From c133705892cce3bd9ccd981e8080511bdbc12a0e Mon Sep 17 00:00:00 2001 From: Michael Fritch Date: Tue, 1 Sep 2020 14:39:17 -0600 Subject: [PATCH] mgr/cephadm: introduce `CephService` class - split the cephx related keyring functions into a `CephService` class - move _get_config_and_keyring and get_keyring_entity to this new class - monitoring stack (prom, grafana, etc) have no use for cephx keyrings Signed-off-by: Michael Fritch --- src/pybind/mgr/cephadm/module.py | 27 +------- .../mgr/cephadm/services/cephadmservice.py | 68 ++++++++++++++----- src/pybind/mgr/cephadm/services/iscsi.py | 4 +- src/pybind/mgr/cephadm/services/nfs.py | 6 +- src/pybind/mgr/cephadm/services/osd.py | 4 +- src/pybind/mgr/cephadm/tests/test_services.py | 2 +- 6 files changed, 59 insertions(+), 52 deletions(-) diff --git a/src/pybind/mgr/cephadm/module.py b/src/pybind/mgr/cephadm/module.py index 14c6d8c1fbf..449dc8830b6 100644 --- a/src/pybind/mgr/cephadm/module.py +++ b/src/pybind/mgr/cephadm/module.py @@ -35,7 +35,7 @@ from . import remotes from . import utils from .migrations import Migrations from .services.cephadmservice import MonService, MgrService, MdsService, RgwService, \ - RbdMirrorService, CrashService, CephadmService, AuthEntity + RbdMirrorService, CrashService, CephadmService from .services.iscsi import IscsiService from .services.nfs import NFSService from .services.osd import RemoveUtil, OSDQueue, OSDService, OSD, NotFoundError @@ -1880,31 +1880,6 @@ To check that the host is reachable: deps.append(dd.name()) return sorted(deps) - def _get_config_and_keyring(self, daemon_type, daemon_id, host, - keyring=None, - extra_ceph_config=None): - # type: (str, str, str, Optional[str], Optional[str]) -> Dict[str, Any] - # keyring - if not keyring: - entity: AuthEntity = \ - self.cephadm_services[daemon_type].get_auth_entity(daemon_id, host=host) - ret, keyring, err = self.check_mon_command({ - 'prefix': 'auth get', - 'entity': entity, - }) - - # generate config - ret, config, err = self.check_mon_command({ - "prefix": "config generate-minimal-conf", - }) - if extra_ceph_config: - config += extra_ceph_config - - return { - 'config': config, - 'keyring': keyring, - } - def _create_daemon(self, daemon_spec: CephadmDaemonSpec, reconfig=False, diff --git a/src/pybind/mgr/cephadm/services/cephadmservice.py b/src/pybind/mgr/cephadm/services/cephadmservice.py index 476dde93751..648ca1c931e 100644 --- a/src/pybind/mgr/cephadm/services/cephadmservice.py +++ b/src/pybind/mgr/cephadm/services/cephadmservice.py @@ -90,18 +90,7 @@ class CephadmService(metaclass=ABCMeta): raise NotImplementedError() def generate_config(self, daemon_spec: CephadmDaemonSpec) -> Tuple[Dict[str, Any], List[str]]: - # Ceph.daemons (mon, mgr, mds, osd, etc) - cephadm_config = self.mgr._get_config_and_keyring( - daemon_spec.daemon_type, - daemon_spec.daemon_id, - host=daemon_spec.host, - keyring=daemon_spec.keyring, - extra_ceph_config=daemon_spec.extra_config.pop('config', '')) - - if daemon_spec.extra_config: - cephadm_config.update({'files': daemon_spec.extra_config}) - - return cephadm_config, [] + raise NotImplementedError() def daemon_check_post(self, daemon_descrs: List[DaemonDescription]): """The post actions needed to be done after daemons are checked""" @@ -229,6 +218,22 @@ class CephadmService(metaclass=ABCMeta): """ pass + +class CephService(CephadmService): + def generate_config(self, daemon_spec: CephadmDaemonSpec) -> Tuple[Dict[str, Any], List[str]]: + # Ceph.daemons (mon, mgr, mds, osd, etc) + cephadm_config = self.get_config_and_keyring( + daemon_spec.daemon_type, + daemon_spec.daemon_id, + host=daemon_spec.host, + keyring=daemon_spec.keyring, + extra_ceph_config=daemon_spec.extra_config.pop('config', '')) + + if daemon_spec.extra_config: + cephadm_config.update({'files': daemon_spec.extra_config}) + + return cephadm_config, [] + def get_auth_entity(self, daemon_id: str, host: str = "") -> AuthEntity: """ Map the daemon id to a cephx keyring entity name @@ -246,8 +251,35 @@ class CephadmService(metaclass=ABCMeta): else: raise OrchestratorError("unknown daemon type") + def get_config_and_keyring(self, + daemon_type: str, + daemon_id: str, + host: str, + keyring: Optional[str] = None, + extra_ceph_config: Optional[str] = None + ) -> Dict[str, Any]: + # keyring + if not keyring: + entity: AuthEntity = self.get_auth_entity(daemon_id, host=host) + ret, keyring, err = self.mgr.check_mon_command({ + 'prefix': 'auth get', + 'entity': entity, + }) + + # generate config + ret, config, err = self.mgr.check_mon_command({ + "prefix": "config generate-minimal-conf", + }) + if extra_ceph_config: + config += extra_ceph_config + + return { + 'config': config, + 'keyring': keyring, + } + -class MonService(CephadmService): +class MonService(CephService): TYPE = 'mon' def create(self, daemon_spec: CephadmDaemonSpec) -> str: @@ -332,7 +364,7 @@ class MonService(CephadmService): }) -class MgrService(CephadmService): +class MgrService(CephService): TYPE = 'mgr' def create(self, daemon_spec: CephadmDaemonSpec) -> str: @@ -408,7 +440,7 @@ class MgrService(CephadmService): return bool(num) -class MdsService(CephadmService): +class MdsService(CephService): TYPE = 'mds' def config(self, spec: ServiceSpec) -> None: @@ -455,7 +487,7 @@ class MdsService(CephadmService): return DaemonDescription() -class RgwService(CephadmService): +class RgwService(CephService): TYPE = 'rgw' def config(self, spec: RGWSpec, rgw_id: str): @@ -655,7 +687,7 @@ class RgwService(CephadmService): self.mgr.log.info('updated period') -class RbdMirrorService(CephadmService): +class RbdMirrorService(CephService): TYPE = 'rbd-mirror' def create(self, daemon_spec: CephadmDaemonSpec) -> str: @@ -674,7 +706,7 @@ class RbdMirrorService(CephadmService): return self.mgr._create_daemon(daemon_spec) -class CrashService(CephadmService): +class CrashService(CephService): TYPE = 'crash' def create(self, daemon_spec: CephadmDaemonSpec) -> str: diff --git a/src/pybind/mgr/cephadm/services/iscsi.py b/src/pybind/mgr/cephadm/services/iscsi.py index 3b9b4ff0a59..965e7492496 100644 --- a/src/pybind/mgr/cephadm/services/iscsi.py +++ b/src/pybind/mgr/cephadm/services/iscsi.py @@ -6,13 +6,13 @@ from mgr_module import MonCommandFailed from ceph.deployment.service_spec import IscsiServiceSpec from orchestrator import DaemonDescription, OrchestratorError -from .cephadmservice import CephadmService, CephadmDaemonSpec +from .cephadmservice import CephadmDaemonSpec, CephService from .. import utils logger = logging.getLogger(__name__) -class IscsiService(CephadmService): +class IscsiService(CephService): TYPE = 'iscsi' def config(self, spec: IscsiServiceSpec) -> None: diff --git a/src/pybind/mgr/cephadm/services/nfs.py b/src/pybind/mgr/cephadm/services/nfs.py index ed3e0c393f2..d3220ee4ab5 100644 --- a/src/pybind/mgr/cephadm/services/nfs.py +++ b/src/pybind/mgr/cephadm/services/nfs.py @@ -7,7 +7,7 @@ import rados from orchestrator import OrchestratorError, DaemonDescription from cephadm import utils -from cephadm.services.cephadmservice import CephadmService, CephadmDaemonSpec +from cephadm.services.cephadmservice import CephadmDaemonSpec, CephService if TYPE_CHECKING: from cephadm.module import CephadmOrchestrator @@ -15,7 +15,7 @@ if TYPE_CHECKING: logger = logging.getLogger(__name__) -class NFSService(CephadmService): +class NFSService(CephService): TYPE = 'nfs' def config(self, spec: NFSServiceSpec) -> None: @@ -81,7 +81,7 @@ class NFSService(CephadmService): 'ganesha.conf': get_ganesha_conf(), } config.update( - self.mgr._get_config_and_keyring( + self.get_config_and_keyring( daemon_type, daemon_id, keyring=keyring, host=host diff --git a/src/pybind/mgr/cephadm/services/osd.py b/src/pybind/mgr/cephadm/services/osd.py index 96ff202c2a1..9f350e82f58 100644 --- a/src/pybind/mgr/cephadm/services/osd.py +++ b/src/pybind/mgr/cephadm/services/osd.py @@ -12,13 +12,13 @@ from cephadm.utils import forall_hosts from orchestrator import OrchestratorError from mgr_module import MonCommandFailed -from cephadm.services.cephadmservice import CephadmService, CephadmDaemonSpec +from cephadm.services.cephadmservice import CephadmDaemonSpec, CephService logger = logging.getLogger(__name__) DATEFMT = '%Y-%m-%dT%H:%M:%S.%f' -class OSDService(CephadmService): +class OSDService(CephService): TYPE = 'osd' def create_from_spec(self, drive_group: DriveGroupSpec) -> str: diff --git a/src/pybind/mgr/cephadm/tests/test_services.py b/src/pybind/mgr/cephadm/tests/test_services.py index 865b4856dec..2a66665bb63 100644 --- a/src/pybind/mgr/cephadm/tests/test_services.py +++ b/src/pybind/mgr/cephadm/tests/test_services.py @@ -108,7 +108,7 @@ class TestCephadmService: assert "%s.id1" % daemon_type == \ cephadm_services[daemon_type].get_auth_entity("id1") - with pytest.raises(OrchestratorError): + with pytest.raises(AttributeError): for daemon_type in ['grafana', 'alertmanager', 'prometheus', 'node-exporter']: cephadm_services[daemon_type].get_auth_entity("id1", "host") cephadm_services[daemon_type].get_auth_entity("id1", "") -- 2.39.5