Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[RHELC-828] Add missing integration tests for single yum transaction #677

Merged
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 21 additions & 16 deletions convert2rhel/pkgmanager/handlers/yum/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,11 @@ def _set_up_base(self):
self._base.conf.yumvar["releasever"] = system_info.releasever

def _enable_repos(self):
"""Enable a list of required repositories."""
"""Enable a list of required repositories.

:raises SystemInfo: If there is no way to connect to the mirrors in the
repos.
"""
self._base.repos.disableRepo("*")
# Set the download progress display
self._base.repos.setProgressBar(PackageDownloadCallback())
Expand All @@ -149,22 +153,23 @@ def _perform_operations(self):

loggerinst.info("Adding %s packages to the yum transaction set.", system_info.name)

for pkg in original_os_pkgs:
self._base.update(pattern=pkg)
try:
self._base.reinstall(pattern=pkg)
except (
pkgmanager.Errors.ReinstallInstallError,
pkgmanager.Errors.ReinstallRemoveError,
):
try:
for pkg in original_os_pkgs:
self._base.update(pattern=pkg)
try:
self._base.downgrade(pattern=pkg)
except (
pkgmanager.Errors.ReinstallInstallError,
pkgmanager.Errors.ReinstallRemoveError,
pkgmanager.Errors.DowngradeError,
):
loggerinst.warning("Package %s not available in RHEL repositories.", pkg)
self._base.reinstall(pattern=pkg)
except (pkgmanager.Errors.ReinstallInstallError, pkgmanager.Errors.ReinstallRemoveError):
try:
self._base.downgrade(pattern=pkg)
except (
pkgmanager.Errors.ReinstallInstallError,
pkgmanager.Errors.ReinstallRemoveError,
pkgmanager.Errors.DowngradeError,
):
loggerinst.warning("Package %s not available in RHEL repositories.", pkg)
except pkgmanager.Errors.NoMoreMirrorsRepoError as e:
loggerinst.debug("Got the following exception message: %s", e)
loggerinst.critical("There are no suitable mirrors available for the loaded repositories.")

def _resolve_dependencies(self, validate_transaction):
"""Try to resolve the transaction dependencies.
Expand Down
9 changes: 9 additions & 0 deletions convert2rhel/unit_tests/pkgmanager/handlers/yum/yum_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,15 @@ def test_perform_operations_downgrade_exception(
assert pkgmanager.YumBase.downgrade.call_count == len(system_packages)
assert "not available in RHEL repositories." in caplog.records[-1].message

@centos7
def test_perform_operations_no_more_mirrors_repo_exception(self, pretend_os, _mock_yum_api_calls, monkeypatch):
monkeypatch.setattr(pkgmanager.handlers.yum, "get_system_packages_for_replacement", lambda: ["pkg-1"])
pkgmanager.YumBase.update.side_effect = pkgmanager.Errors.NoMoreMirrorsRepoError
instance = YumTransactionHandler()

with pytest.raises(SystemExit, match="There are no suitable mirrors available for the loaded repositories."):
instance._perform_operations()

@centos7
@pytest.mark.parametrize(
("ret_code", "message", "validate_transaction", "expected"),
Expand Down
4 changes: 4 additions & 0 deletions plans/tier0.fmf
Original file line number Diff line number Diff line change
Expand Up @@ -77,3 +77,7 @@
/log_command_verification:
discover+:
test: log-command

/single_yum_transaction_validation:
discover+:
test: single-yum-transaction-validation
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
summary: Verify single yum transaction validation

description: >
Verify that we are doing a proper rollback during the validation phase in
our transactions.

If any errors occurs during the transaction resolution, either by
downloading a package, dependency resolver and etc... A rollback should
start and revert the changes to the system.

link: https://issues.redhat.com/browse/RHELC-576

tier: 0

tag+:
- yum
- dnf
- transaction

/transaction_validation_error:
adjust+:
- enabled: false
when: distro == centos-8 or distro == oraclelinux-8
Comment on lines +22 to +23
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd love to add a because: here to say why I'm disabling this test for centos-8 and oraclelinux-8, but since it's been a really long time, I don't remember. I will try to get the rationale at some point.

tag+:
- transaction-validation-error
test: |
pytest -svv -m transaction_validation_error

/package_download_error:
tag+:
- package-download-error
test: |
pytest -svv -m package_download_error
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
import os
import shutil

Check notice

Code scanning / CodeQL

Unused import

Import of 'shutil' is not used.
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I can open a follow-up PR to remove this type of warning later... I don't want to wait for a couple of hours to get results for the 3rd time in a row.


import pytest

from conftest import SYSTEM_RELEASE_ENV
from envparse import env


PKI_ENTITLEMENT_CERTS_PATH = "/etc/pki/entitlement"


def backup_entitlement_certs():
"""
Utillity function to backup and remove the entitlment cert as soon as we
notice then in the the `PKI_ENTITLEMENT_CERTS_PATH`.
r0x0d marked this conversation as resolved.
Show resolved Hide resolved
"""
original_certs = os.listdir(PKI_ENTITLEMENT_CERTS_PATH)

for cert in original_certs:
full_cert = "{}/{}".format(PKI_ENTITLEMENT_CERTS_PATH, cert)
new_cert = "{}.bk".format(full_cert)
shutil.move(full_cert, new_cert)
r0x0d marked this conversation as resolved.
Show resolved Hide resolved


@pytest.mark.package_download_error
def test_package_download_error(convert2rhel):
"""
Remove the entitlement certs found at /etc/pki/entitlement during package
download phase for both yum and dnf transactions.

