mgr/cephadm: only add deps for set NFS spec fields, skip upgrade reconfig for defaults

Only add deps when the user has set a non-default value.  In
choose_next_action(), ignore False/None-valued entries in the symmetric
diff so daemons upgrading from the old behavior are not reconfigured
solely because default deps disappeared

Fixes: https://tracker.ceph.com/issues/77901
Signed-off-by: Shweta Bhosale <Shweta.Bhosale1@ibm.com>
This commit is contained in:
Shweta Bhosale 2026-07-02 15:48:10 +05:30
parent 8d6d1a1f5c
commit 8855c439b4
2 changed files with 62 additions and 7 deletions

View File

@ -130,12 +130,23 @@ class NFSService(CephService):
assert spec
deps: List[str] = []
nfs_spec = cast(NFSServiceSpec, spec)
deps.append(f'enable_rdma: {nfs_spec.enable_rdma}')
deps.append(f'rdma_port: {nfs_spec.rdma_port}')
deps.append(f'tls_ktls: {nfs_spec.tls_ktls}')
deps.append(f'tls_debug: {nfs_spec.tls_debug}')
deps.append(f'tls_min_version: {nfs_spec.tls_min_version}')
deps.append(f'tls_ciphers: {nfs_spec.tls_ciphers}')
# choose_next_action() ignores False/None in the symmetric diff, so
# False <-> None transitions do not trigger reconfig or redeploy.
# RDMA related
if nfs_spec.enable_rdma:
deps.append(f'enable_rdma: {nfs_spec.enable_rdma}')
if nfs_spec.rdma_port is not None:
deps.append(f'rdma_port: {nfs_spec.rdma_port}')
# TLS related
if nfs_spec.tls_ktls:
deps.append(f'tls_ktls: {nfs_spec.tls_ktls}')
if nfs_spec.tls_debug:
deps.append(f'tls_debug: {nfs_spec.tls_debug}')
if nfs_spec.tls_min_version is not None:
deps.append(f'tls_min_version: {nfs_spec.tls_min_version}')
if nfs_spec.tls_ciphers is not None:
deps.append(f'tls_ciphers: {nfs_spec.tls_ciphers}')
parent_deps = super().get_dependencies(mgr, spec, daemon_type)
return sorted(deps + parent_deps)
@ -585,9 +596,20 @@ class NFSService(CephService):
current and previous dependency lists return the next action that
this service would prefer cephadm take.
"""
def is_default_value_dep(dep: str) -> bool:
# Ignoring False and None as both represent an unset/default option
if ':' not in dep:
return False
return dep.split(':', 1)[1].strip() in ('False', 'None')
if curr_deps == last_deps:
return utils.NextDaemonStep(scheduled_action)
sym_diff = set(curr_deps).symmetric_difference(last_deps)
sym_diff = {
d for d in set(curr_deps).symmetric_difference(last_deps)
if not is_default_value_dep(d)
}
if not sym_diff:
return utils.NextDaemonStep(scheduled_action)
logger.info(
'Reconfigure wanted %s: deps %r -> %r (diff %r)',
spec.service_name() if spec else daemon_type,

View File

@ -10,6 +10,7 @@ from orchestrator import DaemonDescriptionStatus
from cephadm.serve import CephadmServe
from cephadm.services.service_registry import service_registry
from cephadm.services.cephadmservice import CephadmDaemonDeploySpec
from cephadm import utils
from cephadm.module import CephadmOrchestrator
from ceph.deployment.service_spec import (
NFSServiceSpec,
@ -846,3 +847,35 @@ def test_check_daemons_starts_keepalived_when_stopped_and_haproxy_running(
for c in mock_cephadm._daemon_action.call_args_list
)
assert keepalived_started
def test_nfs_choose_next_action_skips_legacy_default_deps():
nfs_svc = service_registry.get_service('nfs')
legacy_deps = [
'enable_rdma: False',
'rdma_port: None',
'tls_ktls: False',
'tls_debug: False',
'tls_min_version: None',
'tls_ciphers: None',
]
step = nfs_svc.choose_next_action(
utils.Action.NO_ACTION,
'nfs',
None,
curr_deps=[],
last_deps=legacy_deps,
)
assert step.action is utils.Action.NO_ACTION
def test_nfs_choose_next_action_detects_explicit_value_change():
nfs_svc = service_registry.get_service('nfs')
step = nfs_svc.choose_next_action(
utils.Action.NO_ACTION,
'nfs',
None,
curr_deps=['tls_ktls: True'],
last_deps=['tls_ktls: False'],
)
assert step.action is utils.Action.REDEPLOY