Skip to content

Commit 748cbac

Browse files
committed
Remove enable_repo from osmorphing for all redhat based OSes
1 parent 539fabb commit 748cbac

7 files changed

Lines changed: 172 additions & 168 deletions

File tree

coriolis/osmorphing/amazon.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,18 @@
11
# Copyright 2023 Cloudbase Solutions Srl
22
# All Rights Reserved.
33

4+
from oslo_log import log as logging
5+
6+
from coriolis import exception
47
from coriolis.osmorphing.osdetect import amazon as amazon_detect
58
from coriolis.osmorphing import redhat
9+
from coriolis import utils
610

711

812
AMAZON_DISTRO_NAME_IDENTIFIER = amazon_detect.AMAZON_DISTRO_NAME
913

14+
LOG = logging.getLogger(__name__)
15+
1016

1117
class BaseAmazonLinuxOSMorphingTools(redhat.BaseRedHatMorphingTools):
1218

@@ -19,3 +25,39 @@ def check_os_supported(cls, detected_os_info):
1925
return False
2026
return cls._version_supported_util(
2127
detected_os_info['release_version'], minimum=2)
28+
29+
def enable_repos(self, repo_names):
30+
"""Enable repositories for Amazon Linux.
31+
32+
Uses yum-config-manager for Amazon Linux 2,
33+
dnf config-manager for Amazon Linux 2023 and later.
34+
"""
35+
if not repo_names:
36+
return
37+
38+
# Determine package manager based on version
39+
# Amazon Linux 2 has version "2", AL2023 has version "2023"
40+
try:
41+
major_version = int(str(self._version).split('.')[0])
42+
except (ValueError, AttributeError):
43+
# Fallback to yum if version parsing fails
44+
major_version = 2
45+
46+
if major_version >= 2023:
47+
# Amazon Linux 2023+ uses dnf
48+
config_manager = 'dnf config-manager'
49+
enable_flag = '--set-enabled=%s'
50+
else:
51+
# Amazon Linux 2 and earlier use yum
52+
config_manager = 'yum-config-manager'
53+
enable_flag = '--enable %s'
54+
55+
for repo in repo_names:
56+
cmd = '%s %s' % (config_manager, enable_flag % repo)
57+
try:
58+
self._exec_cmd_chroot(cmd)
59+
LOG.info("Enabled repository '%s' using %s",
60+
repo, config_manager)
61+
except exception.CoriolisException:
62+
LOG.warning(f"Failed to enable repository {repo}. "
63+
f"Error was: {utils.get_exception_details()}")

coriolis/osmorphing/centos.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,19 @@
11
# Copyright 2020 Cloudbase Solutions Srl
22
# All Rights Reserved.
33

4+
from oslo_log import log as logging
45

6+
from coriolis import exception
57
from coriolis.osmorphing.osdetect import centos as centos_detect
68
from coriolis.osmorphing import redhat
9+
from coriolis import utils
710

811

912
CENTOS_DISTRO_IDENTIFIER = centos_detect.CENTOS_DISTRO_IDENTIFIER
1013
CENTOS_STREAM_DISTRO_IDENTIFIER = centos_detect.CENTOS_STREAM_DISTRO_IDENTIFIER
1114

15+
LOG = logging.getLogger(__name__)
16+
1217

1318
class BaseCentOSMorphingTools(redhat.BaseRedHatMorphingTools):
1419

@@ -22,3 +27,33 @@ def check_os_supported(cls, detected_os_info):
2227
return False
2328
return cls._version_supported_util(
2429
detected_os_info['release_version'], minimum=6)
30+
31+
def enable_repos(self, repo_names):
32+
"""Enable repositories for CentOS.
33+
34+
Uses yum-config-manager for CentOS 7 and earlier,
35+
dnf config-manager for CentOS 8 and later.
36+
"""
37+
if not repo_names:
38+
return
39+
40+
# Determine package manager based on version
41+
major_version = int(str(self._version).split('.')[0])
42+
if major_version >= 8:
43+
# CentOS 8+ uses dnf
44+
config_manager = 'dnf config-manager'
45+
enable_flag = '--set-enabled=%s'
46+
else:
47+
# CentOS 7 and earlier use yum
48+
config_manager = 'yum-config-manager'
49+
enable_flag = '--enable %s'
50+
51+
for repo in repo_names:
52+
cmd = '%s %s' % (config_manager, enable_flag % repo)
53+
try:
54+
self._exec_cmd_chroot(cmd)
55+
LOG.info("Enabled repository '%s' using %s",
56+
repo, config_manager)
57+
except exception.CoriolisException:
58+
LOG.warning(f"Failed to enable repository {repo}. "
59+
f"Error was: {utils.get_exception_details()}")

coriolis/osmorphing/oracle.py

