From: Guillaume Abrioux Date: Wed, 1 Jul 2026 13:28:31 +0000 (+0200) Subject: node-proxy: fix NodeProxySpec deserialization from JSON X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=428898401662ac04dd33cef1806e857c75768c71;p=ceph.git node-proxy: fix NodeProxySpec deserialization from JSON NodeProxySpec.__init__() only accepts service_type and placement, but ServiceSpec.from_json() passes all stored fields (ssl, certificate_source, unmanaged, ...) This breaks 'ceph orch ls' after the mgr reloads a node-proxy spec. This commit forwards the standard ServiceSpec parameters to the parent. Fixes: https://tracker.ceph.com/issues/77874 Signed-off-by: Guillaume Abrioux --- diff --git a/src/python-common/ceph/deployment/service_spec.py b/src/python-common/ceph/deployment/service_spec.py index bf2429b8b68..33c33518fc4 100644 --- a/src/python-common/ceph/deployment/service_spec.py +++ b/src/python-common/ceph/deployment/service_spec.py @@ -4350,11 +4350,28 @@ class NodeProxySpec(ServiceSpec): def __init__(self, service_type: str, placement: Optional[PlacementSpec] = None, + ssl: Optional[bool] = True, + certificate_source: Optional[str] = None, + unmanaged: bool = False, + preview_only: bool = False, + extra_container_args: Optional[GeneralArgList] = None, + extra_entrypoint_args: Optional[GeneralArgList] = None, + custom_configs: Optional[List[CustomConfig]] = None, ) -> None: assert service_type == 'node-proxy' - super(NodeProxySpec, self).__init__('node-proxy', placement=placement) - self.ssl: bool = True + super(NodeProxySpec, self).__init__( + 'node-proxy', + placement=placement, + ssl=ssl, + certificate_source=certificate_source, + unmanaged=unmanaged, + preview_only=preview_only, + extra_container_args=extra_container_args, + extra_entrypoint_args=extra_entrypoint_args, + custom_configs=custom_configs, + ) self.validate() +yaml.add_representer(NodeProxySpec, ServiceSpec.yaml_representer) yaml.add_representer(SMBSpec, ServiceSpec.yaml_representer) diff --git a/src/python-common/ceph/tests/test_service_spec.py b/src/python-common/ceph/tests/test_service_spec.py index 5d470f7804a..41a7340b474 100644 --- a/src/python-common/ceph/tests/test_service_spec.py +++ b/src/python-common/ceph/tests/test_service_spec.py @@ -15,6 +15,7 @@ from ceph.deployment.service_spec import ( IngressSpec, IscsiServiceSpec, NFSServiceSpec, + NodeProxySpec, OAuth2ProxySpec, PlacementSpec, PrometheusSpec, @@ -337,6 +338,18 @@ def test_osd_unmanaged(): assert dg_spec.unmanaged == True +def test_node_proxy_unmanaged(): + node_proxy_spec = {"placement": {"host_pattern": "*"}, + "service_name": "node-proxy", + "service_type": "node-proxy", + "unmanaged": True} + + spec = ServiceSpec.from_json(node_proxy_spec) + assert isinstance(spec, NodeProxySpec) + assert spec.unmanaged is True + ServiceSpec.from_json(spec.to_json()) + + @pytest.mark.parametrize("y", """service_type: crash service_name: crash