renaming
authorTony Mack <tmack@tux.cs.princeton.edu>
Sun, 30 Nov 2014 20:35:56 +0000 (15:35 -0500)
committerTony Mack <tmack@tux.cs.princeton.edu>
Sun, 30 Nov 2014 20:35:56 +0000 (15:35 -0500)
planetstack/openstack_observer/steps/sync_controller_images.py [new file with mode: 0644]

diff --git a/planetstack/openstack_observer/steps/sync_controller_images.py b/planetstack/openstack_observer/steps/sync_controller_images.py
new file mode 100644 (file)
index 0000000..20c22a2
--- /dev/null
@@ -0,0 +1,77 @@
+import os
+import base64
+from collections import defaultdict
+from django.db.models import F, Q
+from planetstack.config import Config
+from observer.openstacksyncstep import OpenStackSyncStep
+from core.models import Deployment
+from core.models import Image, ImageDeployments
+from util.logger import Logger, logging
+\r
+logger = Logger(level=logging.INFO)
+
+class SyncImageDeployments(OpenStackSyncStep):
+    provides=[ImageDeployments]
+    requested_interval=0
+
+    def fetch_pending(self, deleted):
+        if (deleted):
+            return []
+         # smbaker: commented out automatic creation of ImageDeployments as
+         #    as they will now be configured in GUI. Not sure if this is
+         #    sufficient.
+
+#        # ensure images are available across all deployments
+#        image_deployments = ImageDeployments.objects.all()
+#        image_deploy_lookup = defaultdict(list)
+#        for image_deployment in image_deployments:
+#            image_deploy_lookup[image_deployment.image].append(image_deployment.deployment)
+#
+#        all_deployments = Deployment.objects.all()
+#        for image in Image.objects.all():
+#            expected_deployments = all_deployments
+#            for expected_deployment in expected_deployments:
+#                if image not in image_deploy_lookup or \
+#                  expected_deployment not in image_deploy_lookup[image]:
+#                    id = ImageDeployments(image=image, deployment=expected_deployment)
+#                    id.save()
+
+        # now we return all images that need to be enacted
+        return ImageDeployments.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))
+
+    def sync_record(self, image_deployment):
+        logger.info("Working on image %s on deployment %s" % (image_deployment.image.name, image_deployment.deployment.name))
+        driver = self.driver.admin_driver(deployment=image_deployment.deployment.name)
+        images = driver.shell.glance.get_images()
+        glance_image = None
+        for image in images:
+            if image['name'] == image_deployment.image.name:
+                glance_image = image
+                break
+        if glance_image:
+            logger.info("Found image %s on deployment %s" % (image_deployment.image.name, image_deployment.deployment.name))
+            image_deployment.glance_image_id = glance_image['id']
+        elif image_deployment.image.path:
+            image = {
+                'name': image_deployment.image.name,
+                'is_public': True,
+                'disk_format': 'raw',
+                'container_format': 'bare',
+                'file': image_deployment.image.path,
+            }
+
+            logger.info("Creating image %s on deployment %s" % (image_deployment.image.name, image_deployment.deployment.name))
+
+            glance_image = driver.shell.glanceclient.images.create(name=image_deployment.image.name,
+                                                                   is_public=True,
+                                                                   disk_format='raw',
+                                                                   container_format='bare')
+            glance_image.update(data=open(image_deployment.image.path, 'rb'))
+
+            # While the images returned by driver.shell.glance.get_images()
+            #   are dicts, the images returned by driver.shell.glanceclient.images.create
+            #   are not dicts. We have to use getattr() instead of [] operator.
+            if not glance_image or not getattr(glance_image,"id",None):
+                raise Exception, "Add image failed at deployment %s" % image_deployment.deployment.name
+            image_deployment.glance_image_id = getattr(glance_image, "id")
+        image_deployment.save()