openshift_version.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. # vim: expandtab:tabstop=4:shiftwidth=4
  4. """
  5. Custom version comparison filters for use in openshift-ansible
  6. """
  7. # pylint can't locate distutils.version within virtualenv
  8. # https://github.com/PyCQA/pylint/issues/73
  9. # pylint: disable=no-name-in-module, import-error
  10. from distutils.version import LooseVersion
  11. def legacy_gte_function_builder(name, versions):
  12. """
  13. Build and return a version comparison function.
  14. Ex: name = 'oo_version_gte_3_1_or_1_1'
  15. versions = {'enterprise': '3.1', 'origin': '1.1'}
  16. returns oo_version_gte_3_1_or_1_1, a function which based on the
  17. version and deployment type will return true if the provided
  18. version is greater than or equal to the function's version
  19. """
  20. enterprise_version = versions['enterprise']
  21. origin_version = versions['origin']
  22. def _gte_function(version, deployment_type):
  23. """
  24. Dynamic function created by gte_function_builder.
  25. Ex: version = '3.1'
  26. deployment_type = 'openshift-enterprise'
  27. returns True/False
  28. """
  29. version_gte = False
  30. if 'enterprise' in deployment_type:
  31. if str(version) >= LooseVersion(enterprise_version):
  32. version_gte = True
  33. elif 'origin' in deployment_type:
  34. if str(version) >= LooseVersion(origin_version):
  35. version_gte = True
  36. return version_gte
  37. _gte_function.__name__ = name
  38. return _gte_function
  39. def gte_function_builder(name, gte_version):
  40. """
  41. Build and return a version comparison function.
  42. Ex: name = 'oo_version_gte_3_6'
  43. version = '3.6'
  44. returns oo_version_gte_3_6, a function which based on the
  45. version will return true if the provided version is greater
  46. than or equal to the function's version
  47. """
  48. def _gte_function(version):
  49. """
  50. Dynamic function created by gte_function_builder.
  51. Ex: version = '3.1'
  52. returns True/False
  53. """
  54. version_gte = False
  55. if str(version) >= LooseVersion(gte_version):
  56. version_gte = True
  57. return version_gte
  58. _gte_function.__name__ = name
  59. return _gte_function
  60. # pylint: disable=too-few-public-methods
  61. class FilterModule(object):
  62. """
  63. Filters for version checking.
  64. """
  65. # Each element of versions is composed of (major, minor_start, minor_end)
  66. # Origin began versioning 3.x with 3.6, so begin 3.x with 3.6.
  67. versions = [(3, 6, 10)]
  68. def __init__(self):
  69. """
  70. Creates a new FilterModule for ose version checking.
  71. """
  72. self._filters = {}
  73. # For each set of (major, minor, minor_iterations)
  74. for major, minor_start, minor_end in self.versions:
  75. # For each minor version in the range
  76. for minor in range(minor_start, minor_end):
  77. # Create the function name
  78. func_name = 'oo_version_gte_{}_{}'.format(major, minor)
  79. # Create the function with the builder
  80. func = gte_function_builder(func_name, "{}.{}.0".format(major, minor))
  81. # Add the function to the mapping
  82. self._filters[func_name] = func
  83. # Create filters with special versioning requirements.
  84. # Treat all Origin 1.x as special case.
  85. legacy_filters = [{'name': 'oo_version_gte_3_1_or_1_1',
  86. 'versions': {'enterprise': '3.0.2.905',
  87. 'origin': '1.1.0'}},
  88. {'name': 'oo_version_gte_3_1_1_or_1_1_1',
  89. 'versions': {'enterprise': '3.1.1',
  90. 'origin': '1.1.1'}},
  91. {'name': 'oo_version_gte_3_2_or_1_2',
  92. 'versions': {'enterprise': '3.1.1.901',
  93. 'origin': '1.2.0'}},
  94. {'name': 'oo_version_gte_3_3_or_1_3',
  95. 'versions': {'enterprise': '3.3.0',
  96. 'origin': '1.3.0'}},
  97. {'name': 'oo_version_gte_3_4_or_1_4',
  98. 'versions': {'enterprise': '3.4.0',
  99. 'origin': '1.4.0'}},
  100. {'name': 'oo_version_gte_3_5_or_1_5',
  101. 'versions': {'enterprise': '3.5.0',
  102. 'origin': '1.5.0'}}]
  103. for legacy_filter in legacy_filters:
  104. self._filters[legacy_filter['name']] = legacy_gte_function_builder(legacy_filter['name'],
  105. legacy_filter['versions'])
  106. def filters(self):
  107. """
  108. Return the filters mapping.
  109. """
  110. return self._filters