From: Sage Weil Date: Fri, 23 Apr 2021 19:25:58 +0000 (-0400) Subject: mgr/cephadm: add rank[_generation] properties X-Git-Tag: v17.1.0~1854^2~38 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=5e8f184be8091fdea8d7856a243dca913180e2a9;p=ceph.git mgr/cephadm: add rank[_generation] properties DaemonDescription CephadmDaemonDeploySpec DaemonPlacement unit.meta get_unique_name() (we include it in the daemon_id) Signed-off-by: Sage Weil --- diff --git a/src/pybind/mgr/cephadm/module.py b/src/pybind/mgr/cephadm/module.py index 9cfd6ee0e5a6..f2a158f07bf2 100644 --- a/src/pybind/mgr/cephadm/module.py +++ b/src/pybind/mgr/cephadm/module.py @@ -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) diff --git a/src/pybind/mgr/cephadm/schedule.py b/src/pybind/mgr/cephadm/schedule.py index 6ea9058be657..47214cf5433e 100644 --- a/src/pybind/mgr/cephadm/schedule.py +++ b/src/pybind/mgr/cephadm/schedule.py @@ -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: diff --git a/src/pybind/mgr/cephadm/serve.py b/src/pybind/mgr/cephadm/serve.py index 681434ddcf27..08cc4445d1bb 100644 --- a/src/pybind/mgr/cephadm/serve.py +++ b/src/pybind/mgr/cephadm/serve.py @@ -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, diff --git a/src/pybind/mgr/cephadm/services/cephadmservice.py b/src/pybind/mgr/cephadm/services/cephadmservice.py index fee4820411b9..66c6a92b7270 100644 --- a/src/pybind/mgr/cephadm/services/cephadmservice.py +++ b/src/pybind/mgr/cephadm/services/cephadmservice.py @@ -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: diff --git a/src/pybind/mgr/cephadm/tests/test_cephadm.py b/src/pybind/mgr/cephadm/tests/test_cephadm.py index adb07d878569..ba6c0addfe13 100644 --- a/src/pybind/mgr/cephadm/tests/test_cephadm.py +++ b/src/pybind/mgr/cephadm/tests/test_cephadm.py @@ -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', ], diff --git a/src/pybind/mgr/orchestrator/_interface.py b/src/pybind/mgr/orchestrator/_interface.py index 488401c09496..eb533cb540a5 100644 --- a/src/pybind/mgr/orchestrator/_interface.py +++ b/src/pybind/mgr/orchestrator/_interface.py @@ -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']: