X-Git-Url: https://osm.etsi.org/gitweb/?p=osm%2FRO.git;a=blobdiff_plain;f=osm_ro%2Fvim_thread.py;h=0074dfe91888086e2e42c7abf448c5386b7b0a8c;hp=373fe7bfff7e0555e6ae0f6faecc86d0de36b7b0;hb=5461675ac6705ee92916ed741da1914bd2162482;hpb=99314908f1e270c682b3402491b227db71d59545 diff --git a/osm_ro/vim_thread.py b/osm_ro/vim_thread.py index 373fe7bf..0074dfe9 100644 --- a/osm_ro/vim_thread.py +++ b/osm_ro/vim_thread.py @@ -46,6 +46,8 @@ def is_task_id(task_id): class vim_thread(threading.Thread): + REFRESH_BUILD = 5 # 5 seconds + REFRESH_ACTIVE = 60 # 1 minute def __init__(self, vimconn, task_lock, name=None, datacenter_name=None, datacenter_tenant_id=None, db=None, db_lock=None, ovim=None): @@ -142,8 +144,9 @@ class vim_thread(threading.Thread): #delete old port if task_interface.get("sdn_port_id"): try: - self.ovim.delete_port(task_interface["sdn_port_id"]) - task_interface["sdn_port_id"] = None + with self.db_lock: + self.ovim.delete_port(task_interface["sdn_port_id"]) + task_interface["sdn_port_id"] = None except ovimException as e: self.logger.error("ovimException deleting external_port={} ".format( task_interface["sdn_port_id"]) + str(e), exc_info=True) @@ -161,7 +164,7 @@ class vim_thread(threading.Thread): FROM="instance_interfaces as ii left join instance_nets as ine on " "ii.instance_net_id=ine.uuid left join instance_vms as iv on " "ii.instance_vm_id=iv.uuid", - SELECT=("ii.uuid as iface_id", "ine.uuid as net_id", "iv.uuid as vm_id", "sdn_net_id"), + SELECT=("ii.uuid as iface_id", "ine.uuid as net_id", "iv.uuid as vm_id", "sdn_net_id", "vim_net_id"), WHERE=where_) if len(db_ifaces)>1: self.logger.critical("Refresing interfaces. " @@ -172,20 +175,33 @@ class vim_thread(threading.Thread): continue else: db_iface = db_ifaces[0] + # If there is no sdn_net_id, check if it is because an already created vim network is being used + # in that case, the sdn_net_id will be in that entry of the instance_nets table + if not db_iface.get("sdn_net_id"): + with self.db_lock: + result = self.db.get_rows( + SELECT=('sdn_net_id',), FROM='instance_nets', + WHERE={'vim_net_id': db_iface.get("vim_net_id"), + 'instance_scenario_id': None, + 'datacenter_tenant_id': self.datacenter_tenant_id}) + if len(result) == 1: + db_iface["sdn_net_id"] = result[0]['sdn_net_id'] + if db_iface.get("sdn_net_id") and interface.get("compute_node") and interface.get("pci"): sdn_net_id = db_iface["sdn_net_id"] sdn_port_name = sdn_net_id + "." + db_iface["vm_id"] sdn_port_name = sdn_port_name[:63] try: - sdn_port_id = self.ovim.new_external_port( - {"compute_node": interface["compute_node"], - "pci": interface["pci"], - "vlan": interface.get("vlan"), - "net_id": sdn_net_id, - "region": self.vim["config"]["datacenter_id"], - "name": sdn_port_name, - "mac": interface.get("mac_address")}) - interface["sdn_port_id"] = sdn_port_id + with self.db_lock: + sdn_port_id = self.ovim.new_external_port( + {"compute_node": interface["compute_node"], + "pci": interface["pci"], + "vlan": interface.get("vlan"), + "net_id": sdn_net_id, + "region": self.vim["config"]["datacenter_id"], + "name": sdn_port_name, + "mac": interface.get("mac_address")}) + interface["sdn_port_id"] = sdn_port_id except (ovimException, Exception) as e: self.logger.error( "ovimException creating new_external_port compute_node={} " \ @@ -204,12 +220,12 @@ class vim_thread(threading.Thread): task["vim_info"] = vim_info if task["vim_info"]["status"] == "BUILD": - self._insert_refresh(task, now+5) # 5seconds + self._insert_refresh(task, now + self.REFRESH_BUILD) else: - self._insert_refresh(task, now+300) # 5minutes + self._insert_refresh(task, now + self.REFRESH_ACTIVE) except vimconn.vimconnException as e: self.logger.error("vimconnException Exception when trying to refresh vms " + str(e)) - self._insert_refresh(task, now + 300) # 5minutes + self._insert_refresh(task, now + self.REFRESH_ACTIVE) if net_to_refresh_list: try: @@ -238,7 +254,8 @@ class vim_thread(threading.Thread): if db_net.get("sdn_net_id"): # get ovim status try: - sdn_net = self.ovim.show_network(db_net["sdn_net_id"]) + with self.db_lock: + sdn_net = self.ovim.show_network(db_net["sdn_net_id"]) if sdn_net["status"] == "ERROR": if not vim_info.get("error_msg"): vim_info["error_msg"] = sdn_net["error_msg"] @@ -271,12 +288,12 @@ class vim_thread(threading.Thread): task["vim_info"] = vim_info if task["vim_info"]["status"] == "BUILD": - self._insert_refresh(task, now+5) # 5seconds + self._insert_refresh(task, now + self.REFRESH_BUILD) else: - self._insert_refresh(task, now+300) # 5minutes + self._insert_refresh(task, now + self.REFRESH_ACTIVE) except vimconn.vimconnException as e: self.logger.error("vimconnException Exception when trying to refresh nets " + str(e)) - self._insert_refresh(task, now + 300) # 5minutes + self._insert_refresh(task, now + self.REFRESH_ACTIVE) if not items_to_refresh: time.sleep(1) @@ -402,7 +419,7 @@ class vim_thread(threading.Thread): sdn_net_id = None sdn_controller = self.vim.config.get('sdn-controller') if sdn_controller and (net_type == "data" or net_type == "ptp"): - network = {"name": net_name, "type": net_type} + network = {"name": net_name, "type": net_type, "region": self.vim["config"]["datacenter_id"]} vim_net = self.vim.get_network(net_id) if vim_net.get('encapsulation') != 'vlan': @@ -411,7 +428,8 @@ class vim_thread(threading.Thread): net_name, net_type, vim_net['encapsulation'])) network["vlan"] = vim_net.get('segmentation_id') try: - sdn_net_id = self.ovim.new_network(network) + with self.db_lock: + sdn_net_id = self.ovim.new_network(network) except (ovimException, Exception) as e: self.logger.error("task=%s cannot create SDN network vim_net_id=%s input='%s' ovimException='%s'", str(task_id), net_id, str(network), str(e)) @@ -521,7 +539,8 @@ class vim_thread(threading.Thread): for iface in interfaces: if iface.get("sdn_port_id"): try: - self.ovim.delete_port(iface["sdn_port_id"]) + with self.db_lock: + self.ovim.delete_port(iface["sdn_port_id"]) except ovimException as e: self.logger.error("ovimException deleting external_port={} at VM vim_id={} deletion ".format( iface["sdn_port_id"], vm_id) + str(e), exc_info=True) @@ -549,6 +568,22 @@ class vim_thread(threading.Thread): self._remove_refresh("get-net", net_id) result = self.vim.delete_network(net_id) if sdn_net_id: + # Delete any attached port to this sdn network + # At this point, there will be ports associated to this network in case it was manually done using 'openmano vim-net-sdn-attach' + try: + with self.db_lock: + port_list = self.ovim.get_ports(columns={'uuid'}, filter={'name': 'external_port', 'net_id': sdn_net_id}) + except ovimException as e: + raise vimconn.vimconnException( + "ovimException obtaining external ports for net {}. ".format(sdn_net_id) + str(e)) + + for port in port_list: + try: + with self.db_lock: + self.ovim.delete_port(port['uuid']) + except ovimException as e: + raise vimconn.vimconnException( + "ovimException deleting port {} for net {}. ".format(port['uuid'], sdn_net_id) + str(e)) with self.db_lock: self.ovim.delete_network(sdn_net_id) return True, result