248 lines
11 KiB
Diff
248 lines
11 KiB
Diff
From f7c82a2468c1dae62d3beb94a3b1271b3b396ea5 Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Peter=20Mo=C4=8D=C3=A1ry?=
|
|
<68905580+PeterMocary@users.noreply.github.com>
|
|
Date: Fri, 27 Jan 2023 13:53:59 +0100
|
|
Subject: [PATCH 75/75] Add mapping based on the installed content (#967)
|
|
|
|
* Add mapping based on the installed content
|
|
|
|
Repositories covered by repositories mapping, that are used by installed
|
|
RPM packages, are used to evaluate expected target repositories on top
|
|
of evaluating the target repositories from enabled repositories. This
|
|
covers repositories which might be disabled when upgrading, but should
|
|
be used to upgrade installed packages during the upgrade.
|
|
|
|
* Cover with a unit test
|
|
|
|
Co-authored-by: Inessa Vasilevskaya <ivasilev@redhat.com>
|
|
---
|
|
.../common/actors/setuptargetrepos/actor.py | 2 +
|
|
.../libraries/setuptargetrepos.py | 57 ++++++++++++-------
|
|
.../tests/test_setuptargetrepos.py | 40 +++++++++++--
|
|
3 files changed, 75 insertions(+), 24 deletions(-)
|
|
|
|
diff --git a/repos/system_upgrade/common/actors/setuptargetrepos/actor.py b/repos/system_upgrade/common/actors/setuptargetrepos/actor.py
|
|
index 47724f0d..767fa00c 100644
|
|
--- a/repos/system_upgrade/common/actors/setuptargetrepos/actor.py
|
|
+++ b/repos/system_upgrade/common/actors/setuptargetrepos/actor.py
|
|
@@ -2,6 +2,7 @@ from leapp.actors import Actor
|
|
from leapp.libraries.actor import setuptargetrepos
|
|
from leapp.models import (
|
|
CustomTargetRepository,
|
|
+ InstalledRPM,
|
|
RepositoriesBlacklisted,
|
|
RepositoriesFacts,
|
|
RepositoriesMapping,
|
|
@@ -25,6 +26,7 @@ class SetupTargetRepos(Actor):
|
|
|
|
name = 'setuptargetrepos'
|
|
consumes = (CustomTargetRepository,
|
|
+ InstalledRPM,
|
|
RepositoriesSetupTasks,
|
|
RepositoriesMapping,
|
|
RepositoriesFacts,
|
|
diff --git a/repos/system_upgrade/common/actors/setuptargetrepos/libraries/setuptargetrepos.py b/repos/system_upgrade/common/actors/setuptargetrepos/libraries/setuptargetrepos.py
|
|
index 3f34aedb..4b8405d0 100644
|
|
--- a/repos/system_upgrade/common/actors/setuptargetrepos/libraries/setuptargetrepos.py
|
|
+++ b/repos/system_upgrade/common/actors/setuptargetrepos/libraries/setuptargetrepos.py
|
|
@@ -4,6 +4,7 @@ from leapp.libraries.common.config.version import get_source_major_version
|
|
from leapp.libraries.stdlib import api
|
|
from leapp.models import (
|
|
CustomTargetRepository,
|
|
+ InstalledRPM,
|
|
RepositoriesBlacklisted,
|
|
RepositoriesFacts,
|
|
RepositoriesMapping,
|
|
@@ -20,7 +21,6 @@ def _get_enabled_repoids():
|
|
"""
|
|
Collects repoids of all enabled repositories on the source system.
|
|
|
|
- :param repositories_facts: Iterable of RepositoriesFacts containing info about repositories on the source system.
|
|
:returns: Set of all enabled repository IDs present on the source system.
|
|
:rtype: Set[str]
|
|
"""
|
|
@@ -33,6 +33,14 @@ def _get_enabled_repoids():
|
|
return enabled_repoids
|
|
|
|
|
|
+def _get_repoids_from_installed_packages():
|
|
+ repoids_from_installed_packages = set()
|
|
+ for installed_packages in api.consume(InstalledRPM):
|
|
+ for rpm_package in installed_packages.items:
|
|
+ repoids_from_installed_packages.add(rpm_package.repository)
|
|
+ return repoids_from_installed_packages
|
|
+
|
|
+
|
|
def _get_blacklisted_repoids():
|
|
repos_blacklisted = set()
|
|
for blacklist in api.consume(RepositoriesBlacklisted):
|
|
@@ -58,16 +66,6 @@ def _get_used_repo_dict():
|
|
return used
|
|
|
|
|
|
-def _setup_repomap_handler(src_repoids):
|
|
- repo_mappig_msg = next(api.consume(RepositoriesMapping), RepositoriesMapping())
|
|
- rhui_info = next(api.consume(RHUIInfo), RHUIInfo(provider=''))
|
|
- repomap = setuptargetrepos_repomap.RepoMapDataHandler(repo_mappig_msg, cloud_provider=rhui_info.provider)
|
|
- # TODO(pstodulk): what about skip this completely and keep the default 'ga'..?
|
|
- default_channels = setuptargetrepos_repomap.get_default_repository_channels(repomap, src_repoids)
|
|
- repomap.set_default_channels(default_channels)
|
|
- return repomap
|
|
-
|
|
-
|
|
def _get_mapped_repoids(repomap, src_repoids):
|
|
mapped_repoids = set()
|
|
src_maj_ver = get_source_major_version()
|
|
@@ -78,24 +76,40 @@ def _get_mapped_repoids(repomap, src_repoids):
|
|
|
|
|
|
def process():
|
|
- # load all data / messages
|
|
+ # Load relevant data from messages
|
|
used_repoids_dict = _get_used_repo_dict()
|
|
enabled_repoids = _get_enabled_repoids()
|
|
excluded_repoids = _get_blacklisted_repoids()
|
|
custom_repos = _get_custom_target_repos()
|
|
+ repoids_from_installed_packages = _get_repoids_from_installed_packages()
|
|
|
|
- # TODO(pstodulk): isn't that a potential issue that we map just enabled repos
|
|
- # instead of enabled + used repos??
|
|
- # initialise basic data
|
|
- repomap = _setup_repomap_handler(enabled_repoids)
|
|
- mapped_repoids = _get_mapped_repoids(repomap, enabled_repoids)
|
|
- skipped_repoids = enabled_repoids & set(used_repoids_dict.keys()) - mapped_repoids
|
|
+ # Setup repomap handler
|
|
+ repo_mappig_msg = next(api.consume(RepositoriesMapping), RepositoriesMapping())
|
|
+ rhui_info = next(api.consume(RHUIInfo), RHUIInfo(provider=''))
|
|
+ repomap = setuptargetrepos_repomap.RepoMapDataHandler(repo_mappig_msg, cloud_provider=rhui_info.provider)
|
|
+
|
|
+ # Filter set of repoids from installed packages so that it contains only repoids with mapping
|
|
+ repoids_from_installed_packages_with_mapping = _get_mapped_repoids(repomap, repoids_from_installed_packages)
|
|
+
|
|
+ # Set of repoid that are going to be mapped to target repoids containing enabled repoids and also repoids from
|
|
+ # installed packages that have mapping to prevent missing repositories that are disabled during the upgrade, but
|
|
+ # can be used to upgrade installed packages.
|
|
+ repoids_to_map = enabled_repoids.union(repoids_from_installed_packages_with_mapping)
|
|
|
|
- # Now get the info what should be the target RHEL repositories
|
|
- expected_repos = repomap.get_expected_target_pesid_repos(enabled_repoids)
|
|
+ # Set default repository channels for the repomap
|
|
+ # TODO(pstodulk): what about skip this completely and keep the default 'ga'..?
|
|
+ default_channels = setuptargetrepos_repomap.get_default_repository_channels(repomap, repoids_to_map)
|
|
+ repomap.set_default_channels(default_channels)
|
|
+
|
|
+ # Get target RHEL repoids based on the repomap
|
|
+ expected_repos = repomap.get_expected_target_pesid_repos(repoids_to_map)
|
|
target_rhel_repoids = set()
|
|
for target_pesid, target_pesidrepo in expected_repos.items():
|
|
if not target_pesidrepo:
|
|
+ # NOTE this could happen only for enabled repositories part of the set,
|
|
+ # since the repositories collected from installed packages already contain
|
|
+ # only mappable repoids.
|
|
+
|
|
# With the original repomap data, this should not happen (this should
|
|
# currently point to a problem in our data
|
|
# TODO(pstodulk): add report? inhibitor? what should be in the report?
|
|
@@ -126,6 +140,9 @@ def process():
|
|
custom_repos = [repo for repo in custom_repos if repo.repoid not in excluded_repoids]
|
|
custom_repos = sorted(custom_repos, key=lambda x: x.repoid)
|
|
|
|
+ # produce message about skipped repositories
|
|
+ enabled_repoids_with_mapping = _get_mapped_repoids(repomap, enabled_repoids)
|
|
+ skipped_repoids = enabled_repoids & set(used_repoids_dict.keys()) - enabled_repoids_with_mapping
|
|
if skipped_repoids:
|
|
pkgs = set()
|
|
for repo in skipped_repoids:
|
|
diff --git a/repos/system_upgrade/common/actors/setuptargetrepos/tests/test_setuptargetrepos.py b/repos/system_upgrade/common/actors/setuptargetrepos/tests/test_setuptargetrepos.py
|
|
index 7fd626c7..ac7f49ec 100644
|
|
--- a/repos/system_upgrade/common/actors/setuptargetrepos/tests/test_setuptargetrepos.py
|
|
+++ b/repos/system_upgrade/common/actors/setuptargetrepos/tests/test_setuptargetrepos.py
|
|
@@ -6,6 +6,7 @@ from leapp.libraries.common.testutils import CurrentActorMocked, produce_mocked
|
|
from leapp.libraries.stdlib import api
|
|
from leapp.models import (
|
|
CustomTargetRepository,
|
|
+ InstalledRPM,
|
|
PESIDRepositoryEntry,
|
|
RepoMapEntry,
|
|
RepositoriesBlacklisted,
|
|
@@ -14,9 +15,17 @@ from leapp.models import (
|
|
RepositoriesSetupTasks,
|
|
RepositoryData,
|
|
RepositoryFile,
|
|
+ RPM,
|
|
TargetRepositories
|
|
)
|
|
|
|
+RH_PACKAGER = 'Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>'
|
|
+
|
|
+
|
|
+def mock_package(pkg_name, repository=None):
|
|
+ return RPM(name=pkg_name, version='0.1', release='1.sm01', epoch='1', packager=RH_PACKAGER, arch='noarch',
|
|
+ pgpsig='RSA/SHA256, Mon 01 Jan 1970 00:00:00 AM -03, Key ID 199e2f91fd431d51', repository=repository)
|
|
+
|
|
|
|
def test_minimal_execution(monkeypatch):
|
|
"""
|
|
@@ -103,9 +112,13 @@ def test_repos_mapping(monkeypatch):
|
|
|
|
repos_files = [RepositoryFile(file='/etc/yum.repos.d/redhat.repo', data=repos_data)]
|
|
facts = RepositoriesFacts(repositories=repos_files)
|
|
+ installed_rpms = InstalledRPM(
|
|
+ items=[mock_package('foreman', 'rhel-7-for-x86_64-satellite-extras-rpms'),
|
|
+ mock_package('foreman-proxy', 'nosuch-rhel-7-for-x86_64-satellite-extras-rpms')])
|
|
|
|
repomap = RepositoriesMapping(
|
|
- mapping=[RepoMapEntry(source='rhel7-base', target=['rhel8-baseos', 'rhel8-appstream', 'rhel8-blacklist'])],
|
|
+ mapping=[RepoMapEntry(source='rhel7-base', target=['rhel8-baseos', 'rhel8-appstream', 'rhel8-blacklist']),
|
|
+ RepoMapEntry(source='rhel7-satellite-extras', target=['rhel8-satellite-extras'])],
|
|
repositories=[
|
|
PESIDRepositoryEntry(
|
|
pesid='rhel7-base',
|
|
@@ -143,12 +156,30 @@ def test_repos_mapping(monkeypatch):
|
|
channel='ga',
|
|
rhui=''
|
|
),
|
|
+ PESIDRepositoryEntry(
|
|
+ pesid='rhel7-satellite-extras',
|
|
+ repoid='rhel-7-for-x86_64-satellite-extras-rpms',
|
|
+ major_version='7',
|
|
+ arch='x86_64',
|
|
+ repo_type='rpm',
|
|
+ channel='ga',
|
|
+ rhui=''
|
|
+ ),
|
|
+ PESIDRepositoryEntry(
|
|
+ pesid='rhel8-satellite-extras',
|
|
+ repoid='rhel-8-for-x86_64-satellite-extras-rpms',
|
|
+ major_version='8',
|
|
+ arch='x86_64',
|
|
+ repo_type='rpm',
|
|
+ channel='ga',
|
|
+ rhui=''
|
|
+ ),
|
|
]
|
|
)
|
|
|
|
repos_blacklisted = RepositoriesBlacklisted(repoids=['rhel-8-blacklisted-rpms'])
|
|
|
|
- msgs = [facts, repomap, repos_blacklisted]
|
|
+ msgs = [facts, repomap, repos_blacklisted, installed_rpms]
|
|
|
|
monkeypatch.setattr(api, 'current_actor', CurrentActorMocked(msgs=msgs))
|
|
monkeypatch.setattr(api, 'produce', produce_mocked())
|
|
@@ -157,8 +188,9 @@ def test_repos_mapping(monkeypatch):
|
|
assert api.produce.called
|
|
|
|
rhel_repos = api.produce.model_instances[0].rhel_repos
|
|
- assert len(rhel_repos) == 2
|
|
+ assert len(rhel_repos) == 3
|
|
|
|
produced_rhel_repoids = {repo.repoid for repo in rhel_repos}
|
|
- expected_rhel_repoids = {'rhel-8-for-x86_64-baseos-htb-rpms', 'rhel-8-for-x86_64-appstream-htb-rpms'}
|
|
+ expected_rhel_repoids = {'rhel-8-for-x86_64-baseos-htb-rpms', 'rhel-8-for-x86_64-appstream-htb-rpms',
|
|
+ 'rhel-8-for-x86_64-satellite-extras-rpms'}
|
|
assert produced_rhel_repoids == expected_rhel_repoids
|
|
--
|
|
2.39.0
|
|
|