Skip to content

Commit 68bd445

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

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
@@ -255,14 +255,46 @@ def check_dependency_version(handler: CheckResultHandler):
255255
handler.log_info('Checking dependency version...')
256256
shell = sh.LocalShell()
257257
out = shell.get_stdout_or_raise_error(None, 'corosync -v')
258-
match = re.search(r"version\s+'((\d+)(?:\.\d+)*)'", out)
259-
if not match or match.group(2) != '3':
258+
_check_version_range(
259+
handler,
260+
'Corosync', (3,),
261+
re.compile(r"version\s+'(\d+(?:\.\d+)*)'"),
262+
shell.get_stdout_or_raise_error(None, 'corosync -v'),
263+
)
264+
_check_version_range(
265+
handler,
266+
'Pacemaker', (3,),
267+
re.compile(r"^Pacemaker\s+(\d+(?:\.\d+)*)"),
268+
shell.get_stdout_or_raise_error(None, 'pacemakerd --version'),
269+
)
270+
271+
272+
def _check_version_range(
273+
handler: CheckResultHandler, component_name: str,
274+
minimum: tuple,
275+
pattern,
276+
text: str,
277+
):
278+
match = pattern.search(text)
279+
if not match:
260280
handler.handle_problem(
261-
False, 'Corosync version not supported', [
262-
'Supported version: corosync >= 3',
263-
f'Actual version: corosync == {match.group(1)}',
281+
False, f'{component_name} version not supported', [
282+
'Unknown version:',
283+
text,
264284
],
265285
)
286+
else:
287+
version = tuple(int(x) for x in match.group(1).split('.'))
288+
if not minimum <= version:
289+
handler.handle_problem(
290+
False, f'{component_name} version not supported', [
291+
'Supported version: {} <= {}'.format(
292+
'.'.join(str(x) for x in minimum),
293+
component_name,
294+
),
295+
f'Actual version: {component_name} == {match.group(1)}',
296+
],
297+
)
266298

267299

268300
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

@@ -13,3 +14,37 @@ def test_load_supported_resource_agents(self):
1314
self.assertIn(cibquery.ResourceAgent('ocf', 'heartbeat', 'IPaddr2'), s)
1415
self.assertIn(cibquery.ResourceAgent('stonith', None, 'fence_sbd'), s)
1516
self.assertNotIn(cibquery.ResourceAgent('foo', None, 'bar'), s)
17+
18+
def test_check_version_range(self):
19+
def check_fn(x):
20+
migration._check_version_range(
21+
self._handler,
22+
'foo',
23+
(1, 1,),
24+
re.compile(r'^foo\s+(\d+(?:.\d+)*)'),
25+
x,
26+
)
27+
check_fn('foo 0')
28+
self._handler.handle_problem.assert_called()
29+
self._handler.handle_problem.reset_mock()
30+
check_fn('foo 0.9')
31+
self._handler.handle_problem.assert_called()
32+
self._handler.handle_problem.reset_mock()
33+
check_fn('foo 0.9.99')
34+
self._handler.handle_problem.assert_called()
35+
self._handler.handle_problem.reset_mock()
36+
check_fn('foo 1')
37+
self._handler.handle_problem.assert_called()
38+
self._handler.handle_problem.reset_mock()
39+
check_fn('foo 1.1')
40+
self._handler.handle_problem.assert_not_called()
41+
check_fn('foo 1.1.0')
42+
self._handler.handle_problem.assert_not_called()
43+
check_fn('foo 1.1.1')
44+
self._handler.handle_problem.assert_not_called()
45+
check_fn('foo 1.2')
46+
self._handler.handle_problem.assert_not_called()
47+
check_fn('foo 2')
48+
self._handler.handle_problem.assert_not_called()
49+
check_fn('foo 2.0')
50+
self._handler.handle_problem.assert_not_called()

0 commit comments

Comments
 (0)