]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/cephadm: moving certificates reconciliation code to a new method
authorRedouane Kachach <rkachach@ibm.com>
Mon, 23 Feb 2026 15:15:12 +0000 (16:15 +0100)
committerRedouane Kachach <rkachach@ibm.com>
Fri, 22 May 2026 18:21:23 +0000 (20:21 +0200)
This way we ensure it's called everytime there's a switch in the
certificate

Signed-off-by: Redouane Kachach <rkachach@ibm.com>
src/pybind/mgr/cephadm/services/cephadmservice.py
src/pybind/mgr/cephadm/services/iscsi.py
src/pybind/mgr/cephadm/services/mgmt_gateway.py
src/pybind/mgr/cephadm/services/nfs.py
src/pybind/mgr/cephadm/services/node_proxy.py
src/pybind/mgr/cephadm/services/nvmeof.py

index 207295a73ec480d50837a75dd9f2850cf057daea..09080e27a191241a41aa9c28fba5b3576b9c81b8 100644 (file)
@@ -423,28 +423,6 @@ class CephadmService(metaclass=ABCMeta):
         cert_source = getattr(svc_spec, cert_source_attr, None)
         logger.debug(f'Getting certificate for {svc_spec.service_name()} using source: {cert_source}')
 
-        # Reconcile TLS objects when switching certificate sources.
-        #
-        # - Inline-saved certs/keys are persisted in the certmgr store as user_made=True
-        #   but editable=False. These should be garbage-collected once the service no
-        #   longer uses INLINE.
-        # - Cephadm-signed certs/keys are stored under cephadm-signed_* entities and
-        #   should be removed when the service no longer uses CEPHADM_SIGNED.
-        svc_name = svc_spec.service_name()
-        host = daemon_spec.host
-        if cert_source in (CertificateSource.REFERENCE.value, CertificateSource.CEPHADM_SIGNED.value):
-            self.mgr.cert_mgr.rm_inline_saved_cert_key_pair(
-                cert_name,
-                key_name,
-                service_name=svc_name,
-                host=host,
-                ca_cert_name=ca_cert_name,
-            )
-        if cert_source != CertificateSource.CEPHADM_SIGNED.value:
-            # Best-effort: the cephadm-signed entities might not be registered if the
-            # service never used CEPHADM_SIGNED (or after a manager restart).
-            self.mgr.cert_mgr.try_rm_self_signed_cert_key_pair(svc_name, host)
-
         if cert_source == CertificateSource.INLINE.value:
             return self._get_certificates_from_spec(svc_spec, daemon_spec, cert_attr, key_attr, cert_name, key_name, ca_cert_attr, ca_cert_name)
         elif cert_source == CertificateSource.REFERENCE.value:
@@ -621,8 +599,38 @@ class CephadmService(metaclass=ABCMeta):
         if spec.is_using_certificates_source(CertificateSource.CEPHADM_SIGNED):
             self.mgr.cert_mgr.register_self_signed_cert_key_pair(spec.service_name())
 
-    def prepare_create(self, daemon_spec: CephadmDaemonDeploySpec) -> CephadmDaemonDeploySpec:
+    def prepare_certificates(self, daemon_spec: CephadmDaemonDeploySpec) -> None:
         self.register_for_certificates(daemon_spec)
+        self.reconcile_certificates(daemon_spec)
+
+    def reconcile_certificates(self, daemon_spec: CephadmDaemonDeploySpec) -> None:
+        """Garbage-collect stale TLS objects when the certificate source has changed."""
+        if not self.requires_certificates:
+            return
+        spec = self.mgr.spec_store[daemon_spec.service_name].spec
+        cert_source = getattr(spec, 'certificate_source', None)
+        svc_name = spec.service_name()
+        host = daemon_spec.host
+
+        # Inline-saved certs/keys are persisted in the certmgr store as user_made=True
+        # but editable=False. These should be garbage-collected once the service no
+        # longer uses INLINE.
+        if cert_source in (CertificateSource.REFERENCE.value, CertificateSource.CEPHADM_SIGNED.value):
+            self.mgr.cert_mgr.rm_inline_saved_cert_key_pair(
+                self.cert_name,
+                self.key_name,
+                service_name=svc_name,
+                host=host,
+                ca_cert_name=self.ca_cert_name,
+            )
+
+        # Cephadm-signed certs/keys are stored under cephadm-signed_* entities and
+        # should be removed when the service no longer uses CEPHADM_SIGNED.
+        if cert_source != CertificateSource.CEPHADM_SIGNED.value:
+            self.mgr.cert_mgr.try_rm_self_signed_cert_key_pair(svc_name, host)
+
+    def prepare_create(self, daemon_spec: CephadmDaemonDeploySpec) -> CephadmDaemonDeploySpec:
+        self.prepare_certificates(daemon_spec)
         daemon_spec.final_config, daemon_spec.deps = self.generate_config(daemon_spec)
         return daemon_spec
 
