From a5917b4be96452205a9f282ffbde67faf87df4a8 Mon Sep 17 00:00:00 2001 From: Zack Cerza Date: Mon, 29 Sep 2014 07:39:49 -0600 Subject: [PATCH] Move OS class to its own files Signed-off-by: Zack Cerza --- teuthology/orchestra/opsys.py | 93 ++++++++++++++++ teuthology/orchestra/remote.py | 93 +--------------- teuthology/orchestra/test/test_opsys.py | 134 +++++++++++++++++++++++ teuthology/orchestra/test/test_remote.py | 133 ---------------------- 4 files changed, 228 insertions(+), 225 deletions(-) create mode 100644 teuthology/orchestra/opsys.py create mode 100644 teuthology/orchestra/test/test_opsys.py diff --git a/teuthology/orchestra/opsys.py b/teuthology/orchestra/opsys.py new file mode 100644 index 0000000000..a9629d7e35 --- /dev/null +++ b/teuthology/orchestra/opsys.py @@ -0,0 +1,93 @@ +import re + + +class OS(object): + """ + Class that parses either /etc/os-release or the output of 'lsb_release -a' + and provides OS name and version information. + + Must be initialized with OS.from_lsb_release or OS.from_os_release + """ + + __slots__ = ['name', 'version', 'package_type'] + + _deb_distros = ('debian', 'ubuntu') + _rpm_distros = ('fedora', 'rhel', 'centos', 'suse') + + def __init__(self): + pass + + @classmethod + def from_lsb_release(cls, lsb_release_str): + """ + Parse /etc/os-release and populate attributes + + Given output like: + Distributor ID: Ubuntu + Description: Ubuntu 12.04.4 LTS + Release: 12.04 + Codename: precise + + Attributes will be: + name = 'ubuntu' + version = '12.04' + Additionally, we set the package type: + package_type = 'deb' + """ + obj = cls() + str_ = lsb_release_str.strip() + name = obj._get_value(str_, 'Distributor ID') + if name == 'RedHatEnterpriseServer': + name = 'rhel' + obj.name = name.lower() + + obj.version = obj._get_value(str_, 'Release') + + if obj.name in cls._deb_distros: + obj.package_type = "deb" + elif obj.name in cls._rpm_distros: + obj.package_type = "rpm" + + return obj + + @classmethod + def from_os_release(cls, os_release_str): + """ + Parse /etc/os-release and populate attributes + + Given output like: + NAME="Ubuntu" + VERSION="12.04.4 LTS, Precise Pangolin" + ID=ubuntu + ID_LIKE=debian + PRETTY_NAME="Ubuntu precise (12.04.4 LTS)" + VERSION_ID="12.04" + + Attributes will be: + name = 'ubuntu' + version = '12.04' + 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') + + if obj.name in cls._deb_distros: + obj.package_type = "deb" + elif obj.name in cls._rpm_distros: + obj.package_type = "rpm" + + return obj + + @staticmethod + def _get_value(str_, name): + regex = '^%s[:=](.+)' % name + match = re.search(regex, str_, flags=re.M) + if match: + return match.groups()[0].strip(' \t"\'') + return '' + + def __str__(self): + return " ".join([self.name, self.version]).strip() diff --git a/teuthology/orchestra/remote.py b/teuthology/orchestra/remote.py index 06336726d4..f7bd6ec527 100644 --- a/teuthology/orchestra/remote.py +++ b/teuthology/orchestra/remote.py @@ -2,6 +2,7 @@ Support for paramiko remote objects. """ from . import run +from .opsys import OS import connection from teuthology import misc import time @@ -289,98 +290,6 @@ class Remote(object): return node -class OS(object): - """ - Class that parses either /etc/os-release or the output of 'lsb_release -a' - and provides OS name and version information. - - Must be initialized with OS.from_lsb_release or OS.from_os_release - """ - - __slots__ = ['name', 'version', 'package_type'] - - _deb_distros = ('debian', 'ubuntu') - _rpm_distros = ('fedora', 'rhel', 'centos', 'suse') - - def __init__(self): - pass - - @classmethod - def from_lsb_release(cls, lsb_release_str): - """ - Parse /etc/os-release and populate attributes - - Given output like: - Distributor ID: Ubuntu - Description: Ubuntu 12.04.4 LTS - Release: 12.04 - Codename: precise - - Attributes will be: - name = 'ubuntu' - version = '12.04' - Additionally, we set the package type: - package_type = 'deb' - """ - obj = cls() - str_ = lsb_release_str.strip() - name = obj._get_value(str_, 'Distributor ID') - if name == 'RedHatEnterpriseServer': - name = 'rhel' - obj.name = name.lower() - - obj.version = obj._get_value(str_, 'Release') - - if obj.name in cls._deb_distros: - obj.package_type = "deb" - elif obj.name in cls._rpm_distros: - obj.package_type = "rpm" - - return obj - - @classmethod - def from_os_release(cls, os_release_str): - """ - Parse /etc/os-release and populate attributes - - Given output like: - NAME="Ubuntu" - VERSION="12.04.4 LTS, Precise Pangolin" - ID=ubuntu - ID_LIKE=debian - PRETTY_NAME="Ubuntu precise (12.04.4 LTS)" - VERSION_ID="12.04" - - Attributes will be: - name = 'ubuntu' - version = '12.04' - 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') - - if obj.name in cls._deb_distros: - obj.package_type = "deb" - elif obj.name in cls._rpm_distros: - obj.package_type = "rpm" - - return obj - - @staticmethod - def _get_value(str_, name): - regex = '^%s[:=](.+)' % name - match = re.search(regex, str_, flags=re.M) - if match: - return match.groups()[0].strip(' \t"\'') - return '' - - def __str__(self): - return " ".join([self.name, self.version]).strip() - - def getShortName(name): """ Extract the name portion from remote name strings. diff --git a/teuthology/orchestra/test/test_opsys.py b/teuthology/orchestra/test/test_opsys.py new file mode 100644 index 0000000000..ac9c4766ca --- /dev/null +++ b/teuthology/orchestra/test/test_opsys.py @@ -0,0 +1,134 @@ +from textwrap import dedent +from ..opsys import OS + + +class TestOS(object): + str_centos_7_os_release = dedent(""" + NAME="CentOS Linux" + VERSION="7 (Core)" + ID="centos" + ID_LIKE="rhel fedora" + VERSION_ID="7" + PRETTY_NAME="CentOS Linux 7 (Core)" + ANSI_COLOR="0;31" + CPE_NAME="cpe:/o:centos:centos:7" + HOME_URL="https://www.centos.org/" + BUG_REPORT_URL="https://bugs.centos.org/" + """) + + str_debian_7_lsb_release = dedent(""" + Distributor ID: Debian + Description: Debian GNU/Linux 7.1 (wheezy) + Release: 7.1 + Codename: wheezy + """) + + str_debian_7_os_release = dedent(""" + PRETTY_NAME="Debian GNU/Linux 7 (wheezy)" + NAME="Debian GNU/Linux" + VERSION_ID="7" + VERSION="7 (wheezy)" + ID=debian + ANSI_COLOR="1;31" + HOME_URL="http://www.debian.org/" + SUPPORT_URL="http://www.debian.org/support/" + BUG_REPORT_URL="http://bugs.debian.org/" + """) + + str_ubuntu_12_04_lsb_release = dedent(""" + Distributor ID: Ubuntu + Description: Ubuntu 12.04.4 LTS + Release: 12.04 + Codename: precise + """) + + str_ubuntu_12_04_os_release = dedent(""" + NAME="Ubuntu" + VERSION="12.04.4 LTS, Precise Pangolin" + ID=ubuntu + ID_LIKE=debian + PRETTY_NAME="Ubuntu precise (12.04.4 LTS)" + VERSION_ID="12.04" + """) + + str_rhel_6_4_lsb_release = dedent(""" + LSB Version: :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch + Distributor ID: RedHatEnterpriseServer + Description: Red Hat Enterprise Linux Server release 6.4 (Santiago) + Release: 6.4 + Codename: Santiago + """) + + 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 + Description: Red Hat Enterprise Linux Server release 7.0 (Maipo) + Release: 7.0 + Codename: Maipo + """) + + str_rhel_7_os_release = dedent(""" + NAME="Red Hat Enterprise Linux Server" + VERSION="7.0 (Maipo)" + ID="rhel" + ID_LIKE="fedora" + VERSION_ID="7.0" + PRETTY_NAME="Red Hat Enterprise Linux Server 7.0 (Maipo)" + ANSI_COLOR="0;31" + CPE_NAME="cpe:/o:redhat:enterprise_linux:7.0:GA:server" + HOME_URL="https://www.redhat.com/" + BUG_REPORT_URL="https://bugzilla.redhat.com/" + + REDHAT_BUGZILLA_PRODUCT="Red Hat Enterprise Linux 7" + REDHAT_BUGZILLA_PRODUCT_VERSION=7.0 + REDHAT_SUPPORT_PRODUCT="Red Hat Enterprise Linux" + REDHAT_SUPPORT_PRODUCT_VERSION=7.0 + """) + + def test_centos_7_os_release(self): + os = OS.from_os_release(self.str_centos_7_os_release) + assert os.name == 'centos' + assert os.version == '7' + 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.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.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.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.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.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.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.package_type == 'rpm' diff --git a/teuthology/orchestra/test/test_remote.py b/teuthology/orchestra/test/test_remote.py index 128b3f2a0d..c73bb6be7d 100644 --- a/teuthology/orchestra/test/test_remote.py +++ b/teuthology/orchestra/test/test_remote.py @@ -3,7 +3,6 @@ import fudge.inspector from pytest import skip from cStringIO import StringIO, OutputType -from textwrap import dedent from .. import remote from ..run import RemoteProcess @@ -138,135 +137,3 @@ class TestRemote(object): key.expects('get_base64').returns('test ssh key') r = remote.Remote(name='jdoe@xyzzy.example.com', ssh=ssh) assert r.host_key == 'key_type test ssh key' - - -class TestDistribution(object): - str_centos_7_os_release = dedent(""" - NAME="CentOS Linux" - VERSION="7 (Core)" - ID="centos" - ID_LIKE="rhel fedora" - VERSION_ID="7" - PRETTY_NAME="CentOS Linux 7 (Core)" - ANSI_COLOR="0;31" - CPE_NAME="cpe:/o:centos:centos:7" - HOME_URL="https://www.centos.org/" - BUG_REPORT_URL="https://bugs.centos.org/" - """) - - str_debian_7_lsb_release = dedent(""" - Distributor ID: Debian - Description: Debian GNU/Linux 7.1 (wheezy) - Release: 7.1 - Codename: wheezy - """) - - str_debian_7_os_release = dedent(""" - PRETTY_NAME="Debian GNU/Linux 7 (wheezy)" - NAME="Debian GNU/Linux" - VERSION_ID="7" - VERSION="7 (wheezy)" - ID=debian - ANSI_COLOR="1;31" - HOME_URL="http://www.debian.org/" - SUPPORT_URL="http://www.debian.org/support/" - BUG_REPORT_URL="http://bugs.debian.org/" - """) - - str_ubuntu_12_04_lsb_release = dedent(""" - Distributor ID: Ubuntu - Description: Ubuntu 12.04.4 LTS - Release: 12.04 - Codename: precise - """) - - str_ubuntu_12_04_os_release = dedent(""" - NAME="Ubuntu" - VERSION="12.04.4 LTS, Precise Pangolin" - ID=ubuntu - ID_LIKE=debian - PRETTY_NAME="Ubuntu precise (12.04.4 LTS)" - VERSION_ID="12.04" - """) - - str_rhel_6_4_lsb_release = dedent(""" - LSB Version: :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch - Distributor ID: RedHatEnterpriseServer - Description: Red Hat Enterprise Linux Server release 6.4 (Santiago) - Release: 6.4 - Codename: Santiago - """) - - 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 - Description: Red Hat Enterprise Linux Server release 7.0 (Maipo) - Release: 7.0 - Codename: Maipo - """) - - str_rhel_7_os_release = dedent(""" - NAME="Red Hat Enterprise Linux Server" - VERSION="7.0 (Maipo)" - ID="rhel" - ID_LIKE="fedora" - VERSION_ID="7.0" - PRETTY_NAME="Red Hat Enterprise Linux Server 7.0 (Maipo)" - ANSI_COLOR="0;31" - CPE_NAME="cpe:/o:redhat:enterprise_linux:7.0:GA:server" - HOME_URL="https://www.redhat.com/" - BUG_REPORT_URL="https://bugzilla.redhat.com/" - - REDHAT_BUGZILLA_PRODUCT="Red Hat Enterprise Linux 7" - REDHAT_BUGZILLA_PRODUCT_VERSION=7.0 - REDHAT_SUPPORT_PRODUCT="Red Hat Enterprise Linux" - REDHAT_SUPPORT_PRODUCT_VERSION=7.0 - """) - - def test_centos_7_os_release(self): - os = remote.OS.from_os_release(self.str_centos_7_os_release) - assert os.name == 'centos' - assert os.version == '7' - assert os.package_type == 'rpm' - - def test_debian_7_lsb_release(self): - os = remote.OS.from_lsb_release(self.str_debian_7_lsb_release) - assert os.name == 'debian' - assert os.version == '7.1' - assert os.package_type == 'deb' - - def test_debian_7_os_release(self): - os = remote.OS.from_os_release(self.str_debian_7_os_release) - assert os.name == 'debian' - assert os.version == '7' - assert os.package_type == 'deb' - - def test_ubuntu_12_04_lsb_release(self): - os = remote.OS.from_lsb_release(self.str_ubuntu_12_04_lsb_release) - assert os.name == 'ubuntu' - assert os.version == '12.04' - assert os.package_type == 'deb' - - def test_ubuntu_12_04_os_release(self): - os = remote.OS.from_os_release(self.str_ubuntu_12_04_os_release) - assert os.name == 'ubuntu' - assert os.version == '12.04' - assert os.package_type == 'deb' - - def test_rhel_6_4_lsb_release(self): - os = remote.OS.from_lsb_release(self.str_rhel_6_4_lsb_release) - assert os.name == 'rhel' - assert os.version == '6.4' - assert os.package_type == 'rpm' - - def test_rhel_7_lsb_release(self): - os = remote.OS.from_lsb_release(self.str_rhel_7_lsb_release) - assert os.name == 'rhel' - assert os.version == '7.0' - assert os.package_type == 'rpm' - - def test_rhel_7_os_release(self): - os = remote.OS.from_os_release(self.str_rhel_7_os_release) - assert os.name == 'rhel' - assert os.version == '7.0' - assert os.package_type == 'rpm' -- 2.39.5