This will run the conversion up to the point where we valiate the
transaction, when it reaches a specific point of the validation, we remove
the entitlement certs found in /etc/pki/entitlement/*.pem to ensure that the
tool is doing a proper rollback when there is any failure during the package
download.

The package download happens in different phases for yum and dnf, yum
download the packages during the `processTransaction` method call, while dnf
has a specific method that process and download the packages in the
transaction.
"""

server_sub = "CentOS Linux"
pkgmanager = "yum"
final_message = "There are no suitable mirrors available for the loaded repositories."

if "oracle" in SYSTEM_RELEASE_ENV:
server_sub = "Oracle Linux Server"

if "8" in SYSTEM_RELEASE_ENV:
pkgmanager = "dnf"
final_message = "Failed to download the transaction packages."

with convert2rhel(
"-y --no-rpm-va --serverurl {} --username {} --password {} --pool {} --debug".format(
env.str("RHSM_SERVER_URL"),
env.str("RHSM_USERNAME"),
env.str("RHSM_PASSWORD"),
env.str("RHSM_POOL"),
)
) as c2r:
c2r.expect("Adding {} packages to the {} transaction set.".format(server_sub, pkgmanager))
backup_entitlement_certs()
assert c2r.expect_exact(final_message, timeout=600) == 0

assert c2r.exitstatus == 1


@pytest.mark.transaction_validation_error
def test_transaction_validation_error(convert2rhel):
"""
Remove the entitlement certs found at /etc/pki/entitlement during transaction
processing to throw the following yum error: pkgmanager.Errors.YumDownloadError

This will run the conversion up to the point where we valiate the
transaction, when it reaches a specific point of the validation, we remove
the entitlement certs found in /etc/pki/entitlement/*.pem to ensure that the
tool is doing a proper rollback when the transaction is being processed.
"""
with convert2rhel(
"-y --no-rpm-va --serverurl {} --username {} --password {} --pool {} --debug".format(
env.str("RHSM_SERVER_URL"),
env.str("RHSM_USERNAME"),
env.str("RHSM_PASSWORD"),
env.str("RHSM_POOL"),
)
) as c2r:
c2r.expect(
"Downloading and validating the yum transaction set, no modifications to the system will happen this time."
)
backup_entitlement_certs()
r0x0d marked this conversation as resolved.
Show resolved Hide resolved
assert c2r.expect_exact("Failed to validate the yum transaction.", timeout=600) == 0

assert c2r.exitstatus == 1
7 changes: 4 additions & 3 deletions tests/integration/tier1/single-yum-transaction/main.fmf
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
summary: Single yum transaction
summary: Verify the single yum transaction

description: |
Handle the unified yum transactions so that it handles packages without error. Previous iterations used a lot of
different steps, whereas now it is one transaction that can be rolled back more easily.
Handle the unified yum transactions so that it handles packages without
error. Previous iterations used a lot of different steps, whereas now it is
one transaction that can be rolled back more easily.

link: https://issues.redhat.com/browse/RHELC-576

Expand Down