Creates and returns a glance client object
:return: the glance client
"""
- return Client(version=os_creds.image_api_version, session=keystone_utils.keystone_session(os_creds))
+ return Client(version=os_creds.image_api_version,
+ session=keystone_utils.keystone_session(os_creds))
def get_image(glance, image_name=None):
if glance.version == VERSION_1:
if image.name == image_name:
image = glance.images.get(image.id)
- return Image(name=image.name, image_id=image.id, size=image.size, properties=image.properties)
+ return Image(name=image.name, image_id=image.id,
+ size=image.size, properties=image.properties)
elif glance.version == VERSION_2:
if image['name'] == image_name:
- return Image(name=image['name'], image_id=image['id'], size=image['size'],
- properties=image.get('properties'))
+ return Image(
+ name=image['name'], image_id=image['id'],
+ size=image['size'], properties=image.get('properties'))
return None
os_image = glance.images.get(image.id)
return os_image['status']
else:
- raise Exception('Unsupported glance client version')
+ raise GlanceException('Unsupported glance client version')
def create_image(glance, image_settings):
elif glance.version == VERSION_2:
return __create_image_v2(glance, image_settings)
else:
- raise Exception('Unsupported glance client version')
+ raise GlanceException('Unsupported glance client version')
def __create_image_v1(glance, image_settings):
:param glance: the glance client
:param image_settings: the image settings object
:return: the OpenStack image object
- :raise Exception if using a file and it cannot be found
+ :raise exceptions from the Glance client or IOError when opening a file
"""
created_image = None
+ # TODO/REFACTOR - replace each call with one including kwargs
if image_settings.url:
if image_settings.extra_properties:
created_image = glance.images.create(
- name=image_settings.name, disk_format=image_settings.format, container_format="bare",
- location=image_settings.url, properties=image_settings.extra_properties)
+ name=image_settings.name, disk_format=image_settings.format,
+ container_format="bare", location=image_settings.url,
+ properties=image_settings.extra_properties,
+ is_public=image_settings.public)
else:
- created_image = glance.images.create(name=image_settings.name, disk_format=image_settings.format,
- container_format="bare", location=image_settings.url)
+ created_image = glance.images.create(
+ name=image_settings.name, disk_format=image_settings.format,
+ container_format="bare", location=image_settings.url,
+ is_public=image_settings.public)
elif image_settings.image_file:
- image_file = file_utils.get_file(image_settings.image_file)
+ image_file = open(image_settings.image_file, 'rb')
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)
+ name=image_settings.name, disk_format=image_settings.format,
+ container_format="bare", data=image_file,
+ properties=image_settings.extra_properties,
+ is_public=image_settings.public)
else:
created_image = glance.images.create(
- name=image_settings.name, disk_format=image_settings.format, container_format="bare", data=image_file)
+ name=image_settings.name, disk_format=image_settings.format,
+ container_format="bare", data=image_file,
+ is_public=image_settings.public)
- return Image(name=image_settings.name, image_id=created_image.id, size=created_image.size,
- properties=created_image.properties)
+ 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):
: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
+ :raise GlanceException or IOException or URLError
"""
- cleanup_file = False
+ cleanup_temp_file = False
+ image_file = None
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
+ file_name = str(uuid.uuid4())
+ try:
+ image_file = file_utils.download(
+ image_settings.url, './tmp', file_name)
+ image_filename = image_file.name
+ except:
+ os.remove('./tmp/' + file_name)
+ raise
+
+ cleanup_temp_file = True
else:
- raise Exception('Filename or URL of image not configured')
+ raise GlanceException('Filename or URL of image not configured')
created_image = None
try:
kwargs['name'] = image_settings.name
kwargs['disk_format'] = image_settings.format
kwargs['container_format'] = 'bare'
+
+ if image_settings.public:
+ kwargs['visibility'] = 'public'
+
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)
+ image_file = open(image_filename, 'rb')
glance.images.upload(created_image['id'], image_file)
- except Exception as e:
+ except:
logger.error('Unexpected exception creating image. Rolling back')
if created_image:
delete_image(glance, created_image)
- raise e
+ raise
finally:
- if cleanup_file:
+ if image_file:
+ image_file.close()
+ if cleanup_temp_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'))
+ return Image(
+ name=updated_image['name'], image_id=updated_image['id'],
+ size=updated_image['size'], properties=updated_image.get('properties'))
def delete_image(glance, image):
elif glance.version == VERSION_2:
glance.images.delete(image.id)
else:
- raise Exception('Unsupported glance client version')
+ raise GlanceException('Unsupported glance client version')
+
+
+class GlanceException(Exception):
+ """
+ Exception when calls to the Glance client cannot be served properly
+ """