-
Notifications
You must be signed in to change notification settings - Fork 146
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add unit tests for leftover packages actors
* Actors: - checkleftoverpackages - removeleftoverpackages - reportleftoverpackages * Refactor actors code from el7toel8 to common * Put their processes into library * Create unit tests for actors Jira: OAMG-1254
- Loading branch information
1 parent
4526ea2
commit 3f4f395
Showing
8 changed files
with
329 additions
and
111 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
56 changes: 56 additions & 0 deletions
56
...s/system_upgrade/common/actors/removeleftoverpackages/libraries/removeleftoverpackages.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
from leapp.libraries.stdlib import api, run, CalledProcessError | ||
from leapp.libraries.common.rpms import get_installed_rpms | ||
from leapp.libraries.common.rhsm import skip_rhsm | ||
from leapp.models import LeftoverPackages, RemovedPackages, RPM | ||
|
||
|
||
def get_leftover_packages(): | ||
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): | ||
return list(set(installed_rpms) - set(get_installed_rpms())) | ||
|
||
|
||
def get_removed_packages(installed_rpms): | ||
removed_packages = RemovedPackages() | ||
removed = _get_removed_packages(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 not leftover_packages: | ||
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 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(to_remove)) | ||
api.current_logger().error(error) | ||
return | ||
|
||
api.produce(get_removed_packages(installed_rpms)) |
116 changes: 116 additions & 0 deletions
116
.../system_upgrade/common/actors/removeleftoverpackages/tests/test_removeleftoverpackages.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,116 @@ | ||
import pytest | ||
|
||
from leapp.libraries.common.testutils import produce_mocked, CurrentActorMocked, logger_mocked | ||
from leapp.libraries.stdlib import api, CalledProcessError | ||
from leapp.libraries.actor import removeleftoverpackages | ||
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()) | ||
|
||
removeleftoverpackages.get_leftover_packages() | ||
|
||
assert api.current_logger.infomsg == ['No leftover packages, skipping...'] | ||
|
||
|
||
def test_remove_lefover_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'] | ||
|
||
|
||
def test__get_removed_packages(monkeypatch): | ||
pkg1 = 'rpm|1.0|1.el7|0|packager|noarch|SIG' | ||
pkg2 = 'rpm2|1.0|1.el7|0|packager|noarch|SIG' | ||
installed_packages = [pkg1, pkg2] | ||
monkeypatch.setattr(removeleftoverpackages, 'get_installed_rpms', lambda: [pkg1]) | ||
|
||
assert removeleftoverpackages._get_removed_packages(installed_packages) == [pkg2] | ||
|
||
|
||
@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_removed_packages', lambda _: mocked_installed_rpms) | ||
|
||
removed_packages = removeleftoverpackages.get_removed_packages(mocked_installed_rpms) | ||
expected_output = [RPM(name=rpm, **rpm_details) for rpm in installed_rpms] | ||
|
||
assert removed_packages == RemovedPackages(items=expected_output) | ||
|
||
|
||
@pytest.mark.parametrize( | ||
('removed_packages'), | ||
( | ||
([]), | ||
(['rpm1']), | ||
(['rpm1', 'rpm2']), | ||
) | ||
) | ||
def test_process(monkeypatch, removed_packages): | ||
def get_leftover_pkgs(): | ||
return LeftoverPackages() | ||
|
||
removed_pkgs = RemovedPackages(items=[RPM(name=pkg, version='1.0', release='1.el7', epoch='0', | ||
packager='packager', arch='noarch', pgpsig='SIG') | ||
for pkg in removed_packages]) | ||
|
||
def mocked_get_removed_packages(installed_rpms): | ||
return removed_pkgs | ||
|
||
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, 'run', lambda _: None) | ||
monkeypatch.setattr(removeleftoverpackages, 'skip_rhsm', lambda: False) | ||
monkeypatch.setattr(removeleftoverpackages, 'get_removed_packages', mocked_get_removed_packages) | ||
|
||
removeleftoverpackages.process() | ||
|
||
assert api.produce.called == 1 | ||
assert api.produce.model_instances == [removed_pkgs] |
Oops, something went wrong.