blob: 52aaeef15fc845f8e332ca48d4dc4bb3ef29790e [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
Scott Bakere3969b22014-06-02 22:59:08 -07009from util.logger import Logger, logging
10
11logger = Logger(level=logging.INFO)
Tony Mackbf39d9f2014-05-06 21:42:36 -040012
13class SyncImageDeployments(OpenStackSyncStep):
14 provides=[ImageDeployments]
15 requested_interval=0
16
17 def fetch_pending(self):
18 # ensure images are available across all deployments
19 image_deployments = ImageDeployments.objects.all()
20 image_deploy_lookup = defaultdict(list)
21 for image_deployment in image_deployments:
22 image_deploy_lookup[image_deployment.image].append(image_deployment.deployment)
Scott Bakere3969b22014-06-02 22:59:08 -070023
24 all_deployments = Deployment.objects.all()
Tony Mackbf39d9f2014-05-06 21:42:36 -040025 for image in Image.objects.all():
26 expected_deployments = all_deployments
27 for expected_deployment in expected_deployments:
28 if image not in image_deploy_lookup or \
29 expected_deployment not in image_deploy_lookup[image]:
30 id = ImageDeployments(image=image, deployment=expected_deployment)
31 id.save()
Scott Bakere3969b22014-06-02 22:59:08 -070032
Tony Mackbf39d9f2014-05-06 21:42:36 -040033 # now we return all images that need to be enacted
Scott Bakere3969b22014-06-02 22:59:08 -070034 return ImageDeployments.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))
35
Tony Mackbf39d9f2014-05-06 21:42:36 -040036 def sync_record(self, image_deployment):
Scott Bakere3969b22014-06-02 22:59:08 -070037 logger.info("Working on image %s on deployment %s" % (image_deployment.image.name, image_deployment.deployment.name))
Tony Mackbf39d9f2014-05-06 21:42:36 -040038 driver = self.driver.admin_driver(deployment=image_deployment.deployment.name)
Tony Mack8b85d9a2014-05-06 23:43:14 -040039 images = driver.shell.glance.get_images()
40 glance_image = None
41 for image in images:
42 if image['name'] == image_deployment.image.name:
43 glance_image = image
44 break
45 if glance_image:
Scott Bakere3969b22014-06-02 22:59:08 -070046 logger.info("Found image %s on deployment %s" % (image_deployment.image.name, image_deployment.deployment.name))
Tony Mack8b85d9a2014-05-06 23:43:14 -040047 image_deployment.glance_image_id = glance_image['id']
48 elif image_deployment.image.path:
Scott Baker3949bc62014-05-12 10:42:16 -070049 image = {
50 'name': image_deployment.image.name,
51 'is_public': True,
Scott Bakere3969b22014-06-02 22:59:08 -070052 'disk_format': 'raw',
Scott Baker3949bc62014-05-12 10:42:16 -070053 'container_format': 'bare',
Scott Bakere3969b22014-06-02 22:59:08 -070054 'file': image_deployment.image.path,
55 }
56
57 logger.info("Creating image %s on deployment %s" % (image_deployment.image.name, image_deployment.deployment.name))
58
Tony Mack8b85d9a2014-05-06 23:43:14 -040059 glance_image = driver.shell.glanceclient.images.create(name=image_deployment.image.name,
60 is_public=True,
61 disk_format='raw',
62 container_format='bare')
63 glance_image.update(data=open(image_deployment.image.path, 'rb'))
Scott Bakere3969b22014-06-02 22:59:08 -070064
65 # While the images returned by driver.shell.glance.get_images()
66 # are dicts, the images returned by driver.shell.glanceclient.images.create
67 # are not dicts. We have to use getattr() instead of [] operator.
68 if not glance_image or not getattr(glance_image,"id",None):
Scott Baker3949bc62014-05-12 10:42:16 -070069 raise Exception, "Add image failed at deployment %s" % image_deployment.deployment.name
Scott Bakere3969b22014-06-02 22:59:08 -070070 image_deployment.glance_image_id = getattr(glance_image, "id")
Tony Mackbf39d9f2014-05-06 21:42:36 -040071 image_deployment.save()