From: Sebastian Wagner Date: Tue, 23 Feb 2021 12:50:12 +0000 (+0100) Subject: mgr/cephadm: move CephadmExporter to new module X-Git-Tag: v17.1.0~2660^2~8 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=935a15fd06421786096a37c4bae6571bf6467aec;p=ceph.git mgr/cephadm: move CephadmExporter to new module Signed-off-by: Sebastian Wagner --- diff --git a/src/pybind/mgr/cephadm/module.py b/src/pybind/mgr/cephadm/module.py index fa3c858e12d8..e6d19115b094 100644 --- a/src/pybind/mgr/cephadm/module.py +++ b/src/pybind/mgr/cephadm/module.py @@ -45,7 +45,7 @@ from . import remotes from . import utils from .migrations import Migrations from .services.cephadmservice import MonService, MgrService, MdsService, RgwService, \ - RbdMirrorService, CrashService, CephadmService, CephadmExporter, CephadmExporterConfig + RbdMirrorService, CrashService, CephadmService from .services.container import CustomContainerService from .services.iscsi import IscsiService from .services.ha_rgw import HA_RGWService @@ -53,6 +53,7 @@ from .services.nfs import NFSService from .services.osd import OSDRemovalQueue, OSDService, OSD, NotFoundError from .services.monitoring import GrafanaService, AlertmanagerService, PrometheusService, \ NodeExporterService +from .services.exporter import CephadmExporter, CephadmExporterConfig from .schedule import HostAssignment from .inventory import Inventory, SpecStore, HostCache, EventStore from .upgrade import CEPH_UPGRADE_ORDER, CephadmUpgrade diff --git a/src/pybind/mgr/cephadm/services/cephadmservice.py b/src/pybind/mgr/cephadm/services/cephadmservice.py index a8d6ce617519..12578438797b 100644 --- a/src/pybind/mgr/cephadm/services/cephadmservice.py +++ b/src/pybind/mgr/cephadm/services/cephadmservice.py @@ -13,7 +13,6 @@ from ceph.deployment.utils import is_ipv6, unwrap_ipv6 from orchestrator import OrchestratorError, DaemonDescription, DaemonDescriptionStatus from orchestrator._interface import daemon_type_to_service from cephadm import utils -from mgr_util import ServerConfigException, verify_tls if TYPE_CHECKING: from cephadm.module import CephadmOrchestrator @@ -830,137 +829,3 @@ class CrashService(CephService): daemon_spec.final_config, daemon_spec.deps = self.generate_config(daemon_spec) return daemon_spec - - -class CephadmExporterConfig: - required_keys = ['crt', 'key', 'token', 'port'] - DEFAULT_PORT = '9443' - - def __init__(self, mgr, crt="", key="", token="", port=""): - # type: (CephadmOrchestrator, str, str, str, str) -> None - self.mgr = mgr - self.crt = crt - self.key = key - self.token = token - self.port = port - - @property - def ready(self) -> bool: - return all([self.crt, self.key, self.token, self.port]) - - def load_from_store(self) -> None: - cfg = self.mgr._get_exporter_config() - - assert isinstance(cfg, dict) - self.crt = cfg.get('crt', "") - self.key = cfg.get('key', "") - self.token = cfg.get('token', "") - self.port = cfg.get('port', "") - - def load_from_json(self, json_str: str) -> Tuple[int, str]: - try: - cfg = json.loads(json_str) - except ValueError: - return 1, "Invalid JSON provided - unable to load" - - if not all([k in cfg for k in CephadmExporterConfig.required_keys]): - return 1, "JSON file must contain crt, key, token and port" - - self.crt = cfg.get('crt') - self.key = cfg.get('key') - self.token = cfg.get('token') - self.port = cfg.get('port') - - return 0, "" - - def validate_config(self) -> Tuple[int, str]: - if not self.ready: - return 1, "Incomplete configuration. cephadm-exporter needs crt, key, token and port to be set" - - for check in [self._validate_tls, self._validate_token, self._validate_port]: - rc, reason = check() - if rc: - return 1, reason - - return 0, "" - - def _validate_tls(self) -> Tuple[int, str]: - - try: - verify_tls(self.crt, self.key) - except ServerConfigException as e: - return 1, str(e) - - return 0, "" - - def _validate_token(self) -> Tuple[int, str]: - if not isinstance(self.token, str): - return 1, "token must be a string" - if len(self.token) < 8: - return 1, "Token must be a string of at least 8 chars in length" - - return 0, "" - - def _validate_port(self) -> Tuple[int, str]: - try: - p = int(str(self.port)) - if p <= 1024: - raise ValueError - except ValueError: - return 1, "Port must be a integer (>1024)" - - return 0, "" - - -class CephadmExporter(CephadmService): - TYPE = 'cephadm-exporter' - - def prepare_create(self, daemon_spec: CephadmDaemonDeploySpec) -> CephadmDaemonDeploySpec: - assert self.TYPE == daemon_spec.daemon_type - - cfg = CephadmExporterConfig(self.mgr) - cfg.load_from_store() - - if cfg.ready: - rc, reason = cfg.validate_config() - if rc: - raise OrchestratorError(reason) - else: - logger.info( - "Incomplete/Missing configuration, applying defaults") - self.mgr._set_exporter_defaults() - cfg.load_from_store() - - if not daemon_spec.ports: - daemon_spec.ports = [int(cfg.port)] - - daemon_spec.final_config, daemon_spec.deps = self.generate_config(daemon_spec) - - return daemon_spec - - def generate_config(self, daemon_spec: CephadmDaemonDeploySpec) -> Tuple[Dict[str, Any], List[str]]: - assert self.TYPE == daemon_spec.daemon_type - deps: List[str] = [] - - cfg = CephadmExporterConfig(self.mgr) - cfg.load_from_store() - - if cfg.ready: - rc, reason = cfg.validate_config() - if rc: - raise OrchestratorError(reason) - else: - logger.info("Using default configuration for cephadm-exporter") - self.mgr._set_exporter_defaults() - cfg.load_from_store() - - config = { - "crt": cfg.crt, - "key": cfg.key, - "token": cfg.token - } - return config, deps - - def purge(self, service_name: str) -> None: - logger.info("Purging cephadm-exporter settings from mon K/V store") - self.mgr._clear_exporter_config_settings() diff --git a/src/pybind/mgr/cephadm/services/exporter.py b/src/pybind/mgr/cephadm/services/exporter.py new file mode 100644 index 000000000000..d6bef885bc2f --- /dev/null +++ b/src/pybind/mgr/cephadm/services/exporter.py @@ -0,0 +1,147 @@ +import json +import logging +from typing import TYPE_CHECKING, List, Dict, Any, Tuple + +from orchestrator import OrchestratorError +from mgr_util import ServerConfigException, verify_tls + +from .cephadmservice import CephadmService, CephadmDaemonDeploySpec + +if TYPE_CHECKING: + from cephadm.module import CephadmOrchestrator + +logger = logging.getLogger(__name__) + + +class CephadmExporterConfig: + required_keys = ['crt', 'key', 'token', 'port'] + DEFAULT_PORT = '9443' + + def __init__(self, mgr, crt="", key="", token="", port=""): + # type: (CephadmOrchestrator, str, str, str, str) -> None + self.mgr = mgr + self.crt = crt + self.key = key + self.token = token + self.port = port + + @property + def ready(self) -> bool: + return all([self.crt, self.key, self.token, self.port]) + + def load_from_store(self) -> None: + cfg = self.mgr._get_exporter_config() + + assert isinstance(cfg, dict) + self.crt = cfg.get('crt', "") + self.key = cfg.get('key', "") + self.token = cfg.get('token', "") + self.port = cfg.get('port', "") + + def load_from_json(self, json_str: str) -> Tuple[int, str]: + try: + cfg = json.loads(json_str) + except ValueError: + return 1, "Invalid JSON provided - unable to load" + + if not all([k in cfg for k in CephadmExporterConfig.required_keys]): + return 1, "JSON file must contain crt, key, token and port" + + self.crt = cfg.get('crt') + self.key = cfg.get('key') + self.token = cfg.get('token') + self.port = cfg.get('port') + + return 0, "" + + def validate_config(self) -> Tuple[int, str]: + if not self.ready: + return 1, "Incomplete configuration. cephadm-exporter needs crt, key, token and port to be set" + + for check in [self._validate_tls, self._validate_token, self._validate_port]: + rc, reason = check() + if rc: + return 1, reason + + return 0, "" + + def _validate_tls(self) -> Tuple[int, str]: + + try: + verify_tls(self.crt, self.key) + except ServerConfigException as e: + return 1, str(e) + + return 0, "" + + def _validate_token(self) -> Tuple[int, str]: + if not isinstance(self.token, str): + return 1, "token must be a string" + if len(self.token) < 8: + return 1, "Token must be a string of at least 8 chars in length" + + return 0, "" + + def _validate_port(self) -> Tuple[int, str]: + try: + p = int(str(self.port)) + if p <= 1024: + raise ValueError + except ValueError: + return 1, "Port must be a integer (>1024)" + + return 0, "" + + +class CephadmExporter(CephadmService): + TYPE = 'cephadm-exporter' + + def prepare_create(self, daemon_spec: CephadmDaemonDeploySpec) -> CephadmDaemonDeploySpec: + assert self.TYPE == daemon_spec.daemon_type + + cfg = CephadmExporterConfig(self.mgr) + cfg.load_from_store() + + if cfg.ready: + rc, reason = cfg.validate_config() + if rc: + raise OrchestratorError(reason) + else: + logger.info( + "Incomplete/Missing configuration, applying defaults") + self.mgr._set_exporter_defaults() + cfg.load_from_store() + + if not daemon_spec.ports: + daemon_spec.ports = [int(cfg.port)] + + daemon_spec.final_config, daemon_spec.deps = self.generate_config(daemon_spec) + + return daemon_spec + + def generate_config(self, daemon_spec: CephadmDaemonDeploySpec) -> Tuple[Dict[str, Any], List[str]]: + assert self.TYPE == daemon_spec.daemon_type + deps: List[str] = [] + + cfg = CephadmExporterConfig(self.mgr) + cfg.load_from_store() + + if cfg.ready: + rc, reason = cfg.validate_config() + if rc: + raise OrchestratorError(reason) + else: + logger.info("Using default configuration for cephadm-exporter") + self.mgr._set_exporter_defaults() + cfg.load_from_store() + + config = { + "crt": cfg.crt, + "key": cfg.key, + "token": cfg.token + } + return config, deps + + def purge(self, service_name: str) -> None: + logger.info("Purging cephadm-exporter settings from mon K/V store") + self.mgr._clear_exporter_config_settings() diff --git a/src/pybind/mgr/cephadm/tests/test_services.py b/src/pybind/mgr/cephadm/tests/test_services.py index 916859b63858..19fc5b36e401 100644 --- a/src/pybind/mgr/cephadm/tests/test_services.py +++ b/src/pybind/mgr/cephadm/tests/test_services.py @@ -3,12 +3,13 @@ import pytest from unittest.mock import MagicMock, call from cephadm.services.cephadmservice import MonService, MgrService, MdsService, RgwService, \ - RbdMirrorService, CrashService, CephadmExporter, CephadmDaemonDeploySpec + RbdMirrorService, CrashService, CephadmDaemonDeploySpec from cephadm.services.iscsi import IscsiService from cephadm.services.nfs import NFSService from cephadm.services.osd import OSDService from cephadm.services.monitoring import GrafanaService, AlertmanagerService, PrometheusService, \ NodeExporterService +from cephadm.services.exporter import CephadmExporter from ceph.deployment.service_spec import IscsiServiceSpec from orchestrator import OrchestratorError