def generate_config(self, daemon_spec: CephadmDaemonDeploySpec) -> Tuple[Dict[str, Any], List[str]]:
assert self.TYPE == daemon_spec.daemon_type
- default_webhook_urls: List[str] = []
+ webhook_urls: List[str] = []
spec = cast(AlertManagerSpec, self.mgr.spec_store[daemon_spec.service_name].spec)
try:
user_data = spec.user_data
if 'default_webhook_urls' in user_data and isinstance(
user_data['default_webhook_urls'], list):
- default_webhook_urls.extend(user_data['default_webhook_urls'])
+ webhook_urls.extend(user_data['default_webhook_urls'])
+ if 'webhook_urls' in user_data and isinstance(
+ user_data['webhook_urls'], list):
+ webhook_urls.extend(user_data['webhook_urls'])
security_enabled, mgmt_gw_enabled, oauth2_enabled = self.mgr._get_security_config()
if mgmt_gw_enabled:
context = {
'security_enabled': security_enabled,
'dashboard_urls': dashboard_urls,
- 'default_webhook_urls': default_webhook_urls,
+ 'webhook_urls': webhook_urls,
'snmp_gateway_urls': snmp_gateway_urls,
'secure': secure,
}
receivers:
- name: 'default'
webhook_configs:
+ - name: 'custom-receiver'
+ webhook_configs:
- name: 'ceph-dashboard'
webhook_configs:
- url: '{url}/api/prometheus_receiver'
receivers:
- name: 'default'
webhook_configs:
+ - name: 'custom-receiver'
+ webhook_configs:
- name: 'ceph-dashboard'
webhook_configs:
- url: 'https://host_fqdn:29443/internal/dashboard/api/prometheus_receiver'
receivers:
- name: 'default'
webhook_configs:
+ - name: 'custom-receiver'
+ webhook_configs:
- name: 'ceph-dashboard'
webhook_configs:
- url: 'http://{fqdn}:8080/api/prometheus_receiver'
use_current_daemon_image=False,
)
+ @pytest.mark.parametrize(
+ "user_data",
+ [
+ ({'webhook_urls': ['http://foo.com:9999', 'http://bar.com:1111']}),
+ ({'default_webhook_urls': ['http://bar.com:9999', 'http://foo.com:1111']}),
+ ({'default_webhook_urls': ['http://bar.com:9999', 'http://foo.com:1111'],
+ 'webhook_urls': ['http://foo.com:9999', 'http://bar.com:1111']}),
+ ],
+ )
+ @patch("cephadm.serve.CephadmServe._run_cephadm")
+ @patch("socket.getfqdn")
+ @patch("cephadm.module.CephadmOrchestrator.get_mgr_ip", lambda _: '::1')
+ @patch("cephadm.services.monitoring.password_hash", lambda password: 'alertmanager_password_hash')
+ @patch('cephadm.cert_mgr.CertMgr.get_root_ca', lambda instance: 'cephadm_root_cert')
+ @patch('cephadm.cert_mgr.CertMgr.generate_cert', lambda instance, fqdn, ip: ('mycert', 'mykey'))
+ def test_alertmanager_config_custom_webhook_urls(
+ self,
+ _get_fqdn,
+ _run_cephadm,
+ cephadm_module: CephadmOrchestrator,
+ user_data: Dict[str, List[str]]
+ ):
+ _run_cephadm.side_effect = async_side_effect(('{}', '', 0))
+ cephadm_module.set_store(AlertmanagerService.USER_CFG_KEY, 'alertmanager_user')
+ cephadm_module.set_store(AlertmanagerService.PASS_CFG_KEY, 'alertmanager_plain_password')
+ fqdn = 'host1.test'
+ _get_fqdn.return_value = fqdn
+
+ print(user_data)
+
+ urls = []
+ if 'default_webhook_urls' in user_data:
+ urls += user_data['default_webhook_urls']
+ if 'webhook_urls' in user_data:
+ urls += user_data['webhook_urls']
+ tab_over = ' ' * 18 # since we'll be inserting this into an indented string
+ webhook_configs_str = '\n'.join(f'{tab_over}- url: \'{u}\'' for u in urls)
+
+ with with_host(cephadm_module, 'test'):
+ with with_service(cephadm_module, AlertManagerSpec(user_data=user_data)):
+
+ y = dedent(f"""
+ # This file is generated by cephadm.
+ # See https://prometheus.io/docs/alerting/configuration/ for documentation.
+
+ global:
+ resolve_timeout: 5m
+ http_config:
+ tls_config:
+ insecure_skip_verify: true
+
+ route:
+ receiver: 'default'
+ routes:
+ - group_by: ['alertname']
+ group_wait: 10s
+ group_interval: 10s
+ repeat_interval: 1h
+ receiver: 'ceph-dashboard'
+ continue: true
+ - group_by: ['alertname']
+ group_wait: 10s
+ group_interval: 10s
+ repeat_interval: 1h
+ receiver: 'custom-receiver'
+
+ receivers:
+ - name: 'default'
+ webhook_configs:
+ - name: 'custom-receiver'
+ webhook_configs:
+{webhook_configs_str}
+ - name: 'ceph-dashboard'
+ webhook_configs:
+ - url: 'http://{fqdn}:8080/api/prometheus_receiver'
+ """).lstrip()
+
+ _run_cephadm.assert_called_with(
+ 'test',
+ "alertmanager.test",
+ ['_orch', 'deploy'],
+ [],
+ stdin=json.dumps({
+ "fsid": "fsid",
+ "name": 'alertmanager.test',
+ "image": '',
+ "deploy_arguments": [],
+ "params": {
+ 'tcp_ports': [9093, 9094],
+ },
+ "meta": {
+ 'service_name': 'alertmanager',
+ 'ports': [9093, 9094],
+ 'ip': None,
+ 'deployed_by': [],
+ 'rank': None,
+ 'rank_generation': None,
+ 'extra_container_args': None,
+ 'extra_entrypoint_args': None,
+ },
+ "config_blobs": {
+ "files": {
+ "alertmanager.yml": y,
+ },
+ 'peers': [],
+ "use_url_prefix": False,
+ "ip_to_bind_to": "",
+ }
+ }),
+ use_current_daemon_image=False,
+ error_ok=True,
+ )
+
@patch("cephadm.serve.CephadmServe._run_cephadm")
@patch("socket.getfqdn")
@patch("cephadm.module.CephadmOrchestrator.get_mgr_ip", lambda _: '::1')