self.load_schedules()
- with self.lock:
- if not self.schedules:
- self.images = {}
- self.queue = {}
- self.last_refresh_images = datetime.now()
- return
-
images = {}
for pool_id, pool_name in get_rbd_pools(self.module).items():
+ if not self.schedules.intersects(
+ LevelSpec.from_pool_spec(pool_id, pool_name)):
+ continue
with self.module.rados.open_ioctx2(int(pool_id)) as ioctx:
self.load_pool_images(ioctx, images)
pool_name = ioctx.get_pool_name()
images[pool_id] = {}
+ self.log.debug("load_pool_images: pool={}".format(pool_name))
+
try:
namespaces = [''] + rbd.RBD().namespace_list(ioctx)
for namespace in namespaces:
+ if not self.schedules.intersects(
+ LevelSpec.from_pool_spec(pool_id, pool_name, namespace)):
+ continue
+ self.log.debug("load_pool_images: pool={}, namespace={}".format(
+ pool_name, namespace))
images[pool_id][namespace] = {}
ioctx.set_namespace(namespace)
mirror_images = dict(rbd.RBD().mirror_image_info_list(
return False
return True
+ def intersects(self, level_spec):
+ if self.pool_id is None or level_spec.pool_id is None:
+ return True
+ if self.pool_id != level_spec.pool_id:
+ return False
+ if self.namespace is None or level_spec.namespace is None:
+ return True
+ if self.namespace != level_spec.namespace:
+ return False
+ if self.image_id is None or level_spec.image_id is None:
+ return True
+ if self.image_id != level_spec.image_id:
+ return False
+ return True
+
@classmethod
def make_global(cls):
return LevelSpec("", "", None, None, None)
+ @classmethod
+ def from_pool_spec(cls, pool_id, pool_name, namespace=None):
+ if namespace is None:
+ id = "{}".format(pool_id)
+ name = "{}/".format(pool_name)
+ else:
+ id = "{}/{}".format(pool_id, namespace)
+ name = "{}/{}/".format(pool_name, namespace)
+ return LevelSpec(name, id, str(pool_id), namespace, None)
+
@classmethod
def from_name(cls, handler, name, namespace_validator=None,
image_validator=None, allow_image_level=True):
del levels[-1]
return None
+ def intersects(self, level_spec):
+ for ls in self.level_specs.values():
+ if ls.intersects(level_spec):
+ return True
+ return False
+
def to_list(self, level_spec):
if level_spec.id in self.schedules:
parent = level_spec
self.load_schedules()
- with self.lock:
- if not self.schedules:
- self.images = {}
- self.queue = {}
- self.last_refresh_pools = datetime.now()
- return
-
pools = {}
for pool_id, pool_name in get_rbd_pools(self.module).items():
+ if not self.schedules.intersects(
+ LevelSpec.from_pool_spec(pool_id, pool_name)):
+ continue
with self.module.rados.open_ioctx2(int(pool_id)) as ioctx:
self.load_pool(ioctx, pools)
pools[pool_id] = {}
pool_namespaces = ['']
+ self.log.debug("load_pool: {}".format(pool_name))
+
try:
pool_namespaces += rbd.RBD().namespace_list(ioctx)
except rbd.OperationNotSupported:
schedule_time = schedule.next_run(now)
if schedule_time not in self.queue:
self.queue[schedule_time] = []
- self.log.debug("schedule image {}/{} at {}".format(
+ self.log.debug("schedule {}/{} at {}".format(
pool_id, namespace, schedule_time))
ns_spec = (pool_id, namespace)
if ns_spec not in self.queue[schedule_time]: