changes from alpha site
diff --git a/planetstack/observer/sync_image_deployments.py b/planetstack/observer/sync_image_deployments.py
new file mode 100644
index 0000000..3522eca
--- /dev/null
+++ b/planetstack/observer/sync_image_deployments.py
@@ -0,0 +1,60 @@
+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.deployment import Deployment
+from core.models.image import Image, ImageDeployments
+
+class SyncImageDeployments(OpenStackSyncStep):
+ provides=[ImageDeployments]
+ requested_interval=0
+
+ def fetch_pending(self):
+ # 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):
+ 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:
+ 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,
+ }
+ 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'))
+
+ if not glance_image or not glance_image.get('id'):
+ raise Exception, "Add image failed at deployment %s" % image_deployment.deployment.name
+ image_deployment.glance_image_id = glance_image['id']
+ image_deployment.save()