Skip to content

Commit c6f4ac9

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

7 files changed

Lines changed: 117 additions & 169 deletions

File tree

coriolis/osmorphing/amazon.py

Lines changed: 21 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,18 @@ 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 using yum-config-manager for Amazon Linux."""
31+
if not repo_names:
32+
return
33+
34+
for repo in repo_names:
35+
cmd = 'yum-config-manager --enable %s' % repo
36+
try:
37+
self._exec_cmd_chroot(cmd)
38+
LOG.info("Enabled repository '%s' using yum-config-manager",
39+
repo)
40+
except exception.CoriolisException:
41+
LOG.warning(f"Failed to enable repository {repo}. "
42+
f"Error was: {utils.get_exception_details()}")

coriolis/osmorphing/centos.py

Lines changed: 20 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,18 @@ 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 using yum-config-manager for CentOS."""
33+
if not repo_names:
34+
return
35+
36+
for repo in repo_names:
37+
cmd = 'yum-config-manager --enable %s' % repo
38+
try:
39+
self._exec_cmd_chroot(cmd)
40+
LOG.info("Enabled repository '%s' using yum-config-manager",
41+
repo)
42+
except exception.CoriolisException:
43+
LOG.warning(f"Failed to enable repository {repo}. "
44+
f"Error was: {utils.get_exception_details()}")

coriolis/osmorphing/oracle.py

Lines changed: 19 additions & 32 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,17 @@ 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)
43-
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
27+
def enable_repos(self, repo_names):
28+
"""Enable repositories using yum-config-manager for Oracle Linux."""
29+
if not repo_names:
30+
return
31+
32+
for repo in repo_names:
33+
cmd = 'yum-config-manager --enable %s' % repo
34+
try:
35+
self._exec_cmd_chroot(cmd)
36+
LOG.info("Enabled repository '%s' using yum-config-manager",
37+
repo)
38+
except exception.CoriolisException:
39+
LOG.warning(f"Failed to enable repository {repo}. "
40+
f"Error was: {utils.get_exception_details()}")

coriolis/osmorphing/redhat.py

Lines changed: 27 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,28 @@ 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+
for repo in repo_names:
223+
cmd = 'subscription-manager repos --enable=%s' % repo
224+
try:
225+
self._exec_cmd_chroot(cmd)
226+
LOG.info("Enabled repository '%s' using subscription-manager",
227+
repo)
228+
except exception.CoriolisException:
229+
LOG.warning(f"Failed to enable repository {repo}. "
230+
f"Error was: {utils.get_exception_details()}")
257231

258232
def pre_packages_install(self, package_names):
259233
super(BaseRedHatMorphingTools, self).pre_packages_install(
@@ -271,8 +245,9 @@ def post_packages_install(self, package_names):
271245
package_names)
272246

273247
def install_packages(self, package_names):
274-
enable_repos = self._get_repos_to_enable()
275-
self._yum_install(package_names, enable_repos)
248+
repos_to_enable = self._get_repos_to_enable()
249+
self.enable_repos(repos_to_enable)
250+
self._yum_install(package_names)
276251

277252
def uninstall_packages(self, package_names):
278253
self._yum_uninstall(package_names)

coriolis/osmorphing/rocky.py

Lines changed: 22 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+
from sys import exception
6+
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,19 @@ 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 using dnf config-manager for
31+
Rocky based systems."""
32+
if not repo_names:
33+
return
34+
35+
for repo in repo_names:
36+
cmd = 'dnf config-manager --set-enabled=%s' % repo
37+
try:
38+
self._exec_cmd_chroot(cmd)
39+
LOG.info("Enabled repository '%s' using dnf config-manager",
40+
repo)
41+
except exception.CoriolisException:
42+
LOG.warning(f"Failed to enable repository {repo}. "
43+
f"Error was: {utils.get_exception_details()}")

coriolis/tests/osmorphing/test_oracle.py

Lines changed: 0 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,8 @@
33

44
from unittest import mock
55

6-
from coriolis.osmorphing import base
76
from coriolis.osmorphing import oracle
87
from coriolis.osmorphing.osdetect import oracle as oracle_detect
9-
from coriolis.osmorphing import redhat
108
from coriolis.tests import test_base
119

1210

@@ -40,53 +38,3 @@ def test_check_os_not_supported(self):
4038
self.detected_os_info)
4139

4240
self.assertFalse(result)
43-
44-
@mock.patch.object(base.BaseLinuxOSMorphingTools, '_exec_cmd_chroot')
45-
@mock.patch.object(redhat.BaseRedHatMorphingTools, '_find_yum_repos')
46-
@mock.patch.object(redhat.BaseRedHatMorphingTools, '_yum_install')
47-
def test__get_oracle_repos(self, mock_yum_install, mock_find_yum_repos,
48-
mock_exec_cmd_chroot):
49-
self.oracle_morphing_tools._version = '10'
50-
51-
result = self.oracle_morphing_tools._get_oracle_repos()
52-
53-
self.assertEqual(result, mock_find_yum_repos.return_value)
54-
55-
mock_find_yum_repos.assert_has_calls([
56-
mock.call(["ol10_baseos_latest"]),
57-
mock.call([
58-
"ol10_baseos_latest",
59-
"ol10_appstream",
60-
"ol10_addons",
61-
"ol10_UEKR8"
62-
]),
63-
])
64-
mock_yum_install.assert_called_once_with(
65-
['oraclelinux-release-el10'], mock_find_yum_repos.return_value)
66-
mock_exec_cmd_chroot.assert_not_called()
67-
68-
@mock.patch.object(base.BaseLinuxOSMorphingTools, '_exec_cmd_chroot')
69-
@mock.patch.object(redhat.BaseRedHatMorphingTools, '_find_yum_repos')
70-
@mock.patch.object(redhat.BaseRedHatMorphingTools, '_yum_install')
71-
@mock.patch.object(oracle.uuid, 'uuid4')
72-
def test__get_oracle_repos_major_version_lt_8(
73-
self, mock_uuid4, mock_yum_install, mock_find_yum_repos,
74-
mock_exec_cmd_chroot):
75-
result = self.oracle_morphing_tools._get_oracle_repos()
76-
77-
self.assertEqual(result, mock_find_yum_repos.return_value)
78-
79-
mock_find_yum_repos.assert_called_once_with([
80-
"ol6_software_collections",
81-
"ol6_addons",
82-
"ol6_UEKR",
83-
"ol6_latest"
84-
])
85-
mock_yum_install.assert_not_called()
86-
mock_exec_cmd_chroot.assert_has_calls([
87-
mock.call(
88-
"curl -L http://public-yum.oracle.com/public-yum-ol6.repo "
89-
"-o /etc/yum.repos.d/%s.repo" % mock_uuid4.return_value),
90-
mock.call('sed -i "s/^enabled=1$/enabled=0/g" %s' % (
91-
"/etc/yum.repos.d/%s.repo" % mock_uuid4.return_value))
92-
])

0 commit comments

Comments
 (0)