]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
mgr/cephadm: add rank[_generation] properties
authorSage Weil <sage@newdream.net>
Fri, 23 Apr 2021 19:25:58 +0000 (15:25 -0400)
committerSage Weil <sage@newdream.net>
Wed, 19 May 2021 12:43:13 +0000 (08:43 -0400)
DaemonDescription
CephadmDaemonDeploySpec
DaemonPlacement
unit.meta
get_unique_name() (we include it in the daemon_id)

Signed-off-by: Sage Weil <sage@newdream.net>
src/pybind/mgr/cephadm/module.py
src/pybind/mgr/cephadm/schedule.py
src/pybind/mgr/cephadm/serve.py
src/pybind/mgr/cephadm/services/cephadmservice.py
src/pybind/mgr/cephadm/tests/test_cephadm.py
src/pybind/mgr/orchestrator/_interface.py

index 9cfd6ee0e5a69565e59988717797243db10e6f35..f2a158f07bf26f6c0fe6f6bb753f7d0a8bda6c09 100644 (file)
@@ -570,9 +570,16 @@ class CephadmOrchestrator(orchestrator.Orchestrator, MgrModule,
         # cephadm
         self._kick_serve_loop()
 
-    def get_unique_name(self, daemon_type, host, existing, prefix=None,
-                        forcename=None):
-        # type: (str, str, List[orchestrator.DaemonDescription], Optional[str], Optional[str]) -> str
+    def get_unique_name(
+            self,
+            daemon_type: str,
+            host: str,
+            existing: List[orchestrator.DaemonDescription],
+            prefix: Optional[str] = None,
+            forcename: Optional[str] = None,
+            rank: Optional[int] = None,
+            rank_generation: Optional[int] = None,
+    ) -> str:
         """
         Generate a unique random service name
         """
@@ -594,6 +601,8 @@ class CephadmOrchestrator(orchestrator.Orchestrator, MgrModule,
                 name = prefix + '.'
             else:
                 name = ''
+            if rank is not None and rank_generation is not None:
+                name += f'{rank}.{rank_generation}.'
             name += host
             if suffix:
                 name += '.' + ''.join(random.choice(string.ascii_lowercase)
index 6ea9058be657e96ca96f823c4c1e6bd2b9d9c11f..47214cf5433eb3a2516130995c93d0eb2280f5cf 100644 (file)
@@ -19,10 +19,14 @@ class DaemonPlacement(NamedTuple):
     name: str = ''
     ip: Optional[str] = None
     ports: List[int] = []
+    rank: Optional[int] = None
+    rank_generation: Optional[int] = None
 
     def __str__(self) -> str:
         res = self.daemon_type + ':' + self.hostname
         other = []
+        if self.rank is not None:
+            other.append(f'rank={self.rank}.{self.rank_generation}')
         if self.network:
             other.append(f'network={self.network}')
         if self.name:
@@ -41,6 +45,8 @@ class DaemonPlacement(NamedTuple):
             self.name,
             self.ip,
             [p + n for p in self.ports],
+            self.rank,
+            self.rank_generation,
         )
 
     def matches_daemon(self, dd: DaemonDescription) -> bool:
index 681434ddcf274f534b3a7e194f1bb7ba69684d72..08cc4445d1bbe2a55edb70a8cc02a7b8c6bd29ce 100644 (file)
@@ -420,6 +420,8 @@ class CephadmServe:
             sd.version = d.get('version')
             sd.ports = d.get('ports')
             sd.ip = d.get('ip')
+            sd.rank = int(d['rank']) if d.get('rank') is not None else None
+            sd.rank_generation = int(d['rank_generation']) if d.get('rank_generation') is not None else None
             if sd.daemon_type == 'osd':
                 sd.osdspec_affinity = self.mgr.osd_service.get_osdspec_affinity(sd.daemon_id)
             if 'state' in d:
@@ -737,6 +739,8 @@ class CephadmServe:
                 daemon_type=slot.daemon_type,
                 ports=slot.ports,
                 ip=slot.ip,
+                rank=slot.rank,
+                rank_generation=slot.rank_generation,
             )
             self.log.debug('Placing %s.%s on host %s' % (
                 slot.daemon_type, daemon_id, slot.hostname))
@@ -966,6 +970,8 @@ class CephadmServe:
                             'ports': daemon_spec.ports,
                             'ip': daemon_spec.ip,
                             'deployed_by': self.mgr.get_active_mgr_digests(),
+                            'rank': daemon_spec.rank,
+                            'rank_generation': daemon_spec.rank_generation,
                         }),
                         '--config-json', '-',
                     ] + daemon_spec.extra_args,
