diff --git a/src/pybind/mgr/dashboard/module.py b/src/pybind/mgr/dashboard/module.py index 7b0e17b295825..79077ca84c3b6 100644 --- a/src/pybind/mgr/dashboard/module.py +++ b/src/pybind/mgr/dashboard/module.py @@ -31,6 +31,7 @@ def global_instance(): from types import OsdMap, NotFound, Config, FsMap, MonMap, \ PgSummary, Health, MonStatus +import rados from rbd_ls import RbdLs from cephfs_clients import CephFSClients @@ -63,6 +64,9 @@ def __init__(self, *args, **kwargs): self.log_buffer = collections.deque(maxlen=LOG_BUFFER_SIZE) + # Keep a librados instance for those that need it. + self._rados = None + # Stateful instances of RbdLs, hold cached results. Key to dict # is pool name. self.rbd_ls = {} @@ -75,6 +79,28 @@ def __init__(self, *args, **kwargs): self.pool_stats = defaultdict(lambda: defaultdict( lambda: collections.deque(maxlen=10))) + @property + def rados(self): + """ + A librados instance to be shared by any classes within + this mgr module that want one. + """ + if self._rados: + return self._rados + + from mgr_module import ceph_state + ctx_capsule = ceph_state.get_context() + self._rados = rados.Rados(context=ctx_capsule) + self._rados.connect() + + return self._rados + + def get_localized_config(self, key): + r = self.get_config(self.get_mgr_id() + '/' + key) + if r is None: + r = self.get_config(key) + return r + def update_pool_stats(self): df = global_instance().get("df") pool_stats = dict([(p['id'], p['stats']) for p in df['pools']]) @@ -103,26 +129,26 @@ def get_sync_object(self, object_type, path=None): data['crush'] = self.get("osd_map_crush") data['crush_map_text'] = self.get("osd_map_crush_map_text") data['osd_metadata'] = self.get("osd_metadata") - obj = OsdMap(data['epoch'], data) + obj = OsdMap(data) elif object_type == Config: data = self.get("config") - obj = Config(0, data) + obj = Config( data) elif object_type == MonMap: data = self.get("mon_map") - obj = MonMap(data['epoch'], data) + obj = MonMap(data) elif object_type == FsMap: data = self.get("fs_map") - obj = FsMap(data['epoch'], data) + obj = FsMap(data) elif object_type == PgSummary: data = self.get("pg_summary") self.log.debug("JSON: {0}".format(data)) - obj = PgSummary(0, data) + obj = PgSummary(data) elif object_type == Health: data = self.get("health") - obj = Health(0, json.loads(data['json'])) + obj = Health(json.loads(data['json'])) elif object_type == MonStatus: data = self.get("mon_status") - obj = MonStatus(0, json.loads(data['json'])) + obj = MonStatus(json.loads(data['json'])) else: raise NotImplementedError(object_type) @@ -145,6 +171,11 @@ def shutdown(self): cherrypy.engine.exit() log.info("Stopped server") + log.info("Stopping librados...") + if self._rados: + self._rados.shutdown() + log.info("Stopped librados.") + def get_latest(self, daemon_type, daemon_name, stat): data = self.get_counter(daemon_type, daemon_name, stat)[stat] if data: @@ -546,6 +577,7 @@ def servers(self): ) def _servers(self): + servers = global_instance().list_servers() return { 'servers': global_instance().list_servers() } diff --git a/src/pybind/mgr/dashboard/remote_view_cache.py b/src/pybind/mgr/dashboard/remote_view_cache.py index 07858ab4ed80e..294975d762cdd 100644 --- a/src/pybind/mgr/dashboard/remote_view_cache.py +++ b/src/pybind/mgr/dashboard/remote_view_cache.py @@ -22,13 +22,12 @@ def run(self): self._view.value = None self._view.value_when = None self._view.getter_thread = None - self.event.set() - - with self._view.lock: - self._view.latency = t1 - t0 - self._view.value = val - self._view.value_when = datetime.datetime.now() - self._view.getter_thread = None + else: + with self._view.lock: + self._view.latency = t1 - t0 + self._view.value = val + self._view.value_when = datetime.datetime.now() + self._view.getter_thread = None self.event.set() @@ -133,4 +132,4 @@ def _init(self): pass def _get(self): - raise NotImplementedError() \ No newline at end of file + raise NotImplementedError() diff --git a/src/pybind/mgr/dashboard/servers.html b/src/pybind/mgr/dashboard/servers.html index 81a93e787c69f..301bca24bbe12 100644 --- a/src/pybind/mgr/dashboard/servers.html +++ b/src/pybind/mgr/dashboard/servers.html @@ -24,9 +24,16 @@ }; rivets.formatters.short_version = function(version) { - // Turn "ceph version 1.2.3-g9asdasd (as98d7a0s8d7)" - // into "1.2.3-g9asdasd" - return /ceph version (.+) \(.+\)$/.exec(version)[1]; + // Expect "ceph version 1.2.3-g9asdasd (as98d7a0s8d7)" + var result = /ceph version\s+([^ ]+)\s+\(.+\)/.exec(version); + if (result) { + // Return the "1.2.3-g9asdasd" part + return result[1]; + } else { + // Unexpected format, pass it through + return version; + } + return }; rivets.bind($("#content"), content_data); @@ -74,4 +81,4 @@