# 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
"""
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)
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:
self.name,
self.ip,
[p + n for p in self.ports],
+ self.rank,
+ self.rank_generation,
)
def matches_daemon(self, dd: DaemonDescription) -> bool:
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:
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))
'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,
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 ...
"""
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)
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:
status_desc=status_desc,
ip=self.ip,
ports=self.ports,
+ rank=self.rank,
+ rank_generation=self.rank_generation,
)
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,
daemon_type=daemon_type,
ports=ports,
ip=ip,
+ rank=rank,
+ rank_generation=rank_generation,
)
def prepare_create(self, daemon_spec: CephadmDaemonDeploySpec) -> CephadmDaemonDeploySpec:
_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',
],
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
# 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
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']: