]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/cephadm: Monitoring: Verify config file generation
authorSebastian Wagner <sewagner@redhat.com>
Mon, 18 Oct 2021 13:06:20 +0000 (15:06 +0200)
committerSebastian Wagner <sewagner@redhat.com>
Tue, 2 Nov 2021 09:01:24 +0000 (10:01 +0100)
Signed-off-by: Sebastian Wagner <sewagner@redhat.com>
(cherry picked from commit f4c154463365f7df5dcd9053e59de65f53bf0f5f)

Conflicts:
src/pybind/mgr/cephadm/tests/test_services.py

src/pybind/mgr/cephadm/tests/test_services.py

index 4f1bafafd01e20a2100a41ffae50adb97ec591c0..a9452899051fd80d555c16457a234a7399cfce89 100644 (file)
@@ -1,3 +1,6 @@
+from textwrap import dedent
+import json
+
 import pytest
 
 from unittest.mock import MagicMock, call, patch
@@ -10,12 +13,15 @@ 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 cephadm.module import CephadmOrchestrator
+from ceph.deployment.service_spec import IscsiServiceSpec, MonitoringSpec, AlertManagerSpec
+from cephadm.tests.fixtures import with_host, with_service
 
 from orchestrator import OrchestratorError
 from orchestrator._interface import DaemonDescription
 
 
+
 class FakeInventory:
     def get_addr(self, name: str) -> str:
         return '1.2.3.4'
@@ -226,3 +232,160 @@ class TestISCSIService:
                                        'https://user:password@[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:5000')
 
         assert dashboard_expected_call in self.mgr.check_mon_command.mock_calls
+
+
+class TestMonitoring:
+    @patch("cephadm.serve.CephadmServe._run_cephadm")
+    def test_alertmanager_config(self, _run_cephadm, cephadm_module: CephadmOrchestrator):
+        _run_cephadm.return_value = ('{}', '', 0)
+
+        with with_host(cephadm_module, 'test'):
+            with with_service(cephadm_module, AlertManagerSpec()):
+
+                y = dedent("""
+                # This file is generated by cephadm.
+                # See https://prometheus.io/docs/alerting/configuration/ for documentation.
+
+                global:
+                  resolve_timeout: 5m
+
+                route:
+                  receiver: 'default'
+                  routes:
+                    - group_by: ['alertname']
+                      group_wait: 10s
+                      group_interval: 10s
+                      repeat_interval: 1h
+                      receiver: 'ceph-dashboard'
+
+                receivers:
+                - name: 'default'
+                  webhook_configs:
+                - name: 'ceph-dashboard'
+                  webhook_configs:
+                  - url: 'http://[::1]:8080/api/prometheus_receiver'
+                """).lstrip()
+
+                _run_cephadm.assert_called_with(
+                    'test',
+                    'alertmanager.test',
+                    'deploy',
+                    [
+                        '--name', 'alertmanager.test',
+                        '--meta-json', '{"service_name": "alertmanager", "ports": [9093, 9094], "ip": null, "deployed_by": [], "rank": null, "rank_generation": null}',
+                        '--config-json', '-', '--tcp-ports', '9093 9094'
+                    ],
+                    stdin=json.dumps({"files": {"alertmanager.yml": y}, "peers": []}),
+                    image='')\
+
+
+    @patch("cephadm.serve.CephadmServe._run_cephadm")
+    def test_prometheus_config(self, _run_cephadm, cephadm_module: CephadmOrchestrator):
+        _run_cephadm.return_value = ('{}', '', 0)
+
+        with with_host(cephadm_module, 'test'):
+            with with_service(cephadm_module, MonitoringSpec('node-exporter')) as _, \
+                    with_service(cephadm_module, MonitoringSpec('prometheus')) as _:
+
+                y = dedent("""
+                # This file is generated by cephadm.
+                global:
+                  scrape_interval: 10s
+                  evaluation_interval: 10s
+                rule_files:
+                  - /etc/prometheus/alerting/*
+                scrape_configs:
+                  - job_name: 'ceph'
+                    honor_labels: true
+                    static_configs:
+                    - targets:
+                      - '[::1]:8081'
+
+                  - job_name: 'node'
+                    static_configs:
+                    - targets: ['[1::4]:9100']
+                      labels:
+                        instance: 'test'
+
+                """).lstrip()
+
+                _run_cephadm.assert_called_with(
+                    'test',
+                    'prometheus.test',
+                    'deploy',
+                    [
+                        '--name', 'prometheus.test',
+                        '--meta-json',
+                        '{"service_name": "prometheus", "ports": [9095], "ip": null, "deployed_by": [], "rank": null, "rank_generation": null}',
+                        '--config-json', '-',
+                        '--tcp-ports', '9095'
+                    ],
+                    stdin=json.dumps({"files": {"prometheus.yml": y}}),
+                    image='')
+
+    @patch("cephadm.serve.CephadmServe._run_cephadm")
+    @patch("cephadm.module.CephadmOrchestrator.get_mgr_ip", lambda _: '1::4')
+    @patch("cephadm.services.monitoring.verify_tls", lambda *_: None)
+    def test_grafana_config(self, _run_cephadm, cephadm_module: CephadmOrchestrator):
+        _run_cephadm.return_value = ('{}', '', 0)
+
+        with with_host(cephadm_module, 'test'):
+            cephadm_module.set_store('grafana_crt', 'c')
+            cephadm_module.set_store('grafana_key', 'k')
+            with with_service(cephadm_module, MonitoringSpec('prometheus')) as _, \
+                    with_service(cephadm_module, MonitoringSpec('grafana')) as _:
+                files = {
+                    'grafana.ini': dedent("""
+                        # This file is 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
+                          http_addr = 
+                        [security]
+                          admin_user = admin
+                          admin_password = admin
+                          allow_embedding = true""").lstrip(),  # noqa: W291
+                    'provisioning/datasources/ceph-dashboard.yml': dedent("""
+                        # This file is generated by cephadm.
+                        deleteDatasources:
+                          - name: 'Dashboard1'
+                            orgId: 1
+
+                        datasources:
+                          - name: 'Dashboard1'
+                            type: 'prometheus'
+                            access: 'proxy'
+                            orgId: 1
+                            url: 'http://[1::4]:9095'
+                            basicAuth: false
+                            isDefault: true
+                            editable: false
+                        """).lstrip(),
+                    'certs/cert_file': dedent("""
+                        # generated by cephadm
+                        c""").lstrip(),
+                    'certs/cert_key': dedent("""
+                        # generated by cephadm
+                        k""").lstrip(),
+                }
+
+                _run_cephadm.assert_called_with(
+                    'test',
+                    'grafana.test',
+                    'deploy',
+                    [
+                        '--name', 'grafana.test',
+                        '--meta-json',
+                        '{"service_name": "grafana", "ports": [3000], "ip": null, "deployed_by": [], "rank": null, "rank_generation": null}',
+                        '--config-json', '-', '--tcp-ports', '3000'],
+                    stdin=json.dumps({"files": files}),
+                    image='')