From b19a0a010a6f1a96a90dc14f7d3830dd75603a74 Mon Sep 17 00:00:00 2001 From: John Spray Date: Wed, 28 Feb 2018 14:58:30 +0000 Subject: [PATCH] pybind/mgr/mgr_module: some accessors Signed-off-by: John Spray --- src/pybind/mgr/mgr_module.py | 76 ++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/src/pybind/mgr/mgr_module.py b/src/pybind/mgr/mgr_module.py index 964a4612e87..e425d129b8a 100644 --- a/src/pybind/mgr/mgr_module.py +++ b/src/pybind/mgr/mgr_module.py @@ -126,6 +126,16 @@ class OSDMap(ceph_module.BasePyOSDMap): def dump(self): return self._dump() + def get_pools(self): + # FIXME: efficient implementation + d = self._dump() + return dict([(p['pool'], p) for p in d['pools']]) + + def get_pools_by_name(self): + # FIXME: efficient implementation + d = self._dump() + return dict([(p['pool_name'], p) for p in d['pools']]) + def new_incremental(self): return self._new_incremental() @@ -153,6 +163,11 @@ class OSDMap(ceph_module.BasePyOSDMap): def pool_raw_used_rate(self, pool_id): return self._pool_raw_used_rate(pool_id) + def get_ec_profile(self, name): + # FIXME: efficient implementation + d = self._dump() + return d['erasure_code_profiles'].get(name, None) + class OSDMapIncremental(ceph_module.BasePyOSDMapIncremental): def get_epoch(self): @@ -174,6 +189,7 @@ class OSDMapIncremental(ceph_module.BasePyOSDMapIncremental): """ return self._set_crush_compat_weight_set_weights(weightmap) + class CRUSHMap(ceph_module.BasePyCRUSH): ITEM_NONE = 0x7fffffff DEFAULT_CHOOSE_ARGS = '-1' @@ -202,6 +218,66 @@ class CRUSHMap(ceph_module.BasePyCRUSH): def get_default_choose_args(dump): return dump.get('choose_args').get(CRUSHMap.DEFAULT_CHOOSE_ARGS, []) + def get_rule(self, rule_name): + # TODO efficient implementation + for rule in self.dump()['rules']: + if rule_name == rule['rule_name']: + return rule + + return None + + def get_rule_by_id(self, rule_id): + for rule in self.dump()['rules']: + if rule['rule_id'] == rule_id: + return rule + + return None + + def get_rule_root(self, rule_name): + rule = self.get_rule(rule_name) + if rule is None: + return None + + try: + first_take = [s for s in rule['steps'] if s['op'] == 'take'][0] + except IndexError: + self.log.warn("CRUSH rule '{0}' has no 'take' step".format( + rule_name)) + return None + else: + return first_take['item'] + + def get_osds_under(self, root_id): + # TODO don't abuse dump like this + d = self.dump() + buckets = dict([(b['id'], b) for b in d['buckets']]) + + osd_list = [] + + def accumulate(b): + for item in b['items']: + if item['id'] >= 0: + osd_list.append(item['id']) + else: + try: + accumulate(buckets[item['id']]) + except KeyError: + pass + + accumulate(buckets[root_id]) + + return osd_list + + def device_class_counts(self): + result = defaultdict(int) + # TODO don't abuse dump like this + d = self.dump() + for device in d['devices']: + cls = device.get('class', None) + result[cls] += 1 + + return dict(result) + class MgrStandbyModule(ceph_module.BaseMgrStandbyModule): """ -- 2.39.5