]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
mgr/cephadm: adapting mgmt-gateway service to use the new cert mgmt
authorRedouane Kachach <rkachach@ibm.com>
Fri, 25 Apr 2025 07:38:22 +0000 (09:38 +0200)
committerRedouane Kachach <rkachach@ibm.com>
Sat, 6 Sep 2025 21:39:43 +0000 (23:39 +0200)
Signed-off-by: Redouane Kachach <rkachach@ibm.com>
src/pybind/mgr/cephadm/services/mgmt_gateway.py

index 5a89c96187f861c0b02c60a78a3f7aee4aa46b98..0dd53f7c302f02427ff5062ed48aed960261b7bb 100644 (file)
@@ -11,6 +11,8 @@ if TYPE_CHECKING:
 
 logger = logging.getLogger(__name__)
 
+INTERNAL_CERT_LABEL = 'internal'
+
 
 @register_cephadm_service
 class MgmtGatewayService(CephadmService):
@@ -22,6 +24,8 @@ class MgmtGatewayService(CephadmService):
 
     def prepare_create(self, daemon_spec: CephadmDaemonDeploySpec) -> CephadmDaemonDeploySpec:
         assert self.TYPE == daemon_spec.daemon_type
+        super().register_for_certificates(daemon_spec)
+        self.mgr.cert_mgr.register_self_signed_cert_key_pair(MgmtGatewayService.TYPE, INTERNAL_CERT_LABEL)
         daemon_spec.final_config, daemon_spec.deps = self.generate_config(daemon_spec)
         return daemon_spec
 
@@ -51,37 +55,6 @@ class MgmtGatewayService(CephadmService):
         self.mgr.set_module_option_ex('dashboard', 'standby_error_status_code', '503')
         self.mgr.set_module_option_ex('dashboard', 'standby_behaviour', 'error')
 
-    def get_external_certificates(self, svc_spec: MgmtGatewaySpec, daemon_spec: CephadmDaemonDeploySpec) -> Tuple[str, str]:
-        cert = self.mgr.cert_mgr.get_cert('mgmt_gw_cert')
-        key = self.mgr.cert_mgr.get_key('mgmt_gw_key')
-        user_made = False
-        if not (cert and key):
-            # not available on store, check if provided on the spec
-            if svc_spec.ssl_cert and svc_spec.ssl_key:
-                user_made = True
-                cert = svc_spec.ssl_cert
-                key = svc_spec.ssl_key
-            else:
-                # not provided on the spec, let's generate self-sigend certificates
-                ip = self.get_mgmt_gw_ip(svc_spec, daemon_spec)
-                # we don't include the host_fqdn in case of using a virtual_ip
-                # because we may have several instances of the mgmt-gateway running
-                # on different hosts
-                host_fqdn = [] if svc_spec.virtual_ip else [self.mgr.get_fqdn(daemon_spec.host)]
-                cert, key = self.mgr.cert_mgr.generate_cert(host_fqdn, ip)
-            # save certificates
-            if cert and key:
-                self.mgr.cert_mgr.save_cert('mgmt_gw_cert', cert, user_made=user_made)
-                self.mgr.cert_mgr.save_key('mgmt_gw_key', key, user_made=user_made)
-            else:
-                logger.error("Failed to obtain certificate and key from mgmt-gateway.")
-        return cert, key
-
-    def get_internal_certificates(self, svc_spec: MgmtGatewaySpec, daemon_spec: CephadmDaemonDeploySpec) -> Tuple[str, str]:
-        ip = self.get_mgmt_gw_ip(svc_spec, daemon_spec)
-        host_fqdn = self.mgr.get_fqdn(daemon_spec.host)
-        return self.mgr.cert_mgr.generate_cert(host_fqdn, ip)
-
     def get_service_discovery_endpoints(self) -> List[str]:
         sd_endpoints = []
         for dd in self.mgr.cache.get_daemons_by_service('mgr'):
@@ -122,7 +95,7 @@ class MgmtGatewayService(CephadmService):
             grafana_spec = cast(GrafanaSpec, self.mgr.spec_store['grafana'].spec)
             grafana_protocol = grafana_spec.protocol
         except Exception:
-            grafana_protocol = 'https'  # defualt to https just for UT
+            grafana_protocol = 'https'  # default to https just for UT
 
         main_context = {
             'dashboard_endpoints': dashboard_endpoints,
@@ -147,7 +120,7 @@ class MgmtGatewayService(CephadmService):
             'enable_oauth2_proxy': bool(oauth2_proxy_endpoints),
         }
 
-        internal_cert, internal_pkey = self.get_internal_certificates(svc_spec, daemon_spec)
+        internal_cert, internal_pkey = self.get_self_signed_certificates_with_label(svc_spec, daemon_spec, INTERNAL_CERT_LABEL)
         daemon_config = {
             "files": {
                 "nginx.conf": self.mgr.template.render(self.SVC_TEMPLATE_PATH, main_context),
@@ -158,10 +131,12 @@ class MgmtGatewayService(CephadmService):
                 "ca.crt": self.mgr.cert_mgr.get_root_ca()
             }
         }
+
         if svc_spec.ssl:
-            cert, key = self.get_external_certificates(svc_spec, daemon_spec)
-            daemon_config["files"]["nginx.crt"] = cert
-            daemon_config["files"]["nginx.key"] = key
+            ip = self.get_mgmt_gw_ip(svc_spec, daemon_spec)
+            tls_pair = self.get_certificates(daemon_spec, [ip])
+            daemon_config["files"]["nginx.crt"] = tls_pair.cert
+            daemon_config["files"]["nginx.key"] = tls_pair.key
 
         return daemon_config, sorted(MgmtGatewayService.get_dependencies(self.mgr))
 
@@ -170,8 +145,8 @@ class MgmtGatewayService(CephadmService):
         Called before mgmt-gateway daemon is removed.
         """
         # reset the standby dashboard redirection behaviour
+        assert daemon.hostname  # for mypy
+        super().post_remove(daemon, is_failed_deploy=is_failed_deploy)
+        self.mgr.cert_mgr.rm_self_signed_cert_key_pair(MgmtGatewayService.TYPE, daemon.hostname, label=INTERNAL_CERT_LABEL)
         self.mgr.set_module_option_ex('dashboard', 'standby_error_status_code', '500')
         self.mgr.set_module_option_ex('dashboard', 'standby_behaviour', 'redirect')
-        # delete cert/key entires for this mgmt-gateway daemon
-        self.mgr.cert_mgr.rm_cert('mgmt_gw_cert')
-        self.mgr.cert_mgr.rm_key('mgmt_gw_key')