Skip to content

Commit

Permalink
Get system release via guest fact
Browse files Browse the repository at this point in the history
Signed-off-by: Vector Li <[email protected]>
  • Loading branch information
idorax committed Aug 1, 2023
1 parent d773e5c commit 7a3efc4
Showing 1 changed file with 25 additions and 39 deletions.
64 changes: 25 additions & 39 deletions tmt/steps/prepare/feature.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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')
Expand All @@ -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')
Expand All @@ -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:
Expand Down

0 comments on commit 7a3efc4

Please sign in to comment.