import logging import features from app import storage, image_replication_queue from data.database import Image, ImageStorage, Repository, User from data import model from util.registry.replication import queue_storage_replication def backfill_replication(): encountered = set() query = (Image .select(Image, ImageStorage, Repository, User) .join(ImageStorage) .switch(Image) .join(Repository) .join(User)) for image in query: if image.storage.uuid in encountered: continue namespace = image.repository.namespace_user.username locations = model.user.get_region_locations(namespace) locations_required = locations | set(storage.default_locations) locations_missing = locations_required - set(image.storage.locations) if locations_missing: print "Enqueueing image storage %s to be replicated" % (image.storage.uuid) encountered.add(image.storage.uuid) if not image_replication_queue.alive([image.storage.uuid]): queue_storage_replication(image.repository.namespace_user.username, image.storage) if __name__ == '__main__': logging.basicConfig(level=logging.INFO) if not features.STORAGE_REPLICATION: print "Storage replication is not enabled" else: backfill_replication()