]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/devicehealth: factor _get_device_metrics out of show_device_metrics
authorSage Weil <sage@redhat.com>
Fri, 4 Oct 2019 20:03:02 +0000 (15:03 -0500)
committerYaarit Hatuka <yaarit@redhat.com>
Sat, 15 Feb 2020 01:20:33 +0000 (20:20 -0500)
Add the min_sample lower-bound argument too

Signed-off-by: Sage Weil <sage@redhat.com>
(cherry picked from commit 7be5c1323b3814e2634d5cd66d45cab5a77df680)
Conflicts: had to be backported to enable backporting of
https://github.com/ceph/ceph/pull/32903
Backport tracker: https://tracker.ceph.com/issues/43873

src/pybind/mgr/devicehealth/module.py

index dfa956ed812d629d79e892a3ae0426365fc07f6a..ed352bfb07eeaa04a7485ad4b4874dbad0ffb63f 100644 (file)
@@ -422,16 +422,11 @@ class Module(MgrModule):
                 ioctx.remove_omap_keys(op, tuple(erase))
             ioctx.operate_write_op(op, devid)
 
-    def show_device_metrics(self, devid, sample):
-        # verify device exists
-        r = self.get("device " + devid)
-        if not r or 'device' not in r.keys():
-            return -errno.ENOENT, '', 'device ' + devid + ' not found'
-        # fetch metrics
+    def _get_device_metrics(self, devid, sample=None, min_sample=None):
         res = {}
         ioctx = self.open_connection(create_if_missing=False)
         if not ioctx:
-            return 0, json.dumps(res, indent=4), ''
+            return {}
         with ioctx:
             with rados.ReadOpCtx() as op:
                 omap_iter, ret = ioctx.get_omap_vals(op, "", sample or '',
@@ -442,6 +437,8 @@ class Module(MgrModule):
                     for key, value in list(omap_iter):
                         if sample and key != sample:
                             break
+                        if min_sample and key < min_sample:
+                            break
                         try:
                             v = json.loads(value)
                         except (ValueError, IndexError):
@@ -454,8 +451,16 @@ class Module(MgrModule):
                 except rados.Error as e:
                     self.log.exception("RADOS error reading omap: {0}".format(e))
                     raise
+        return res
 
-        return 0, json.dumps(res, indent=4), ''
+    def show_device_metrics(self, devid, sample):
+        # verify device exists
+        r = self.get("device " + devid)
+        if not r or 'device' not in r.keys():
+            return -errno.ENOENT, '', 'device ' + devid + ' not found'
+        # fetch metrics
+        res = self._get_device_metrics(devid, sample=sample)
+        return 0, json.dumps(res, indent=4, sort_keys=True), ''
 
     def check_health(self):
         self.log.info('Check health')