X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=RO%2Fosm_ro%2Fvim_thread.py;h=3039bab5901132102173c5abf47dea055353d711;hb=refs%2Fchanges%2F12%2F9012%2F1;hp=d0b8dc91860095cb83267d9bfab1467d69323e0a;hpb=69647795675df7357a9aeddaa5aba15c6f92b065;p=osm%2FRO.git diff --git a/RO/osm_ro/vim_thread.py b/RO/osm_ro/vim_thread.py index d0b8dc91..3039bab5 100644 --- a/RO/osm_ro/vim_thread.py +++ b/RO/osm_ro/vim_thread.py @@ -126,7 +126,7 @@ class vim_thread(threading.Thread): self.error_status = None self.wim_account_id = wim_account_id self.datacenter_tenant_id = datacenter_tenant_id - self.port_mapping = None + self.port_mappings = None if self.wim_account_id: self.target_k = "wim_account_id" self.target_v = self.wim_account_id @@ -320,6 +320,8 @@ class vim_thread(threading.Thread): copy_to["sdn_net_id"] = copy_from["sdn_net_id"] if copy_from.get("interfaces"): copy_to["interfaces"] = copy_from["interfaces"] + if copy_from.get("sdn-ports"): + copy_to["sdn-ports"] = copy_from["sdn-ports"] if copy_from.get("created_items"): if not copy_to.get("created_items"): copy_to["created_items"] = {} @@ -1138,21 +1140,21 @@ class vim_thread(threading.Thread): # look for ports sdn_ports = [] pending_ports = 0 + vlan_used = None ports = self.db.get_rows(FROM='instance_interfaces', WHERE={'instance_wim_net_id': task["item_id"]}) sdn_need_update = False - if len(ports) != len(connected_ports): - sdn_need_update = True for port in ports: + vlan_used = port.get("vlan") or vlan_used # TODO. Do not connect if already done if port.get("compute_node") and port.get("pci"): - for map in self.port_mappings: - if map.get("device_id") == port["compute_node"] and \ - map.get("device_interface_id") == port["pci"]: + for pmap in self.port_mappings: + if pmap.get("device_id") == port["compute_node"] and \ + pmap.get("device_interface_id") == port["pci"]: break else: if self.sdnconn_config.get("mapping_not_needed"): - map = { + pmap = { "service_endpoint_id": "{}:{}".format(port["compute_node"], port["pci"]), "service_endpoint_encapsulation_info": { "vlan": port["vlan"], @@ -1162,25 +1164,25 @@ class vim_thread(threading.Thread): } } else: - map = None + pmap = None error_list.append("Port mapping not found for compute_node={} pci={}".format( port["compute_node"], port["pci"])) - if map: - if port["uuid"] not in connected_ports or port["modified_at"] > last_update: + if pmap: + if port["modified_at"] > last_update: sdn_need_update = True new_connected_ports.append(port["uuid"]) sdn_ports.append({ - "service_endpoint_id": map["service_endpoint_id"], + "service_endpoint_id": pmap["service_endpoint_id"], "service_endpoint_encapsulation_type": "dot1q" if port["model"] == "SR-IOV" else None, "service_endpoint_encapsulation_info": { "vlan": port["vlan"], "mac": port["mac_address"], - "device_id": map.get("device_id"), - "device_interface_id": map.get("device_interface_id"), - "switch_dpid": map.get("switch_dpid"), - "switch_port": map.get("switch_port"), - "service_mapping_info": map.get("service_mapping_info"), + "device_id": pmap.get("device_id"), + "device_interface_id": pmap.get("device_interface_id"), + "switch_dpid": pmap.get("switch_dpid"), + "switch_port": pmap.get("switch_port"), + "service_mapping_info": pmap.get("service_mapping_info"), } }) @@ -1189,24 +1191,44 @@ class vim_thread(threading.Thread): if pending_ports: error_list.append("Waiting for getting interfaces location from VIM. Obtained '{}' of {}" .format(len(ports)-pending_ports, len(ports))) + + # connect external ports + for index, external_port in enumerate(task["extra"].get("sdn-ports") or ()): + external_port_id = external_port.get("service_endpoint_id") or str(index) + sdn_ports.append({ + "service_endpoint_id": external_port_id, + "service_endpoint_encapsulation_type": external_port.get("service_endpoint_encapsulation_type", + "dot1q"), + "service_endpoint_encapsulation_info": { + "vlan": external_port.get("vlan") or vlan_used, + "mac": external_port.get("mac_address"), + "device_id": external_port.get("device_id"), + "device_interface_id": external_port.get("device_interface_id"), + "switch_dpid": external_port.get("switch_dpid") or external_port.get("switch_id"), + "switch_port": external_port.get("switch_port"), + "service_mapping_info": external_port.get("service_mapping_info"), + }}) + new_connected_ports.append(external_port_id) + # if there are more ports to connect or they have been modified, call create/update - if sdn_need_update and len(sdn_ports) >= 2: - if not wimconn_net_id: - if params[0] == "data": - net_type = "ELAN" - elif params[0] == "ptp": - net_type = "ELINE" - else: - net_type = "L3" + try: + if (set(connected_ports) != set(new_connected_ports) or sdn_need_update) and len(sdn_ports) >= 2: + last_update = time.time() + if not wimconn_net_id: + if params[0] == "data": + net_type = "ELAN" + elif params[0] == "ptp": + net_type = "ELINE" + else: + net_type = "L3" - wimconn_net_id, created_items = self.sdnconnector.create_connectivity_service(net_type, sdn_ports) - else: - created_items = self.sdnconnector.edit_connectivity_service(wimconn_net_id, conn_info=created_items, - connection_points=sdn_ports) - last_update = time.time() - connected_ports = new_connected_ports - elif wimconn_net_id: - try: + wimconn_net_id, created_items = self.sdnconnector.create_connectivity_service( + net_type, sdn_ports) + else: + created_items = self.sdnconnector.edit_connectivity_service( + wimconn_net_id, conn_info=created_items, connection_points=sdn_ports) + connected_ports = new_connected_ports + elif wimconn_net_id: wim_status_dict = self.sdnconnector.get_connectivity_service_status(wimconn_net_id, conn_info=created_items) sdn_status = wim_status_dict["sdn_status"] @@ -1214,8 +1236,8 @@ class vim_thread(threading.Thread): error_list.append(wim_status_dict.get("error_msg")) if wim_status_dict.get("sdn_info"): sdn_info = str(wim_status_dict.get("sdn_info")) - except Exception as e: - self._proccess_sdn_exception(e) + except Exception as e: + self._proccess_sdn_exception(e) task["status"] = "DONE" task["extra"]["vim_info"] = {} @@ -1237,6 +1259,7 @@ class vim_thread(threading.Thread): # task["extra"]["sdn_net_id"] = sdn_net_id instance_element_update = {"wim_internal_id": wimconn_net_id, "status": "WIM_ERROR", "error_msg": task["error_msg"]} + if sdn_info: instance_element_update["wim_info"] = sdn_info return instance_element_update