189 lines
7.7 KiB
Diff
189 lines
7.7 KiB
Diff
From bab105d15a0f848e341cd1b4ade4e4e7b3ab38aa Mon Sep 17 00:00:00 2001
|
|
From: mreznik <mreznik@redhat.com>
|
|
Date: Fri, 25 Nov 2022 09:53:53 +0100
|
|
Subject: [PATCH 59/63] Enable disabling dnf plugins in the dnfcnfig library
|
|
|
|
When on AWS, we need to disable the "amazon-id" plugin during the
|
|
upgrade stage as we do not have network up and running there yet.
|
|
Moreover, even with the network up, we do already have all the data
|
|
cached so further communication with its backend could invalidate
|
|
the data.
|
|
---
|
|
.../common/libraries/dnfconfig.py | 26 +++++++++----
|
|
.../common/libraries/dnfplugin.py | 38 ++++++++++++++++---
|
|
2 files changed, 51 insertions(+), 13 deletions(-)
|
|
|
|
diff --git a/repos/system_upgrade/common/libraries/dnfconfig.py b/repos/system_upgrade/common/libraries/dnfconfig.py
|
|
index 64d6c204..5b8180f0 100644
|
|
--- a/repos/system_upgrade/common/libraries/dnfconfig.py
|
|
+++ b/repos/system_upgrade/common/libraries/dnfconfig.py
|
|
@@ -30,15 +30,21 @@ def _strip_split(data, sep, maxsplit=-1):
|
|
return [item.strip() for item in data.split(sep, maxsplit)]
|
|
|
|
|
|
-def _get_main_dump(context):
|
|
+def _get_main_dump(context, disable_plugins):
|
|
"""
|
|
Return the dnf configuration dump of main options for the given context.
|
|
|
|
Returns the list of lines after the line with "[main]" section
|
|
"""
|
|
|
|
+ cmd = ['dnf', 'config-manager', '--dump']
|
|
+
|
|
+ if disable_plugins:
|
|
+ for plugin in disable_plugins:
|
|
+ cmd += ['--disableplugin', plugin]
|
|
+
|
|
try:
|
|
- data = context.call(['dnf', 'config-manager', '--dump'], split=True)['stdout']
|
|
+ data = context.call(cmd, split=True)['stdout']
|
|
except CalledProcessError as e:
|
|
api.current_logger().error('Cannot obtain the dnf configuration')
|
|
raise StopActorExecutionError(
|
|
@@ -73,18 +79,18 @@ def _get_main_dump(context):
|
|
return output_data
|
|
|
|
|
|
-def _get_excluded_pkgs(context):
|
|
+def _get_excluded_pkgs(context, disable_plugins):
|
|
"""
|
|
Return the list of excluded packages for DNF in the given context.
|
|
|
|
It shouldn't be used on the source system. It is expected this functions
|
|
is called only in the target userspace container or on the target system.
|
|
"""
|
|
- pkgs = _strip_split(_get_main_dump(context).get('exclude', ''), ',')
|
|
+ pkgs = _strip_split(_get_main_dump(context, disable_plugins).get('exclude', ''), ',')
|
|
return [i for i in pkgs if i]
|
|
|
|
|
|
-def _set_excluded_pkgs(context, pkglist):
|
|
+def _set_excluded_pkgs(context, pkglist, disable_plugins):
|
|
"""
|
|
Configure DNF to exclude packages in the given list
|
|
|
|
@@ -93,6 +99,10 @@ def _set_excluded_pkgs(context, pkglist):
|
|
exclude = 'exclude={}'.format(','.join(pkglist))
|
|
cmd = ['dnf', 'config-manager', '--save', '--setopt', exclude]
|
|
|
|
+ if disable_plugins:
|
|
+ for plugin in disable_plugins:
|
|
+ cmd += ['--disableplugin', plugin]
|
|
+
|
|
try:
|
|
context.call(cmd)
|
|
except CalledProcessError:
|
|
@@ -101,7 +111,7 @@ def _set_excluded_pkgs(context, pkglist):
|
|
api.current_logger().debug('The DNF configuration has been updated to exclude leapp packages.')
|
|
|
|
|
|
-def exclude_leapp_rpms(context):
|
|
+def exclude_leapp_rpms(context, disable_plugins):
|
|
"""
|
|
Ensure the leapp RPMs are excluded from any DNF transaction.
|
|
|
|
@@ -112,5 +122,5 @@ def exclude_leapp_rpms(context):
|
|
So user will have to drop these packages from the exclude after the
|
|
upgrade.
|
|
"""
|
|
- to_exclude = list(set(_get_excluded_pkgs(context) + get_leapp_packages()))
|
|
- _set_excluded_pkgs(context, to_exclude)
|
|
+ to_exclude = list(set(_get_excluded_pkgs(context, disable_plugins) + get_leapp_packages()))
|
|
+ _set_excluded_pkgs(context, to_exclude, disable_plugins)
|
|
diff --git a/repos/system_upgrade/common/libraries/dnfplugin.py b/repos/system_upgrade/common/libraries/dnfplugin.py
|
|
index 7a15abc4..7f541c18 100644
|
|
--- a/repos/system_upgrade/common/libraries/dnfplugin.py
|
|
+++ b/repos/system_upgrade/common/libraries/dnfplugin.py
|
|
@@ -299,6 +299,8 @@ def perform_transaction_install(target_userspace_info, storage_info, used_repos,
|
|
Performs the actual installation with the DNF rhel-upgrade plugin using the target userspace
|
|
"""
|
|
|
|
+ stage = 'upgrade'
|
|
+
|
|
# These bind mounts are performed by systemd-nspawn --bind parameters
|
|
bind_mounts = [
|
|
'/:/installroot',
|
|
@@ -337,22 +339,28 @@ def perform_transaction_install(target_userspace_info, storage_info, used_repos,
|
|
# communicate with udev
|
|
cmd_prefix = ['nsenter', '--ipc=/installroot/proc/1/ns/ipc']
|
|
|
|
+ disable_plugins = []
|
|
+ if plugin_info:
|
|
+ for info in plugin_info:
|
|
+ if stage in info.disable_in:
|
|
+ disable_plugins += [info.name]
|
|
+
|
|
# we have to ensure the leapp packages will stay untouched
|
|
# Note: this is the most probably duplicate action - it should be already
|
|
# set like that, however seatbelt is a good thing.
|
|
- dnfconfig.exclude_leapp_rpms(context)
|
|
+ dnfconfig.exclude_leapp_rpms(context, disable_plugins)
|
|
|
|
if get_target_major_version() == '9':
|
|
_rebuild_rpm_db(context, root='/installroot')
|
|
_transaction(
|
|
- context=context, stage='upgrade', target_repoids=target_repoids, plugin_info=plugin_info, tasks=tasks,
|
|
+ context=context, stage=stage, target_repoids=target_repoids, plugin_info=plugin_info, tasks=tasks,
|
|
cmd_prefix=cmd_prefix
|
|
)
|
|
|
|
# we have to ensure the leapp packages will stay untouched even after the
|
|
# upgrade is fully finished (it cannot be done before the upgrade
|
|
# on the host as the config-manager plugin is available since rhel-8)
|
|
- dnfconfig.exclude_leapp_rpms(mounting.NotIsolatedActions(base_dir='/'))
|
|
+ dnfconfig.exclude_leapp_rpms(mounting.NotIsolatedActions(base_dir='/'), disable_plugins=disable_plugins)
|
|
|
|
|
|
@contextlib.contextmanager
|
|
@@ -377,10 +385,20 @@ def perform_transaction_check(target_userspace_info,
|
|
"""
|
|
Perform DNF transaction check using our plugin
|
|
"""
|
|
+
|
|
+ stage = 'check'
|
|
+
|
|
with _prepare_perform(used_repos=used_repos, target_userspace_info=target_userspace_info, xfs_info=xfs_info,
|
|
storage_info=storage_info, target_iso=target_iso) as (context, overlay, target_repoids):
|
|
apply_workarounds(overlay.nspawn())
|
|
- dnfconfig.exclude_leapp_rpms(context)
|
|
+
|
|
+ disable_plugins = []
|
|
+ if plugin_info:
|
|
+ for info in plugin_info:
|
|
+ if stage in info.disable_in:
|
|
+ disable_plugins += [info.name]
|
|
+
|
|
+ dnfconfig.exclude_leapp_rpms(context, disable_plugins)
|
|
_transaction(
|
|
context=context, stage='check', target_repoids=target_repoids, plugin_info=plugin_info, tasks=tasks
|
|
)
|
|
@@ -397,13 +415,23 @@ def perform_rpm_download(target_userspace_info,
|
|
"""
|
|
Perform RPM download including the transaction test using dnf with our plugin
|
|
"""
|
|
+
|
|
+ stage = 'download'
|
|
+
|
|
with _prepare_perform(used_repos=used_repos,
|
|
target_userspace_info=target_userspace_info,
|
|
xfs_info=xfs_info,
|
|
storage_info=storage_info,
|
|
target_iso=target_iso) as (context, overlay, target_repoids):
|
|
+
|
|
+ disable_plugins = []
|
|
+ if plugin_info:
|
|
+ for info in plugin_info:
|
|
+ if stage in info.disable_in:
|
|
+ disable_plugins += [info.name]
|
|
+
|
|
apply_workarounds(overlay.nspawn())
|
|
- dnfconfig.exclude_leapp_rpms(context)
|
|
+ dnfconfig.exclude_leapp_rpms(context, disable_plugins)
|
|
_transaction(
|
|
context=context, stage='download', target_repoids=target_repoids, plugin_info=plugin_info, tasks=tasks,
|
|
test=True, on_aws=on_aws
|
|
--
|
|
2.39.0
|
|
|