CAL and SDNAL cleanup for failure cases in accounts
[osm/SO.git] / rwcal / plugins / vala / rwcal_openstack / rift / rwcal / openstack / openstack_drv.py
index ffab014..d6831a7 100644 (file)
@@ -29,6 +29,7 @@ from . import utils as drv_utils
 
 # Exceptions
 import keystoneclient.exceptions as KeystoneExceptions
+import neutronclient.common.exceptions as NeutronException
 
 
 class ValidationError(Exception):
@@ -132,10 +133,13 @@ class OpenstackDriver(object):
         self.glance_drv = gl_drv.GlanceDriver(self.sess_drv,
                                               region_name = region,
                                               logger = self.log)
-        
-        self.cinder_drv = ci_drv.CinderDriver(self.sess_drv,
+       
+        try: 
+           self.cinder_drv = ci_drv.CinderDriver(self.sess_drv,
                                               region_name = region,
                                               logger = self.log)
+        except Exception:
+           self.cinder_drv = None
         
         self.ceilo_drv = ce_drv.CeilometerDriver(self.sess_drv,
                                                  region_name = region,
@@ -168,7 +172,10 @@ class OpenstackDriver(object):
         return self._cache['cinder']
     
     def build_resource_cache(self):
-        self.build_network_resource_cache()
+        try:
+            self.build_network_resource_cache()
+        except KeyError:
+            raise
         self.build_nova_resource_cache()
         self.build_cinder_resource_cache()
         self.build_glance_resource_cache()
@@ -212,19 +219,27 @@ class OpenstackDriver(object):
             self.log.info("Discovering management network %s", self._mgmt_network)
             network_list = self._cache_populate(self.neutron_drv.network_get,
                                                 None,
-                                                **{'network_name':self._mgmt_network})
+                                                **{'network_name': self._mgmt_network})
             if network_list:
                 self.neutron_cache['mgmt_net'] = network_list['id']
             else:
-                raise KeyError("Error")
+                msg = "Could not find management network %s" % self._mgmt_network
+                self.log.error(msg)
+                raise KeyError(msg)
 
             
     def _build_glance_image_list(self):
         self.log.info("Discovering images")
         self.glance_cache['images'] = self._cache_populate(self.glance_image_list,
                                                            list())
+
         return self.glance_cache['images']
     
+    def _build_cinder_volume_list(self):
+        self.log.info("Discovering volumes")
+        self.cinder_cache['volumes'] = self._cache_populate(self.cinder_volume_list,
+                                                           list())
+        return self.cinder_cache['volumes']
                                                                  
     def build_nova_resource_cache(self):
         self.log.info("Building nova resource cache")
@@ -234,13 +249,17 @@ class OpenstackDriver(object):
             
     def build_network_resource_cache(self):
         self.log.info("Building network resource cache")
-        self._get_neutron_mgmt_network()
+        try:
+            self._get_neutron_mgmt_network()
+        except KeyError:
+            raise
         self._build_neutron_security_group_list()
         self._build_neutron_subnet_prefix_list()
 
     def build_cinder_resource_cache(self):
-        pass
-
+        self.log.info("Building cinder resource cache")
+        if self.cinder_drv is not None:
+            self._build_cinder_volume_list()
 
     def build_glance_resource_cache(self):
         self.log.info("Building glance resource cache")
@@ -293,27 +312,40 @@ class OpenstackDriver(object):
         else:
             return self._build_glance_image_list()
     
+    @property
+    def _cinder_volume_list(self):
+        if 'volumes' in self.cinder_cache:
+            return self.cinder_cache['volumes']
+        else:
+            return self._build_cinder_volume_list()
+
     def validate_account_creds(self):
         try:
             self.sess_drv.invalidate_auth_token()
             self.sess_drv.auth_token
             self.build_resource_cache()
+        except KeystoneExceptions.Unauthorized as e:
+            self.log.error("Invalid credentials ")
+            raise ValidationError("Invalid Credentials: "+ str(e))
         except KeystoneExceptions.AuthorizationFailure as e:
             self.log.error("Unable to authenticate or validate the existing credentials. Exception: %s", str(e))
             raise ValidationError("Invalid Credentials: "+ str(e))
+        except NeutronException.NotFound as e:
+            self.log.error("Given management network could not be found for Openstack account ")
+            raise ValidationError("Neutron network not found "+ str(e))
         except Exception as e:
             self.log.error("Could not connect to Openstack. Exception: %s", str(e))
             raise ValidationError("Connection Error: "+ str(e))
 
-    
+
     def glance_image_create(self, **kwargs):
-        if not 'disk_format' in kwargs:
+        if 'disk_format' not in kwargs:
             kwargs['disk_format'] = 'qcow2'
-        if not 'container_format' in kwargs:
+        if 'container_format' not in kwargs:
             kwargs['container_format'] = 'bare'
-        if not 'min_disk' in kwargs:
+        if 'min_disk' not in kwargs:
             kwargs['min_disk'] = 0
-        if not 'min_ram' in kwargs:
+        if 'min_ram' not in kwargs:
             kwargs['min_ram'] = 0
         return self.glance_drv.image_create(**kwargs)
 
@@ -356,7 +388,7 @@ class OpenstackDriver(object):
 
     def nova_server_create(self, **kwargs):
         if 'security_groups' not in kwargs:
-            kwargs['security_groups'] = [ s['name'] for s in self._nova_security_groups ]
+            kwargs['security_groups'] = [s['name'] for s in self._nova_security_groups]
         return self.nova_drv.server_create(**kwargs)
 
     def nova_server_add_port(self, server_id, port_id):
@@ -410,6 +442,9 @@ class OpenstackDriver(object):
     def nova_volume_list(self, server_id):
         return self.nova_drv.volume_list(server_id)
 
+    def neutron_extensions_list(self):
+        return self.neutron_drv.extensions_list()
+
     def neutron_network_list(self):
         return self.neutron_drv.network_list()
 
@@ -574,7 +609,7 @@ class OpenstackDriver(object):
     def cinder_volume_list(self):
         return self.cinder_drv.volume_list()
   
-    def cinder_volume_get(self,vol_id):
+    def cinder_volume_get(self, vol_id):
         return self.cinder_drv.volume_get(vol_id)
   
     def cinder_volume_set_metadata(self, volumeid, metadata):