]> git.apps.os.sepia.ceph.com Git - teuthology.git/commitdiff
Add OS.codename 378/head
authorZack Cerza <zack.cerza@inktank.com>
Thu, 4 Dec 2014 20:55:42 +0000 (13:55 -0700)
committerZack Cerza <zack.cerza@inktank.com>
Thu, 4 Dec 2014 20:57:14 +0000 (13:57 -0700)
The codename can be reliably set by parsing
platform.linux_distribution() or lsb_release -a. We now default to
trying the former first.

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

index c459f15306b0fedeec171cd6a4e49a68742d99b5..34cee5f3d1b7e00d5425c9f5b0f56d792e74c04d 100644 (file)
@@ -1,3 +1,4 @@
+import ast
 import re
 
 
@@ -9,20 +10,54 @@ class OS(object):
     Must be initialized with OS.from_lsb_release or OS.from_os_release
     """
 
-    __slots__ = ['name', 'version', 'package_type']
+    __slots__ = ['name', 'version', 'codename', 'package_type']
 
     _deb_distros = ('debian', 'ubuntu')
     _rpm_distros = ('fedora', 'rhel', 'centos', 'suse')
 
-    def __init__(self, name=None, version=None):
+    def __init__(self, name=None, version=None, codename=None):
         self.name = name
         self.version = version
+        self.codename = codename
         self._set_package_type()
 
+    @classmethod
+    def from_python(cls, python_val):
+        """
+        Parse output from platform.linux_distribution() and populate attributes
+
+        Given a tuple or str()'ed tuple like this:
+            ('Ubuntu', '14.04', 'trusty')
+
+        Attributes will be:
+            name = 'ubuntu'
+            version = '14.04'
+            codename = 'trusty'
+        Additionally, we set the package type:
+            package_type = 'deb'
+        """
+        if not isinstance(python_val, tuple):
+            python_val = ast.literal_eval(python_val)
+
+        (name, version, codename) = python_val
+        name = name.lower().replace(' ', '')
+        if name.startswith('redhat'):
+            name = 'rhel'
+        elif name.startswith('centos'):
+            name = 'centos'
+        elif name.startswith('fedora'):
+            name = 'fedora'
+        obj = cls()
+        obj.name = name
+        obj.version = version
+        obj.codename = codename.lower()
+        obj._set_package_type()
+        return obj
+
     @classmethod
     def from_lsb_release(cls, lsb_release_str):
         """
-        Parse /etc/os-release and populate attributes
+        Parse output from lsb_release -a and populate attributes
 
         Given output like:
             Distributor ID: Ubuntu
@@ -33,6 +68,7 @@ class OS(object):
         Attributes will be:
             name = 'ubuntu'
             version = '12.04'
+            codename = 'precise'
         Additionally, we set the package type:
             package_type = 'deb'
         """
@@ -44,6 +80,7 @@ class OS(object):
         obj.name = name.lower()
 
         obj.version = obj._get_value(str_, 'Release')
+        obj.codename = obj._get_value(str_, 'Codename').lower()
 
         obj._set_package_type()
 
@@ -65,6 +102,7 @@ class OS(object):
         Attributes will be:
             name = 'ubuntu'
             version = '12.04'
+            codename = None
         Additionally, we set the package type:
             package_type = 'deb'
         """
@@ -72,6 +110,7 @@ class OS(object):
         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()
 
@@ -95,11 +134,14 @@ class OS(object):
         return dict(
             name=self.name,
             version=self.version,
+            codename=self.codename,
         )
 
     def __str__(self):
         return " ".join([self.name, self.version]).strip()
 
     def __repr__(self):
-        return "OS(name='{name}', version='{version}')".format(
-            name=self.name, version=self.version)
+        return "OS(name={name}, version={version}, codename={codename})"\
+            .format(name=repr(self.name),
+                    version=repr(self.version),
+                    codename=repr(self.codename))
index eccfeef1f9a345c4bca22d4ff8c6e1da7d09cf8e..15ef022e0617661b2df3a912160ce52b86d61fa7 100644 (file)
@@ -251,14 +251,24 @@ class Remote(object):
     @property
     def os(self):
         if not hasattr(self, '_os'):
+            proc = self.run(
+                args=[
+                    'python', '-c',
+                    'import platform; print platform.linux_distribution()'],
+                stdout=StringIO(), stderr=StringIO(), check_status=False)
+            if proc.exitstatus == 0:
+                self._os = OS.from_python(proc.stdout.getvalue().strip())
+                return self._os
+
             proc = self.run(args=['cat', '/etc/os-release'], stdout=StringIO(),
                             stderr=StringIO(), check_status=False)
             if proc.exitstatus == 0:
                 self._os = OS.from_os_release(proc.stdout.getvalue().strip())
-            else:
-                proc = self.run(args=['lsb_release', '-a'], stdout=StringIO(),
-                                stderr=StringIO())
-                self._os = OS.from_lsb_release(proc.stdout.getvalue().strip())
+                return self._os
+
+            proc = self.run(args=['lsb_release', '-a'], stdout=StringIO(),
+                            stderr=StringIO())
+            self._os = OS.from_lsb_release(proc.stdout.getvalue().strip())
         return self._os
 
     @property
index bbe80982b3a084aa4098644ad1ba8667391354d2..d1f1431ebda4d0759335c8ac8a15a480d933f71d 100644 (file)
@@ -35,6 +35,8 @@ class TestOS(object):
         BUG_REPORT_URL="http://bugs.debian.org/"
     """)
 
+    str_ubuntu_12_04_python = "('Ubuntu', '12.04', 'precise')"
+
     str_ubuntu_12_04_lsb_release = dedent("""
         Distributor ID: Ubuntu
         Description:    Ubuntu 12.04.4 LTS
@@ -59,6 +61,8 @@ class TestOS(object):
         Codename:       Santiago
     """)
 
+    str_rhel_7_python = "('Red Hat Enterprise Linux Server', '7.0', 'Maipo')"
+
     str_rhel_7_lsb_release = dedent("""
         LSB Version:    :core-4.1-amd64:core-4.1-noarch:cxx-4.1-amd64:cxx-4.1-noarch:desktop-4.1-amd64:desktop-4.1-noarch:languages-4.1-amd64:languages-4.1-noarch:printing-4.1-amd64:printing-4.1-noarch
         Distributor ID: RedHatEnterpriseServer
@@ -89,54 +93,77 @@ 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.package_type == 'rpm'
 
     def test_debian_7_lsb_release(self):
         os = OS.from_lsb_release(self.str_debian_7_lsb_release)
         assert os.name == 'debian'
         assert os.version == '7.1'
+        assert os.codename == 'wheezy'
         assert os.package_type == 'deb'
 
     def test_debian_7_os_release(self):
         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.package_type == 'deb'
+
+    def test_ubuntu_12_04_python(self):
+        os = OS.from_python(self.str_ubuntu_12_04_python)
+        assert os.name == 'ubuntu'
+        assert os.version == '12.04'
+        assert os.codename == 'precise'
         assert os.package_type == 'deb'
 
     def test_ubuntu_12_04_lsb_release(self):
         os = OS.from_lsb_release(self.str_ubuntu_12_04_lsb_release)
         assert os.name == 'ubuntu'
         assert os.version == '12.04'
+        assert os.codename == 'precise'
         assert os.package_type == 'deb'
 
     def test_ubuntu_12_04_os_release(self):
         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.package_type == 'deb'
 
     def test_rhel_6_4_lsb_release(self):
         os = OS.from_lsb_release(self.str_rhel_6_4_lsb_release)
         assert os.name == 'rhel'
         assert os.version == '6.4'
+        assert os.codename == 'santiago'
+        assert os.package_type == 'rpm'
+
+    def test_rhel_7_python(self):
+        os = OS.from_python(self.str_rhel_7_python)
+        assert os.name == 'rhel'
+        assert os.version == '7.0'
+        assert os.codename == 'maipo'
         assert os.package_type == 'rpm'
 
     def test_rhel_7_lsb_release(self):
         os = OS.from_lsb_release(self.str_rhel_7_lsb_release)
         assert os.name == 'rhel'
         assert os.version == '7.0'
+        assert os.codename == 'maipo'
         assert os.package_type == 'rpm'
 
     def test_rhel_7_os_release(self):
         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.package_type == 'rpm'
 
     def test_repr(self):
-        os = OS(name='NAME', version='0.1.2')
-        assert repr(os) == "OS(name='NAME', version='0.1.2')"
+        os = OS(name='NAME', version='0.1.2', codename='code')
+        assert repr(os) == "OS(name='NAME', version='0.1.2', codename='code')"
 
     def test_to_dict(self):
-        os = OS(name='NAME', version='0.1.2')
-        assert os.to_dict() == dict(name='NAME', version='0.1.2')
+        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