+++ /dev/null
-
-import rbd
-import rados
-from types import OsdMap
-from remote_view_cache import RemoteViewCache
-
-class RbdPoolLs(RemoteViewCache):
- def _get(self):
- ctx_capsule = self._module.get_context()
-
-
- osd_map = self._module.get_sync_object(OsdMap).data
- osd_pools = [pool['pool_name'] for pool in osd_map['pools']]
-
- rbd_pools = []
- for pool in osd_pools:
- self.log.debug("Constructing IOCtx " + pool)
- try:
- ioctx = self._module.rados.open_ioctx(pool)
- ioctx.stat("rbd_directory")
- rbd_pools.append(pool)
- except (rados.PermissionError, rados.ObjectNotFound):
- self.log.debug("No RBD directory in " + pool)
- except:
- self.log.exception("Failed to open pool " + pool)
-
- return rbd_pools
-
-class RbdLs(RemoteViewCache):
- def __init__(self, module_inst, pool):
- super(RbdLs, self).__init__(module_inst)
-
- self.pool = pool
-
- self.ioctx = None
- self.rbd = None
-
- def _init(self):
- self.log.debug("Constructing IOCtx")
- self.ioctx = self._module.rados.open_ioctx(self.pool)
-
- self.log.debug("Constructing RBD")
- self.rbd = rbd.RBD()
-
- def _get(self):
- self.log.debug("rbd.list")
- names = self.rbd.list(self.ioctx)
- result = []
- for name in names:
- i = rbd.Image(self.ioctx, name)
- stat = i.stat()
- stat['name'] = name
- features = i.features()
- stat['features'] = features
- stat['features_name'] = self._format_bitmask(features)
-
- try:
- parent_info = i.parent_info()
- parent = "{}@{}".format(parent_info[0], parent_info[1])
- if parent_info[0] != self.pool:
- parent = "{}/{}".format(parent_info[0], parent)
- stat['parent'] = parent
- except rbd.ImageNotFound:
- pass
- result.append(stat)
- return result
-
- def _format_bitmask(self, features):
- names = ""
- RBD_FEATURES_NAME_MAPPING = {
- rbd.RBD_FEATURE_LAYERING: "layering",
- rbd.RBD_FEATURE_STRIPINGV2: "striping",
- rbd.RBD_FEATURE_EXCLUSIVE_LOCK: "exclusive-lock",
- rbd.RBD_FEATURE_OBJECT_MAP: "object-map",
- rbd.RBD_FEATURE_FAST_DIFF: "fast-diff",
- rbd.RBD_FEATURE_DEEP_FLATTEN: "deep-flatten",
- rbd.RBD_FEATURE_JOURNALING: "journaling",
- rbd.RBD_FEATURE_DATA_POOL: "data-pool",
- }
-
- for key in RBD_FEATURES_NAME_MAPPING.keys():
- if (key & features == 0):
- continue
-
- if names:
- names = names + ", "
- names = names + RBD_FEATURES_NAME_MAPPING.get(key)
-
- return names