aos_version.py 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. #!/usr/bin/python
  2. # vim: expandtab:tabstop=4:shiftwidth=4
  3. '''
  4. Ansible module for determining if multiple versions of an OpenShift package are
  5. available, and if the version requested is available down to the given
  6. precision.
  7. Multiple versions available suggest that multiple repos are enabled for the
  8. different versions, which may cause installation problems.
  9. '''
  10. import yum # pylint: disable=import-error
  11. from ansible.module_utils.basic import AnsibleModule
  12. def main(): # pylint: disable=missing-docstring,too-many-branches
  13. module = AnsibleModule(
  14. argument_spec=dict(
  15. prefix=dict(required=True), # atomic-openshift, origin, ...
  16. version=dict(required=True),
  17. ),
  18. supports_check_mode=True
  19. )
  20. def bail(error): # pylint: disable=missing-docstring
  21. module.fail_json(msg=error)
  22. rpm_prefix = module.params['prefix']
  23. if not rpm_prefix:
  24. bail("prefix must not be empty")
  25. yb = yum.YumBase() # pylint: disable=invalid-name
  26. yb.conf.disable_excludes = ["all"] # assume the openshift excluder will be managed, ignore current state
  27. # search for package versions available for aos pkgs
  28. expected_pkgs = [
  29. rpm_prefix,
  30. rpm_prefix + '-master',
  31. rpm_prefix + '-node',
  32. ]
  33. try:
  34. pkgs = yb.pkgSack.returnPackages(patterns=expected_pkgs)
  35. except yum.Errors.PackageSackError as e: # pylint: disable=invalid-name
  36. # you only hit this if *none* of the packages are available
  37. bail('Unable to find any OpenShift packages.\nCheck your subscription and repo settings.\n%s' % e)
  38. # determine what level of precision we're expecting for the version
  39. expected_version = module.params['version']
  40. if expected_version.startswith('v'): # v3.3 => 3.3
  41. expected_version = expected_version[1:]
  42. num_dots = expected_version.count('.')
  43. pkgs_by_name_version = {}
  44. pkgs_precise_version_found = {}
  45. for pkg in pkgs:
  46. # get expected version precision
  47. match_version = '.'.join(pkg.version.split('.')[:num_dots + 1])
  48. if match_version == expected_version:
  49. pkgs_precise_version_found[pkg.name] = True
  50. # get x.y version precision
  51. minor_version = '.'.join(pkg.version.split('.')[:2])
  52. if pkg.name not in pkgs_by_name_version:
  53. pkgs_by_name_version[pkg.name] = {}
  54. pkgs_by_name_version[pkg.name][minor_version] = True
  55. # see if any packages couldn't be found at requested version
  56. # see if any packages are available in more than one minor version
  57. not_found = []
  58. multi_found = []
  59. for name in expected_pkgs:
  60. if name not in pkgs_precise_version_found:
  61. not_found.append(name)
  62. if name in pkgs_by_name_version and len(pkgs_by_name_version[name]) > 1:
  63. multi_found.append(name)
  64. if not_found:
  65. msg = 'Not all of the required packages are available at requested version %s:\n' % expected_version
  66. for name in not_found:
  67. msg += ' %s\n' % name
  68. bail(msg + 'Please check your subscriptions and enabled repositories.')
  69. if multi_found:
  70. msg = 'Multiple minor versions of these packages are available\n'
  71. for name in multi_found:
  72. msg += ' %s\n' % name
  73. bail(msg + "There should only be one OpenShift version's repository enabled at a time.")
  74. module.exit_json(changed=False)
  75. if __name__ == '__main__':
  76. main()