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, \
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:
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')
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 = \
'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,
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', '')
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)
--- /dev/null
+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)