Skip to content

Commit

Permalink
Copy dnf.conf to target userspace and allow a custom one
Browse files Browse the repository at this point in the history
This change allows working around the fact that source and target
`dnf.conf` files might be incompatible. For example some of the proxy
configuration between RHEL7 and RHEL8.

If it exists, the `/etc/leapp/files/dnf.conf` config file will be
copied to the target userspace. Target system compatible configuration
can be specified there. If it doesn't exist, the `/etc/dnf/dnf.conf`
from the source system will be copied instead.

NOTE: The configuration is not copied onto the target system,
only to the target userspace.
  • Loading branch information
matejmatuska committed Nov 7, 2023
1 parent 17c88d9 commit 7e75d3d
Show file tree
Hide file tree
Showing 3 changed files with 69 additions and 0 deletions.
24 changes: 24 additions & 0 deletions repos/system_upgrade/common/actors/dnfconfuserspacecopy/actor.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
from leapp.actors import Actor
from leapp.libraries.actor import copycustomdnfconf
from leapp.models import TargetUserSpacePreupgradeTasks
from leapp.tags import FactsPhaseTag, IPUWorkflowTag


class DNFConfUserspaceCopy(Actor):
"""
Copy dnf.conf to target userspace
Copies /etc/leapp/files/dnf.conf to target userspace. If it isn't available
/etc/dnf/dnf.conf is copied instead. This allows specifying a different
config for the target userspace, which might be required if the source
system configuration file isn't compatible with the target one. One such
example is incompatible proxy configuration between RHEL7 and RHEL8 DNF
versions.
"""
name = "dnf_conf_userspace_copy"
consumes = ()
produces = (TargetUserSpacePreupgradeTasks,)
tags = (FactsPhaseTag, IPUWorkflowTag)

def process(self):
copycustomdnfconf.process()
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import os

from leapp.libraries.stdlib import api
from leapp.models import CopyFile, TargetUserSpacePreupgradeTasks


def process():
src = "/etc/dnf/dnf.conf"
if os.path.exists("/etc/leapp/files/dnf.conf"):
src = "/etc/leapp/files/dnf.conf"

api.current_logger().debug(
"Copying dnf.conf at {} to the target userspace".format(src)
)
api.produce(
TargetUserSpacePreupgradeTasks(
copy_files=[CopyFile(src=src, dst="/etc/dnf/dnf.conf")]
)
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import os

import pytest

from leapp.libraries.actor import copycustomdnfconf
from leapp.libraries.common.testutils import CurrentActorMocked, logger_mocked, produce_mocked


@pytest.mark.parametrize(
"userspace_conf_exists,expected",
[(False, "/etc/dnf/dnf.conf"), (True, "/etc/leapp/files/dnf.conf")],
)
def test_copy_correct_dnf_conf(monkeypatch, userspace_conf_exists, expected):
monkeypatch.setattr(os.path, "exists", lambda _: userspace_conf_exists)

mocked_produce = produce_mocked()
monkeypatch.setattr(copycustomdnfconf.api, 'produce', mocked_produce)
monkeypatch.setattr(copycustomdnfconf.api, 'current_logger', logger_mocked())

copycustomdnfconf.process()

assert mocked_produce.called == 1
assert len(mocked_produce.model_instances) == 1
assert len(mocked_produce.model_instances[0].copy_files) == 1
assert mocked_produce.model_instances[0].copy_files[0].src == expected
assert mocked_produce.model_instances[0].copy_files[0].dst == "/etc/dnf/dnf.conf"

0 comments on commit 7e75d3d

Please sign in to comment.