sync images
authorTony Mack <tmack@paris.CS.Princeton.EDU>
Wed, 9 Oct 2013 17:04:28 +0000 (13:04 -0400)
committerTony Mack <tmack@paris.CS.Princeton.EDU>
Wed, 9 Oct 2013 17:04:28 +0000 (13:04 -0400)
planetstack/observer/event_loop.py
planetstack/observer/steps/__init__.py
planetstack/observer/steps/garbage_collector.py
planetstack/observer/steps/sync_images.py [new file with mode: 0644]

index b177409..22a4e0b 100644 (file)
@@ -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
index 50405a8..926a7dc 100644 (file)
@@ -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
index a45db8c..705ed67 100644 (file)
@@ -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 (file)
index 0000000..2dbd74d
--- /dev/null
@@ -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()