Skip to content

Commit d2ec1a1

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

7 files changed

Lines changed: 180 additions & 169 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: 36 additions & 53 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(
@@ -200,60 +202,40 @@ def _yum_uninstall(self, package_names):
200202
error=str(err)) from err
201203

202204
def _yum_clean_all(self):
203-
self._exec_cmd_chroot("yum clean all")
205+
try:
206+
self._exec_cmd_chroot("yum clean all")
207+
except exception.CoriolisException:
208+
# On systems with no enabled repos, yum clean fails with
209+
# "There are no enabled repos". This is non-fatal since
210+
# there is nothing to clean.
211+
LOG.warning("yum clean all failed (e.g. no enabled repos), "
212+
"continuing. Error: %s", utils.get_exception_details())
204213
if self._test_path('var/cache/yum'):
205214
self._exec_cmd_chroot("rm -rf /var/cache/yum")
206215

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 = []
216+
def _get_repos_to_enable(self):
217+
return []
224218

225-
reposdir_path = 'etc/yum.repos.d'
219+
def enable_repos(self, repo_names):
220+
"""Enable repositories using subscription-manager for
221+
Red Hat Enterprise Linux.
226222
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
223+
This method should be overridden by subclasses that use different
224+
repository management tools.
225+
"""
226+
if not repo_names:
227+
return
254228

255-
def _get_repos_to_enable(self):
256-
return []
229+
# RHEL uses subscription-manager for all versions
230+
for repo in repo_names:
231+
cmd = 'subscription-manager repos --enable=%s' % repo
232+
try:
233+
self._exec_cmd_chroot(cmd)
234+
LOG.info("Enabled repository '%s' using subscription-manager",
235+
repo)
236+
except exception.CoriolisException:
237+
LOG.warning(f"Failed to enable repository {repo}. "
238+
f"Error was: {utils.get_exception_details()}")
257239

258240
def pre_packages_install(self, package_names):
259241
super(BaseRedHatMorphingTools, self).pre_packages_install(
@@ -271,8 +253,9 @@ def post_packages_install(self, package_names):
271253
package_names)
272254

273255
def install_packages(self, package_names):
274-
enable_repos = self._get_repos_to_enable()
275-
self._yum_install(package_names, enable_repos)
256+
repos_to_enable = self._get_repos_to_enable()
257+
self.enable_repos(repos_to_enable)
258+
self._yum_install(package_names)
276259

277260
def uninstall_packages(self, package_names):
278261
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)