Lines changed: 33 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,18 @@
11
# Copyright 2016 Cloudbase Solutions Srl
22
# All Rights Reserved.
33

4-
import uuid
4+
from oslo_log import log as logging
55

6+
from coriolis import exception
67
from coriolis.osmorphing.osdetect import oracle as oracle_detect
78
from coriolis.osmorphing import redhat
9+
from coriolis import utils
810

911

1012
ORACLE_DISTRO_IDENTIFIER = oracle_detect.ORACLE_DISTRO_IDENTIFIER
1113

14+
LOG = logging.getLogger(__name__)
15+
1216

1317
class BaseOracleMorphingTools(redhat.BaseRedHatMorphingTools):
1418

@@ -20,34 +24,32 @@ def check_os_supported(cls, detected_os_info):
2024
return cls._version_supported_util(
2125
detected_os_info['release_version'], minimum=6)
2226

23-
def _get_oracle_repos(self):
24-
repos = []
25-
major_version = int(self._version.split(".")[0])
26-
uekr_version = int(major_version) - 2
27-
if major_version < 8:
28-
repo_file_path = (
29-
'/etc/yum.repos.d/%s.repo' % str(uuid.uuid4()))
30-
self._exec_cmd_chroot(
31-
"curl -L http://public-yum.oracle.com/public-yum-ol%s.repo "
32-
"-o %s" % (major_version, repo_file_path))
33-
# During OSMorphing, we temporarily enable needed package repos,
34-
# so we make sure we disable all downloaded repos here.
35-
self._exec_cmd_chroot(
36-
'sed -i "s/^enabled=1$/enabled=0/g" %s' % repo_file_path)
37-
38-
repos_to_enable = ["ol%s_software_collections" % major_version,
39-
"ol%s_addons" % major_version,
40-
"ol%s_UEKR" % major_version,
41-
"ol%s_latest" % major_version]
42-
repos = self._find_yum_repos(repos_to_enable)
27+
def enable_repos(self, repo_names):
28+
"""Enable repositories for Oracle Linux.
29+
30+
Uses yum-config-manager for OL7 and earlier,
31+
dnf config-manager for OL8 and later.
32+
"""
33+
if not repo_names:
34+
return
35+
36+
# Determine package manager based on version
37+
major_version = int(str(self._version).split('.')[0])
38+
if major_version >= 8:
39+
# OL8+ uses dnf
40+
config_manager = 'dnf config-manager'
41+
enable_flag = '--set-enabled=%s'
4342
else:
44-
self._yum_install(
45-
['oraclelinux-release-el%s' % major_version],
46-
self._find_yum_repos(['ol%s_baseos_latest' % major_version]))
47-
repos_to_enable = ["ol%s_baseos_latest" % major_version,
48-
"ol%s_appstream" % major_version,
49-
"ol%d_addons" % major_version,
50-
"ol%s_UEKR%s" % (major_version, uekr_version)]
51-
repos = self._find_yum_repos(repos_to_enable)
52-
53-
return repos
43+
# OL7 and earlier use yum
44+
config_manager = 'yum-config-manager'
45+
enable_flag = '--enable %s'
46+
47+
for repo in repo_names:
48+
cmd = '%s %s' % (config_manager, enable_flag % repo)
49+
try:
50+
self._exec_cmd_chroot(cmd)
51+
LOG.info("Enabled repository '%s' using %s",
52+
repo, config_manager)
53+
except exception.CoriolisException:
54+
LOG.warning(f"Failed to enable repository {repo}. "
55+
f"Error was: {utils.get_exception_details()}")

coriolis/osmorphing/redhat.py

Lines changed: 28 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -178,11 +178,13 @@ def get_installed_packages(self):
178178
LOG.trace(utils.get_exception_details())
179179
self.installed_packages = []
180180

