Skip to content

Commit 9b5e3f6

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

6 files changed

Lines changed: 92 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,17 @@
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
69

710

811
AMAZON_DISTRO_NAME_IDENTIFIER = amazon_detect.AMAZON_DISTRO_NAME
912

13+
LOG = logging.getLogger(__name__)
14+
1015

1116
class BaseAmazonLinuxOSMorphingTools(redhat.BaseRedHatMorphingTools):
1217

@@ -19,3 +24,19 @@ def check_os_supported(cls, detected_os_info):
1924
return False
2025
return cls._version_supported_util(
2126
detected_os_info['release_version'], minimum=2)
27+
28+
def enable_repos(self, repo_names):
29+
"""Enable repositories using yum-config-manager for Amazon Linux."""
30+
if not repo_names:
31+
return
32+
33+
for repo in repo_names:
34+
cmd = 'yum-config-manager --enable %s' % repo
35+
try:
36+
self._exec_cmd_chroot(cmd)
37+
LOG.info("Enabled repository '%s' using yum-config-manager",
38+
repo)
39+
except exception.CoriolisException as err:
40+
LOG.warning(
41+
"Failed to enable repository '%s' with: %s",
42+
repo, err)

coriolis/osmorphing/centos.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,18 @@
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
79

810

911
CENTOS_DISTRO_IDENTIFIER = centos_detect.CENTOS_DISTRO_IDENTIFIER
1012
CENTOS_STREAM_DISTRO_IDENTIFIER = centos_detect.CENTOS_STREAM_DISTRO_IDENTIFIER
1113

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

1317
class BaseCentOSMorphingTools(redhat.BaseRedHatMorphingTools):
1418

@@ -22,3 +26,19 @@ def check_os_supported(cls, detected_os_info):
2226
return False
2327
return cls._version_supported_util(
2428
detected_os_info['release_version'], minimum=6)
29+
30+
def enable_repos(self, repo_names):
31+
"""Enable repositories using yum-config-manager for CentOS."""
32+
if not repo_names:
33+
return
34+
35+
for repo in repo_names:
36+
cmd = 'yum-config-manager --enable %s' % repo
37+
try:
38+
self._exec_cmd_chroot(cmd)
39+
LOG.info("Enabled repository '%s' using yum-config-manager",
40+
repo)
41+
except exception.CoriolisException as err:
42+
LOG.warning(
43+
"Failed to enable repository '%s' with: %s",
44+
repo, err)

coriolis/osmorphing/oracle.py

Lines changed: 19 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
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
89

910

1011
ORACLE_DISTRO_IDENTIFIER = oracle_detect.ORACLE_DISTRO_IDENTIFIER
1112

13+
LOG = logging.getLogger(__name__)
14+
1215

1316
class BaseOracleMorphingTools(redhat.BaseRedHatMorphingTools):
1417

@@ -20,34 +23,18 @@ def check_os_supported(cls, detected_os_info):
2023
return cls._version_supported_util(
2124
detected_os_info['release_version'], minimum=6)
2225

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
26+
def enable_repos(self, repo_names):
27+
"""Enable repositories using yum-config-manager for Oracle Linux."""
28+
if not repo_names:
29+
return
30+
31+
for repo in repo_names:
32+
cmd = 'yum-config-manager --enable %s' % repo
33+
try:
34+
self._exec_cmd_chroot(cmd)
35+
LOG.info("Enabled repository '%s' using yum-config-manager",
36+
repo)
37+
except exception.CoriolisException as err:
38+
LOG.warning(
39+
"Failed to enable repository '%s' with: %s",
40+
repo, err)

coriolis/osmorphing/redhat.py

Lines changed: 24 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -179,11 +179,9 @@ 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' % (
185-
" ".join(package_names),
186-
"".join([" --enablerepo=%s" % r for r in enable_repos]))
184+
yum_cmd = 'yum install %s -y' % " ".join(package_names)
187185
self._exec_cmd_chroot(yum_cmd)
188186
except exception.CoriolisException as err:
189187
raise exception.FailedPackageInstallationException(
@@ -205,56 +203,29 @@ def _yum_clean_all(self):
205203
if self._test_path('var/cache/yum'):
206204
self._exec_cmd_chroot("rm -rf /var/cache/yum")
207205

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 = []
206+
def _get_repos_to_enable(self):
207+
return []
225208

226-
reposdir_path = 'etc/yum.repos.d'
209+
def enable_repos(self, repo_names):
210+
"""Enable repositories using subscription-manager for
211+
Red Hat Enterprise Linux.
227212
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)
213+
This method should be overridden by subclasses that use different
214+
repository management tools.
215+
"""
216+
if not repo_names:
217+
return
218+
219+
for repo in repo_names:
220+
cmd = 'subscription-manager repos --enable=%s' % repo
233221
try:
234-
content = self._read_file_sudo(path).decode()
235-
except Exception as e:
222+
self._exec_cmd_chroot(cmd)
223+
LOG.info("Enabled repository '%s' using subscription-manager",
224+
repo)
225+
except exception.CoriolisException as err:
236226
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
255-
256-
def _get_repos_to_enable(self):
257-
return []
227+
"Failed to enable repository '%s' with: %s",
228+
repo, err)
258229

259230
def pre_packages_install(self, package_names):
260231
super(BaseRedHatMorphingTools, self).pre_packages_install(
@@ -272,8 +243,9 @@ def post_packages_install(self, package_names):
272243
package_names)
273244

274245
def install_packages(self, package_names):
275-
enable_repos = self._get_repos_to_enable()
276-
self._yum_install(package_names, enable_repos)
246+
repos_to_enable = self._get_repos_to_enable()
247+
self.enable_repos(repos_to_enable)
248+
self._yum_install(package_names)
277249

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