@@ -1510,7 +1518,7 @@ class RgwService(CephService):
 
     def prepare_create(self, daemon_spec: CephadmDaemonDeploySpec) -> CephadmDaemonDeploySpec:
         assert self.TYPE == daemon_spec.daemon_type
-        self.register_for_certificates(daemon_spec)
+        super().prepare_certificates(daemon_spec)
         rgw_id, _ = daemon_spec.daemon_id, daemon_spec.host
         spec = cast(RGWSpec, self.mgr.spec_store[daemon_spec.service_name].spec)
 
@@ -1921,7 +1929,7 @@ class CephExporterService(CephService):
 
     def prepare_create(self, daemon_spec: CephadmDaemonDeploySpec) -> CephadmDaemonDeploySpec:
         assert self.TYPE == daemon_spec.daemon_type
-        self.register_for_certificates(daemon_spec)
+        super().prepare_certificates(daemon_spec)
         spec = cast(CephExporterSpec, self.mgr.spec_store[daemon_spec.service_name].spec)
         keyring = self.get_keyring_with_caps(self.get_auth_entity(daemon_spec.daemon_id),
                                              ['mon', 'profile ceph-exporter',
index b33c88b52b46294fe2d416ac80844a400fc67e78..d49adfd2227fe759f83c978ebed9cf44be9be20a 100644 (file)
@@ -56,7 +56,7 @@ class IscsiService(CephService):
     def prepare_create(self, daemon_spec: CephadmDaemonDeploySpec) -> CephadmDaemonDeploySpec:
         assert self.TYPE == daemon_spec.daemon_type
 
-        self.register_for_certificates(daemon_spec)
+        super().prepare_certificates(daemon_spec)
 
         spec = cast(IscsiServiceSpec, self.mgr.spec_store[daemon_spec.service_name].spec)
         igw_id = daemon_spec.daemon_id
index dc68eb465cbdc0b7224ae7d6d63b4d77d01c6e03..801a76b281e57f73bc3428cf218c4b9db155f5aa 100644 (file)
@@ -26,7 +26,7 @@ class MgmtGatewayService(CephadmService):
 
     def prepare_create(self, daemon_spec: CephadmDaemonDeploySpec) -> CephadmDaemonDeploySpec:
         assert self.TYPE == daemon_spec.daemon_type
-        super().register_for_certificates(daemon_spec)
+        super().prepare_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
index 566d936a6ed2778b75c5708f8e36937e52fcfd62..d47adb3327ebf5801192b2b5b12eb98d8072d958 100644 (file)
@@ -146,8 +146,7 @@ class NFSService(CephService):
 
     def generate_config(self, daemon_spec: CephadmDaemonDeploySpec) -> Tuple[Dict[str, Any], List[str]]:
         assert self.TYPE == daemon_spec.daemon_type
-
-        super().register_for_certificates(daemon_spec)
+        super().prepare_certificates(daemon_spec)
         daemon_type = daemon_spec.daemon_type
         daemon_id = daemon_spec.daemon_id
         host = daemon_spec.host
index a760c223352de7ab74ba4bfabcd3c9f1fddedfec..9b9de4e6e13323ecf0fa2fd6bfef36012d54324b 100644 (file)
@@ -26,7 +26,7 @@ class NodeProxy(CephService):
         if not self.mgr.http_server.agent:
             raise OrchestratorError('Cannot deploy node-proxy before creating cephadm endpoint')
 
-        super().register_for_certificates(daemon_spec)
+        super().prepare_certificates(daemon_spec)
         keyring = self.get_keyring_with_caps(self.get_auth_entity(daemon_id, host=host), [])
         daemon_spec.keyring = keyring
         self.mgr.node_proxy_cache.update_keyring(host, keyring)
index b811d0118f78a627e688b7f54a47fbde9cff1a30..e83db5a42bfe769c41c96cc2ac9d89d3059e3013 100644 (file)
@@ -120,7 +120,7 @@ class NvmeofService(CephService):
                                              ['mon', 'profile rbd',
                                               'osd', 'profile rbd'])
 
-        super().register_for_certificates(daemon_spec)
+        super().prepare_certificates(daemon_spec)
         self.mgr.cert_mgr.register_self_signed_cert_key_pair(spec.service_name(), NVMEOF_CLIENT_CERT_LABEL)
         self.configure_tls(spec, daemon_spec)