From efe02f1dd8d6711dcb4eb475382568da3c5ae492 Mon Sep 17 00:00:00 2001 From: tomasfratrik Date: Tue, 9 Apr 2024 15:53:57 +0200 Subject: [PATCH] Add unit tests for leftover packages actors and move them to common repo Actors: - checkleftoverpackages - removeleftoverpackages - reportleftoverpackages * Refactor actors code from el7toel8 to common * Put their processes into library * Create unit tests for actors Jira: OAMG-1254 --- .../actors/checkleftoverpackages/actor.py | 21 ++++ .../libraries/checkleftoverpackages.py | 43 +++++++ .../tests/test_checkleftoverpackages.py | 51 ++++++++ .../actors/removeleftoverpackages/actor.py | 21 ++++ .../libraries/removeleftoverpackages.py | 58 +++++++++ .../tests/test_removeleftoverpackages.py | 117 ++++++++++++++++++ .../reportleftoverpackages/actor.py | 23 ++++ .../libraries/reportleftoverpackages.py | 60 +++++++++ .../tests/test_reportleftoverpackages.py | 57 +++++++++ .../actors/checkleftoverpackages/actor.py | 46 ------- .../actors/removeleftoverpackages/actor.py | 56 --------- .../reportleftoverpackages/actor.py | 62 ---------- 12 files changed, 451 insertions(+), 164 deletions(-) create mode 100644 repos/system_upgrade/common/actors/checkleftoverpackages/actor.py create mode 100644 repos/system_upgrade/common/actors/checkleftoverpackages/libraries/checkleftoverpackages.py create mode 100644 repos/system_upgrade/common/actors/checkleftoverpackages/tests/test_checkleftoverpackages.py create mode 100644 repos/system_upgrade/common/actors/removeleftoverpackages/actor.py create mode 100644 repos/system_upgrade/common/actors/removeleftoverpackages/libraries/removeleftoverpackages.py create mode 100644 repos/system_upgrade/common/actors/removeleftoverpackages/tests/test_removeleftoverpackages.py create mode 100644 repos/system_upgrade/common/actors/reportleftoverpackages/reportleftoverpackages/actor.py create mode 100644 repos/system_upgrade/common/actors/reportleftoverpackages/reportleftoverpackages/libraries/reportleftoverpackages.py create mode 100644 repos/system_upgrade/common/actors/reportleftoverpackages/reportleftoverpackages/tests/test_reportleftoverpackages.py delete mode 100644 repos/system_upgrade/el7toel8/actors/checkleftoverpackages/actor.py delete mode 100644 repos/system_upgrade/el7toel8/actors/removeleftoverpackages/actor.py delete mode 100644 repos/system_upgrade/el7toel8/actors/reportleftoverpackages/reportleftoverpackages/actor.py diff --git a/repos/system_upgrade/common/actors/checkleftoverpackages/actor.py b/repos/system_upgrade/common/actors/checkleftoverpackages/actor.py new file mode 100644 index 0000000000..a4e3292341 --- /dev/null +++ b/repos/system_upgrade/common/actors/checkleftoverpackages/actor.py @@ -0,0 +1,21 @@ +from leapp.actors import Actor +from leapp.libraries.actor import checkleftoverpackages +from leapp.models import InstalledUnsignedRPM, LeftoverPackages, TransactionCompleted +from leapp.tags import IPUWorkflowTag, RPMUpgradePhaseTag + + +class CheckLeftoverPackages(Actor): + """ + Check if there are any left over packages from older RHEL version present after upgrade. + + Actor produces message containing these packages. + Message is empty if there are no packages from older system left. + """ + + name = 'check_leftover_packages' + consumes = (TransactionCompleted, InstalledUnsignedRPM) + produces = (LeftoverPackages,) + tags = (RPMUpgradePhaseTag, IPUWorkflowTag) + + def process(self): + checkleftoverpackages.process() diff --git a/repos/system_upgrade/common/actors/checkleftoverpackages/libraries/checkleftoverpackages.py b/repos/system_upgrade/common/actors/checkleftoverpackages/libraries/checkleftoverpackages.py new file mode 100644 index 0000000000..fe0b02b2f9 --- /dev/null +++ b/repos/system_upgrade/common/actors/checkleftoverpackages/libraries/checkleftoverpackages.py @@ -0,0 +1,43 @@ +import re + +from leapp.libraries.common.config.version import get_source_major_version +from leapp.libraries.common.rpms import get_installed_rpms, get_leapp_dep_packages, get_leapp_packages +from leapp.libraries.stdlib import api +from leapp.models import InstalledUnsignedRPM, LeftoverPackages, RPM + + +def process(): + LEAPP_PACKAGES = get_leapp_packages(major_version=[get_source_major_version()]) + LEAPP_DEP_PACKAGES = get_leapp_dep_packages(major_version=[get_source_major_version()]) + installed_rpms = get_installed_rpms() + + if not installed_rpms: + return + + leftover_pkgs_to_remove = LeftoverPackages() + unsigned = [pkg.name for pkg in next(api.consume(InstalledUnsignedRPM), InstalledUnsignedRPM()).items] + + for rpm in installed_rpms: + rpm = rpm.strip() + if not rpm: + continue + name, version, release, epoch, packager, arch, pgpsig = rpm.split('|') + + version_pattern = r'el(\d+)' + match = re.search(version_pattern, release) + + if match: + major_version = match.group(1) + PKGS_NOT_TO_BE_DELETED = set(LEAPP_PACKAGES + LEAPP_DEP_PACKAGES + unsigned) + if int(major_version) <= int(get_source_major_version()) and name not in PKGS_NOT_TO_BE_DELETED: + leftover_pkgs_to_remove.items.append(RPM( + name=name, + version=version, + epoch=epoch, + packager=packager, + arch=arch, + release=release, + pgpsig=pgpsig + )) + + api.produce(leftover_pkgs_to_remove) diff --git a/repos/system_upgrade/common/actors/checkleftoverpackages/tests/test_checkleftoverpackages.py b/repos/system_upgrade/common/actors/checkleftoverpackages/tests/test_checkleftoverpackages.py new file mode 100644 index 0000000000..b948827f70 --- /dev/null +++ b/repos/system_upgrade/common/actors/checkleftoverpackages/tests/test_checkleftoverpackages.py @@ -0,0 +1,51 @@ +import pytest + +from leapp.libraries.actor import checkleftoverpackages +from leapp.libraries.common.testutils import CurrentActorMocked, produce_mocked +from leapp.libraries.stdlib import api +from leapp.models import InstalledUnsignedRPM, LeftoverPackages, RPM + + +@pytest.mark.parametrize( + ('source_major_version', 'rpm_name', 'release', 'expected_to_be_removed'), + ( + (7, 'sed', '7.el7', True), + (8, 'sed', '8.el7', True), + (7, 'gnutls', '8.el8_9.1', False), + (7, 'unsigned', '1.el7', False), + + (7, 'leapp', '1.el7', False), + (8, 'leapp-upgrade-el8toel9', '1.el8', False), + (8, 'leapp-upgrade-el8toel9-deps', '1.el8', False), + ) +) +def test_package_to_be_removed(monkeypatch, source_major_version, rpm_name, release, expected_to_be_removed): + rpm_details = { + 'version': '0.1', + 'epoch': '0', + 'packager': 'packager', + 'arch': 'noarch', + 'pgpsig': 'sig' + } + + def get_installed_rpms_mocked(): + return ['{}|{}|{}|{}|{}|{}|{}'.format(rpm_name, rpm_details['version'], release, rpm_details['epoch'], + rpm_details['packager'], rpm_details['arch'], rpm_details['pgpsig'])] + + UnsignedRPM = RPM(name='unsigned', version='0.1', release=release, epoch='0', + packager='packager', arch='noarch', pgpsig='OTHER_SIG') + + monkeypatch.setattr(api, 'current_actor', CurrentActorMocked(msgs=[InstalledUnsignedRPM(items=[UnsignedRPM])])) + monkeypatch.setattr(checkleftoverpackages, 'get_installed_rpms', get_installed_rpms_mocked) + monkeypatch.setattr(checkleftoverpackages, 'get_source_major_version', lambda: str(source_major_version)) + monkeypatch.setattr(api, 'produce', produce_mocked()) + + checkleftoverpackages.process() + + expected_output = LeftoverPackages() + if expected_to_be_removed: + expected_output.items.append(RPM(name=rpm_name, release=release, **rpm_details)) + + assert api.produce.called == 1 + assert len(api.produce.model_instances) == 1 + assert api.produce.model_instances[0] == expected_output diff --git a/repos/system_upgrade/common/actors/removeleftoverpackages/actor.py b/repos/system_upgrade/common/actors/removeleftoverpackages/actor.py new file mode 100644 index 0000000000..29de573186 --- /dev/null +++ b/repos/system_upgrade/common/actors/removeleftoverpackages/actor.py @@ -0,0 +1,21 @@ +from leapp.actors import Actor +from leapp.libraries.actor import removeleftoverpackages +from leapp.models import LeftoverPackages, RemovedPackages +from leapp.tags import ExperimentalTag, IPUWorkflowTag, RPMUpgradePhaseTag + + +class RemoveLeftoverPackages(Actor): + """ + Remove packages left on the system after the upgrade to higher major version of RHEL. + + Removal of packages is necessary in order to keep the machine in supported state. + Actor generates report telling users what packages have been removed. + """ + + name = 'remove_leftover_packages' + consumes = (LeftoverPackages, ) + produces = (RemovedPackages, ) + tags = (RPMUpgradePhaseTag, IPUWorkflowTag, ExperimentalTag) + + def process(self): + removeleftoverpackages.process() diff --git a/repos/system_upgrade/common/actors/removeleftoverpackages/libraries/removeleftoverpackages.py b/repos/system_upgrade/common/actors/removeleftoverpackages/libraries/removeleftoverpackages.py new file mode 100644 index 0000000000..5f17186145 --- /dev/null +++ b/repos/system_upgrade/common/actors/removeleftoverpackages/libraries/removeleftoverpackages.py @@ -0,0 +1,58 @@ +from leapp.libraries.common.rhsm import skip_rhsm +from leapp.libraries.common.rpms import get_installed_rpms +from leapp.libraries.stdlib import api, CalledProcessError, run +from leapp.models import LeftoverPackages, RemovedPackages, RPM + + +def _get_leftover_packages(): + """ + Consume and return LefoverPackages, if there are none, return None + """ + leftover_packages = next(api.consume(LeftoverPackages), LeftoverPackages()) + if not leftover_packages.items: + api.current_logger().info('No leftover packages, skipping...') + return None + return leftover_packages + + +def _get_removed_packages(installed_rpms): + """ + Create RemovedPackages message with the list of removed packages + """ + removed_packages = RemovedPackages() + removed = list(set(installed_rpms) - set(get_installed_rpms())) + + for pkg in removed: + name, version, release, epoch, packager, arch, pgpsig = pkg.split('|') + removed_packages.items.append(RPM( + name=name, + version=version, + epoch=epoch, + packager=packager, + arch=arch, + release=release, + pgpsig=pgpsig + )) + return removed_packages + + +def process(): + leftover_packages = _get_leftover_packages() + if leftover_packages is None: + return + + installed_rpms = get_installed_rpms() + + leftover_pkgs_to_remove = ['-'.join([pkg.name, pkg.version, pkg.release]) for pkg in leftover_packages.items] + cmd = ['dnf', 'remove', '-y', '--noautoremove'] + leftover_pkgs_to_remove + if skip_rhsm(): + # ensure we don't use suscription-manager when it should be skipped + cmd += ['--disableplugin', 'subscription-manager'] + try: + run(cmd) + except (CalledProcessError, OSError): + error = 'Failed to remove packages: {}'.format(', '.join(leftover_pkgs_to_remove)) + api.current_logger().error(error) + return + + api.produce(_get_removed_packages(installed_rpms)) diff --git a/repos/system_upgrade/common/actors/removeleftoverpackages/tests/test_removeleftoverpackages.py b/repos/system_upgrade/common/actors/removeleftoverpackages/tests/test_removeleftoverpackages.py new file mode 100644 index 0000000000..1907855af5 --- /dev/null +++ b/repos/system_upgrade/common/actors/removeleftoverpackages/tests/test_removeleftoverpackages.py @@ -0,0 +1,117 @@ +import pytest + +from leapp.libraries.actor import removeleftoverpackages +from leapp.libraries.common.testutils import CurrentActorMocked, logger_mocked, produce_mocked +from leapp.libraries.stdlib import api, CalledProcessError +from leapp.models import LeftoverPackages, RemovedPackages, RPM + + +def test_get_leftover_packages(monkeypatch): + rpm = RPM(name='rpm', version='1.0', release='1.el7', epoch='0', packager='foo', arch='noarch', pgpsig='SIG') + monkeypatch.setattr(api, 'current_actor', CurrentActorMocked(msgs=[LeftoverPackages(items=[rpm])])) + monkeypatch.setattr(api, 'current_logger', logger_mocked()) + + assert removeleftoverpackages._get_leftover_packages() == LeftoverPackages(items=[rpm]) + + +def test_no_leftover_packages(monkeypatch): + monkeypatch.setattr(api, 'current_actor', CurrentActorMocked(msgs=[LeftoverPackages()])) + monkeypatch.setattr(api, 'current_logger', logger_mocked()) + + packages = removeleftoverpackages._get_leftover_packages() + assert packages is None + assert api.current_logger.infomsg == ['No leftover packages, skipping...'] + + +def test_remove_leftover_packages_error(monkeypatch): + def get_leftover_pkgs(): + return LeftoverPackages(items=[RPM(name='rpm', version='1.0', release='1.el7', epoch='0', + packager='packager', arch='noarch', pgpsig='SIG')]) + + def mocked_run(cmd): + raise CalledProcessError(command=cmd, + message='mocked error', + result={'stdout': 'out', 'stderr': 'err', 'exit_code': 1, 'signal': 0}) + + monkeypatch.setattr(api, 'current_logger', logger_mocked()) + monkeypatch.setattr(api, 'produce', produce_mocked()) + monkeypatch.setattr(removeleftoverpackages, '_get_leftover_packages', get_leftover_pkgs) + monkeypatch.setattr(removeleftoverpackages, 'get_installed_rpms', lambda: []) + monkeypatch.setattr(removeleftoverpackages, 'skip_rhsm', lambda: False) + monkeypatch.setattr(removeleftoverpackages, 'run', mocked_run) + + removeleftoverpackages.process() + + assert api.produce.called == 0 + assert api.current_logger.errmsg == ['Failed to remove packages: rpm-1.0-1.el7'] + + +@pytest.mark.parametrize( + ('installed_rpms'), + ( + ([]), + (['rpm1']), + (['rpm1', 'rpm2']), + ) +) +def test_get_removed_packages(monkeypatch, installed_rpms): + rpm_details = { + 'version': '1.0', + 'release': '1.el7', + 'epoch': '0', + 'packager': 'packager', + 'arch': 'noarch', + 'pgpsig': 'SIG' + } + rpm_details_composed = '|'.join([rpm_details[key] for key in ['version', 'release', 'epoch', + 'packager', 'arch', 'pgpsig']]) + mocked_installed_rpms = ['{}|{}'.format(rpm, rpm_details_composed) for rpm in installed_rpms] + + monkeypatch.setattr(removeleftoverpackages, 'get_installed_rpms', lambda: []) + + removed_packages = removeleftoverpackages._get_removed_packages(mocked_installed_rpms) + removed_packages.items = sorted(removed_packages.items, key=lambda x: x.name) + expected_output = [RPM(name=rpm, **rpm_details) for rpm in installed_rpms] + expected_output = sorted(expected_output, key=lambda x: x.name) + + assert removed_packages == RemovedPackages(items=expected_output) + + +@pytest.mark.parametrize( + ('removed_packages', 'skip_rhsm'), + ( + ([], True), + ([], False), + (['rpm1'], True), + (['rpm1', 'rpm2'], True), + (['rpm1', 'rpm2'], False), + ) +) +def test_process(monkeypatch, removed_packages, skip_rhsm): + pkgs = [RPM(name=pkg, version='1.0', release='1.el7', epoch='0', + packager='packager', arch='noarch', pgpsig='SIG') + for pkg in removed_packages] + + removed_pkgs = RemovedPackages(items=pkgs) + + def mocked_run(cmd): + pkgs_joined = ['-'.join([pkg.name, pkg.version, pkg.release]) for pkg in pkgs] + expected_cmd = ['dnf', 'remove', '-y', '--noautoremove'] + expected_cmd += pkgs_joined + + if skip_rhsm: + expected_cmd += ['--disableplugin', 'subscription-manager'] + + assert cmd == expected_cmd + + monkeypatch.setattr(api, 'produce', produce_mocked()) + monkeypatch.setattr(removeleftoverpackages, 'run', mocked_run) + monkeypatch.setattr(removeleftoverpackages, 'skip_rhsm', lambda: skip_rhsm) + monkeypatch.setattr(removeleftoverpackages, 'get_installed_rpms', lambda: []) + monkeypatch.setattr(removeleftoverpackages, '_get_leftover_packages', lambda: LeftoverPackages(items=pkgs)) + monkeypatch.setattr(removeleftoverpackages, '_get_removed_packages', lambda _: removed_pkgs) + + removeleftoverpackages.process() + + assert api.produce.called == 1 + assert api.produce.model_instances == [removed_pkgs] diff --git a/repos/system_upgrade/common/actors/reportleftoverpackages/reportleftoverpackages/actor.py b/repos/system_upgrade/common/actors/reportleftoverpackages/reportleftoverpackages/actor.py new file mode 100644 index 0000000000..5857345103 --- /dev/null +++ b/repos/system_upgrade/common/actors/reportleftoverpackages/reportleftoverpackages/actor.py @@ -0,0 +1,23 @@ +from leapp.actors import Actor +from leapp.libraries.actor import reportleftoverpackages +from leapp.models import LeftoverPackages, RemovedPackages +from leapp.reporting import Report +from leapp.tags import IPUWorkflowTag, RPMUpgradePhaseTag + + +class ReportLeftoverPackages(Actor): + """ + Collect messages about leftover RHEL packages from older major versions and generate a report. + + Depending on execution of previous actors, + generated report contains information that there are still old RHEL packages + present on the system, which makes it unsupported or lists packages that have been removed. + """ + + name = 'report_leftover_packages' + consumes = (LeftoverPackages, RemovedPackages) + produces = (Report,) + tags = (RPMUpgradePhaseTag, IPUWorkflowTag) + + def process(self): + reportleftoverpackages.process() diff --git a/repos/system_upgrade/common/actors/reportleftoverpackages/reportleftoverpackages/libraries/reportleftoverpackages.py b/repos/system_upgrade/common/actors/reportleftoverpackages/reportleftoverpackages/libraries/reportleftoverpackages.py new file mode 100644 index 0000000000..d2aee72c3d --- /dev/null +++ b/repos/system_upgrade/common/actors/reportleftoverpackages/reportleftoverpackages/libraries/reportleftoverpackages.py @@ -0,0 +1,60 @@ +from leapp import reporting +from leapp.libraries.stdlib import api +from leapp.models import LeftoverPackages, RemovedPackages + +FMT_LIST_SEPARATOR = '\n - ' + + +def process(): + removed_packages = next(api.consume(RemovedPackages), None) + leftover_packages = next(api.consume(LeftoverPackages), LeftoverPackages()) + leftover_pkgs_to_remove = ['-'.join([pkg.name, pkg.version, pkg.release]) for pkg in leftover_packages.items] + + if removed_packages: + title = 'Leftover RHEL packages have been removed' + + if removed_packages.items: + removed = ['-'.join([pkg.name, pkg.version, pkg.release]) for pkg in removed_packages.items] + reporting.create_report([ + reporting.Title(title), + reporting.Summary('Following packages have been removed:\n{}'.format('\n'.join(removed))), + reporting.Severity(reporting.Severity.HIGH), + reporting.Groups([reporting.Groups.SANITY]), + ] + [reporting.RelatedResource('package', pkg.name) for pkg in removed_packages.items]) + else: + summary = ( + 'Following packages have been removed:{sep}{list}\n' + 'Dependent packages may have been removed as well, please check that you are not missing ' + 'any packages.' + .format( + sep=FMT_LIST_SEPARATOR, + list=FMT_LIST_SEPARATOR.join(leftover_pkgs_to_remove) + ) + ) + + reporting.create_report([ + reporting.Title(title), + reporting.Summary(summary), + reporting.Severity(reporting.Severity.HIGH), + reporting.Groups([reporting.Groups.SANITY]), + ] + [reporting.RelatedResource('package', pkg.name) for pkg in leftover_packages.items]) + return + + if not leftover_packages.items: + api.current_logger().info('No leftover packages, skipping...') + return + + summary = ( + 'Following RHEL packages have not been upgraded:{sep}{list}' + 'Please remove these packages to keep your system in supported state.' + .format( + sep=FMT_LIST_SEPARATOR, + list=FMT_LIST_SEPARATOR.join(leftover_pkgs_to_remove) + ) + ) + reporting.create_report([ + reporting.Title('Some RHEL packages have not been upgraded'), + reporting.Summary(summary), + reporting.Severity(reporting.Severity.HIGH), + reporting.Groups([reporting.Groups.SANITY]), + ] + [reporting.RelatedResource('package', pkg.name) for pkg in leftover_packages.items]) diff --git a/repos/system_upgrade/common/actors/reportleftoverpackages/reportleftoverpackages/tests/test_reportleftoverpackages.py b/repos/system_upgrade/common/actors/reportleftoverpackages/reportleftoverpackages/tests/test_reportleftoverpackages.py new file mode 100644 index 0000000000..b942494d3c --- /dev/null +++ b/repos/system_upgrade/common/actors/reportleftoverpackages/reportleftoverpackages/tests/test_reportleftoverpackages.py @@ -0,0 +1,57 @@ +from leapp import reporting +from leapp.libraries.actor import reportleftoverpackages +from leapp.libraries.common.testutils import create_report_mocked, CurrentActorMocked, logger_mocked +from leapp.libraries.stdlib import api +from leapp.models import LeftoverPackages, RemovedPackages, RPM + + +def test_no_leftover_and_no_removed_packages(monkeypatch): + monkeypatch.setattr(api, 'current_actor', CurrentActorMocked(msgs=[])) + monkeypatch.setattr(reporting, 'create_report', create_report_mocked()) + monkeypatch.setattr(api, 'current_logger', logger_mocked()) + reportleftoverpackages.process() + + assert reporting.create_report.called == 0 + assert api.current_logger.infomsg == ['No leftover packages, skipping...'] + + +def test_no_removed_packages(monkeypatch): + leftover_packages = LeftoverPackages(items=[RPM(name='rpm', version='1.0', release='1.el7', epoch='0', + packager='foo', arch='noarch', pgpsig='SIG')]) + monkeypatch.setattr(api, 'current_actor', CurrentActorMocked(msgs=[leftover_packages])) + monkeypatch.setattr(reporting, 'create_report', create_report_mocked()) + monkeypatch.setattr(api, 'current_logger', logger_mocked()) + reportleftoverpackages.process() + + assert reporting.create_report.called == 1 + assert 'Some RHEL packages have not been upgraded' in reporting.create_report.report_fields['title'] + assert 'Following RHEL packages have not been upgraded' in reporting.create_report.report_fields['summary'] + summary = 'Please remove these packages to keep your system in supported state.' + assert summary in reporting.create_report.report_fields['summary'] + + +def test_removed_packages(monkeypatch): + removed_packages = RemovedPackages(items=[RPM(name='rpm', version='1.0', release='1.el7', epoch='0', + packager='foo', arch='noarch', pgpsig='SIG')]) + + monkeypatch.setattr(api, 'current_actor', CurrentActorMocked(msgs=[removed_packages])) + monkeypatch.setattr(reporting, 'create_report', create_report_mocked()) + reportleftoverpackages.process() + + assert reporting.create_report.called == 1 + assert 'Leftover RHEL packages have been removed' in reporting.create_report.report_fields['title'] + assert 'Following packages have been removed' in reporting.create_report.report_fields['summary'] + assert 'rpm-1.0-1.el7' in reporting.create_report.report_fields['summary'] + + +def test_removed_packages_no_items(monkeypatch): + removed_packages = RemovedPackages() + monkeypatch.setattr(api, 'current_actor', CurrentActorMocked(msgs=[removed_packages])) + monkeypatch.setattr(reporting, 'create_report', create_report_mocked()) + reportleftoverpackages.process() + + assert reporting.create_report.called == 1 + assert 'Leftover RHEL packages have been removed' in reporting.create_report.report_fields['title'] + assert 'Following packages have been removed' in reporting.create_report.report_fields['summary'] + summary = 'Dependent packages may have been removed as well, please check that you are not missing any packages.' + assert summary in reporting.create_report.report_fields['summary'] diff --git a/repos/system_upgrade/el7toel8/actors/checkleftoverpackages/actor.py b/repos/system_upgrade/el7toel8/actors/checkleftoverpackages/actor.py deleted file mode 100644 index 7a817741c8..0000000000 --- a/repos/system_upgrade/el7toel8/actors/checkleftoverpackages/actor.py +++ /dev/null @@ -1,46 +0,0 @@ -from leapp.actors import Actor -from leapp.libraries.common.rpms import get_installed_rpms -from leapp.models import InstalledUnsignedRPM, LeftoverPackages, RPM, TransactionCompleted -from leapp.tags import IPUWorkflowTag, RPMUpgradePhaseTag - - -class CheckLeftoverPackages(Actor): - """ - Check if there are any RHEL 7 packages present after upgrade. - - Actor produces message containing these packages. Message is empty if there are no el7 package left. - """ - - name = 'check_leftover_packages' - consumes = (TransactionCompleted, InstalledUnsignedRPM) - produces = (LeftoverPackages,) - tags = (RPMUpgradePhaseTag, IPUWorkflowTag) - - def process(self): - LEAPP_PACKAGES = ['leapp', 'leapp-repository', 'snactor', 'leapp-repository-deps-el8', 'leapp-deps-el8', - 'python2-leapp'] - installed_rpms = get_installed_rpms() - if not installed_rpms: - return - - to_remove = LeftoverPackages() - unsigned = [pkg.name for pkg in next(self.consume(InstalledUnsignedRPM), InstalledUnsignedRPM()).items] - - for rpm in installed_rpms: - rpm = rpm.strip() - if not rpm: - continue - name, version, release, epoch, packager, arch, pgpsig = rpm.split('|') - - if 'el7' in release and name not in set(unsigned + LEAPP_PACKAGES): - to_remove.items.append(RPM( - name=name, - version=version, - epoch=epoch, - packager=packager, - arch=arch, - release=release, - pgpsig=pgpsig - )) - - self.produce(to_remove) diff --git a/repos/system_upgrade/el7toel8/actors/removeleftoverpackages/actor.py b/repos/system_upgrade/el7toel8/actors/removeleftoverpackages/actor.py deleted file mode 100644 index 063e07d57a..0000000000 --- a/repos/system_upgrade/el7toel8/actors/removeleftoverpackages/actor.py +++ /dev/null @@ -1,56 +0,0 @@ -from leapp.actors import Actor -from leapp.libraries import stdlib -from leapp.libraries.common import rhsm -from leapp.libraries.common.rpms import get_installed_rpms -from leapp.models import LeftoverPackages, RemovedPackages, RPM -from leapp.reporting import Report -from leapp.tags import ExperimentalTag, IPUWorkflowTag, RPMUpgradePhaseTag - - -class RemoveLeftoverPackages(Actor): - """ - Remove el7 packages left on the system after the upgrade to RHEL 8. - - Removal of el7 packages is necessary in order to keep the machine in supported state. - Actor generates report telling users what packages have been removed. - """ - - name = 'remove_leftover_packages' - consumes = (LeftoverPackages, ) - produces = (Report, RemovedPackages) - tags = (RPMUpgradePhaseTag, IPUWorkflowTag, ExperimentalTag) - - def process(self): - leftover_packages = next(self.consume(LeftoverPackages), LeftoverPackages()) - if not leftover_packages.items: - self.log.info('No leftover packages, skipping...') - return - - installed_rpms = get_installed_rpms() - - to_remove = ['-'.join([pkg.name, pkg.version, pkg.release]) for pkg in leftover_packages.items] - cmd = ['dnf', 'remove', '-y', '--noautoremove'] + to_remove - if rhsm.skip_rhsm(): - # ensure we don't use suscription-manager when it should be skipped - cmd += ['--disableplugin', 'subscription-manager'] - try: - stdlib.run(cmd) - except stdlib.CalledProcessError: - error = 'Failed to remove packages: {}'.format(', '.join(to_remove)) - self.log.error(error) - return - - removed_packages = RemovedPackages() - removed = list(set(installed_rpms) - set(get_installed_rpms())) - for pkg in removed: - name, version, release, epoch, packager, arch, pgpsig = pkg.split('|') - removed_packages.items.append(RPM( - name=name, - version=version, - epoch=epoch, - packager=packager, - arch=arch, - release=release, - pgpsig=pgpsig - )) - self.produce(removed_packages) diff --git a/repos/system_upgrade/el7toel8/actors/reportleftoverpackages/reportleftoverpackages/actor.py b/repos/system_upgrade/el7toel8/actors/reportleftoverpackages/reportleftoverpackages/actor.py deleted file mode 100644 index 171eab9392..0000000000 --- a/repos/system_upgrade/el7toel8/actors/reportleftoverpackages/reportleftoverpackages/actor.py +++ /dev/null @@ -1,62 +0,0 @@ -from leapp import reporting -from leapp.actors import Actor -from leapp.models import LeftoverPackages, RemovedPackages -from leapp.reporting import create_report, Report -from leapp.tags import IPUWorkflowTag, RPMUpgradePhaseTag - - -class ReportLeftoverPackages(Actor): - """ - Collect messages about leftover el7 packages and generate report for users. - - Depending on execution of previous actors, generated report contains information that there are still el7 packages - present on the system, which makes it unsupported or lists packages that have been removed. - """ - - name = 'report_leftover_packages' - consumes = (LeftoverPackages, RemovedPackages) - produces = (Report,) - tags = (RPMUpgradePhaseTag, IPUWorkflowTag) - - def process(self): - removed_packages = next(self.consume(RemovedPackages), None) - leftover_packages = next(self.consume(LeftoverPackages), LeftoverPackages()) - to_remove = ['-'.join([pkg.name, pkg.version, pkg.release]) for pkg in leftover_packages.items] - - if removed_packages: - title = 'Leftover RHEL 7 packages have been removed' - - if removed_packages.items: - removed = ['-'.join([pkg.name, pkg.version, pkg.release]) for pkg in removed_packages.items] - create_report([ - reporting.Title(title), - reporting.Summary('Following packages have been removed:\n{}'.format('\n'.join(removed))), - reporting.Severity(reporting.Severity.HIGH), - reporting.Groups([reporting.Groups.SANITY]), - ] + [reporting.RelatedResource('package', pkg.name) for pkg in removed_packages.items]) - else: - summary = ('Following packages have been removed:\n' - '{}\n' - 'Dependent packages may have been removed as well, please check that you are not missing ' - 'any packages.\n'.format('\n'.join(to_remove))) - - create_report([ - reporting.Title(title), - reporting.Summary(summary), - reporting.Severity(reporting.Severity.HIGH), - reporting.Groups([reporting.Groups.SANITY]), - ] + [reporting.RelatedResource('package', pkg.name) for pkg in leftover_packages.items]) - return - - if not leftover_packages.items: - self.log.info('No leftover packages, skipping...') - return - - summary = 'Following RHEL 7 packages have not been upgraded:\n{}\n'.format('\n'.join(to_remove)) - summary += 'Please remove these packages to keep your system in supported state.\n' - create_report([ - reporting.Title('Some RHEL 7 packages have not been upgraded'), - reporting.Summary(summary), - reporting.Severity(reporting.Severity.HIGH), - reporting.Groups([reporting.Groups.SANITY]), - ] + [reporting.RelatedResource('package', pkg.name) for pkg in leftover_packages.items])