import logging
from collections import defaultdict
from contextlib import contextmanager
-from typing import TYPE_CHECKING, Optional, List, Callable, cast, Set, Dict, Any, Union, Tuple, Iterator
+from typing import TYPE_CHECKING, Optional, List, cast, Set, Dict, Any, Union, Tuple, Iterator
from cephadm import remotes
from ceph.deployment import inventory
from ceph.deployment.drive_group import DriveGroupSpec
-from ceph.deployment.service_spec import ServiceSpec, HostPlacementSpec, RGWSpec, \
+from ceph.deployment.service_spec import ServiceSpec, HostPlacementSpec, \
HA_RGWSpec, CustomContainerSpec
from ceph.utils import str_to_datetime, datetime_now
return r
- def _config_fn(self, service_type: str) -> Optional[Callable[[ServiceSpec], None]]:
- fn = {
- 'mds': self.mgr.mds_service.config,
- 'rgw': self.mgr.rgw_service.config,
- 'nfs': self.mgr.nfs_service.config,
- 'iscsi': self.mgr.iscsi_service.config,
- }.get(service_type)
- return cast(Callable[[ServiceSpec], None], fn)
-
def _apply_service(self, spec: ServiceSpec) -> bool:
"""
Schedule a service. Deploy new daemons or remove old ones, depending
return False
self.log.debug('Applying service %s spec' % service_name)
- config_func = self._config_fn(service_type)
-
if service_type == 'osd':
self.mgr.osd_service.create_from_spec(cast(DriveGroupSpec, spec))
# TODO: return True would result in a busy loop
prefix=spec.service_id,
forcename=name)
- if not did_config and config_func:
- if daemon_type == 'rgw':
- rgw_config_func = cast(Callable[[RGWSpec, str], None], config_func)
- rgw_config_func(cast(RGWSpec, spec), daemon_id)
- else:
- config_func(spec)
+ if not did_config:
+ self.mgr.cephadm_services[service_type].config(spec, daemon_id)
did_config = True
daemon_spec = self.mgr.cephadm_services[service_type].make_daemon_spec(
def generate_config(self, daemon_spec: CephadmDaemonSpec) -> Tuple[Dict[str, Any], List[str]]:
raise NotImplementedError()
+ def config(self, spec: ServiceSpec, daemon_id: str) -> None:
+ """
+ Configure the cluster for this service. Only called *once* per
+ service apply. Not for every daemon.
+ """
+ pass
+
def daemon_check_post(self, daemon_descrs: List[DaemonDescription]) -> None:
"""The post actions needed to be done after daemons are checked"""
if self.mgr.config_dashboard:
class MdsService(CephService):
TYPE = 'mds'
- def config(self, spec: ServiceSpec) -> None:
+ def config(self, spec: ServiceSpec, daemon_id: str) -> None:
assert self.TYPE == spec.service_type
assert spec.service_id
class RgwService(CephService):
TYPE = 'rgw'
- def config(self, spec: RGWSpec, rgw_id: str) -> None:
+ def config(self, spec: RGWSpec, rgw_id: str) -> None: # type: ignore
assert self.TYPE == spec.service_type
# create realm, zonegroup, and zone if needed