Skip to content

Commit 5518ae0

Browse files
matejmatuskapirat89
authored andcommitted
transitionsystemdservicesstates: Do not handle libvirt and virt* services on 8->9+
Beginning with RHEL8 there are two possible configurations (monolithic and modular) for the libvirt and virt* (virtqemud, virtlockd, virtproxyd, ...) services. The generic strategy implemented in the transitionsystemdservicesstates actor cannot handle such setup and leaves the upgraded system with a an incorrect combination of these configurations. Therefore these services are ignored by the actor and their state transition will be done by the services (and other related units) themselves. Jira: RHEL-22597
1 parent c63ccbb commit 5518ae0

File tree

2 files changed

+74
-6
lines changed

2 files changed

+74
-6
lines changed

repos/system_upgrade/common/actors/systemd/transitionsystemdservicesstates/libraries/transitionsystemdservicesstates.py

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from leapp import reporting
22
from leapp.exceptions import StopActorExecutionError
3+
from leapp.libraries.common.config import version
34
from leapp.libraries.stdlib import api
45
from leapp.models import (
56
SystemdServicesInfoSource,
@@ -78,9 +79,43 @@ def _get_service_preset(service_name, presets):
7879
return preset
7980

8081

81-
def _filter_services(services_source, services_target):
82+
def _filter_ignored_services(services_source):
83+
"""
84+
Filter out services that should be ignored i.e. not handled
85+
"""
86+
to_ignore = []
87+
if int(version.get_source_major_version()) >= 8:
88+
to_ignore.extend([
89+
"libvirtd.service",
90+
"virtqemud.service",
91+
"virtinterfaced.service",
92+
"virtnetworkd.service",
93+
"virtnodedevd.service",
94+
"virtnwfilterd.service",
95+
"virtsecretd.service",
96+
"virtstoraged.service",
97+
"virtproxyd.service",
98+
"virtlockd.service",
99+
"virtlogd.service",
100+
"libvirt-guests.service",
101+
])
102+
103+
for s in to_ignore:
104+
# It's sufficient to remove just from the source system services,
105+
# because if a service is not present on the source system it's not handled either way
106+
if services_source.pop(s, None):
107+
api.current_logger().debug("Ignored service {} found on the source system".format(s))
108+
109+
110+
def _filter_irrelevant_services(services_source, services_target):
82111
"""
83112
Filter out irrelevant services
113+
114+
Irrelevant services are those that cannot be enabled/disabled,
115+
those that do not exist on the source system and those in masked-runtime state.
116+
117+
:return: Target system services without the irrelevant ones.
118+
:rtype: list
84119
"""
85120
filtered = []
86121
for service in services_target:
@@ -197,7 +232,8 @@ def process():
197232
presets_source = {p.service: p.state for p in presets_source}
198233
presets_target = {p.service: p.state for p in presets_target}
199234

200-
services_target = _filter_services(services_source, services_target)
235+
_filter_ignored_services(services_source)
236+
services_target = _filter_irrelevant_services(services_source, services_target)
201237

202238
desired_states = _get_desired_states(
203239
services_source, presets_source, services_target, presets_target

repos/system_upgrade/common/actors/systemd/transitionsystemdservicesstates/tests/test_transitionsystemdservicesstates.py

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from leapp import reporting
44
from leapp.libraries.actor import transitionsystemdservicesstates
5+
from leapp.libraries.common.config import version
56
from leapp.libraries.common.testutils import create_report_mocked, CurrentActorMocked, produce_mocked
67
from leapp.libraries.stdlib import api
78
from leapp.models import (
@@ -68,7 +69,7 @@ def _get_desired_service_state_mocked(*args):
6869
assert tasks == expected
6970

7071

71-
def test_filter_services_services_filtered():
72+
def test_filter_irrelevant_services_services_filtered():
7273
services_source = {
7374
"test2.service": "static",
7475
"test3.service": "masked",
@@ -85,14 +86,14 @@ def test_filter_services_services_filtered():
8586
SystemdServiceFile(name="test6.service", state="masked-runtime"),
8687
]
8788

88-
filtered = transitionsystemdservicesstates._filter_services(
89+
filtered = transitionsystemdservicesstates._filter_irrelevant_services(
8990
services_source, services_target
9091
)
9192

9293
assert not filtered
9394

9495

95-
def test_filter_services_services_not_filtered():
96+
def test_filter_irrelevant_services_services_not_filtered():
9697
services_source = {
9798
"test1.service": "enabled",
9899
"test2.service": "disabled",
@@ -106,7 +107,7 @@ def test_filter_services_services_not_filtered():
106107
SystemdServiceFile(name="test4.service", state="enabled"),
107108
]
108109

109-
filtered = transitionsystemdservicesstates._filter_services(
110+
filtered = transitionsystemdservicesstates._filter_irrelevant_services(
110111
services_source, services_target
111112
)
112113

@@ -238,3 +239,34 @@ def test_report_newly_enabled(monkeypatch):
238239

239240
assert created_reports.called
240241
assert all([s in created_reports.report_fields["summary"] for s in newly_enabled])
242+
243+
244+
@pytest.mark.parametrize(
245+
"source_major_ver,expected", (
246+
(
247+
7,
248+
{
249+
'abc.service': 'enabled',
250+
'virtqemud.service': 'enabled',
251+
'virtlogd.service': 'disabled',
252+
'virtproxyd.service': 'masked',
253+
}
254+
),
255+
(8, {'abc.service': 'enabled'}),
256+
(9, {'abc.service': 'enabled'}),
257+
)
258+
)
259+
def test_filter_ignored_services(monkeypatch, source_major_ver, expected):
260+
services = {
261+
'abc.service': 'enabled',
262+
'virtqemud.service': 'enabled',
263+
'virtlogd.service': 'disabled',
264+
'virtproxyd.service': 'masked',
265+
}
266+
monkeypatch.setattr(
267+
version,
268+
"get_source_major_version",
269+
lambda: source_major_ver,
270+
)
271+
transitionsystemdservicesstates._filter_ignored_services(services)
272+
assert services == expected

0 commit comments

Comments
 (0)