From f8186bd72f807df3c8a31b8c515d2a9e4bb69d09 Mon Sep 17 00:00:00 2001 From: Michael Fritch Date: Wed, 15 Jul 2020 16:23:59 -0600 Subject: [PATCH] mgr/cephadm: assert the service_type during config/create ensure the passed ServiceSpec type matches the CephadmService type Signed-off-by: Michael Fritch --- .../mgr/cephadm/services/cephadmservice.py | 16 +++++++++++++++- src/pybind/mgr/cephadm/services/iscsi.py | 7 +++++-- src/pybind/mgr/cephadm/services/monitoring.py | 8 ++++++++ src/pybind/mgr/cephadm/services/nfs.py | 8 ++++++++ 4 files changed, 36 insertions(+), 3 deletions(-) diff --git a/src/pybind/mgr/cephadm/services/cephadmservice.py b/src/pybind/mgr/cephadm/services/cephadmservice.py index 0738f352c76..6a1bda7c49f 100644 --- a/src/pybind/mgr/cephadm/services/cephadmservice.py +++ b/src/pybind/mgr/cephadm/services/cephadmservice.py @@ -222,6 +222,7 @@ class MonService(CephadmService): """ Create a new monitor on the given host. """ + assert self.TYPE == daemon_spec.daemon_type name, host, network = daemon_spec.daemon_id, daemon_spec.host, daemon_spec.network # get mon. key @@ -300,7 +301,9 @@ class MgrService(CephadmService): """ Create a new manager instance on a host. """ + assert self.TYPE == daemon_spec.daemon_type mgr_id, host = daemon_spec.daemon_id, daemon_spec.host + # get mgr. key ret, keyring, err = self.mgr.check_mon_command({ 'prefix': 'auth get-or-create', @@ -319,8 +322,10 @@ class MdsService(CephadmService): TYPE = 'mds' def config(self, spec: ServiceSpec) -> None: - # ensure mds_join_fs is set for these daemons + assert self.TYPE == spec.service_type assert spec.service_id + + # ensure mds_join_fs is set for these daemons ret, out, err = self.mgr.check_mon_command({ 'prefix': 'config set', 'who': 'mds.' + spec.service_id, @@ -329,6 +334,7 @@ class MdsService(CephadmService): }) def create(self, daemon_spec: CephadmDaemonSpec) -> str: + assert self.TYPE == daemon_spec.daemon_type mds_id, host = daemon_spec.daemon_id, daemon_spec.host # get mgr. key @@ -348,6 +354,8 @@ class RgwService(CephadmService): TYPE = 'rgw' def config(self, spec: RGWSpec) -> None: + assert self.TYPE == spec.service_type + # ensure rgw_realm and rgw_zone is set for these daemons ret, out, err = self.mgr.check_mon_command({ 'prefix': 'config set', @@ -403,7 +411,9 @@ class RgwService(CephadmService): self.mgr.spec_store.save(spec) def create(self, daemon_spec: CephadmDaemonSpec) -> str: + assert self.TYPE == daemon_spec.daemon_type rgw_id, host = daemon_spec.daemon_id, daemon_spec.host + ret, keyring, err = self.mgr.check_mon_command({ 'prefix': 'auth get-or-create', 'entity': f"{utils.name_to_config_section('rgw')}.{rgw_id}", @@ -421,7 +431,9 @@ class RbdMirrorService(CephadmService): TYPE = 'rbd-mirror' def create(self, daemon_spec: CephadmDaemonSpec) -> str: + assert self.TYPE == daemon_spec.daemon_type daemon_id, host = daemon_spec.daemon_id, daemon_spec.host + ret, keyring, err = self.mgr.check_mon_command({ 'prefix': 'auth get-or-create', 'entity': 'client.rbd-mirror.' + daemon_id, @@ -438,7 +450,9 @@ class CrashService(CephadmService): TYPE = 'crash' def create(self, daemon_spec: CephadmDaemonSpec) -> str: + assert self.TYPE == daemon_spec.daemon_type daemon_id, host = daemon_spec.daemon_id, daemon_spec.host + ret, keyring, err = self.mgr.check_mon_command({ 'prefix': 'auth get-or-create', 'entity': 'client.crash.' + host, diff --git a/src/pybind/mgr/cephadm/services/iscsi.py b/src/pybind/mgr/cephadm/services/iscsi.py index 1c46dd674de..86ec539cb5f 100644 --- a/src/pybind/mgr/cephadm/services/iscsi.py +++ b/src/pybind/mgr/cephadm/services/iscsi.py @@ -16,6 +16,7 @@ class IscsiService(CephadmService): TYPE = 'iscsi' def config(self, spec: IscsiServiceSpec) -> None: + assert self.TYPE == spec.service_type self.mgr._check_pool_exists(spec.pool, spec.service_name()) logger.info('Saving service %s spec with placement %s' % ( @@ -23,10 +24,12 @@ class IscsiService(CephadmService): self.mgr.spec_store.save(spec) def create(self, daemon_spec: CephadmDaemonSpec[IscsiServiceSpec]) -> str: + assert self.TYPE == daemon_spec.daemon_type + assert daemon_spec.spec + spec = daemon_spec.spec - if spec is None: - raise OrchestratorError(f'Unable to deploy {daemon_spec.name()}: Service not found.') igw_id = daemon_spec.daemon_id + ret, keyring, err = self.mgr.check_mon_command({ 'prefix': 'auth get-or-create', 'entity': utils.name_to_auth_entity('iscsi', igw_id), diff --git a/src/pybind/mgr/cephadm/services/monitoring.py b/src/pybind/mgr/cephadm/services/monitoring.py index 4616f34af24..f910a644469 100644 --- a/src/pybind/mgr/cephadm/services/monitoring.py +++ b/src/pybind/mgr/cephadm/services/monitoring.py @@ -13,9 +13,11 @@ class GrafanaService(CephadmService): DEFAULT_SERVICE_PORT = 3000 def create(self, daemon_spec: CephadmDaemonSpec) -> str: + assert self.TYPE == daemon_spec.daemon_type return self.mgr._create_daemon(daemon_spec) def generate_config(self, daemon_spec: CephadmDaemonSpec) -> Tuple[Dict[str, Any], List[str]]: + assert self.TYPE == daemon_spec.daemon_type deps = [] # type: List[str] prom_services = [] # type: List[str] @@ -76,9 +78,11 @@ class AlertmanagerService(CephadmService): DEFAULT_SERVICE_PORT = 9093 def create(self, daemon_spec: CephadmDaemonSpec) -> str: + assert self.TYPE == daemon_spec.daemon_type return self.mgr._create_daemon(daemon_spec) def generate_config(self, daemon_spec: CephadmDaemonSpec) -> Tuple[Dict[str, Any], List[str]]: + assert self.TYPE == daemon_spec.daemon_type deps = [] # type: List[str] # dashboard(s) @@ -143,9 +147,11 @@ class PrometheusService(CephadmService): DEFAULT_SERVICE_PORT = 9095 def create(self, daemon_spec: CephadmDaemonSpec) -> str: + assert self.TYPE == daemon_spec.daemon_type return self.mgr._create_daemon(daemon_spec) def generate_config(self, daemon_spec: CephadmDaemonSpec) -> Tuple[Dict[str, Any], List[str]]: + assert self.TYPE == daemon_spec.daemon_type deps = [] # type: List[str] # scrape mgrs @@ -230,7 +236,9 @@ class NodeExporterService(CephadmService): TYPE = 'node-exporter' def create(self, daemon_spec: CephadmDaemonSpec) -> str: + assert self.TYPE == daemon_spec.daemon_type return self.mgr._create_daemon(daemon_spec) def generate_config(self, daemon_spec: CephadmDaemonSpec) -> Tuple[Dict[str, Any], List[str]]: + assert self.TYPE == daemon_spec.daemon_type return {}, [] diff --git a/src/pybind/mgr/cephadm/services/nfs.py b/src/pybind/mgr/cephadm/services/nfs.py index c47c4705d0a..ed751ec4ec0 100644 --- a/src/pybind/mgr/cephadm/services/nfs.py +++ b/src/pybind/mgr/cephadm/services/nfs.py @@ -21,6 +21,8 @@ class NFSService(CephadmService): TYPE = 'nfs' def generate_config(self, daemon_spec: CephadmDaemonSpec) -> Tuple[Dict[str, Any], List[str]]: + assert self.TYPE == daemon_spec.daemon_type + daemon_type = daemon_spec.daemon_type daemon_id = daemon_spec.daemon_id host = daemon_spec.host @@ -67,15 +69,21 @@ class NFSService(CephadmService): return cephadm_config, deps def config(self, spec: NFSServiceSpec) -> None: + assert self.TYPE == spec.service_type self.mgr._check_pool_exists(spec.pool, spec.service_name()) + logger.info('Saving service %s spec with placement %s' % ( spec.service_name(), spec.placement.pretty_str())) self.mgr.spec_store.save(spec) def create(self, daemon_spec: CephadmDaemonSpec[NFSServiceSpec]) -> str: + assert self.TYPE == daemon_spec.daemon_type + assert daemon_spec.spec + daemon_id = daemon_spec.daemon_id host = daemon_spec.host spec = daemon_spec.spec + logger.info('Create daemon %s on host %s with spec %s' % ( daemon_id, host, spec)) return self.mgr._create_daemon(daemon_spec) -- 2.47.3