181-
def _yum_install(self, package_names, enable_repos=[]):
181+
def _yum_install(self, package_names):
182182
try:
183-
yum_cmd = 'yum install %s -y%s' % (
183+
yum_cmd = 'yum install %s -y %s %s' % (
184184
" ".join(package_names),
185-
"".join([" --enablerepo=%s" % r for r in enable_repos]))
185+
"--setopt=strict=1",
186+
"--setopt=skip_missing_names_on_install=0"
187+
)
186188
self._exec_cmd_chroot(yum_cmd)
187189
except exception.CoriolisException as err:
188190
raise exception.FailedPackageInstallationException(
@@ -204,56 +206,29 @@ def _yum_clean_all(self):
204206
if self._test_path('var/cache/yum'):
205207
self._exec_cmd_chroot("rm -rf /var/cache/yum")
206208

207-
def _find_yum_repos(self, repos_to_enable=[]):
208-
"""
209-
Looks for required repositories passed as `repos_to_enable` in
210-
/etc/yum.repos.d and returns the found repository names, so they can
211-
be temporarily enabled when installing packages using yum.
212-
213-
Yum only looks for repos in files with '.repo' extension, anything
214-
else gets ignored, therefore this method should filter files by that
215-
extension.
216-
217-
Also, yum repository names might be different in some guest releases,
218-
but still be similar. Therefore, repo name substrings should ideally be
219-
passed in `repos_to_enable`. For example, we might be looking for repo
220-
name 'ol7_latest', but the guest has it named as 'public_ol7_latest' in
221-
the repo file.
222-
"""
223-
found_repos = []
209+
def _get_repos_to_enable(self):
210+
return []
224211

225-
reposdir_path = 'etc/yum.repos.d'
212+
def enable_repos(self, repo_names):
213+
"""Enable repositories using subscription-manager for
214+
Red Hat Enterprise Linux.
226215
227-
repofiles = [
228-
f for f in self._list_dir(reposdir_path) if f.endswith('.repo')]
229-
installed_repos = []
230-
for file in repofiles:
231-
path = os.path.join(reposdir_path, file)
232-
try:
233-
content = self._read_file_sudo(path)
234-
except Exception as e:
235-
LOG.warning(
236-
"Could not read yum repository file %s: %s", path, e)
237-
continue
238-
for line in content.splitlines():
239-
m = re.match(r'^\[(.+)\]$', line)
240-
if m:
241-
installed_repos.append(m.group(1))
242-
243-
for repo in repos_to_enable:
244-
available_repos = [ir for ir in installed_repos if repo in ir]
245-
available_repos.sort(key=len)
246-
if available_repos:
247-
found_repos.append(available_repos[0])
248-
else:
249-
LOG.warn(
250-
"Could not find yum repository while searching for "
251-
"repositories to enable: %s.", repo)
252-
253-
return found_repos
216+
This method should be overridden by subclasses that use different
217+
repository management tools.
218+
"""
219+
if not repo_names:
220+
return
254221

255-
def _get_repos_to_enable(self):
256-
return []
222+
# RHEL uses subscription-manager for all versions
223+
for repo in repo_names:
224+
cmd = 'subscription-manager repos --enable=%s' % repo
225+
try:
226+
self._exec_cmd_chroot(cmd)
227+
LOG.info("Enabled repository '%s' using subscription-manager",
228+
repo)
229+
except exception.CoriolisException:
230+
LOG.warning(f"Failed to enable repository {repo}. "
231+
f"Error was: {utils.get_exception_details()}")
257232

258233
def pre_packages_install(self, package_names):
259234
super(BaseRedHatMorphingTools, self).pre_packages_install(
@@ -271,8 +246,9 @@ def post_packages_install(self, package_names):
271246
package_names)
272247

273248
def install_packages(self, package_names):
274-
enable_repos = self._get_repos_to_enable()
275-
self._yum_install(package_names, enable_repos)
249+
repos_to_enable = self._get_repos_to_enable()
250+
self.enable_repos(repos_to_enable)
251+
self._yum_install(package_names)
276252

277253
def uninstall_packages(self, package_names):
278254
self._yum_uninstall(package_names)

coriolis/osmorphing/rocky.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,18 @@
11
# Copyright 2023 Cloudbase Solutions Srl
22
# All Rights Reserved.
33

4+
import logging
5+
6+
from coriolis import exception
47
from coriolis.osmorphing import centos
58
from coriolis.osmorphing.osdetect import rocky as rocky_osdetect
9+
from coriolis.taskflow import utils
610

711

812
ROCKY_LINUX_DISTRO_IDENTIFIER = rocky_osdetect.ROCKY_LINUX_DISTRO_IDENTIFIER
913

14+
LOG = logging.getLogger(__name__)
15+
1016

1117
class BaseRockyLinuxMorphingTools(centos.BaseCentOSMorphingTools):
1218

@@ -19,3 +25,23 @@ def check_os_supported(cls, detected_os_info):
1925
return False
2026
return cls._version_supported_util(
2127
detected_os_info['release_version'], minimum=8)
28+
29+
def enable_repos(self, repo_names):
30+
"""Enable repositories for Rocky Linux.
31+
32+
Uses dnf config-manager for all Rocky Linux versions (8+).
33+
"""
34+
if not repo_names:
35+
return
36+
37+
# Rocky Linux only exists as version 8+, always uses dnf
38+
config_manager = 'dnf config-manager'
39+
for repo in repo_names:
40+
cmd = '%s --set-enabled=%s' % (config_manager, repo)
41+
try:
42+
self._exec_cmd_chroot(cmd)
43+
LOG.info("Enabled repository '%s' using %s",
44+
repo, config_manager)
45+
except exception.CoriolisException:
46+
LOG.warning(f"Failed to enable repository {repo}. "
47+
f"Error was: {utils.get_exception_details()}")

0 commit comments

Comments
 (0)