]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/cli_api: pretty_json for mappingproxy fix
authorNitzan Mordechai <nmordech@redhat.com>
Thu, 4 Sep 2025 14:24:53 +0000 (14:24 +0000)
committerNitzan Mordechai <nmordech@ibm.com>
Thu, 4 Jun 2026 06:52:22 +0000 (06:52 +0000)
since we are modifying read-only python object, we need to copy it first

Fixes: https://tracker.ceph.com/issues/72447
Signed-off-by: Nitzan Mordechai <nmordec@ibm.com>
src/pybind/mgr/cli_api/module.py

index c3ff9d924d468a02d87936c323003a61f5061018..fda5a3015e8bf6001d21c2a233d870506562565e 100755 (executable)
@@ -16,7 +16,21 @@ get_time = time.perf_counter
 
 def pretty_json(obj: Any) -> Any:
     import json
-    return json.dumps(obj, sort_keys=True, indent=2)
+    return json.dumps(_make_serializable(obj), sort_keys=True, indent=2)
+
+
+def _make_serializable(obj):
+    """Convert non-JSON-serializable objects to serializable equivalents"""
+    if obj.__class__.__name__ == 'mappingproxy':
+        return {k: _make_serializable(v) for k, v in obj.items()}
+    elif isinstance(obj, tuple):
+        return [_make_serializable(item) for item in obj]
+    elif isinstance(obj, list):
+        return [_make_serializable(item) for item in obj]
+    elif isinstance(obj, dict):
+        return {k: _make_serializable(v) for k, v in obj.items()}
+    else:
+        return obj
 
 
 class CephCommander: