Merge "Bug 129 RIFT-15122"
[osm/SO.git] / rwcal / plugins / vala / rwcal_openstack / rift / rwcal / openstack / openstack_drv.py
index 2505da3..90cefa1 100644 (file)
@@ -70,6 +70,18 @@ class KeystoneDriver(object):
         """
         return self._tenant_name
 
+    def get_user_domain_name(self):
+        """
+        Returns None as this field does not exist for v2.
+        """
+        return None;
+
+    def get_project_domain_name(self):
+        """
+        Returns None as this field does not exist for v2.
+        """
+        return None;
+
     def _get_keystone_connection(self):
         """
         Returns object of class python-keystoneclient class
@@ -123,6 +135,8 @@ class KeystoneDriver(object):
         try:
             ksconn = self._get_keystone_connection()
             service_endpoint  = ksconn.service_catalog.url_for(**endpoint_kwargs)
+        except (KeystoneExceptions.Unauthorized, KeystoneExceptions.AuthorizationFailure) as e:
+            raise
         except Exception as e:
             logger.error("OpenstackDriver: Service Catalog discovery operation failed for service_type: %s, endpoint_type: %s. Exception: %s" %(service_type, endpoint_type, str(e)))
             raise
@@ -261,7 +275,7 @@ class KeystoneDriverV3(KeystoneDriver):
     """
     Driver class for keystoneclient V3 APIs
     """
-    def __init__(self, username, password, auth_url,tenant_name, insecure):
+    def __init__(self, username, password, auth_url,tenant_name, insecure, user_domain_name = None, project_domain_name = None):
         """
         Constructor for KeystoneDriverV3 class
         Arguments:
@@ -272,26 +286,41 @@ class KeystoneDriverV3(KeystoneDriver):
 
         Returns: None
         """
-        self._username    = username
-        self._password    = password
-        self._auth_url    = auth_url
-        self._tenant_name = tenant_name
-        self._insecure    = insecure
+        self._username             = username
+        self._password             = password
+        self._auth_url             = auth_url
+        self._tenant_name          = tenant_name
+        self._insecure             = insecure
+        self._user_domain_name     = user_domain_name
+        self._project_domain_name  = project_domain_name
         super(KeystoneDriverV3, self).__init__(ksclientv3.Client)
 
     def _get_keystone_credentials(self):
         """
         Returns the dictionary of kwargs required to instantiate python-keystoneclient class
         """
-        creds                 = {}
-        #creds['user_domain'] = self._domain_name
-        creds['username']     = self._username
-        creds['password']     = self._password
-        creds['auth_url']     = self._auth_url
-        creds['project_name'] = self._tenant_name
-        creds['insecure']     = self._insecure
+        creds                        = {}
+        creds['username']            = self._username
+        creds['password']            = self._password
+        creds['auth_url']            = self._auth_url
+        creds['project_name']        = self._tenant_name
+        creds['insecure']            = self._insecure
+        creds['user_domain_name']    = self._user_domain_name
+        creds['project_domain_name'] = self._project_domain_name
         return creds
 
+    def get_user_domain_name(self):
+        """
+        Returns the domain_name of the associated OpenStack user account
+        """
+        return self._user_domain_name;
+
+    def get_project_domain_name(self):
+        """
+        Returns the domain_name of the associated OpenStack project
+        """
+        return self._project_domain_name;
+
     def get_auth_token(self):
         """
         Returns a valid auth_token
@@ -338,6 +367,9 @@ class NovaDriver(object):
         creds['project_id'] = self.ks_drv.get_tenant_name()
         creds['auth_token'] = self.ks_drv.get_auth_token()
         creds['insecure']   = self.ks_drv.get_security_mode()
+        creds['user_domain_name'] = self.ks_drv.get_user_domain_name()
+        creds['project_domain_name'] = self.ks_drv.get_project_domain_name()
+
         return creds
 
     def _get_nova_connection(self):
@@ -527,7 +559,8 @@ class NovaDriver(object):
          {
            server_name(string)        : Name of the VM/Server
            flavor_id  (string)        : UUID of the flavor to be used for VM
-           image_id   (string)        : UUID of the image to be used VM/Server instance
+           image_id   (string)        : UUID of the image to be used VM/Server instance,
+                                             This could be None if volumes (with images) are being used
            network_list(List)         : A List of network_ids. A port will be created in these networks
            port_list (List)           : A List of port-ids. These ports will be added to VM.
            metadata   (dict)          : A dictionary of arbitrary key-value pairs associated with VM/server
@@ -550,6 +583,7 @@ class NovaDriver(object):
 
         nvconn = self._get_nova_connection()
 
+
         try:
             server = nvconn.servers.create(kwargs['name'],
                                            kwargs['image_id'],
@@ -562,7 +596,7 @@ class NovaDriver(object):
                                            userdata             = kwargs['userdata'],
                                            security_groups      = kwargs['security_groups'],
                                            availability_zone    = kwargs['availability_zone'],
-                                           block_device_mapping = None,
+                                           block_device_mapping_v2 = kwargs['block_device_mapping_v2'],
                                            nics                 = nics,
                                            scheduler_hints      = kwargs['scheduler_hints'],
                                            config_drive         = None)
@@ -834,6 +868,26 @@ class NovaDriver(object):
             logger.error("OpenstackDriver: Release Floating IP operation failed. Exception: %s"  %str(e))
             raise
 
+    def volume_list(self, server_id):
+        """
+          List of volumes attached to the server
+  
+          Arguments:
+              None
+          Returns:
+             List of dictionary objects where dictionary is representation of class (novaclient.v2.volumes.Volume)
+        """
+        nvconn =  self._get_nova_connection()
+        try:
+            volumes = nvconn.volumes.get_server_volumes(server_id=server_id)
+        except Exception as e:
+            logger.error("OpenstackDriver: Get volume information failed. Exception: %s"  %str(e))
+            raise
+
+        volume_info = [v.to_dict() for v in volumes]
+        return volume_info
+
+
     def group_list(self):
         """
         List of Server Affinity and Anti-Affinity Groups
