From 378230c6693c08c3fc6622058aaa670078aaaa3a Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 11 Jun 2018 07:10:08 -0500 Subject: [PATCH] mgr/devicehealth: fix 'device get-health-metrics' when no metrics are stored Signed-off-by: Sage Weil --- src/pybind/mgr/devicehealth/module.py | 49 ++++++++++++++++----------- 1 file changed, 30 insertions(+), 19 deletions(-) diff --git a/src/pybind/mgr/devicehealth/module.py b/src/pybind/mgr/devicehealth/module.py index 528f7aafcb761..0b3c2043b805f 100644 --- a/src/pybind/mgr/devicehealth/module.py +++ b/src/pybind/mgr/devicehealth/module.py @@ -235,14 +235,17 @@ class Module(MgrModule): self.log.debug('put_device_metrics device %s prune %s' % (devid, prune)) erase = [] - with rados.ReadOpCtx() as op: - iter, ret = ioctx.get_omap_keys(op, "", 500) # fixme - assert ret == 0 - ioctx.operate_read_op(op, devid) - for key, _ in list(iter): - if key >= prune: - break - erase.append(key) + try: + with rados.ReadOpCtx() as op: + iter, ret = ioctx.get_omap_keys(op, "", 500) # fixme + assert ret == 0 + ioctx.operate_read_op(op, devid) + for key, _ in list(iter): + if key >= prune: + break + erase.append(key) + except: + pass key = datetime.now().strftime(TIME_FORMAT) self.log.debug('put_device_metrics device %s key %s = %s, erase %s' % (devid, key, data, erase)) @@ -253,22 +256,30 @@ class Module(MgrModule): 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 ioctx = self.open_connection() res = {} with rados.ReadOpCtx() as op: iter, ret = ioctx.get_omap_vals(op, "", sample or '', 500) # fixme assert ret == 0 - ioctx.operate_read_op(op, devid) - for key, value in list(iter): - if sample and key != sample: - break - try: - v = json.loads(value) - except: - self.log.debug('unable to parse value for %s: "%s"' % - (key, value)) - pass - res[key] = v + try: + ioctx.operate_read_op(op, devid) + for key, value in list(iter): + if sample and key != sample: + break + try: + v = json.loads(value) + except: + self.log.debug('unable to parse value for %s: "%s"' % + (key, value)) + pass + res[key] = v + except: + pass return (0, json.dumps(res, indent=4), '') def extract_smart_features(self, raw): -- 2.39.5