From 4fd509e350bf6ff3fe3f7685054812cf2bfccf59 Mon Sep 17 00:00:00 2001 From: wangzhe Date: Thu, 6 Jul 2023 20:59:32 +0800 Subject: [PATCH] Remove extra kernel package. Signed-off-by: wangzhe --- .../kernel/checkinstalledkernels/actor.py | 27 +++++++++++++-- .../libraries/checkinstalledkernels.py | 34 +++++++++++++++---- 2 files changed, 53 insertions(+), 8 deletions(-) diff --git a/repos/system_upgrade/el7toel8/actors/kernel/checkinstalledkernels/actor.py b/repos/system_upgrade/el7toel8/actors/kernel/checkinstalledkernels/actor.py index dba174e2..1c78b529 100644 --- a/repos/system_upgrade/el7toel8/actors/kernel/checkinstalledkernels/actor.py +++ b/repos/system_upgrade/el7toel8/actors/kernel/checkinstalledkernels/actor.py @@ -3,7 +3,8 @@ from leapp.models import InstalledRedHatSignedRPM from leapp.tags import IPUWorkflowTag, ChecksPhaseTag from leapp.reporting import Report from leapp.libraries.actor import checkinstalledkernels - +from leapp.dialogs import Dialog +from leapp.dialogs.components import BooleanComponent class CheckInstalledKernels(Actor): """ @@ -34,5 +35,27 @@ class CheckInstalledKernels(Actor): produces = (Report,) tags = (IPUWorkflowTag, ChecksPhaseTag) + dialogs = ( + Dialog( + scope='remove_extra_kernel', + reason='Confirmation', + components=( + BooleanComponent( + key='confirm', + label='Remove extra kernel? ' + 'If no, the upgrade process will be interrupted.', + description='Newest installed kernel not in use.', + default=False, + reason='To ensure a stable upgrade, the machine needs to be ' + 'booted into the latest installed kernel.' + ), + ) + ), + ) + + def is_confirm(self): + answer = self.get_answers(self.dialogs[0]) + return answer.get('confirm', False) + def process(self): - checkinstalledkernels.process() + checkinstalledkernels.process(self.is_confirm) diff --git a/repos/system_upgrade/el7toel8/actors/kernel/checkinstalledkernels/libraries/checkinstalledkernels.py b/repos/system_upgrade/el7toel8/actors/kernel/checkinstalledkernels/libraries/checkinstalledkernels.py index 134d1aad..3c0ccfa8 100644 --- a/repos/system_upgrade/el7toel8/actors/kernel/checkinstalledkernels/libraries/checkinstalledkernels.py +++ b/repos/system_upgrade/el7toel8/actors/kernel/checkinstalledkernels/libraries/checkinstalledkernels.py @@ -16,7 +16,7 @@ from leapp.exceptions import StopActorExecutionError from leapp.libraries.common.config import architecture, version from leapp.libraries.stdlib import api from leapp.models import InstalledRedHatSignedRPM - +import subprocess def get_current_kernel_version(): """ @@ -87,21 +87,34 @@ def get_newest_evr(pkgs): return newest_evr -def process(): +def get_newer_evr(pkgs, current_evr): + if not pkgs: + return None + + newer_evr = [] + rpms_evr = _get_pkgs_evr(pkgs) + for pkg in rpms_evr: + if labelCompare(current_evr, pkg) < 0: + newer_evr.append(pkg) + print(newer_evr) + return newer_evr + + +def process(is_confirm): kernel_name = 'kernel' if version.is_rhel_realtime(): api.current_logger().info('The Real Time kernel boot detected.') kernel_name = 'kernel-rt' - pkgs = get_pkgs(kernel_name) - if not pkgs: + all_kernel_pkgs = get_pkgs(kernel_name) + if not all_kernel_pkgs: # Hypothatical, user is not allowed to install any kernel that is not signed by RH # In case we would like to be cautious, we could check whether there are no other # kernels installed as well. api.current_logger().error('Cannot find any installed kernel signed by Red Hat.') raise StopActorExecutionError('Cannot find any installed kernel signed by Red Hat.') - if len(pkgs) > 1 and architecture.matches_architecture(architecture.ARCH_S390X): + if len(all_kernel_pkgs) > 1 and architecture.matches_architecture(architecture.ARCH_S390X): # It's temporary solution, so no need to try automatize everything. title = 'Multiple kernels installed' summary = ('The upgrade process does not handle well the case when multiple kernels' @@ -120,12 +133,21 @@ def process(): ]) current_evr = get_current_kernel_evr() - newest_evr = get_newest_evr(pkgs) + newest_evr = get_newest_evr(all_kernel_pkgs) + newer_evr = get_newer_evr(all_kernel_pkgs, current_evr) api.current_logger().debug('Current kernel EVR: {}'.format(current_evr)) api.current_logger().debug('Newest kernel EVR: {}'.format(newest_evr)) + api.current_logger().debug('Newer kernel EVR: {}'.format(newer_evr)) if current_evr != newest_evr: + if len(newer_evr) > 0 and is_confirm(): + for pkg in newer_evr: + pkg_str = kernel_name + '-' + pkg[1] + "-" + pkg[2] + command = ['yum', 'remove', '-y'] + [pkg_str] + subprocess.call(command) + return + title = 'Newest installed kernel not in use' summary = ('To ensure a stable upgrade, the machine needs to be' ' booted into the latest installed kernel.') -- Gitee