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..28f5f362df --- /dev/null +++ b/repos/system_upgrade/common/actors/checkleftoverpackages/actor.py @@ -0,0 +1,20 @@ +from leapp.actors import Actor +from leapp.models import InstalledUnsignedRPM, LeftoverPackages, TransactionCompleted +from leapp.tags import IPUWorkflowTag, RPMUpgradePhaseTag +from leapp.libraries.actor import checkleftoverpackages + + +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): + 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..348e23ffab --- /dev/null +++ b/repos/system_upgrade/common/actors/checkleftoverpackages/libraries/checkleftoverpackages.py @@ -0,0 +1,33 @@ +from leapp.libraries.common.rpms import get_installed_rpms +from leapp.models import InstalledUnsignedRPM, LeftoverPackages, RPM +from leapp.libraries.stdlib import api + + +def process(): + 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(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('|') + + 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 + )) + + api.produce(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..905947c34e --- /dev/null +++ b/repos/system_upgrade/common/actors/checkleftoverpackages/tests/test_checkleftoverpackages.py @@ -0,0 +1,43 @@ +import pytest +from leapp.libraries.common.testutils import produce_mocked, CurrentActorMocked +from leapp.libraries.stdlib import api +from leapp.libraries.actor import checkleftoverpackages +from leapp.models import InstalledUnsignedRPM, LeftoverPackages, RPM + + +@pytest.mark.parametrize( + ('rpm_name', 'release', 'expected_to_be_removed'), + ( + # el7 + ('sed', '7.el7', True), + ('leapp', '1.el7', False), + ('unsigned', '1.el7', False), + + # el8 + ('leapp-repository', '1.el8', False), + ('gnutls', '8.el8_9.1', False), + + # other + ('whois-nls', '1.fc39', False), + ) +) +def test_package_to_be_removed(monkeypatch, rpm_name, release, expected_to_be_removed): + def get_installed_rpms_mocked(): + return [f'{rpm_name}|0.1|{release}|0|packager|noarch|OTHER_SIG'] + + UnsignedRPM = RPM(name='unsigned', version='0.1', release=f'{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(api, 'produce', produce_mocked()) + + checkleftoverpackages.process() + + expected_output = LeftoverPackages() + if expected_to_be_removed: + expected_output.items.append(RPM(name=f'{rpm_name}', version='0.1', release=f'{release}', epoch='0', + packager='packager', arch='noarch', pgpsig='OTHER_SIG')) + + assert api.produce.called == 1 + assert api.produce.model_instances[0] == expected_output diff --git a/repos/system_upgrade/el7toel8/actors/removeleftoverpackages/actor.py b/repos/system_upgrade/common/actors/removeleftoverpackages/actor.py similarity index 100% rename from repos/system_upgrade/el7toel8/actors/removeleftoverpackages/actor.py rename to repos/system_upgrade/common/actors/removeleftoverpackages/actor.py diff --git a/repos/system_upgrade/el7toel8/actors/reportleftoverpackages/reportleftoverpackages/actor.py b/repos/system_upgrade/common/actors/reportleftoverpackages/reportleftoverpackages/actor.py similarity index 100% rename from repos/system_upgrade/el7toel8/actors/reportleftoverpackages/reportleftoverpackages/actor.py rename to repos/system_upgrade/common/actors/reportleftoverpackages/reportleftoverpackages/actor.py 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)