Skip to content

Commit fc37dec

Browse files
committed
Remove enable_repo from osmorphing for all redhat based OSes
1 parent def53f8 commit fc37dec

6 files changed

Lines changed: 95 additions & 170 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
@@ -179,11 +179,13 @@ def get_installed_packages(self):
179179
LOG.trace(utils.get_exception_details())
180180
self.installed_packages = []
181181

182-
def _yum_install(self, package_names, enable_repos=[]):
182+
def _yum_install(self, package_names):
183183
try:
184-
yum_cmd = 'yum install %s -y%s' % (
184+
yum_cmd = 'yum install %s -y %s %s' % (
185185
" ".join(package_names),
186-
"".join([" --enablerepo=%s" % r for r in enable_repos]))
186+
"--setopt=strict=1",
187+
"--setopt=skip_missing_names_on_install=0"
188+
)
187189
self._exec_cmd_chroot(yum_cmd)
188190
except exception.CoriolisException as err:
189191
raise exception.FailedPackageInstallationException(
@@ -205,56 +207,28 @@ def _yum_clean_all(self):
205207
if self._test_path('var/cache/yum'):
206208
self._exec_cmd_chroot("rm -rf /var/cache/yum")
207209

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

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

256-
def _get_repos_to_enable(self):
257-
return []
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()}")
258232

259233
def pre_packages_install(self, package_names):
260234
super(BaseRedHatMorphingTools, self).pre_packages_install(
@@ -272,8 +246,9 @@ def post_packages_install(self, package_names):
272246
package_names)
273247

274248
def install_packages(self, package_names):
275-
enable_repos = self._get_repos_to_enable()
276-
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)
277252

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

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-
])

coriolis/tests/osmorphing/test_redhat.py

Lines changed: 8 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -325,11 +325,10 @@ def test_get_installed_packages_none(self, mock_exec_cmd_chroot):
325325

326326
@mock.patch.object(base.BaseLinuxOSMorphingTools, '_exec_cmd_chroot')
327327
def test__yum_install(self, mock_exec_cmd_chroot):
328-
self.morphing_tools._yum_install(self.package_names, self.enable_repos)
328+
self.morphing_tools._yum_install(self.package_names)
329329

330330
mock_exec_cmd_chroot.assert_called_once_with(
331-
"yum install package1 package2 -y "
332-
"--enablerepo=repo1 --enablerepo=repo2"
331+
"yum install package1 package2 -y"
333332
)
334333

335334
@mock.patch.object(base.BaseLinuxOSMorphingTools, '_exec_cmd_chroot')
@@ -339,7 +338,7 @@ def test__yum_install_with_exception(self, mock_exec_cmd_chroot):
339338
self.assertRaises(
340339
exception.FailedPackageInstallationException,
341340
self.morphing_tools._yum_install,
342-
self.package_names, self.enable_repos
341+
self.package_names
343342
)
344343

345344
@mock.patch.object(base.BaseLinuxOSMorphingTools, '_exec_cmd_chroot')
@@ -383,33 +382,6 @@ def test__yum_clean_all_path_not_exists(self, mock_test_path,
383382

384383
mock_exec_cmd_chroot.assert_called_once_with("yum clean all")
385384

386-
@mock.patch.object(base.BaseLinuxOSMorphingTools, '_list_dir')
387-
@mock.patch.object(base.BaseLinuxOSMorphingTools, '_read_file_sudo')
388-
def test__find_yum_repos_found(self, mock_read_file_sudo, mock_list_dir):
389-
mock_list_dir.return_value = ['file1.repo', 'file2.repo']
390-
mock_read_file_sudo.return_value = b'[repo1]\n[repo2]'
391-
repos_to_enable = ['repo1']
392-
393-
result = self.morphing_tools._find_yum_repos(repos_to_enable)
394-
395-
mock_read_file_sudo.assert_has_calls([
396-
mock.call('etc/yum.repos.d/file1.repo'),
397-
mock.call('etc/yum.repos.d/file2.repo')
398-
])
399-
400-
self.assertEqual(result, ['repo1'])
401-
402-
@mock.patch.object(base.BaseLinuxOSMorphingTools, '_list_dir')
403-
@mock.patch.object(base.BaseLinuxOSMorphingTools, '_read_file_sudo')
404-
def test__find_yum_repos_not_found(self, mock_read_file_sudo,
405-
mock_list_dir):
406-
mock_list_dir.return_value = ['file1.repo', 'file2.repo']
407-
mock_read_file_sudo.return_value = b'[repo1]\n[repo2]'
408-
repos_to_enable = ['repo3']
409-
410-
with self.assertLogs('coriolis.osmorphing.redhat', level=logging.WARN):
411-
self.morphing_tools._find_yum_repos(repos_to_enable)
412-
413385
@mock.patch.object(redhat.BaseRedHatMorphingTools, '_yum_install')
414386
@mock.patch.object(redhat.BaseRedHatMorphingTools, '_yum_clean_all')
415387
@mock.patch.object(base.BaseLinuxOSMorphingTools, 'pre_packages_install')
@@ -450,14 +422,16 @@ def test_post_packages_install(
450422
mock_post_packages_install.assert_called_once_with(self.package_names)
451423

452424
@mock.patch.object(redhat.BaseRedHatMorphingTools, '_yum_install')
425+
@mock.patch.object(redhat.BaseRedHatMorphingTools, 'enable_repos')
453426
@mock.patch.object(redhat.BaseRedHatMorphingTools, '_get_repos_to_enable')
454427
def test_install_packages(self, mock_get_repos_to_enable,
455-
mock_yum_install):
428+
mock_enable_repos, mock_yum_install):
456429
self.morphing_tools.install_packages(self.package_names)
457430

458431
mock_get_repos_to_enable.assert_called_once()
459-
mock_yum_install.assert_called_once_with(
460-
self.package_names, mock_get_repos_to_enable.return_value)
432+
mock_enable_repos.assert_called_once_with(
433+
mock_get_repos_to_enable.return_value)
434+
mock_yum_install.assert_called_once_with(self.package_names)
461435

462436
@mock.patch.object(redhat.BaseRedHatMorphingTools, '_yum_uninstall')
463437
def test_uninstall_packages(self, mock_yum_uninstall):

0 commit comments

Comments
 (0)