]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/cephadm: Add GrafanaService
authorSebastian Wagner <sebastian.wagner@suse.com>
Mon, 4 May 2020 12:21:21 +0000 (14:21 +0200)
committerSebastian Wagner <sebastian.wagner@suse.com>
Thu, 7 May 2020 11:06:01 +0000 (13:06 +0200)
Signed-off-by: Sebastian Wagner <sebastian.wagner@suse.com>
src/pybind/mgr/cephadm/module.py
src/pybind/mgr/cephadm/services/monitoring.py [new file with mode: 0644]

index 3df349af9d052ae9d01dc7e027b2130e36eb2177..3e89200d3b4705a8d769c220620d9c9234c6312d 100644 (file)
@@ -5,8 +5,6 @@ import time
 from threading import Event
 from functools import wraps
 
-from mgr_util import create_self_signed_cert, verify_tls, ServerConfigException
-
 import string
 try:
     from typing import List, Dict, Optional, Callable, Tuple, TypeVar, Type, \
@@ -42,6 +40,7 @@ from .services.cephadmservice import MonService, MgrService, MdsService, RgwServ
     RbdMirrorService
 from .services.nfs import NFSService
 from .services.osd import RemoveUtil, OSDRemoval, OSDService
+from .services.monitoring import GrafanaService
 from .inventory import Inventory, SpecStore, HostCache
 
 try:
@@ -429,6 +428,7 @@ class CephadmOrchestrator(orchestrator.Orchestrator, MgrModule):
         self.mds_service = MdsService(self)
         self.rgw_service = RgwService(self)
         self.rbd_mirror_service = RbdMirrorService(self)
+        self.grafana_service = GrafanaService(self)
 
     def shutdown(self):
         self.log.debug('shutdown')
@@ -1831,7 +1831,7 @@ class CephadmOrchestrator(orchestrator.Orchestrator, MgrModule):
             cephadm_config, deps = self._generate_prometheus_config()
             extra_args.extend(['--config-json', '-'])
         elif daemon_type == 'grafana':
-            cephadm_config, deps = self._generate_grafana_config()
+            cephadm_config, deps = self.grafana_service.generate_config()
             extra_args.extend(['--config-json', '-'])
         elif daemon_type == 'nfs':
             cephadm_config, deps = \
@@ -1938,7 +1938,7 @@ class CephadmOrchestrator(orchestrator.Orchestrator, MgrModule):
             'rgw': self.rgw_service.create,
             'rbd-mirror': self.rbd_mirror_service.create,
             'nfs': self.nfs_service.create,
-            'grafana': self._create_grafana,
+            'grafana': self.grafana_service.create,
             'alertmanager': self._create_alertmanager,
             'prometheus': self._create_prometheus,
             'node-exporter': self._create_node_exporter,
@@ -2418,98 +2418,6 @@ scrape_configs:
 
         return r, sorted(deps)
 
-    def _generate_grafana_config(self):
-        # type: () -> Tuple[Dict[str, Any], List[str]]
-        deps = []  # type: List[str]
-        def generate_grafana_ds_config(hosts: List[str]) -> str:
-            config = '''# generated by cephadm
-deleteDatasources:
-{delete_data_sources}
-
-datasources:
-{data_sources}
-'''
-            delete_ds_template = '''
-  - name: '{name}'
-    orgId: 1\n'''.lstrip('\n')
-            ds_template = '''
-  - name: '{name}'
-    type: 'prometheus'
-    access: 'proxy'
-    orgId: 1
-    url: 'http://{host}:9095'
-    basicAuth: false
-    isDefault: {is_default}
-    editable: false\n'''.lstrip('\n')
-
-            delete_data_sources = ''
-            data_sources = ''
-            for i, host in enumerate(hosts):
-                name = "Dashboard %d" % (i + 1)
-                data_sources += ds_template.format(
-                    name=name,
-                    host=host,
-                    is_default=str(i == 0).lower()
-                )
-                delete_data_sources += delete_ds_template.format(
-                    name=name
-                )
-            return config.format(
-                delete_data_sources=delete_data_sources,
-                data_sources=data_sources,
-            )
-
-        prom_services = []  # type: List[str]
-        for dd in self.cache.get_daemons_by_service('prometheus'):
-            prom_services.append(dd.hostname)
-            deps.append(dd.name())
-
-        cert = self.get_store('grafana_crt')
-        pkey = self.get_store('grafana_key')
-        if cert and pkey:
-            try:
-                verify_tls(cert, pkey)
-            except ServerConfigException as e:
-                logger.warning('Provided grafana TLS certificates invalid: %s', str(e))
-                cert, pkey = None, None
-        if not (cert and pkey):
-            cert, pkey = create_self_signed_cert('Ceph', 'cephadm')
-            self.set_store('grafana_crt', cert)
-            self.set_store('grafana_key', pkey)
-            self.check_mon_command({
-                'prefix': 'dashboard set-grafana-api-ssl-verify',
-                'value': 'false',
-            })
-
-
-
-        config_file = {
-            'files': {
-                "grafana.ini": """# generated by cephadm
-[users]
-  default_theme = light
-[auth.anonymous]
-  enabled = true
-  org_name = 'Main Org.'
-  org_role = 'Viewer'
-[server]
-  domain = 'bootstrap.storage.lab'
-  protocol = https
-  cert_file = /etc/grafana/certs/cert_file
-  cert_key = /etc/grafana/certs/cert_key
-  http_port = 3000
-[security]
-  admin_user = admin
-  admin_password = admin
-  allow_embedding = true
-""",
-                'provisioning/datasources/ceph-dashboard.yml': generate_grafana_ds_config(prom_services),
-                'certs/cert_file': '# generated by cephadm\n%s' % cert,
-                'certs/cert_key': '# generated by cephadm\n%s' % pkey,
-            }
-        }
-        return config_file, sorted(deps)
-
     def _get_dashboard_url(self):
         # type: () -> str
         return self.get('mgr_map').get('services', {}).get('dashboard', '')
