+ if image_settings.extra_properties:
+ created_image = glance.images.create(
+ name=image_settings.name, disk_format=image_settings.format, container_format="bare", data=image_file,
+ properties=image_settings.extra_properties)
+ else:
+ created_image = glance.images.create(
+ name=image_settings.name, disk_format=image_settings.format, container_format="bare", data=image_file)
+
+ return Image(name=image_settings.name, image_id=created_image.id, size=created_image.size,
+ properties=created_image.properties)
+
+
+def __create_image_v2(glance, image_settings):
+ """
+ Creates and returns OpenStack image object with an external URL
+ :param glance: the glance client v2
+ :param image_settings: the image settings object
+ :return: the OpenStack image object
+ :raise Exception if using a file and it cannot be found
+ """
+ cleanup_file = False
+ if image_settings.image_file:
+ image_filename = image_settings.image_file
+ elif image_settings.url:
+ image_file = file_utils.download(image_settings.url, '/tmp', str(uuid.uuid4()))
+ image_filename = image_file.name
+ cleanup_file = True
+ else:
+ raise Exception('Filename or URL of image not configured')
+
+ created_image = None
+ try:
+ kwargs = dict()
+ kwargs['name'] = image_settings.name
+ kwargs['disk_format'] = image_settings.format
+ kwargs['container_format'] = 'bare'
+ if image_settings.extra_properties:
+ kwargs.update(image_settings.extra_properties)
+
+ created_image = glance.images.create(**kwargs)
+ image_file = file_utils.get_file(image_filename)
+ glance.images.upload(created_image['id'], image_file)
+ except Exception as e:
+ logger.error('Unexpected exception creating image. Rolling back')
+ if created_image:
+ delete_image(glance, created_image)
+ raise e
+ finally:
+ if cleanup_file:
+ os.remove(image_filename)
+
+ updated_image = glance.images.get(created_image['id'])
+ return Image(name=updated_image['name'], image_id=updated_image['id'], size=updated_image['size'],
+ properties=updated_image.get('properties'))