import stat
import threading
import uuid
+from typing import Dict, Any
import cephfs
import rados
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]