From: Sage Weil Date: Wed, 10 Mar 2021 22:27:28 +0000 (-0500) Subject: python-common: fix PlacementSpec target size method X-Git-Tag: v17.1.0~2613^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=2904c5ece0e6d3cabaf16b2e977bdcdf5d8f68dd;p=ceph.git python-common: fix PlacementSpec target size method - Rename get_host_selection_size() to get_target_size() since the host part of the name was a bit misleading - Take count-per-host into consideration. Signed-off-by: Sage Weil --- diff --git a/src/pybind/mgr/cephadm/module.py b/src/pybind/mgr/cephadm/module.py index d9cdd8f88ab2..95a7e50f8249 100644 --- a/src/pybind/mgr/cephadm/module.py +++ b/src/pybind/mgr/cephadm/module.py @@ -1608,7 +1608,7 @@ class CephadmOrchestrator(orchestrator.Orchestrator, MgrModule, osd_count += 1 sm[n].size = osd_count else: - sm[n].size = spec.placement.get_host_selection_size( + sm[n].size = spec.placement.get_target_count( self.inventory.all_specs()) sm[n].created = self.spec_store.spec_created[n] @@ -1639,7 +1639,7 @@ class CephadmOrchestrator(orchestrator.Orchestrator, MgrModule, continue sm[n] = orchestrator.ServiceDescription( spec=spec, - size=spec.placement.get_host_selection_size(self.inventory.all_specs()), + size=spec.placement.get_target_count(self.inventory.all_specs()), running=0, events=self.events.get_for_service(spec.service_name()), ) diff --git a/src/python-common/ceph/deployment/service_spec.py b/src/python-common/ceph/deployment/service_spec.py index e3241fcd8ae2..3d9b727e1add 100644 --- a/src/python-common/ceph/deployment/service_spec.py +++ b/src/python-common/ceph/deployment/service_spec.py @@ -217,10 +217,10 @@ class PlacementSpec(object): return fnmatch.filter(all_hosts, self.host_pattern) return all_hosts - def get_host_selection_size(self, hostspecs: Iterable[HostSpec]) -> int: + def get_target_count(self, hostspecs: Iterable[HostSpec]) -> int: if self.count: return self.count - return len(self.filter_matching_hostspecs(hostspecs)) + return len(self.filter_matching_hostspecs(hostspecs)) * (self.count_per_host or 1) def pretty_str(self) -> str: """ diff --git a/src/python-common/ceph/tests/test_service_spec.py b/src/python-common/ceph/tests/test_service_spec.py index 8422d1805468..210e63d13078 100644 --- a/src/python-common/ceph/tests/test_service_spec.py +++ b/src/python-common/ceph/tests/test_service_spec.py @@ -98,6 +98,41 @@ def test_parse_host_placement_specs_raises_wrong_format(test_input): HostPlacementSpec.parse(test_input) +@pytest.mark.parametrize( + "p,hosts,size", + [ + ( + PlacementSpec(count=3), + ['host1', 'host2', 'host3', 'host4', 'host5'], + 3 + ), + ( + PlacementSpec(host_pattern='*'), + ['host1', 'host2', 'host3', 'host4', 'host5'], + 5 + ), + ( + PlacementSpec(count_per_host=2, host_pattern='*'), + ['host1', 'host2', 'host3', 'host4', 'host5'], + 10 + ), + ( + PlacementSpec(host_pattern='foo*'), + ['foo1', 'foo2', 'bar1', 'bar2'], + 2 + ), + ( + PlacementSpec(count_per_host=2, host_pattern='foo*'), + ['foo1', 'foo2', 'bar1', 'bar2'], + 4 + ), + ]) +def test_placement_target_size(p, hosts, size): + assert p.get_target_count( + [HostPlacementSpec(n, '', '') for n in hosts] + ) == size + + def _get_dict_spec(s_type, s_id): dict_spec = { "service_id": s_id,