]> git.apps.os.sepia.ceph.com Git - teuthology.git/commitdiff
OS: Automatically determine version or codename
authorZack Cerza <zack@redhat.com>
Fri, 20 May 2016 21:54:00 +0000 (15:54 -0600)
committerZack Cerza <zack@redhat.com>
Fri, 3 Jun 2016 21:02:54 +0000 (15:02 -0600)
... using a lookup table to map one to the other

Signed-off-by: Zack Cerza <zack@redhat.com>
teuthology/orchestra/opsys.py
teuthology/orchestra/test/test_opsys.py

index 4831e20a840032fcb43b7473ad3459fa5b5a54a9..c604d4793a1a6304201ea8dfc5ffdc6cf91e5856 100644 (file)
@@ -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
 
index d1f1431ebda4d0759335c8ac8a15a480d933f71d..c20ff443bf76af1f9997226811877dc6b9233980 100644 (file)
@@ -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'