From 6f3dbd13605c6f84a634d8fcfbcc137b1df6a024 Mon Sep 17 00:00:00 2001 From: Adam King Date: Wed, 14 Feb 2024 11:28:11 -0500 Subject: [PATCH] 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 (cherry picked from commit 106f34ba31c82dd87f4c3f9ad82d8ace81e6c689) --- src/pybind/mgr/cephadm/schedule.py | 2 ++ src/pybind/mgr/cephadm/tests/test_scheduling.py | 11 +++++++++++ src/python-common/ceph/deployment/service_spec.py | 5 +++-- 3 files changed, 16 insertions(+), 2 deletions(-) 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 067cd5028a2cf..b58680dd5b3f8 100644 --- a/src/pybind/mgr/cephadm/tests/test_scheduling.py +++ b/src/pybind/mgr/cephadm/tests/test_scheduling.py @@ -631,6 +631,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 bcebf23c20822..13bf69182054f 100644 --- a/src/python-common/ceph/deployment/service_spec.py +++ b/src/python-common/ceph/deployment/service_spec.py @@ -190,8 +190,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 fnmatch.filter(all_hosts, self.host_pattern) return all_hosts -- 2.39.5