@@ -2618,16 +2526,12 @@ receivers:
 
     def add_grafana(self, spec):
         # type: (ServiceSpec) -> AsyncCompletion
-        return self._add_daemon('grafana', spec, self._create_grafana)
+        return self._add_daemon('grafana', spec, self.grafana_service.create)
 
     @trivial_completion
     def apply_grafana(self, spec: ServiceSpec):
         return self._apply(spec)
 
-    def _create_grafana(self, daemon_id, host):
-        # type: (str, str) -> str
-        return self._create_daemon('grafana', daemon_id, host)
-
     def add_alertmanager(self, spec):
         # type: (ServiceSpec) -> AsyncCompletion
         return self._add_daemon('alertmanager', spec, self._create_alertmanager)
diff --git a/src/pybind/mgr/cephadm/services/monitoring.py b/src/pybind/mgr/cephadm/services/monitoring.py
new file mode 100644 (file)
index 0000000..f7d2fda
--- /dev/null
@@ -0,0 +1,104 @@
+import logging
+from typing import List, Any, Tuple, Dict
+
+from cephadm.services.cephadmservice import CephadmService
+from mgr_util import verify_tls, ServerConfigException, create_self_signed_cert
+
+logger = logging.getLogger(__name__)
+
+class GrafanaService(CephadmService):
+    def create(self, daemon_id, host):
+        # type: (str, str) -> str
+        return self.mgr._create_daemon('grafana', daemon_id, host)
+
+    def generate_config(self):
+        # type: () -> Tuple[Dict[str, Any], List[str]]
+        deps = []  # type: List[str]
+        def generate_grafana_ds_config(hosts: List[str]) -> str:
+            config = '''# generated by cephadm
+deleteDatasources:
+{delete_data_sources}
+
+datasources:
+{data_sources}
+'''
+            delete_ds_template = '''
+  - name: '{name}'
+    orgId: 1\n'''.lstrip('\n')
+            ds_template = '''
+  - name: '{name}'
+    type: 'prometheus'
+    access: 'proxy'
+    orgId: 1
+    url: 'http://{host}:9095'
+    basicAuth: false
+    isDefault: {is_default}
+    editable: false\n'''.lstrip('\n')
+
+            delete_data_sources = ''
+            data_sources = ''
+            for i, host in enumerate(hosts):
+                name = "Dashboard %d" % (i + 1)
+                data_sources += ds_template.format(
+                    name=name,
+                    host=host,
+                    is_default=str(i == 0).lower()
+                )
+                delete_data_sources += delete_ds_template.format(
+                    name=name
+                )
+            return config.format(
+                delete_data_sources=delete_data_sources,
+                data_sources=data_sources,
+            )
+
+        prom_services = []  # type: List[str]
+        for dd in self.mgr.cache.get_daemons_by_service('prometheus'):
+            prom_services.append(dd.hostname)
+            deps.append(dd.name())
+
+        cert = self.mgr.get_store('grafana_crt')
+        pkey = self.mgr.get_store('grafana_key')
+        if cert and pkey:
+            try:
+                verify_tls(cert, pkey)
+            except ServerConfigException as e:
+                logger.warning('Provided grafana TLS certificates invalid: %s', str(e))
+                cert, pkey = None, None
+        if not (cert and pkey):
+            cert, pkey = create_self_signed_cert('Ceph', 'cephadm')
+            self.mgr.set_store('grafana_crt', cert)
+            self.mgr.set_store('grafana_key', pkey)
+            self.mgr.check_mon_command({
+                'prefix': 'dashboard set-grafana-api-ssl-verify',
+                'value': 'false',
+            })
+
+
+
+        config_file = {
+            'files': {
+                "grafana.ini": """# generated by cephadm
+[users]
+  default_theme = light
+[auth.anonymous]
+  enabled = true
+  org_name = 'Main Org.'
+  org_role = 'Viewer'
+[server]
+  domain = 'bootstrap.storage.lab'
+  protocol = https
+  cert_file = /etc/grafana/certs/cert_file
+  cert_key = /etc/grafana/certs/cert_key
+  http_port = 3000
+[security]
+  admin_user = admin
+  admin_password = admin
+  allow_embedding = true
+""",
+                'provisioning/datasources/ceph-dashboard.yml': generate_grafana_ds_config(prom_services),
+                'certs/cert_file': '# generated by cephadm\n%s' % cert,
+                'certs/cert_key': '# generated by cephadm\n%s' % pkey,
+            }
+        }
+        return config_file, sorted(deps)