From 46c2d5056e93a5f60987cfe9fa7604f010ceb613 Mon Sep 17 00:00:00 2001 From: Tony Mack Date: Wed, 9 Oct 2013 13:04:28 -0400 Subject: [PATCH] sync images --- planetstack/observer/event_loop.py | 2 +- planetstack/observer/steps/__init__.py | 1 + .../observer/steps/garbage_collector.py | 16 +++++++++- planetstack/observer/steps/sync_images.py | 29 +++++++++++++++++++ 4 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 planetstack/observer/steps/sync_images.py diff --git a/planetstack/observer/event_loop.py b/planetstack/observer/event_loop.py index b177409..22a4e0b 100644 --- a/planetstack/observer/event_loop.py +++ b/planetstack/observer/event_loop.py @@ -69,7 +69,7 @@ def toposort(g, steps=None): return order class PlanetStackObserver: - sync_steps = [SyncNetworks,SyncNetworkSlivers,SyncSites,SyncSitePrivileges,SyncSlices,SyncSliceMemberships,SyncSlivers,SyncSliverIps,SyncExternalRoutes,SyncUsers,SyncRoles,SyncNodes,GarbageCollector] + sync_steps = [SyncNetworks,SyncNetworkSlivers,SyncSites,SyncSitePrivileges,SyncSlices,SyncSliceMemberships,SyncSlivers,SyncSliverIps,SyncExternalRoutes,SyncUsers,SyncRoles,SyncNodes,SyncImages,GarbageCollector] def __init__(self): # The Condition object that gets signalled by Feefie events diff --git a/planetstack/observer/steps/__init__.py b/planetstack/observer/steps/__init__.py index 50405a8..926a7dc 100644 --- a/planetstack/observer/steps/__init__.py +++ b/planetstack/observer/steps/__init__.py @@ -10,4 +10,5 @@ from .sync_slivers import SyncSlivers from .sync_users import SyncUsers from .sync_roles import SyncRoles from .sync_nodes import SyncNodes +from .sync_images import SyncImages from .garbage_collector import GarbageCollector diff --git a/planetstack/observer/steps/garbage_collector.py b/planetstack/observer/steps/garbage_collector.py index a45db8c..705ed67 100644 --- a/planetstack/observer/steps/garbage_collector.py +++ b/planetstack/observer/steps/garbage_collector.py @@ -227,4 +227,18 @@ class GarbageCollector(OpenStackSyncStep): Node.objects.filter(name__in=old_node_names).delete() def gc_images(self): - pass + # collect local images + images = Image.objects.all() + images_dict = {} + for image in images: + images_dict[image.name] = image + + # collect glance images + glance_images = self.driver.shell.glance.get_images() + glance_images_dict = {} + for glance_image in glance_images: + glance_images_dict[glance_image['name']] = glance_image + + # remove old images + old_image_names = set(images_dict.keys()).difference(glance_images_dict.keys()) + Image.objects.filter(name__in=old_image_names).delete() diff --git a/planetstack/observer/steps/sync_images.py b/planetstack/observer/steps/sync_images.py new file mode 100644 index 0000000..2dbd74d --- /dev/null +++ b/planetstack/observer/steps/sync_images.py @@ -0,0 +1,29 @@ +import os +import base64 +from django.db.models import F, Q +from planetstack.config import Config +from observer.openstacksyncstep import OpenStackSyncStep +from core.models.image import Image + +class SyncImages(OpenStackSyncStep): + provides=[Image] + requested_interval=0 + + def fetch_pending(self): + images = Image.objects.all() + image_names = [image.name for image in images] + + new_images = [] + glance_images = self.driver.shell.glance.get_images() + for glance_image in glance_images: + if glance_image['name'] not in image_names: + image = Image(image_id=glance_image['id'], + name=glance_image['name'], + disk_format=glance_image['disk_format'], + container_format=glance_image['container_format']) + new_images.append(image) + + return new_images + + def sync_record(self, image): + image.save() -- 2.47.0