]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/cephadm: track SMB rgw_creds_uri as a daemon dependency 69932/head
authorAvan Thakkar <athakkar@redhat.com>
Fri, 3 Jul 2026 10:54:49 +0000 (16:24 +0530)
committerAvan Thakkar <athakkar@redhat.com>
Fri, 10 Jul 2026 14:28:47 +0000 (19:58 +0530)
Add rgw_creds_uri as a Dep.FIELD in get_dependencies and include it in
needs_redeploy_prefixes so a change triggers REDEPLOY.

Also fix _save_pending_rgw_config to use cred_map.get() instead
of a bare dict lookup.

Fixes: https://tracker.ceph.com/issues/77763
Signed-off-by: Avan Thakkar <athakkar@redhat.com>
src/pybind/mgr/cephadm/services/smb.py
src/pybind/mgr/cephadm/tests/services/test_smb.py
src/pybind/mgr/smb/handler.py

index 79549b55c281693a4c24d506d9c58770f67a215d..15fba27bddadc95295eb9f9839e9da9db0255fe0 100644 (file)
@@ -208,16 +208,20 @@ class SMBService(CephService):
             ca_cert=ssl_params.ssl_ca_cert or '',
         )
 
-    def _rgw_creds_uri(self, cluster_id: str) -> Optional[str]:
+    @classmethod
+    def _lookup_rgw_creds_uri(
+        cls, mgr: 'CephadmOrchestrator', cluster_id: str
+    ) -> Optional[str]:
         from smb.external import rgw_config_key as _smb_rgw_config_key
         from smb.mon_store import MonKeyConfigStore
-        _rgw_entry = MonKeyConfigStore(self.mgr)[
-            _smb_rgw_config_key(cluster_id)
-        ]
+        _rgw_entry = MonKeyConfigStore(mgr)[_smb_rgw_config_key(cluster_id)]
         if _rgw_entry.exists():
             return _rgw_entry.uri
         return None
 
+    def _rgw_creds_uri(self, cluster_id: str) -> Optional[str]:
+        return self._lookup_rgw_creds_uri(self.mgr, cluster_id)
+
     def generate_config(
         self, daemon_spec: CephadmDaemonDeploySpec
     ) -> Tuple[Dict[str, Any], List[str]]:
@@ -538,6 +542,8 @@ class SMBService(CephService):
             out.append(Dep.META(f'ceph_cluster_config.{ccc.alias}', value))
         # Add features as a dependency
         out.append(Dep.FIELD('features', ','.join(sorted(smb_spec.features or []))))
+        rgw_creds_uri = cls._lookup_rgw_creds_uri(mgr, smb_spec.cluster_id) or ''
+        out.append(Dep.FIELD('rgw_creds_uri', rgw_creds_uri))
         return out
 
     def choose_next_action(
@@ -553,7 +559,15 @@ class SMBService(CephService):
             scheduled_action, daemon_type, spec, curr_deps, last_deps)
         if step.action is utils.Action.RECONFIG:
             sym_diff = set(curr_deps).symmetric_difference(last_deps)
-            if any(d.startswith(Dep.FIELD('features', '')) for d in sym_diff):
+            needs_redeploy_prefixes = (
+                Dep.FIELD('features', ''),
+                Dep.FIELD('rgw_creds_uri', ''),
+            )
+            if any(
+                d.startswith(p)
+                for d in sym_diff
+                for p in needs_redeploy_prefixes
+            ):
                 return replace(step, action=utils.Action.REDEPLOY)
         return step
 
index c3239066378744d9738245a2ebc8223f3259275f..f11357718643ed83409ccfe53e1da6decddd56c6 100644 (file)
@@ -234,5 +234,6 @@ def test_smb_get_dependencies(cephadm_module):
     deps = SMBService.get_dependencies(cephadm_module, spec, spec.service_type)
     assert deps == [
         'smb+meta:ceph_cluster_config.exo=sha256:859b001f76df4d184b858b9c3e323ca8ff85a311414d0405f4484d17aa481ef3',
-        'smb+field:features=domain'
+        'smb+field:features=domain',
+        'smb+field:rgw_creds_uri=rados:mon-config-key:smb/config/foxtrot/config.smb.rgw',
     ]
index ec081aad4d84a3988b8a2b92f0b27cf66014dfb7..12ea2e06eb3381e91124e6635649492fd01a2b73 100644 (file)
@@ -1541,7 +1541,14 @@ def _save_pending_rgw_config(
         rgw = sc.resource.rgw
         assert rgw is not None
         assert rgw.credential_ref is not None
-        cred = cred_map[rgw.credential_ref]
+        cred = cred_map.get(rgw.credential_ref)
+        if cred is None:
+            log.error(
+                "share %r references missing RGW credential %r",
+                sc.resource.name,
+                rgw.credential_ref,
+            )
+            continue
         access_key = cred.access_key_id or ''
         secret_key = cred.secret_access_key or ''
         merge_shares[sc.resource.name] = {