@@ -875,7 +929,7 @@ class NovaDriverV21(NovaDriver):
         Constructor for NovaDriver
         Arguments: KeystoneDriver class object
         """
-        super(NovaDriverV21, self).__init__(ks_drv, 'computev21', '2.1')
+        super(NovaDriverV21, self).__init__(ks_drv, 'compute', '2.1')
 
 class GlanceDriver(object):
     """
@@ -1615,7 +1669,7 @@ class OpenstackDriver(object):
     """
     Driver for openstack nova, neutron, glance, keystone, swift, cinder services
     """
-    def __init__(self, username, password, auth_url, tenant_name, mgmt_network = None, cert_validate = False):
+    def __init__(self, username, password, auth_url, tenant_name, mgmt_network = None, cert_validate = False, user_domain_name = None, project_domain_name = None):
         """
         OpenstackDriver Driver constructor
         Arguments:
@@ -1630,7 +1684,7 @@ class OpenstackDriver(object):
         """
         insecure = not cert_validate
         if auth_url.find('/v3') != -1:
-            self.ks_drv        = KeystoneDriverV3(username, password, auth_url, tenant_name, insecure)
+            self.ks_drv        = KeystoneDriverV3(username, password, auth_url, tenant_name, insecure, user_domain_name, project_domain_name)
             self.glance_drv    = GlanceDriverV2(self.ks_drv)
             self.nova_drv      = NovaDriverV21(self.ks_drv)
             self.neutron_drv   = NeutronDriverV2(self.ks_drv)
@@ -1645,6 +1699,7 @@ class OpenstackDriver(object):
             logger.error("Could not identity the version information for openstack service endpoints. Auth_URL should contain \"/v2\" or \"/v3\" string in it")
             raise NotImplementedError("Auth URL is wrong or invalid. Only Keystone v2 & v3 supported")
 
+        self._mgmt_network_id = None
         if mgmt_network != None:
             self._mgmt_network = mgmt_network
 
@@ -1652,6 +1707,8 @@ class OpenstackDriver(object):
             try:
                 ntconn   = self.neutron_drv._get_neutron_connection()
                 networks = ntconn.list_networks()
+            except (KeystoneExceptions.Unauthorized, KeystoneExceptions.AuthorizationFailure) as e:
+                raise
             except Exception as e:
                 logger.error("OpenstackDriver: List Network operation failed. Exception: %s" %(str(e)))
                 raise
@@ -1720,10 +1777,19 @@ class OpenstackDriver(object):
         return self.nova_drv.flavor_get(flavor_id)
 
     def nova_server_create(self, **kwargs):
+        def _verify_image(image_id):
+            image = self.glance_drv.image_get(image_id)
+            if image['status'] != 'active':
+                raise GlanceException.NotFound("Image with image_id: %s not found in active state. Current State: %s" %(image['id'], image['status']))
+
         assert kwargs['flavor_id'] == self.nova_drv.flavor_get(kwargs['flavor_id'])['id']
-        image = self.glance_drv.image_get(kwargs['image_id'])
-        if image['status'] != 'active':
-            raise GlanceException.NotFound("Image with image_id: %s not found in active state. Current State: %s" %(image['id'], image['status']))
+
+        if kwargs['block_device_mapping_v2'] is not None:
+            for block_map in kwargs['block_device_mapping_v2']:
+                if 'uuid' in block_map:
+                    _verify_image(block_map['uuid'])
+        else:
+            _verify_image(kwargs['image_id'])
 
         # if 'network_list' in kwargs:
         #     kwargs['network_list'].append(self._mgmt_network_id)
@@ -1789,6 +1855,9 @@ class OpenstackDriver(object):
     def nova_server_group_list(self):
         return self.nova_drv.group_list()
 
+    def nova_volume_list(self, server_id):
+        return self.nova_drv.volume_list(server_id)
+
     def neutron_network_list(self):
         return self.neutron_drv.network_list()