From: Nitzan Mordechai Date: Thu, 4 Sep 2025 14:24:53 +0000 (+0000) Subject: mgr/cli_api: pretty_json for mappingproxy fix X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=f1834867784de18e781db677ef4ab5a3c266d473;p=ceph.git mgr/cli_api: pretty_json for mappingproxy fix 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 --- diff --git a/src/pybind/mgr/cli_api/module.py b/src/pybind/mgr/cli_api/module.py index c3ff9d924d4..fda5a3015e8 100755 --- a/src/pybind/mgr/cli_api/module.py +++ b/src/pybind/mgr/cli_api/module.py @@ -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: