X-Git-Url: https://osm.etsi.org/gitweb/?p=osm%2FRO.git;a=blobdiff_plain;f=RO-VIM-openstack%2Fosm_rovim_openstack%2Fvimconn_openstack.py;h=e392ca7ad5948f99f7c1ec97af01dd4bf7a37c66;hp=b3203189b7d6a26dd9d0f87695fcb4197ebc18b6;hb=1aac33a9ee60884cdcd899ed9d5b47687abe788c;hpb=8a2dda3d4ff0a0c72a6c31232937f4f66a032106 diff --git a/RO-VIM-openstack/osm_rovim_openstack/vimconn_openstack.py b/RO-VIM-openstack/osm_rovim_openstack/vimconn_openstack.py index b3203189..e392ca7a 100644 --- a/RO-VIM-openstack/osm_rovim_openstack/vimconn_openstack.py +++ b/RO-VIM-openstack/osm_rovim_openstack/vimconn_openstack.py @@ -72,8 +72,8 @@ netStatus2manoFormat={'ACTIVE':'ACTIVE','PAUSED':'PAUSED','INACTIVE':'INACTIVE', supportedClassificationTypes = ['legacy_flow_classifier'] #global var to have a timeout creating and deleting volumes -volume_timeout = 600 -server_timeout = 600 +volume_timeout = 1800 +server_timeout = 1800 class SafeDumper(yaml.SafeDumper): @@ -395,17 +395,17 @@ class vimconnector(vimconn.vimconnector): # method before the implemented VIM connectors are called. def _format_exception(self, exception): - '''Transform a keystone, nova, neutron exception into a vimconn exception''' + """Transform a keystone, nova, neutron exception into a vimconn exception discovering the cause""" - message_error = exception.message + message_error = str(exception) if isinstance(exception, (neExceptions.NetworkNotFoundClient, nvExceptions.NotFound, ksExceptions.NotFound, gl1Exceptions.HTTPNotFound)): raise vimconn.vimconnNotFoundException(type(exception).__name__ + ": " + message_error) elif isinstance(exception, (HTTPException, gl1Exceptions.HTTPException, gl1Exceptions.CommunicationError, - ConnectionError, ksExceptions.ConnectionError, neExceptions.ConnectionFailed)): + ConnectionError, ksExceptions.ConnectionError, neExceptions.ConnectionFailed)): raise vimconn.vimconnConnectionException(type(exception).__name__ + ": " + message_error) - elif isinstance(exception, (KeyError, nvExceptions.BadRequest, ksExceptions.BadRequest)): + elif isinstance(exception, (KeyError, nvExceptions.BadRequest, ksExceptions.BadRequest)): raise vimconn.vimconnException(type(exception).__name__ + ": " + message_error) elif isinstance(exception, (nvExceptions.ClientException, ksExceptions.ClientException, neExceptions.NeutronException)): @@ -494,10 +494,10 @@ class vimconnector(vimconn.vimconnector): else: self.keystone.tenants.delete(tenant_id) return tenant_id - except (ksExceptions.ConnectionError, ksExceptions.ClientException, ksExceptions.NotFound, ConnectionError) as e: + except (ksExceptions.ConnectionError, ksExceptions.ClientException, ksExceptions.NotFound, ConnectionError) as e: self._format_exception(e) - def new_network(self,net_name, net_type, ip_profile=None, shared=False, provider_network_profile=None): + def new_network(self, net_name, net_type, ip_profile=None, shared=False, provider_network_profile=None): """Adds a tenant network to VIM Params: 'net_name': name of the network @@ -514,7 +514,8 @@ class vimconnector(vimconn.vimconnector): 'dhcp_start_address': ip_schema, first IP to grant 'dhcp_count': number of IPs to grant. 'shared': if this network can be seen/use by other tenants/organization - 'provider_network_profile': (optional) contains {segmentation-id: vlan, provider-network: vim_netowrk} + 'provider_network_profile': (optional) contains {segmentation-id: vlan, network-type: vlan|vxlan, + physical-network: physnet-label} Returns a tuple with the network identifier and created_items, or raises an exception on error created_items can be None or a dictionary where this method can include key-values that will be passed to the method delete_network. Can be used to store created segments, created l2gw connections, etc. @@ -532,26 +533,52 @@ class vimconnector(vimconn.vimconnector): created_items = {} self._reload_connection() network_dict = {'name': net_name, 'admin_state_up': True} - if net_type=="data" or net_type=="ptp": - if self.config.get('dataplane_physical_net') == None: - raise vimconn.vimconnConflictException("You must provide a 'dataplane_physical_net' at config value before creating sriov network") + if net_type in ("data", "ptp"): + provider_physical_network = None + if provider_network_profile and provider_network_profile.get("physical-network"): + provider_physical_network = provider_network_profile.get("physical-network") + # provider-network must be one of the dataplane_physcial_netowrk if this is a list. If it is string + # or not declared, just ignore the checking + if isinstance(self.config.get('dataplane_physical_net'), (tuple, list)) and \ + provider_physical_network not in self.config['dataplane_physical_net']: + raise vimconn.vimconnConflictException( + "Invalid parameter 'provider-network:physical-network' for network creation. '{}' is not " + "one of the declared list at VIM_config:dataplane_physical_net".format( + provider_physical_network)) + if not provider_physical_network: # use the default dataplane_physical_net + provider_physical_network = self.config.get('dataplane_physical_net') + # if it is non empty list, use the first value. If it is a string use the value directly + if isinstance(provider_physical_network, (tuple, list)) and provider_physical_network: + provider_physical_network = provider_physical_network[0] + + if not provider_physical_network: + raise vimconn.vimconnConflictException("You must provide a 'dataplane_physical_net' at VIM_config " + "for creating underlay networks. or use the NS instantiation" + " parameter provider-network:physical-network for the VLD") + if not self.config.get('multisegment_support'): - network_dict["provider:physical_network"] = self.config[ - 'dataplane_physical_net'] # "physnet_sriov" #TODO physical - network_dict["provider:network_type"] = "vlan" - if vlan!=None: - network_dict["provider:network_type"] = vlan + network_dict["provider:physical_network"] = provider_physical_network + if provider_network_profile and "network-type" in provider_network_profile: + network_dict["provider:network_type"] = provider_network_profile["network-type"] + else: + network_dict["provider:network_type"] = self.config.get('dataplane_network_type','vlan') + if vlan: + network_dict["provider:segmentation_id"] = vlan else: - ###### Multi-segment case ###### + # Multi-segment case segment_list = [] - segment1_dict = {} - segment1_dict["provider:physical_network"] = '' - segment1_dict["provider:network_type"] = 'vxlan' + segment1_dict = { + "provider:physical_network": '', + "provider:network_type": 'vxlan' + } segment_list.append(segment1_dict) - segment2_dict = {} - segment2_dict["provider:physical_network"] = self.config['dataplane_physical_net'] - segment2_dict["provider:network_type"] = "vlan" - if self.config.get('multisegment_vlan_range'): + segment2_dict = { + "provider:physical_network": provider_physical_network, + "provider:network_type": "vlan" + } + if vlan: + segment2_dict["provider:segmentation_id"] = vlan + elif self.config.get('multisegment_vlan_range'): vlanID = self._generate_multisegment_vlanID() segment2_dict["provider:segmentation_id"] = vlanID # else @@ -560,17 +587,13 @@ class vimconnector(vimconn.vimconnector): segment_list.append(segment2_dict) network_dict["segments"] = segment_list - ####### VIO Specific Changes ######### - if self.vim_type == "VIO": - if vlan is not None: - network_dict["provider:segmentation_id"] = vlan - else: - if self.config.get('dataplane_net_vlan_range') is None: - raise vimconn.vimconnConflictException("You must provide "\ - "'dataplane_net_vlan_range' in format [start_ID - end_ID]"\ - "at config value before creating sriov network with vlan tag") - - network_dict["provider:segmentation_id"] = self._generate_vlanID() + # VIO Specific Changes. It needs a concrete VLAN + if self.vim_type == "VIO" and vlan is None: + if self.config.get('dataplane_net_vlan_range') is None: + raise vimconn.vimconnConflictException( + "You must provide 'dataplane_net_vlan_range' in format [start_ID - end_ID] at VIM_config " + "for creating underlay networks") + network_dict["provider:segmentation_id"] = self._generate_vlanID() network_dict["shared"] = shared if self.config.get("disable_network_port_security"): @@ -1237,13 +1260,6 @@ class vimconnector(vimconn.vimconnector): port_dict["provider_security_groups"]=[] port_dict["security_groups"]=[] else: # For PT PCI-PASSTHROUGH - # VIO specific Changes - # Current VIO release does not support port with type 'direct-physical' - # So no need to create virtual port in case of PCI-device. - # Will update port_dict code when support gets added in next VIO release - if self.vim_type == "VIO": - raise vimconn.vimconnNotSupportedException( - "Current VIO release does not support full passthrough (PT)") # if "vpci" in net: # if "PF" not in metadata_vpci: # metadata_vpci["PF"]=[] @@ -1642,7 +1658,7 @@ class vimconnector(vimconn.vimconnector): #if network is of type vlan and port is of type direct (sr-iov) then set vlan id network = self.neutron.show_network(port["network_id"]) if network['network'].get('provider:network_type') == 'vlan' and \ - port.get("binding:vnic_type") == "direct": + port.get("binding:vnic_type") in ("direct", "direct-physical"): interface["vlan"] = network['network'].get('provider:segmentation_id') ips=[] #look for floating ip address @@ -1784,7 +1800,7 @@ class vimconnector(vimconn.vimconnector): Returns: vlanID """ - #Get used VLAN IDs + # Get used VLAN IDs usedVlanIDs = [] networks = self.get_network_list() for net in networks: @@ -1796,17 +1812,17 @@ class vimconnector(vimconn.vimconnector): usedVlanIDs.append(segment.get('provider:segmentation_id')) used_vlanIDs = set(usedVlanIDs) - #find unused VLAN ID + # find unused VLAN ID for vlanID_range in self.config.get('multisegment_vlan_range'): try: - start_vlanid , end_vlanid = map(int, vlanID_range.replace(" ", "").split("-")) + start_vlanid, end_vlanid = map(int, vlanID_range.replace(" ", "").split("-")) for vlanID in range(start_vlanid, end_vlanid + 1): if vlanID not in used_vlanIDs: return vlanID except Exception as exp: raise vimconn.vimconnException("Exception {} occurred while generating VLAN ID.".format(exp)) else: - raise vimconn.vimconnConflictException("Unable to create the VLAN segment."\ + raise vimconn.vimconnConflictException("Unable to create the VLAN segment." " All VLAN IDs {} are in use.".format(self.config.get('multisegment_vlan_range')))