X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=rwcal%2Fplugins%2Fvala%2Frwcal_openstack%2Frift%2Frwcal%2Fopenstack%2Fopenstack_drv.py;h=d6831a73e658b9b6bcee522308e24f6dd621cadd;hb=25df0a991a593e248a6a825193009d307b977169;hp=500f10cb7fbdf7a2f595a7e3ffbd945da7d8ca53;hpb=0f4d8618e4d273cc93848b41fa1492599f038c74;p=osm%2FSO.git diff --git a/rwcal/plugins/vala/rwcal_openstack/rift/rwcal/openstack/openstack_drv.py b/rwcal/plugins/vala/rwcal_openstack/rift/rwcal/openstack/openstack_drv.py index 500f10cb..d6831a73 100644 --- a/rwcal/plugins/vala/rwcal_openstack/rift/rwcal/openstack/openstack_drv.py +++ b/rwcal/plugins/vala/rwcal_openstack/rift/rwcal/openstack/openstack_drv.py @@ -25,11 +25,11 @@ from . import neutron as nt_drv from . import glance as gl_drv from . import ceilometer as ce_drv from . import cinder as ci_drv -from . import portchain as port_drv from . import utils as drv_utils # Exceptions import keystoneclient.exceptions as KeystoneExceptions +import neutronclient.common.exceptions as NeutronException class ValidationError(Exception): @@ -133,18 +133,18 @@ 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, logger = self.log) - self.portchain_drv = port_drv.L2PortChainDriver(self.sess_drv, - self.neutron_drv, - logger = self.log) self.utils = DriverUtilities(self) self._mgmt_network = mgmt_network @@ -172,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() @@ -216,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") @@ -238,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") @@ -297,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) @@ -360,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): @@ -414,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() @@ -575,87 +606,10 @@ class OpenstackDriver(object): def ceilo_alarm_delete(self, alarm_id): self.ceilo_drv.client.alarms.delete(alarm_id) - def create_port_chain(self,name,port_lists): - "Create port chain" - #Create port pair - ppgrp_list = list() - for index,port_pair in enumerate(port_lists): - ppair_list = list() - ingress_port,egress_port = port_pair - #Disable security group and port security for the port - self.neutron_drv.port_update(ingress_port,no_security_groups=True,port_security_enabled=False) - if ingress_port != egress_port: - self.neutron_drv.port_update(egress_port,no_security_groups=True,port_security_enabled=False) - - ppair_id = self.portchain_drv.create_port_pair(name+'ppair'+str(index),ingress_port,egress_port) - ppair_list.append(ppair_id) - # Create port pair group - ppgrp_id = self.portchain_drv.create_port_pair_group(name+'_ppgrp_'+str(index),ppair_list) - ppgrp_list.append(ppgrp_id) - #Create port chain - port_chain_id = self.portchain_drv.create_port_chain(name,ppgrp_list) - return port_chain_id - - def delete_port_chain(self,port_chain_id): - "Delete port chain" - try: - result = self.portchain_drv.get_port_chain(port_chain_id) - port_chain = result.json() - self.log.debug("Port chain result is %s", port_chain) - port_pair_groups = port_chain["port_chain"]["port_pair_groups"] - self.portchain_drv.delete_port_chain(port_chain_id) - - # Get port pairs and delete port pair groups - port_pairs = list() - self.log.debug("Port pair groups during delete is %s", port_pair_groups) - for port_pair_group_id in port_pair_groups: - result = self.portchain_drv.get_port_pair_group(port_pair_group_id) - port_pair_group = result.json() - self.log.debug("Port pair group result is %s", port_pair_group) - port_pairs.extend(port_pair_group["port_pair_group"]["port_pairs"]) - self.portchain_drv.delete_port_pair_group(port_pair_group_id) - - self.log.debug("Port pairs during delete is %s",port_pairs) - - for port_pair_id in port_pairs: - self.portchain_drv.delete_port_pair(port_pair_id) - pass - except Exception as e: - self.log.error("Error while delete port chain with id %s, exception %s", port_chain_id,str(e)) - - def update_port_chain(self,port_chain_id,flow_classifier_list): - result = self.portchain_drv.get_port_chain(port_chain_id) - result.raise_for_status() - port_chain = result.json()['port_chain'] - new_flow_classifier_list = list() - if port_chain and port_chain['flow_classifiers']: - new_flow_classifier_list.extend(port_chain['flow_classifiers']) - new_flow_classifier_list.extend(flow_classifier_list) - port_chain_id = self.portchain_drv.update_port_chain(port_chain['id'],flow_classifiers=new_flow_classifier_list) - return port_chain_id - - def create_flow_classifer(self,classifier_name,classifier_dict): - "Create flow classifier" - flow_classifier_id = self.portchain_drv.create_flow_classifier(classifier_name,classifier_dict) - return flow_classifier_id - - def delete_flow_classifier(self,classifier_id): - "Create flow classifier" - try: - self.portchain_drv.delete_flow_classifier(classifier_id) - except Exception as e: - self.log.error("Error while deleting flow classifier with id %s, exception %s", classifier_id,str(e)) - - def get_port_chain_list(self): - result = self.portchain_drv.get_port_chain_list() - port_chain_list = result.json() - if 'port_chains' in port_chain_list: - return port_chain_list['port_chains'] - 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):