]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/cephadm: move CephadmExporter to new module
authorSebastian Wagner <sebastian.wagner@suse.com>
Tue, 23 Feb 2021 12:50:12 +0000 (13:50 +0100)
committerSage Weil <sage@newdream.net>
Tue, 16 Mar 2021 12:56:18 +0000 (07:56 -0500)
Signed-off-by: Sebastian Wagner <sebastian.wagner@suse.com>
(cherry picked from commit 935a15fd06421786096a37c4bae6571bf6467aec)

src/pybind/mgr/cephadm/module.py
src/pybind/mgr/cephadm/services/cephadmservice.py
src/pybind/mgr/cephadm/services/exporter.py [new file with mode: 0644]
src/pybind/mgr/cephadm/tests/test_services.py

index fa3c858e12d8bff90c369c1590b50af5fc63bd20..e6d19115b09487d3e7e6c48987c9f59b49ca3cbd 100644 (file)
@@ -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
index a8d6ce6175195006053637904036818b871c3856..12578438797b8f1167d3737f1b56fa205a2ddbc9 100644 (file)
@@ -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 (file)
index 0000000..d6bef88
--- /dev/null
@@ -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()
index 916859b63858b6cdf689ba7a55e6be5836132578..19fc5b36e401296e8ee2f412fd4f963cdb40d35f 100644 (file)
@@ -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