blob: e611044fcdaa451ccbf6fce52411c22a0373ab23 [file] [log] [blame]
Tony Mackbf39d9f2014-05-06 21:42:36 -04001import os
2import base64
3from collections import defaultdict
4from django.db.models import F, Q
5from planetstack.config import Config
6from observer.openstacksyncstep import OpenStackSyncStep
7from core.models.deployment import Deployment
8from core.models.image import Image, ImageDeployments
9
10class SyncImageDeployments(OpenStackSyncStep):
11 provides=[ImageDeployments]
12 requested_interval=0
13
14 def fetch_pending(self):
15 # ensure images are available across all deployments
16 image_deployments = ImageDeployments.objects.all()
17 image_deploy_lookup = defaultdict(list)
18 for image_deployment in image_deployments:
19 image_deploy_lookup[image_deployment.image].append(image_deployment.deployment)
20
21 all_deployments = Deployment.objects.all()
22 for image in Image.objects.all():
23 expected_deployments = all_deployments
24 for expected_deployment in expected_deployments:
25 if image not in image_deploy_lookup or \
26 expected_deployment not in image_deploy_lookup[image]:
27 id = ImageDeployments(image=image, deployment=expected_deployment)
28 id.save()
29
30 # now we return all images that need to be enacted
31 return ImageDeployments.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))
32
33 def sync_record(self, image_deployment):
34 driver = self.driver.admin_driver(deployment=image_deployment.deployment.name)
35 image = {
36 'name': image_deployment.image.name,
37 'is_public': True,
38 'disk_format': 'raw',
39 'container_format': 'bare',
40 'file': image_deployment.image.path,
41 }
42 glance_image = driver.shell.glance.add_image(image)
43 image_deployment.glance_image_id = glance_image['id']
44 image_deployment.save()