From: Venky Shankar Date: Tue, 20 Apr 2021 10:12:56 +0000 (-0400) Subject: pybind/mirroring: sanitize `daemon status` JSON X-Git-Tag: v17.1.0~2141^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=06a248b30f0b2879b3db3244cc3cdd7a456339f9;p=ceph.git pybind/mirroring: sanitize `daemon status` JSON Signed-off-by: Venky Shankar --- diff --git a/src/pybind/mgr/mirroring/fs/snapshot_mirror.py b/src/pybind/mgr/mirroring/fs/snapshot_mirror.py index be239d4a5580..bdfc7a469a5c 100644 --- a/src/pybind/mgr/mirroring/fs/snapshot_mirror.py +++ b/src/pybind/mgr/mirroring/fs/snapshot_mirror.py @@ -8,6 +8,7 @@ import re import stat import threading import uuid +from typing import Dict, Any import cephfs import rados @@ -745,25 +746,39 @@ class FSSnapshotMirror: fspolicy = self.pool_policy.get(filesystem, None) if not fspolicy: raise MirrorException(-errno.EINVAL, f'filesystem {filesystem} is not mirrored') - daemons = {} + daemons = [] sm = self.mgr.get('service_map') daemon_entry = sm['services'].get('cephfs-mirror', None) - if daemon_entry: - for daemon_key in daemon_entry['daemons']: - try: - daemon_id = int(daemon_key) - daemon_status = self.mgr.get_daemon_status('cephfs-mirror', daemon_key) - if not daemon_status: - # temporary, should get updated soon - log.debug(f'daemon status not yet availble for daemon_id {daemon_id}') - continue - try: - daemons[daemon_id] = json.loads(daemon_status['status_json']) - except KeyError: - # temporary, should get updated soon - log.debug(f'daemon status not yet available for daemon_id {daemon_id}') - except ValueError: - pass + log.debug(f'daemon_entry: {daemon_entry}') + for daemon_key in daemon_entry.get('daemons', []): + try: + daemon_id = int(daemon_key) + except ValueError: + continue + daemon = { + 'daemon_id' : daemon_id, + 'filesystems' : [] + } # type: Dict[str, Any] + daemon_status = self.mgr.get_daemon_status('cephfs-mirror', daemon_key) + if not daemon_status: + log.debug(f'daemon status not yet availble for cephfs-mirror daemon: {daemon_key}') + continue + status = json.loads(daemon_status['status_json']) + for fs_id, fs_desc in status.items(): + fs = {'filesystem_id' : int(fs_id), + 'name' : fs_desc['name'], + 'directory_count' : fs_desc['directory_count'], + 'peers' : [] + } # type: Dict[str, Any] + for peer_uuid, peer_desc in fs_desc['peers'].items(): + peer = { + 'uuid' : peer_uuid, + 'remote' : peer_desc['remote'], + 'stats' : peer_desc['stats'] + } + fs['peers'].append(peer) + daemon['filesystems'].append(fs) + daemons.append(daemon) return 0, json.dumps(daemons), '' except MirrorException as me: return me.args[0], '', me.args[1]