From: Zack Cerza Date: Thu, 4 Dec 2014 20:55:42 +0000 (-0700) Subject: Add OS.codename X-Git-Tag: 1.1.0~1061^2~13^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=202c70f0c48a81dede285aae3186eda30ce62df4;p=teuthology.git Add OS.codename 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 --- diff --git a/teuthology/orchestra/opsys.py b/teuthology/orchestra/opsys.py index c459f15306..34cee5f3d1 100644 --- a/teuthology/orchestra/opsys.py +++ b/teuthology/orchestra/opsys.py @@ -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)) diff --git a/teuthology/orchestra/remote.py b/teuthology/orchestra/remote.py index eccfeef1f9..15ef022e06 100644 --- a/teuthology/orchestra/remote.py +++ b/teuthology/orchestra/remote.py @@ -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 diff --git a/teuthology/orchestra/test/test_opsys.py b/teuthology/orchestra/test/test_opsys.py index bbe80982b3..d1f1431ebd 100644 --- a/teuthology/orchestra/test/test_opsys.py +++ b/teuthology/orchestra/test/test_opsys.py @@ -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