diff options
Diffstat (limited to '')
-rw-r--r-- | src/pybind/mgr/cephadm/tests/test_scheduling.py | 58 |
1 files changed, 57 insertions, 1 deletions
diff --git a/src/pybind/mgr/cephadm/tests/test_scheduling.py b/src/pybind/mgr/cephadm/tests/test_scheduling.py index 067cd5028..f445ed6f0 100644 --- a/src/pybind/mgr/cephadm/tests/test_scheduling.py +++ b/src/pybind/mgr/cephadm/tests/test_scheduling.py @@ -6,7 +6,13 @@ from typing import NamedTuple, List, Dict, Optional import pytest from ceph.deployment.hostspec import HostSpec -from ceph.deployment.service_spec import ServiceSpec, PlacementSpec, IngressSpec +from ceph.deployment.service_spec import ( + ServiceSpec, + PlacementSpec, + IngressSpec, + PatternType, + HostPattern, +) from ceph.deployment.hostspec import SpecValidationError from cephadm.module import HostAssignment @@ -631,6 +637,17 @@ class NodeAssignmentTest(NamedTuple): 'rgw:host2(*:81)', 'rgw:host3(*:81)'], ['rgw.c'] ), + # label + host pattern + # Note all hosts will get the "foo" label, we are checking + # that it also filters on the host pattern when label is provided + NodeAssignmentTest( + 'mgr', + PlacementSpec(label='foo', host_pattern='mgr*'), + 'mgr1 mgr2 osd1'.split(), + [], + None, None, + ['mgr:mgr1', 'mgr:mgr2'], ['mgr:mgr1', 'mgr:mgr2'], [] + ), # cephadm.py teuth case NodeAssignmentTest( 'mgr', @@ -1697,3 +1714,42 @@ def test_drain_from_explict_placement(service_type, placement, hosts, maintenanc ).place() assert sorted([h.hostname for h in to_add]) in expected_add assert sorted([h.name() for h in to_remove]) in expected_remove + + +class RegexHostPatternTest(NamedTuple): + service_type: str + placement: PlacementSpec + hosts: List[str] + expected_add: List[List[str]] + + +@pytest.mark.parametrize("service_type,placement,hosts,expected_add", + [ + RegexHostPatternTest( + 'crash', + PlacementSpec(host_pattern=HostPattern(pattern='host1|host3', pattern_type=PatternType.regex)), + 'host1 host2 host3 host4'.split(), + ['host1', 'host3'], + ), + RegexHostPatternTest( + 'crash', + PlacementSpec(host_pattern=HostPattern(pattern='host[2-4]', pattern_type=PatternType.regex)), + 'host1 host2 host3 host4'.split(), + ['host2', 'host3', 'host4'], + ), + ]) +def test_placement_regex_host_pattern(service_type, placement, hosts, expected_add): + spec = ServiceSpec(service_type=service_type, + service_id='test', + placement=placement) + + host_specs = [HostSpec(h) for h in hosts] + + hosts, to_add, to_remove = HostAssignment( + spec=spec, + hosts=host_specs, + unreachable_hosts=[], + draining_hosts=[], + daemons=[], + ).place() + assert sorted([h.hostname for h in to_add]) == expected_add |