]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
node-proxy: fix NodeProxySpec deserialization from JSON 69882/head
authorGuillaume Abrioux <gabrioux@ibm.com>
Wed, 1 Jul 2026 13:28:31 +0000 (15:28 +0200)
committerGuillaume Abrioux <gabrioux@ibm.com>
Thu, 2 Jul 2026 15:46:56 +0000 (17:46 +0200)
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 <gabrioux@ibm.com>
src/python-common/ceph/deployment/service_spec.py
src/python-common/ceph/tests/test_service_spec.py

index bf2429b8b683326af6e069760dd4597bf61285ff..33c33518fc492a9a055cdd1b31fba10c634dff4b 100644 (file)
@@ -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)
index 5d470f7804af82b9c7ea34cacc4d8e39ae46306a..41a7340b47439fe43c9f0ab2d020c5c9cb042c5f 100644 (file)
@@ -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