From: Sebastian Wagner Date: Mon, 4 May 2020 12:21:21 +0000 (+0200) Subject: mgr/cephadm: Add GrafanaService X-Git-Tag: wip-pdonnell-testing-20200918.022351~1333^2~5 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=b197904dda8e0fa51f05a6b8b33ad09818f3d479;p=ceph-ci.git mgr/cephadm: Add GrafanaService Signed-off-by: Sebastian Wagner --- diff --git a/src/pybind/mgr/cephadm/module.py b/src/pybind/mgr/cephadm/module.py index 3df349af9d0..3e89200d3b4 100644 --- a/src/pybind/mgr/cephadm/module.py +++ b/src/pybind/mgr/cephadm/module.py @@ -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 index 00000000000..f7d2fda4d7a --- /dev/null +++ b/src/pybind/mgr/cephadm/services/monitoring.py @@ -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)