X-Git-Url: https://osm.etsi.org/gitweb/?p=osm%2FSO.git;a=blobdiff_plain;f=rwcal%2Fplugins%2Fvala%2Frwcal_openstack%2Frwcal_openstack.py;h=eac0d6c9973c7209598959d5c35623b72cafaaf0;hp=52bd574c701a391f486c470a48e274955462e242;hb=68aaf06223982495974be2149c8a120d6a361b98;hpb=be150626c38b6a4b70cb3cc69eb273cd0648556a diff --git a/rwcal/plugins/vala/rwcal_openstack/rwcal_openstack.py b/rwcal/plugins/vala/rwcal_openstack/rwcal_openstack.py index 52bd574c..eac0d6c9 100644 --- a/rwcal/plugins/vala/rwcal_openstack/rwcal_openstack.py +++ b/rwcal/plugins/vala/rwcal_openstack/rwcal_openstack.py @@ -23,7 +23,6 @@ import tempfile import yaml import gi -gi.require_version('RwSdn', '1.0') gi.require_version('RwCal', '1.0') gi.require_version('RwcalYang', '1.0') @@ -40,8 +39,6 @@ import keystoneclient.exceptions as KeystoneExceptions from gi.repository import ( GObject, RwCal, - RwSdn, # Vala package - RwsdnYang, RwTypes, RwcalYang) @@ -96,18 +93,29 @@ class RwcalOpenstackPlugin(GObject.Object, RwCal.Cloud): def __init__(self): GObject.Object.__init__(self) - self._driver_class = openstack_drv.OpenstackDriver self.log = logging.getLogger('rwcal.openstack.%s' % RwcalOpenstackPlugin.instance_num) self.log.setLevel(logging.DEBUG) self._rwlog_handler = None self._account_drivers = dict() RwcalOpenstackPlugin.instance_num += 1 + def _get_account_key(self, account): + key = str() + for f in account.openstack.fields: + try: + key+= str(getattr(account.openstack, f)) + except: + pass + key += account.name + return key + def _use_driver(self, account): if self._rwlog_handler is None: raise UninitializedPluginError("Must call init() in CAL plugin before use.") - if account.name not in self._account_drivers: + acct_key = self._get_account_key(account) + + if acct_key not in self._account_drivers: self.log.debug("Creating OpenstackDriver") kwargs = dict(username = account.openstack.key, password = account.openstack.secret, @@ -122,7 +130,7 @@ class RwcalOpenstackPlugin(GObject.Object, RwCal.Cloud): self._account_drivers[account.name] = drv return drv.driver else: - return self._account_drivers[account.name].driver + return self._account_drivers[acct_key].driver @rwstatus @@ -584,12 +592,17 @@ class RwcalOpenstackPlugin(GObject.Object, RwCal.Cloud): flavor id """ drv = self._use_driver(account) - return drv.nova_flavor_create(name = flavor.name, - ram = flavor.vm_flavor.memory_mb, - vcpus = flavor.vm_flavor.vcpu_count, - disk = flavor.vm_flavor.storage_gb, - epa_specs = drv.utils.flavor.get_extra_specs(flavor)) - + try: + flavor_id = drv.nova_flavor_create(name = flavor.name, + ram = flavor.vm_flavor.memory_mb, + vcpus = flavor.vm_flavor.vcpu_count, + disk = flavor.vm_flavor.storage_gb, + epa_specs = drv.utils.flavor.get_extra_specs(flavor)) + except Exception as e: + self.log.error("Encountered exceptions during Flavor creation. Exception: %s", str(e)) + raise + + return flavor_id @rwstatus def do_delete_flavor(self, account, flavor_id): @@ -600,7 +613,11 @@ class RwcalOpenstackPlugin(GObject.Object, RwCal.Cloud): flavor_id - id flavor of the VM """ drv = self._use_driver(account) - drv.nova_flavor_delete(flavor_id) + try: + drv.nova_flavor_delete(flavor_id) + except Exception as e: + self.log.error("Encountered exceptions during Flavor deletion. Exception: %s", str(e)) + raise @rwstatus(ret_on_failure=[[]]) @@ -615,9 +632,14 @@ class RwcalOpenstackPlugin(GObject.Object, RwCal.Cloud): """ response = RwcalYang.VimResources() drv = self._use_driver(account) - flavors = drv.nova_flavor_list() - for flv in flavors: - response.flavorinfo_list.append(drv.utils.flavor.parse_flavor_info(flv)) + try: + flavors = drv.nova_flavor_list() + for flv in flavors: + response.flavorinfo_list.append(drv.utils.flavor.parse_flavor_info(flv)) + except Exception as e: + self.log.error("Encountered exceptions during get-flavor-list. Exception: %s", str(e)) + raise + return response @rwstatus(ret_on_failure=[None]) @@ -632,8 +654,14 @@ class RwcalOpenstackPlugin(GObject.Object, RwCal.Cloud): Flavor info item """ drv = self._use_driver(account) - flavor = drv.nova_flavor_get(id) - return drv.utils.flavor.parse_flavor_info(flavor) + try: + flavor = drv.nova_flavor_get(id) + response = drv.utils.flavor.parse_flavor_info(flavor) + except Exception as e: + self.log.error("Encountered exceptions during get-flavor. Exception: %s", str(e)) + raise + + return response def _fill_network_info(self, network_info, account): @@ -904,12 +932,12 @@ class RwcalOpenstackPlugin(GObject.Object, RwCal.Cloud): try: kwargs = drv.utils.network.make_virtual_link_args(link_params) network_id = drv.neutron_network_create(**kwargs) + kwargs = drv.utils.network.make_subnet_args(link_params, network_id) + drv.neutron_subnet_create(**kwargs) except Exception as e: self.log.error("Encountered exceptions during network creation. Exception: %s", str(e)) raise - kwargs = drv.utils.network.make_subnet_args(link_params, network_id) - drv.neutron_subnet_create(**kwargs) return network_id @@ -1142,176 +1170,3 @@ class RwcalOpenstackPlugin(GObject.Object, RwCal.Cloud): return vnf_resources -class SdnOpenstackPlugin(GObject.Object, RwSdn.Topology): - instance_num = 1 - def __init__(self): - GObject.Object.__init__(self) - self._driver_class = openstack_drv.OpenstackDriver - self.log = logging.getLogger('rwsdn.openstack.%s' % SdnOpenstackPlugin.instance_num) - self.log.setLevel(logging.DEBUG) - - self._rwlog_handler = None - SdnOpenstackPlugin.instance_num += 1 - - @contextlib.contextmanager - def _use_driver(self, account): - if self._rwlog_handler is None: - raise UninitializedPluginError("Must call init() in CAL plugin before use.") - - with rwlogger.rwlog_root_handler(self._rwlog_handler): - try: - drv = self._driver_class(username = account.openstack.key, - password = account.openstack.secret, - auth_url = account.openstack.auth_url, - tenant_name = account.openstack.tenant, - mgmt_network = account.openstack.mgmt_network, - cert_validate = account.openstack.cert_validate ) - except Exception as e: - self.log.error("SdnOpenstackPlugin: OpenstackDriver init failed. Exception: %s" %(str(e))) - raise - - yield drv - - @rwstatus - def do_init(self, rwlog_ctx): - self._rwlog_handler = rwlogger.RwLogger( - category="rw-cal-log", - subcategory="openstack", - log_hdl=rwlog_ctx, - ) - self.log.addHandler(self._rwlog_handler) - self.log.propagate = False - - @rwstatus(ret_on_failure=[None]) - def do_validate_sdn_creds(self, account): - """ - Validates the sdn account credentials for the specified account. - Performs an access to the resources using Keystone API. If creds - are not valid, returns an error code & reason string - - @param account - a SDN account - - Returns: - Validation Code and Details String - """ - status = RwsdnYang.SdnConnectionStatus() - try: - with self._use_driver(account) as drv: - drv.validate_account_creds() - - except openstack_drv.ValidationError as e: - self.log.error("SdnOpenstackPlugin: OpenstackDriver credential validation failed. Exception: %s", str(e)) - status.status = "failure" - status.details = "Invalid Credentials: %s" % str(e) - - except Exception as e: - msg = "SdnOpenstackPlugin: OpenstackDriver connection failed. Exception: %s" %(str(e)) - self.log.error(msg) - status.status = "failure" - status.details = msg - - else: - status.status = "success" - status.details = "Connection was successful" - - return status - - @rwstatus(ret_on_failure=[""]) - def do_create_vnffg_chain(self, account,vnffg): - """ - Creates Service Function chain in ODL - - @param account - a SDN account - - """ - self.log.debug('Received Create VNFFG chain for account {}, chain {}'.format(account,vnffg)) - with self._use_driver(account) as drv: - port_list = list() - vnf_chain_list = sorted(vnffg.vnf_chain_path, key = lambda x: x.order) - prev_vm_id = None - for path in vnf_chain_list: - if prev_vm_id and path.vnfr_ids[0].vdu_list[0].vm_id == prev_vm_id: - prev_entry = port_list.pop() - port_list.append((prev_entry[0],path.vnfr_ids[0].vdu_list[0].port_id)) - prev_vm_id = None - else: - prev_vm_id = path.vnfr_ids[0].vdu_list[0].vm_id - port_list.append((path.vnfr_ids[0].vdu_list[0].port_id,path.vnfr_ids[0].vdu_list[0].port_id)) - vnffg_id = drv.create_port_chain(vnffg.name,port_list) - return vnffg_id - - @rwstatus - def do_terminate_vnffg_chain(self, account,vnffg_id): - """ - Terminate Service Function chain in ODL - - @param account - a SDN account - """ - self.log.debug('Received terminate VNFFG chain for id %s ', vnffg_id) - with self._use_driver(account) as drv: - drv.delete_port_chain(vnffg_id) - - @rwstatus(ret_on_failure=[None]) - def do_create_vnffg_classifier(self, account, vnffg_classifier): - """ - Add VNFFG Classifier - - @param account - a SDN account - """ - self.log.debug('Received Create VNFFG classifier for account {}, classifier {}'.format(account,vnffg_classifier)) - protocol_map = {1:'ICMP',6:'TCP',17:'UDP'} - flow_classifier_list = list() - with self._use_driver(account) as drv: - for rule in vnffg_classifier.match_attributes: - classifier_name = vnffg_classifier.name + '_' + rule.name - flow_dict = {} - for field, value in rule.as_dict().items(): - if field == 'ip_proto': - flow_dict['protocol'] = protocol_map.get(value,None) - elif field == 'source_ip_address': - flow_dict['source_ip_prefix'] = value - elif field == 'destination_ip_address': - flow_dict['destination_ip_prefix'] = value - elif field == 'source_port': - flow_dict['source_port_range_min'] = value - flow_dict['source_port_range_max'] = value - elif field == 'destination_port': - flow_dict['destination_port_range_min'] = value - flow_dict['destination_port_range_max'] = value - if vnffg_classifier.has_field('port_id'): - flow_dict['logical_source_port'] = vnffg_classifier.port_id - flow_classifier_id = drv.create_flow_classifer(classifier_name, flow_dict) - flow_classifier_list.append(flow_classifier_id) - drv.update_port_chain(vnffg_classifier.rsp_id,flow_classifier_list) - return flow_classifier_list - - @rwstatus(ret_on_failure=[None]) - def do_terminate_vnffg_classifier(self, account, vnffg_classifier_list): - """ - Add VNFFG Classifier - - @param account - a SDN account - """ - self.log.debug('Received terminate VNFFG classifier for id %s ', vnffg_classifier_list) - with self._use_driver(account) as drv: - for classifier_id in vnffg_classifier_list: - drv.delete_flow_classifier(classifier_id) - - @rwstatus(ret_on_failure=[None]) - def do_get_vnffg_rendered_paths(self, account): - """ - Get ODL Rendered Service Path List (SFC) - - @param account - a SDN account - """ - self.log.debug('Received get VNFFG rendered path for account %s ', account) - vnffg_rsps = RwsdnYang.VNFFGRenderedPaths() - with self._use_driver(account) as drv: - port_chain_list = drv.get_port_chain_list() - for port_chain in port_chain_list: - #rsp = vnffg_rsps.vnffg_rendered_path.add() - #rsp.name = port_chain['name'] - pass - return vnffg_rsps - -