Support both admin role name
[snaps.git] / snaps / openstack / create_image.py
index 9ed813c..1a8aa12 100644 (file)
@@ -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,71 @@ 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)
+        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)
@@ -82,12 +102,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 +119,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 +129,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 +137,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
 
@@ -132,6 +148,11 @@ class OpenStackImage:
         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
@@ -225,99 +246,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):