Skip to content

Commit 389d007

Browse files
Dev: add pre-migration checks for pacemaker version (jsc#PED-11808)
(cherry picked from commit 3264f0d)
1 parent ecb079a commit 389d007

File tree

2 files changed

+72
-5
lines changed

2 files changed

+72
-5
lines changed

crmsh/migration.py

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -258,14 +258,46 @@ def check_dependency_version(handler: CheckResultHandler):
258258
handler.log_info('Checking dependency version...')
259259
shell = sh.LocalShell()
260260
out = shell.get_stdout_or_raise_error(None, 'corosync -v')
261-
match = re.search(r"version\s+'((\d+)(?:\.\d+)*)'", out)
262-
if not match or match.group(2) != '3':
261+
_check_version_range(
262+
handler,
263+
'Corosync', (3,),
264+
re.compile(r"version\s+'(\d+(?:\.\d+)*)'"),
265+
shell.get_stdout_or_raise_error(None, 'corosync -v'),
266+
)
267+
_check_version_range(
268+
handler,
269+
'Pacemaker', (3,),
270+
re.compile(r"^Pacemaker\s+(\d+(?:\.\d+)*)"),
271+
shell.get_stdout_or_raise_error(None, 'pacemakerd --version'),
272+
)
273+
274+
275+
def _check_version_range(
276+
handler: CheckResultHandler, component_name: str,
277+
minimum: tuple,
278+
pattern,
279+
text: str,
280+
):
281+
match = pattern.search(text)
282+
if not match:
263283
handler.handle_problem(
264-
False, 'Corosync version not supported', [
265-
'Supported version: corosync >= 3',
266-
f'Actual version: corosync == {match.group(1)}',
284+
False, f'{component_name} version not supported', [
285+
'Unknown version:',
286+
text,
267287
],
268288
)
289+
else:
290+
version = tuple(int(x) for x in match.group(1).split('.'))
291+
if not minimum <= version:
292+
handler.handle_problem(
293+
False, f'{component_name} version not supported', [
294+
'Supported version: {} <= {}'.format(
295+
'.'.join(str(x) for x in minimum),
296+
component_name,
297+
),
298+
f'Actual version: {component_name} == {match.group(1)}',
299+
],
300+
)
269301

270302

271303
def check_service_status(handler: CheckResultHandler):

test/unittests/test_migration.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import re
12
import unittest
23
from unittest import mock
34

@@ -21,3 +22,37 @@ def test_check_removed_resource_agents(self):
2122
[cibquery.ResourceAgent('foo', 'bar', 'qux')]
2223
)
2324
self._handler.handle_problem.assert_called()
25+
26+
def test_check_version_range(self):
27+
def check_fn(x):
28+
migration._check_version_range(
29+
self._handler,
30+
'foo',
31+
(1, 1,),
32+
re.compile(r'^foo\s+(\d+(?:.\d+)*)'),
33+
x,
34+
)
35+
check_fn('foo 0')
36+
self._handler.handle_problem.assert_called()
37+
self._handler.handle_problem.reset_mock()
38+
check_fn('foo 0.9')
39+
self._handler.handle_problem.assert_called()
40+
self._handler.handle_problem.reset_mock()
41+
check_fn('foo 0.9.99')
42+
self._handler.handle_problem.assert_called()
43+
self._handler.handle_problem.reset_mock()
44+
check_fn('foo 1')
45+
self._handler.handle_problem.assert_called()
46+
self._handler.handle_problem.reset_mock()
47+
check_fn('foo 1.1')
48+
self._handler.handle_problem.assert_not_called()
49+
check_fn('foo 1.1.0')
50+
self._handler.handle_problem.assert_not_called()
51+
check_fn('foo 1.1.1')
52+
self._handler.handle_problem.assert_not_called()
53+
check_fn('foo 1.2')
54+
self._handler.handle_problem.assert_not_called()
55+
check_fn('foo 2')
56+
self._handler.handle_problem.assert_not_called()
57+
check_fn('foo 2.0')
58+
self._handler.handle_problem.assert_not_called()

0 commit comments

Comments
 (0)