X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=snaps%2Fopenstack%2Fcreate_image.py;h=a5520e3a9451e087224c031f5e005b8bc66635e3;hb=8c3757c7179cffb86d9889c1744c22a2620bc6a7;hp=9ed813c08b895862d1f814846d989f7cd020c3e2;hpb=5f635fb4354797e16d820dc2a3ac36f5ea2c5163;p=snaps.git diff --git a/snaps/openstack/create_image.py b/snaps/openstack/create_image.py index 9ed813c..a5520e3 100644 --- a/snaps/openstack/create_image.py +++ b/snaps/openstack/create_image.py @@ -17,7 +17,9 @@ from glanceclient.exc import HTTPNotFound 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' @@ -28,53 +30,68 @@ POLL_INTERVAL = 3 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) + self.__glance = glance_utils.glance_client(self._os_creds) + 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) @@ -82,12 +99,9 @@ class OpenStackImage: 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) @@ -102,6 +116,7 @@ class OpenStackImage: 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', @@ -111,8 +126,6 @@ class OpenStackImage: 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 @@ -121,10 +134,10 @@ class OpenStackImage: 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 @@ -225,99 +238,14 @@ class OpenStackImage: 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):