From 5ff0f1bd42925ece8b3e747be44ced78f582b754 Mon Sep 17 00:00:00 2001 From: Felipe Reyes Date: Tue, 28 Mar 2023 15:01:56 -0300 Subject: [PATCH] Add CompareOpenStack class. The CompareOpenStack class allows the comparison of OpenStack codenames. (cherry picked from commit 7205e31753da891aa835b4d911a51c28dc019001) (cherry picked from commit f2ef3ac897c770d99f890688b541d9cbc5cf620a) (cherry picked from commit d780c3a41b167f8f5aa2964d44c6079bf1a0c81f) (cherry picked from commit a1e4522d3d13d4d024ee3f9a945eb74f3ca52295) (cherry picked from commit ffff12c3251c0a4d5a7680705791381d6abffcc7) --- .../test_zaza_utilities_os_versions.py | 32 +++++ zaza/openstack/utilities/os_versions.py | 120 ++++++++++++++++++ 2 files changed, 152 insertions(+) create mode 100644 unit_tests/utilities/test_zaza_utilities_os_versions.py diff --git a/unit_tests/utilities/test_zaza_utilities_os_versions.py b/unit_tests/utilities/test_zaza_utilities_os_versions.py new file mode 100644 index 000000000..86b0f6220 --- /dev/null +++ b/unit_tests/utilities/test_zaza_utilities_os_versions.py @@ -0,0 +1,32 @@ +# Copyright 2023 Canonical Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +import unit_tests.utils as ut_utils +from zaza.openstack.utilities import os_versions + + +class TestOpenStackUtils(ut_utils.BaseTestCase): + + def test_compare_openstack(self): + yoga = os_versions.CompareOpenStack('yoga') + xena = os_versions.CompareOpenStack('xena') + wallaby = os_versions.CompareOpenStack('wallaby') + self.assertGreater(yoga, xena) + self.assertLess(xena, yoga) + self.assertGreaterEqual(xena, xena) + self.assertGreaterEqual(yoga, yoga) + self.assertGreaterEqual(yoga, wallaby) + + self.assertEqual("CompareOpenStack", repr(xena)) diff --git a/zaza/openstack/utilities/os_versions.py b/zaza/openstack/utilities/os_versions.py index 2ea089e2f..9d872ceae 100644 --- a/zaza/openstack/utilities/os_versions.py +++ b/zaza/openstack/utilities/os_versions.py @@ -274,3 +274,123 @@ ('4', 'victoria'), ]), } + + +UBUNTU_RELEASES = ( + 'lucid', + 'maverick', + 'natty', + 'oneiric', + 'precise', + 'quantal', + 'raring', + 'saucy', + 'trusty', + 'utopic', + 'vivid', + 'wily', + 'xenial', + 'yakkety', + 'zesty', + 'artful', + 'bionic', + 'cosmic', + 'disco', + 'eoan', + 'focal', + 'groovy', + 'hirsute', + 'impish', + 'jammy', +) + + +class BasicStringComparator(object): + """Provides a class that will compare strings from an iterator type object. + + Used to provide > and < comparisons on strings that may not necessarily be + alphanumerically ordered. e.g. OpenStack or Ubuntu releases AFTER the + z-wrap. + """ + + _list = None + + def __init__(self, item): + """Do init.""" + if self._list is None: + raise Exception("Must define the _list in the class definition!") + try: + self.index = self._list.index(item) + except Exception: + raise KeyError("Item '{}' is not in list '{}'" + .format(item, self._list)) + + def __eq__(self, other): + """Do equals.""" + assert isinstance(other, str) or isinstance(other, self.__class__) + return self.index == self._list.index(other) + + def __ne__(self, other): + """Do not equals.""" + return not self.__eq__(other) + + def __lt__(self, other): + """Do less than.""" + assert isinstance(other, str) or isinstance(other, self.__class__) + return self.index < self._list.index(other) + + def __ge__(self, other): + """Do greater than or equal.""" + return not self.__lt__(other) + + def __gt__(self, other): + """Do greater than.""" + assert isinstance(other, str) or isinstance(other, self.__class__) + return self.index > self._list.index(other) + + def __le__(self, other): + """Do less than or equals.""" + return not self.__gt__(other) + + def __repr__(self): + """Return the representation of CompareOpenStack.""" + return "%s<%s>" % (self.__class__.__name__, self._list[self.index]) + + def __str__(self): + """Give back the item at the index. + + This is so it can be used in comparisons like: + + s_mitaka = CompareOpenStack('mitaka') + s_newton = CompareOpenstack('newton') + + assert s_newton > s_mitaka + + :returns: + """ + return self._list[self.index] + + +class CompareHostReleases(BasicStringComparator): + """Provide comparisons of Ubuntu releases. + + Use in the form of + + if CompareHostReleases(release) > 'trusty': + # do something with mitaka + """ + + _list = UBUNTU_RELEASES + + +class CompareOpenStack(BasicStringComparator): + """Provide comparisons of OpenStack releases. + + Use in the form of + + if CompareOpenStack(release) > 'yoga': + # do something + """ + + _list = list(OPENSTACK_CODENAMES.values()) +