diff --git a/tmt/steps/prepare/feature.py b/tmt/steps/prepare/feature.py index 20544bef67..2e34bb5b7c 100644 --- a/tmt/steps/prepare/feature.py +++ b/tmt/steps/prepare/feature.py @@ -28,42 +28,28 @@ def __init__( super().__init__(logger=logger, parent=parent, relative_indent=0) self.guest = guest - -class ToggleableFeature(Feature): - def get_system_release(self) -> Optional[str]: - """ Get the release of the guest """ - self.debug('Get release of the guest.', level=2) - command = Command() - if self.guest.facts.is_superuser is False: - command += Command('sudo') - command += Command('cat', '/etc/system-release') - user_output = self.guest.execute(command, silent=True) - if user_output.stdout is None: + def get_guest_distro(self, guest: Guest, logger: tmt.log.Logger) -> Optional[str]: + """ Get guest distro by parsing the guest facts """ + distro = self.guest.facts.distro + if distro is None: return None - # Parse file /etc/system-release to get the system release - # e.g. - # 1. Fedora : Fedora release 36 (Thirty Six) ==> Fedora - # 2. CentOS 7: CentOS Linux release 7.9.2009 (Core) ==> CentOS-7 - # 3. RHEL 8 : Red Hat Enterprise Linux release 8.9 Beta (Ootpa) ==> RHEL-8 - # 4. RHEL 9 : Red Hat Enterprise Linux release 9.3 Beta (Plow) ==> RHEL-9 - if re.search(r'Fedora release \d+', user_output.stdout): + if re.search(r'Fedora Linux \d+', distro): return 'Fedora' - if re.search(r'CentOS Linux.*7\.?', user_output.stdout): + if re.search(r'CentOS Linux.*7\.', distro): return 'CentOS-7' - if re.search(r'CentOS Stream.*8', user_output.stdout): + if re.search(r'CentOS Stream.*8', distro): return 'CentOS-Stream-8' - if re.search(r'CentOS Stream.*9', user_output.stdout): + if re.search(r'CentOS Stream.*9', distro): return 'CentOS-Stream-9' - if re.search(r'Red Hat Enterprise Linux.*\d+\.?', user_output.stdout): - # RHEL-{7, 8, 9, ...} - out = re.search(r'\d+\.?', user_output.stdout) - if out is None: - return None - rhel_version = out.group().replace('.', '') - return f'RHEL-{rhel_version}' + if re.search(r'Red Hat Enterprise Linux.*8\.', distro): + return 'RHEL-8' + if re.search(r'Red Hat Enterprise Linux.*9\.', distro): + return 'RHEL-9' return None + +class ToggleableFeature(Feature): def enable(self, guest: Guest, logger: tmt.log.Logger) -> None: raise NotImplementedError @@ -85,13 +71,13 @@ class EPEL(ToggleableFeature): KEY = 'epel' def enable(self, guest: Guest, logger: tmt.log.Logger) -> None: - system_release = self.get_system_release() - if system_release is None: - raise tmt.utils.PrepareError('The system release of guest is not supported.') + guest_distro: Optional[str] = self.get_guest_distro(guest=guest, logger=logger) + if guest_distro is None: + raise tmt.utils.PrepareError('The distro of the guest is not supported.') - if system_release == 'Fedora': + if guest_distro == 'Fedora': self.info('Enable EPEL on Fedora, do nothing ...') - elif system_release == 'CentOS-Stream-8': + elif guest_distro == 'CentOS-Stream-8': # dnf config-manager --set-enabled powertools # dnf install epel-release epel-next-release self.info('Enable EPEL on CentOS Stream 8') @@ -103,7 +89,7 @@ def enable(self, guest: Guest, logger: tmt.log.Logger) -> None: 'epel-release', 'epel-next-release') self.guest.execute(command1, silent=True) self.guest.execute(command2, silent=True) - elif system_release == 'RHEL-8': + elif guest_distro == 'RHEL-8': # subscription-manager repos --enable codeready-builder-for-rhel-8-$(arch)-rpms # dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm self.info('Enable EPEL on RHEL 8') @@ -119,14 +105,14 @@ def enable(self, guest: Guest, logger: tmt.log.Logger) -> None: self.guest.execute(command1, silent=True) self.guest.execute(command2, silent=True) else: - pass + raise tmt.utils.PrepareError('The distro of the guest is not supported.') def disable(self, guest: Guest, logger: tmt.log.Logger) -> None: - system_release = self.get_system_release() - if system_release is None: - raise tmt.utils.PrepareError('The system release of guest is not supported.') + guest_distro: Optional[str] = self.get_guest_distro(guest=guest, logger=logger) + if guest_distro is None: + raise tmt.utils.PrepareError('The distro of the guest is not supported.') - if system_release == 'Fedora': + if guest_distro == 'Fedora': # XXX: What to do? self.info('Disable epel on Fedora, do nothing ...') else: