import logging
import time
+from snaps.openstack.openstack_creator import OpenStackCloudObject
from snaps.openstack.utils import glance_utils
+from snaps.config import image
__author__ = 'spisarski'
STATUS_ACTIVE = 'active'
-class OpenStackImage:
+class OpenStackImage(OpenStackCloudObject):
"""
- Class responsible for creating an image in OpenStack
+ Class responsible for managing an image in OpenStack
"""
def __init__(self, os_creds, image_settings):
"""
Constructor
:param os_creds: The OpenStack connection credentials
- :param image_settings: The image settings
- :return:
+ :param image_settings: An snaps.config.image.ImageConfig object
"""
- self.__os_creds = os_creds
+ super(self.__class__, self).__init__(os_creds)
+
self.image_settings = image_settings
self.__image = None
self.__kernel_image = None
self.__ramdisk_image = None
self.__glance = None
- def create(self, cleanup=False):
+ def initialize(self):
"""
- Creates the image in OpenStack if it does not already exist and returns
- the domain Image object
- :param cleanup: Denotes whether or not this is being called for cleanup
- or not
- :return: The OpenStack Image object
+ Loads the existing Image
+ :return: The Image domain object or None
"""
- self.__glance = glance_utils.glance_client(self.__os_creds)
- self.__image = glance_utils.get_image(self.__glance,
- self.image_settings.name)
+ super(self.__class__, self).initialize()
+
+ self.__glance = glance_utils.glance_client(
+ self._os_creds, self._os_session)
+ self.__image = glance_utils.get_image(
+ self.__glance, image_settings=self.image_settings)
+
if self.__image:
logger.info('Found image with name - ' + self.image_settings.name)
return self.__image
- elif self.image_settings.exists and not self.image_settings.url \
- and not self.image_settings.image_file:
+ elif (self.image_settings.exists and not self.image_settings.url
+ and not self.image_settings.image_file):
raise ImageCreationError(
'Image with does not exist with name - ' +
self.image_settings.name)
- elif not cleanup:
+
+ if self.image_settings.kernel_image_settings:
+ self.__kernel_image = glance_utils.get_image(
+ self.__glance,
+ image_settings=self.image_settings.kernel_image_settings)
+
+ if self.image_settings.ramdisk_image_settings:
+ self.__ramdisk_image = glance_utils.get_image(
+ self.__glance,
+ image_settings=self.image_settings.ramdisk_image_settings)
+
+ return self.__image
+
+ def create(self):
+ """
+ Creates the image in OpenStack if it does not already exist and returns
+ the domain Image object
+ :return: The Image domain object or None
+ """
+ self.initialize()
+
+ if not self.__image:
extra_properties = self.image_settings.extra_properties or dict()
if self.image_settings.kernel_image_settings:
- self.__kernel_image = glance_utils.get_image(
- self.__glance,
- self.image_settings.kernel_image_settings.name)
-
- if not self.__kernel_image and not cleanup:
+ if not self.__kernel_image:
logger.info(
'Creating associated kernel image with name - %s',
self.image_settings.kernel_image_settings.name)
self.__glance,
self.image_settings.kernel_image_settings)
extra_properties['kernel_id'] = self.__kernel_image.id
- if self.image_settings.ramdisk_image_settings:
- self.__ramdisk_image = glance_utils.get_image(
- self.__glance,
- self.image_settings.ramdisk_image_settings.name)
- if not self.__ramdisk_image and not cleanup:
+ if self.image_settings.ramdisk_image_settings:
+ if not self.__ramdisk_image:
logger.info(
'Creating associated ramdisk image with name - %s',
self.image_settings.ramdisk_image_settings.name)
logger.info(
'Created image with name - %s', self.image_settings.name)
+
if self.__image and self.image_active(block=True):
logger.info(
'Image is now active with name - %s',
raise ImageCreationError(
'Image was not created or activated in the alloted amount'
'of time')
- else:
- logger.info('Did not create image due to cleanup mode')
return self.__image
Cleanse environment of all artifacts
:return: void
"""
- for image in [self.__image, self.__kernel_image, self.__ramdisk_image]:
- if image:
+ for img in [self.__image, self.__kernel_image, self.__ramdisk_image]:
+ if img:
try:
- glance_utils.delete_image(self.__glance, image)
+ glance_utils.delete_image(self.__glance, img)
except HTTPNotFound:
pass
self.__kernel_image = None
self.__ramdisk_image = None
+ if self.__glance:
+ self.__glance.http_client.session.session.close()
+
+ super(self.__class__, self).clean()
+
def get_image(self):
"""
Returns the domain Image object as it was populated when create() was
return status == expected_status_code
-class ImageSettings:
- def __init__(self, **kwargs):
- """
- Constructor
- :param name: the image's name (required)
- :param image_user: the image's default sudo user (required)
- :param format or img_format: the image type (required)
- :param url or download_url: the image download location (requires url
- or img_file)
- :param image_file: the image file location (requires url or img_file)
- :param extra_properties: dict() object containing extra parameters to
- pass when loading the image;
- can be ids of kernel and initramfs images for
- a 3-part image
- :param nic_config_pb_loc: the file location to the Ansible Playbook
- that can configure multiple NICs
- :param kernel_image_settings: the settings for a kernel image
- :param ramdisk_image_settings: the settings for a kernel image
- :param exists: When True, an image with the given name must exist
- :param public: When True, an image will be created with public
- visibility
- """
-
- self.name = kwargs.get('name')
- self.image_user = kwargs.get('image_user')
- self.format = kwargs.get('format')
- if not self.format:
- self.format = kwargs.get('img_format')
-
- self.url = kwargs.get('url')
- if not self.url:
- self.url = kwargs.get('download_url')
-
- self.image_file = kwargs.get('image_file')
- self.extra_properties = kwargs.get('extra_properties')
- self.nic_config_pb_loc = kwargs.get('nic_config_pb_loc')
-
- kernel_image_settings = kwargs.get('kernel_image_settings')
- if kernel_image_settings:
- if isinstance(kernel_image_settings, dict):
- self.kernel_image_settings = ImageSettings(
- **kernel_image_settings)
- else:
- self.kernel_image_settings = kernel_image_settings
- else:
- self.kernel_image_settings = None
-
- ramdisk_image_settings = kwargs.get('ramdisk_image_settings')
- if ramdisk_image_settings:
- if isinstance(ramdisk_image_settings, dict):
- self.ramdisk_image_settings = ImageSettings(
- **ramdisk_image_settings)
- else:
- self.ramdisk_image_settings = ramdisk_image_settings
- else:
- self.ramdisk_image_settings = None
-
- if 'exists' in kwargs and kwargs['exists'] is True:
- self.exists = True
- else:
- self.exists = False
-
- if 'public' in kwargs and kwargs['public'] is True:
- self.public = True
- else:
- self.public = False
-
- if not self.name:
- raise ImageSettingsError("The attribute name is required")
-
- if not (self.url or self.image_file) and not self.exists:
- raise ImageSettingsError(
- 'URL or image file must be set or image must already exist')
-
- if self.url and self.image_file:
- raise ImageSettingsError(
- 'Please set either URL or image file, not both')
-
- if not self.image_user:
- raise ImageSettingsError('Image user is required')
-
- if not self.format and not self.exists:
- raise ImageSettingsError(
- 'Format is required when the image should not already exist')
-
-
-class ImageSettingsError(Exception):
+class ImageSettings(image.ImageConfig):
"""
- Exception to be thrown when an image settings are incorrect
+ Deprecated, use snaps.config.image.ImageSettings instead
"""
-
- def __init__(self, message):
- Exception.__init__(self, message)
+ def __init__(self, **kwargs):
+ from warnings import warn
+ warn('Use snaps.config.image.ImageConfig instead', DeprecationWarning)
+ super(ImageSettings, self).__init__(**kwargs)
class ImageCreationError(Exception):