index fee4820411b981fa2026a99e828244ddd737fa9e..66c6a92b7270efc124106d3dcd4a3c60140bc94b 100644 (file)
@@ -34,7 +34,9 @@ class CephadmDaemonDeploySpec:
                  extra_files: Optional[Dict[str, Any]] = None,
                  daemon_type: Optional[str] = None,
                  ip: Optional[str] = None,
-                 ports: Optional[List[int]] = None):
+                 ports: Optional[List[int]] = None,
+                 rank: Optional[int] = None,
+                 rank_generation: Optional[int] = None):
         """
         A data struction to encapsulate `cephadm deploy ...
         """
@@ -66,6 +68,9 @@ class CephadmDaemonDeploySpec:
         self.final_config: Dict[str, Any] = {}
         self.deps: List[str] = []
 
+        self.rank: Optional[int] = rank
+        self.rank_generation: Optional[int] = rank_generation
+
     def name(self) -> str:
         return '%s.%s' % (self.daemon_type, self.daemon_id)
 
@@ -88,6 +93,8 @@ class CephadmDaemonDeploySpec:
             service_name=dd.service_name(),
             ip=dd.ip,
             ports=dd.ports,
+            rank=dd.rank,
+            rank_generation=dd.rank_generation,
         )
 
     def to_daemon_description(self, status: DaemonDescriptionStatus, status_desc: str) -> DaemonDescription:
@@ -100,6 +107,8 @@ class CephadmDaemonDeploySpec:
             status_desc=status_desc,
             ip=self.ip,
             ports=self.ports,
+            rank=self.rank,
+            rank_generation=self.rank_generation,
         )
 
 
@@ -137,13 +146,16 @@ class CephadmService(metaclass=ABCMeta):
         return None
 
     def make_daemon_spec(
-            self, host: str,
+            self,
+            host: str,
             daemon_id: str,
             network: str,
             spec: ServiceSpecs,
             daemon_type: Optional[str] = None,
             ports: Optional[List[int]] = None,
             ip: Optional[str] = None,
+            rank: Optional[int] = None,
+            rank_generation: Optional[int] = None,
     ) -> CephadmDaemonDeploySpec:
         return CephadmDaemonDeploySpec(
             host=host,
@@ -153,6 +165,8 @@ class CephadmService(metaclass=ABCMeta):
             daemon_type=daemon_type,
             ports=ports,
             ip=ip,
+            rank=rank,
+            rank_generation=rank_generation,
         )
 
     def prepare_create(self, daemon_spec: CephadmDaemonDeploySpec) -> CephadmDaemonDeploySpec:
index adb07d878569c9f2d2a47551ea4274545546b5ad..ba6c0addfe139ffc53095fcc7b44d0407c5adfb8 100644 (file)
@@ -290,7 +290,7 @@ class TestCephadm(object):
                 _run_cephadm.assert_called_with(
                     'test', 'mon.test', 'deploy', [
                         '--name', 'mon.test',
-                        '--meta-json', '{"service_name": "mon", "ports": [], "ip": null, "deployed_by": []}',
+                        '--meta-json', '{"service_name": "mon", "ports": [], "ip": null, "deployed_by": [], "rank": null, "rank_generation": null}',
                         '--config-json', '-',
                         '--reconfig',
                     ],
index 488401c094966b52452c3713ea600092bc8ba9df..eb533cb540a54141ce26292fbed20f9b494cd374 100644 (file)
@@ -794,6 +794,8 @@ class DaemonDescription(object):
                  ports: Optional[List[int]] = None,
                  ip: Optional[str] = None,
                  deployed_by: Optional[List[str]] = None,
+                 rank: Optional[int] = None,
+                 rank_generation: Optional[int] = None,
                  ) -> None:
 
         # Host is at the same granularity as InventoryHost
@@ -816,6 +818,10 @@ class DaemonDescription(object):
         # in the FSMap/ServiceMap.
         self.daemon_id: Optional[str] = daemon_id
 
+        # Some daemon types have a numeric rank assigned
+        self.rank: Optional[int] = rank
+        self.rank_generation: Optional[int] = rank_generation
+
         self._service_name: Optional[str] = service_name
 
         # Service version that was deployed
@@ -960,6 +966,8 @@ class DaemonDescription(object):
         out['is_active'] = self.is_active
         out['ports'] = self.ports
         out['ip'] = self.ip
+        out['rank'] = self.rank
+        out['rank_generation'] = self.rank_generation
 
         for k in ['last_refresh', 'created', 'started', 'last_deployed',
                   'last_configured']: