]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
mgr/cephadm: allow having prometheus bind on specific network
authorAdam King <adking@redhat.com>
Thu, 29 Feb 2024 18:04:43 +0000 (13:04 -0500)
committerAdam King <adking@redhat.com>
Tue, 19 Mar 2024 17:02:38 +0000 (13:02 -0400)
To avoid port conflicts in certain setups where
something else is using the same port on a different
network on the host.

Signed-off-by: Adam King <adking@redhat.com>
(cherry picked from commit e6943dd61374ee8ce337751e9ef9ba55f10a83ed)

Conflicts:
src/cephadm/cephadmlib/daemons/monitoring.py
src/cephadm/tests/test_deploy.py

src/cephadm/cephadm.py
src/pybind/mgr/cephadm/services/monitoring.py
src/pybind/mgr/cephadm/tests/test_services.py
src/python-common/ceph/deployment/service_spec.py

index 5a2e248c62f16dfb80dea370efdcf0555e99b944..2cfc7ce982f56622b3b7f80fe0e537b8ce572085 100755 (executable)
@@ -3129,9 +3129,11 @@ def get_daemon_args(ctx, fsid, daemon_type, daemon_id):
                     ip = meta['ip']
                 if 'ports' in meta and meta['ports']:
                     port = meta['ports'][0]
-            r += [f'--web.listen-address={ip}:{port}']
             if daemon_type == 'prometheus':
                 config = fetch_configs(ctx)
+                ip_to_bind_to = config.get('ip_to_bind_to', '')
+                if ip_to_bind_to:
+                    ip = ip_to_bind_to
                 retention_time = config.get('retention_time', '15d')
                 retention_size = config.get('retention_size', '0')  # default to disabled
                 r += [f'--storage.tsdb.retention.time={retention_time}']
@@ -3146,6 +3148,7 @@ def get_daemon_args(ctx, fsid, daemon_type, daemon_id):
                     addr = next(iter(ipv4_addrs or ipv6_addrs), None)
                     host = wrap_ipv6(addr) if addr else host
                 r += [f'--web.external-url={scheme}://{host}:{port}']
+            r += [f'--web.listen-address={ip}:{port}']
         if daemon_type == 'alertmanager':
             config = fetch_configs(ctx)
             peers = config.get('peers', list())  # type: ignore
index bdcf214721c674eabe07f21a6ae6a23824074280..10ddcbbd02f056935fffd816c1b5d0393f906e25 100644 (file)
@@ -433,6 +433,13 @@ class PrometheusService(CephadmService):
             'nvmeof_sd_url': nvmeof_sd_url,
         }
 
+        ip_to_bind_to = ''
+        if spec.only_bind_port_on_networks and spec.networks:
+            assert daemon_spec.host is not None
+            ip_to_bind_to = self.mgr.get_first_matching_network_ip(daemon_spec.host, spec) or ''
+            if ip_to_bind_to:
+                daemon_spec.port_ips = {str(port): ip_to_bind_to}
+
         web_context = {
             'prometheus_web_user': prometheus_user,
             'prometheus_web_password': password_hash(prometheus_password),
@@ -459,6 +466,7 @@ class PrometheusService(CephadmService):
                     },
                     'retention_time': retention_time,
                     'retention_size': retention_size,
+                    'ip_to_bind_to': ip_to_bind_to,
                     'web_config': '/etc/prometheus/web.yml'
                 }
         else:
@@ -467,7 +475,8 @@ class PrometheusService(CephadmService):
                     'prometheus.yml': self.mgr.template.render('services/prometheus/prometheus.yml.j2', context)
                 },
                 'retention_time': retention_time,
-                'retention_size': retention_size
+                'retention_size': retention_size,
+                'ip_to_bind_to': ip_to_bind_to
             }
 
         # include alerts, if present in the container
index ec0af260cca761858a4fc11a08441671627b34eb..6b0010128f779078a9937d38dc4665de3a8ed47f 100644 (file)
@@ -668,7 +668,9 @@ class TestMonitoring:
                                                              keepalived_password='12345',
                                                              virtual_ip="1.2.3.4/32",
                                                              backend_service='rgw.foo')) as _, \
-                    with_service(cephadm_module, PrometheusSpec('prometheus')) as _:
+                    with_service(cephadm_module, PrometheusSpec('prometheus',
+                                                                networks=['1.2.3.0/24'],
+                                                                only_bind_port_on_networks=True)) as _:
 
                 y = dedent("""
                 # This file is generated by cephadm.
@@ -720,11 +722,12 @@ class TestMonitoring:
                         "deploy_arguments": [],
                         "params": {
                             'tcp_ports': [9095],
+                            'port_ips': {'8765': '1.2.3.1'}
                         },
                         "meta": {
                             'service_name': 'prometheus',
                             'ports': [9095],
-                            'ip': None,
+                            'ip': '1.2.3.1',
                             'deployed_by': [],
                             'rank': None,
                             'rank_generation': None,
@@ -738,6 +741,7 @@ class TestMonitoring:
                             },
                             'retention_time': '15d',
                             'retention_size': '0',
+                            'ip_to_bind_to': '1.2.3.1',
                         },
                     }),
                 )
@@ -912,6 +916,7 @@ class TestMonitoring:
                             },
                             'retention_time': '15d',
                             'retention_size': '0',
+                            'ip_to_bind_to': '',
                             'web_config': '/etc/prometheus/web.yml',
                         },
                     }),
index 20b3cbc5f9f1aa53d33ca894d38fb6e97b223b92..52fe24e203c9cf2d4a042cd7b464a7a733282c15 100644 (file)
@@ -1613,6 +1613,7 @@ class PrometheusSpec(MonitoringSpec):
                  preview_only: bool = False,
                  config: Optional[Dict[str, str]] = None,
                  networks: Optional[List[str]] = None,
+                 only_bind_port_on_networks: bool = False,
                  port: Optional[int] = None,
                  retention_time: Optional[str] = None,
                  retention_size: Optional[str] = None,
@@ -1630,6 +1631,7 @@ class PrometheusSpec(MonitoringSpec):
 
         self.retention_time = retention_time.strip() if retention_time else None
         self.retention_size = retention_size.strip() if retention_size else None
+        self.only_bind_port_on_networks = only_bind_port_on_networks
 
     def validate(self) -> None:
         super(PrometheusSpec, self).validate()