]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
python-common: fix PlacementSpec target size method 39979/head
authorSage Weil <sage@newdream.net>
Wed, 10 Mar 2021 22:27:28 +0000 (17:27 -0500)
committerSage Weil <sage@newdream.net>
Wed, 10 Mar 2021 22:36:38 +0000 (17:36 -0500)
- 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 <sage@newdream.net>
src/pybind/mgr/cephadm/module.py
src/python-common/ceph/deployment/service_spec.py
src/python-common/ceph/tests/test_service_spec.py

index d9cdd8f88ab22a8ba694d537d693c8484fee2b51..95a7e50f8249b317c5b3187d9222eb3aea9ad198 100644 (file)
@@ -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()),
             )
index e3241fcd8ae2e0c1d75a8e812efdbb132526c951..3d9b727e1addcc3b9d43e0491651c0f4c35b8931 100644 (file)
@@ -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:
         """
index 8422d180546881e5733f88377278beca95c76896..210e63d1307869587fae7bf962d436dbbddd81f0 100644 (file)
@@ -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,