From: Shweta Sodani Date: Wed, 1 Jul 2026 10:46:40 +0000 (+0530) Subject: mgr/cephadm/smb: Add feature-based REDEPLOY logic for SMB services X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=3c39960168bf9f0dc2dd0c89e8d63dbcd84e0000;p=ceph.git mgr/cephadm/smb: Add feature-based REDEPLOY logic for SMB services Implement intelligent action selection for SMB daemon updates by tracking feature changes as dependencies. When SMB service features change (e.g., adding cephfs-proxy, remote-control, keybridge), the system now triggers a REDEPLOY instead of RECONFIG, as these changes require container structure modifications. Fixes: https://tracker.ceph.com/issues/77762 Signed-off-by: Shweta Sodani --- diff --git a/src/pybind/mgr/cephadm/services/smb.py b/src/pybind/mgr/cephadm/services/smb.py index f63730221eb..79549b55c28 100644 --- a/src/pybind/mgr/cephadm/services/smb.py +++ b/src/pybind/mgr/cephadm/services/smb.py @@ -36,6 +36,8 @@ from .cephadmservice import ( ) from ..tlsobject_types import TLSCredentials, EMPTY_TLS_CREDENTIALS from ..schedule import DaemonPlacement +from cephadm import utils +from dataclasses import replace if TYPE_CHECKING: from ..module import CephadmOrchestrator @@ -300,7 +302,7 @@ class SMBService(CephService): logger.debug('smb generate_config: %r', config_blobs) self._configure_cluster_meta(smb_spec, daemon_spec) - deps = self.get_dependencies(self.mgr, smb_spec) + deps = sorted(self.get_dependencies(self.mgr, smb_spec)) return config_blobs, deps def _cert_or_uri(self, data: Optional[str]) -> Optional[str]: @@ -534,8 +536,27 @@ class SMBService(CephService): for ccc in smb_spec.ceph_cluster_configs or []: value = _hash_ceph_cluster_config(ccc) 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 [])))) return out + def choose_next_action( + self, + scheduled_action: utils.Action, + daemon_type: Optional[str], + spec: Optional[ServiceSpec], + curr_deps: List[str], + last_deps: List[str], + daemon: Optional[DaemonDescription] = None, + ) -> utils.NextDaemonStep: + step = super().choose_next_action( + 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): + return replace(step, action=utils.Action.REDEPLOY) + return step + Network = Union[ipaddress.IPv4Network, ipaddress.IPv6Network] diff --git a/src/pybind/mgr/cephadm/tests/services/test_smb.py b/src/pybind/mgr/cephadm/tests/services/test_smb.py index 6c942096392..c3239066378 100644 --- a/src/pybind/mgr/cephadm/tests/services/test_smb.py +++ b/src/pybind/mgr/cephadm/tests/services/test_smb.py @@ -233,5 +233,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+meta:ceph_cluster_config.exo=sha256:859b001f76df4d184b858b9c3e323ca8ff85a311414d0405f4484d17aa481ef3', + 'smb+field:features=domain' ]