From 6f62faad6e267e73cf9522ea3c2c2ee385153d8b Mon Sep 17 00:00:00 2001 From: Zack Cerza Date: Fri, 20 May 2016 15:54:00 -0600 Subject: [PATCH] OS: Automatically determine version or codename ... using a lookup table to map one to the other Signed-off-by: Zack Cerza --- teuthology/orchestra/opsys.py | 59 ++++++++++++++++--------- teuthology/orchestra/test/test_opsys.py | 16 +++++-- 2 files changed, 51 insertions(+), 24 deletions(-) diff --git a/teuthology/orchestra/opsys.py b/teuthology/orchestra/opsys.py index 4831e20a84..c604d4793a 100644 --- a/teuthology/orchestra/opsys.py +++ b/teuthology/orchestra/opsys.py @@ -12,6 +12,14 @@ DISTRO_CODENAME_MAP = { "7": "wheezy", "8": "jessie", }, + "rhel": { + "7": "maipo", + "6": "santiago", + }, + "centos": { + "7": "core", + "6": "core", + } } DEFAULT_OS_VERSION = dict( @@ -40,10 +48,30 @@ class OS(object): def __init__(self, name=None, version=None, codename=None): self.name = name - self.version = version - self.codename = codename + self.version = version or self._codename_to_version(name, codename) + self.codename = codename or self._version_to_codename(name, version) self._set_package_type() + @staticmethod + def _version_to_codename(name, version): + for (_version, codename) in DISTRO_CODENAME_MAP[name].iteritems(): + if version == _version or version.split('.')[0] == _version: + return codename + raise RuntimeError("No codename found for %s %s !" % ( + name, + version, + )) + + @staticmethod + def _codename_to_version(name, codename): + for (version, _codename) in DISTRO_CODENAME_MAP[name].iteritems(): + if codename == _codename: + return version + raise RuntimeError("No version found for %s %s !" % ( + name, + codename, + )) + @classmethod def from_python(cls, python_val): """ @@ -70,11 +98,7 @@ class OS(object): name = 'centos' elif name.startswith('fedora'): name = 'fedora' - obj = cls() - obj.name = name - obj.version = version - obj.codename = codename.lower() - obj._set_package_type() + obj = cls(name=name, version=version, codename=codename.lower()) return obj @classmethod @@ -95,17 +119,15 @@ class OS(object): Additionally, we set the package type: package_type = 'deb' """ - obj = cls() str_ = lsb_release_str.strip() - name = obj._get_value(str_, 'Distributor ID') + name = cls._get_value(str_, 'Distributor ID') if name == 'RedHatEnterpriseServer': name = 'rhel' - obj.name = name.lower() - - obj.version = obj._get_value(str_, 'Release') - obj.codename = obj._get_value(str_, 'Codename').lower() + name = name.lower() - obj._set_package_type() + version = cls._get_value(str_, 'Release') + codename = cls._get_value(str_, 'Codename').lower() + obj = cls(name=name, version=version, codename=codename) return obj @@ -129,13 +151,10 @@ class OS(object): Additionally, we set the package type: package_type = 'deb' """ - obj = cls() str_ = os_release_str.strip() - obj.name = cls._get_value(str_, 'ID').lower() - obj.version = cls._get_value(str_, 'VERSION_ID') - obj.codename = None - - obj._set_package_type() + name = cls._get_value(str_, 'ID').lower() + version = cls._get_value(str_, 'VERSION_ID') + obj = cls(name=name, version=version) return obj diff --git a/teuthology/orchestra/test/test_opsys.py b/teuthology/orchestra/test/test_opsys.py index d1f1431ebd..c20ff443bf 100644 --- a/teuthology/orchestra/test/test_opsys.py +++ b/teuthology/orchestra/test/test_opsys.py @@ -93,7 +93,7 @@ class TestOS(object): os = OS.from_os_release(self.str_centos_7_os_release) assert os.name == 'centos' assert os.version == '7' - assert os.codename is None + assert os.codename == 'core' assert os.package_type == 'rpm' def test_debian_7_lsb_release(self): @@ -107,7 +107,7 @@ class TestOS(object): os = OS.from_os_release(self.str_debian_7_os_release) assert os.name == 'debian' assert os.version == '7' - assert os.codename is None + assert os.codename == 'wheezy' assert os.package_type == 'deb' def test_ubuntu_12_04_python(self): @@ -128,7 +128,7 @@ class TestOS(object): os = OS.from_os_release(self.str_ubuntu_12_04_os_release) assert os.name == 'ubuntu' assert os.version == '12.04' - assert os.codename is None + assert os.codename == 'precise' assert os.package_type == 'deb' def test_rhel_6_4_lsb_release(self): @@ -156,7 +156,7 @@ class TestOS(object): os = OS.from_os_release(self.str_rhel_7_os_release) assert os.name == 'rhel' assert os.version == '7.0' - assert os.codename is None + assert os.codename == 'maipo' assert os.package_type == 'rpm' def test_repr(self): @@ -167,3 +167,11 @@ class TestOS(object): os = OS(name='NAME', version='0.1.2', codename='code') ref_dict = dict(name='NAME', version='0.1.2', codename='code') assert os.to_dict() == ref_dict + + def test_version_no_codename(self): + os = OS(name='ubuntu', version='16.04') + assert os.codename == 'xenial' + + def test_codename_no_version(self): + os = OS(name='ubuntu', codename='trusty') + assert os.version == '14.04' -- 2.39.5