From: Adam King Date: Wed, 14 Feb 2024 16:28:11 +0000 (-0500) Subject: mgr/cephadm: fix placement with label and host pattern X-Git-Tag: v20.0.0~2486^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=106f34ba31c82dd87f4c3f9ad82d8ace81e6c689;p=ceph.git mgr/cephadm: fix placement with label and host pattern Previously, when both the label and host pattern were provided, only the label was actually used for the placement Fixes: https://tracker.ceph.com/issues/64428 Signed-off-by: Adam King --- diff --git a/src/pybind/mgr/cephadm/schedule.py b/src/pybind/mgr/cephadm/schedule.py index 6666d761ebcf9..98d2fe99897ec 100644 --- a/src/pybind/mgr/cephadm/schedule.py +++ b/src/pybind/mgr/cephadm/schedule.py @@ -413,6 +413,8 @@ class HostAssignment(object): hostname=x.hostname, ports=self.ports_start) for x in self.hosts_by_label(self.spec.placement.label) ] + if self.spec.placement.host_pattern: + ls = [h for h in ls if h.hostname in self.spec.placement.filter_matching_hostspecs(self.hosts)] elif self.spec.placement.host_pattern: ls = [ DaemonPlacement(daemon_type=self.primary_daemon_type, diff --git a/src/pybind/mgr/cephadm/tests/test_scheduling.py b/src/pybind/mgr/cephadm/tests/test_scheduling.py index b307cd9d34ddc..f445ed6f09333 100644 --- a/src/pybind/mgr/cephadm/tests/test_scheduling.py +++ b/src/pybind/mgr/cephadm/tests/test_scheduling.py @@ -637,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', diff --git a/src/python-common/ceph/deployment/service_spec.py b/src/python-common/ceph/deployment/service_spec.py index f6d290f071888..4da4f46c1fad3 100644 --- a/src/python-common/ceph/deployment/service_spec.py +++ b/src/python-common/ceph/deployment/service_spec.py @@ -306,8 +306,9 @@ class PlacementSpec(object): all_hosts = [hs.hostname for hs in hostspecs] return [h.hostname for h in self.hosts if h.hostname in all_hosts] if self.label: - return [hs.hostname for hs in hostspecs if self.label in hs.labels] - all_hosts = [hs.hostname for hs in hostspecs] + all_hosts = [hs.hostname for hs in hostspecs if self.label in hs.labels] + else: + all_hosts = [hs.hostname for hs in hostspecs] if self.host_pattern: return self.host_pattern.filter_hosts(all_hosts) return all_hosts