]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
pybind/mirroring: sanitize `daemon status` JSON
authorVenky Shankar <vshankar@redhat.com>
Tue, 20 Apr 2021 10:12:56 +0000 (06:12 -0400)
committerVenky Shankar <vshankar@redhat.com>
Wed, 21 Apr 2021 01:18:54 +0000 (21:18 -0400)
Signed-off-by: Venky Shankar <vshankar@redhat.com>
src/pybind/mgr/mirroring/fs/snapshot_mirror.py

index be239d4a5580750979183b2ad62d52ae76d5c17b..bdfc7a469a5cb3e51af41fc5db81fb9112039ce4 100644 (file)
@@ -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]