+ def terminate(self, task):
+ return True, None
+
+ def _format_vim_error_msg(self, error_text, len=1024):
+ if error_text and len(error_text) >= len:
+ return error_text[:len//2-3] + " ... " + error_text[-len//2+3:]
+ return error_text
+
+ def new_net(self, task):
+ try:
+ task_id = task["id"]
+ params = task["params"]
+ net_id = self.vim.new_network(*params)
+
+ net_name = params[0]
+ net_type = params[1]
+
+ network = 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}
+
+ vim_net = self.vim.get_network(net_id)
+ if vim_net.get('encapsulation') != 'vlan':
+ raise vimconn.vimconnException(
+ "net '{}' defined as type '{}' has not vlan encapsulation '{}'".format(
+ net_name, net_type, vim_net['encapsulation']))
+ network["vlan"] = vim_net.get('segmentation_id')
+ sdn_net_id = None
+ try:
+ 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))
+ with self.db_lock:
+ self.db.update_rows("instance_nets", UPDATE={"vim_net_id": net_id, "sdn_net_id": sdn_net_id},
+ WHERE={"vim_net_id": task_id})
+ new_refresh_task = {"status": "enqueued",
+ "id": task_id,
+ "name": "get-net",
+ "vim_id": net_id,
+ "vim_info": {} }
+ self._insert_refresh(new_refresh_task, time.time())
+ return True, net_id
+ except db_base_Exception as e:
+ self.logger.error("Error updating database %s", str(e))
+ return True, net_id
+ except vimconn.vimconnException as e:
+ self.logger.error("Error creating NET, task=%s: %s", str(task_id), str(e))
+ try:
+ with self.db_lock:
+ self.db.update_rows("instance_nets",
+ UPDATE={"error_msg": self._format_vim_error_msg(str(e)), "status": "VIM_ERROR"},
+ WHERE={"vim_net_id": task_id})
+ except db_base_Exception as e:
+ self.logger.error("Error updating database %s", str(e))
+ return False, str(e)
+ #except ovimException as e:
+ # self.logger.error("Error creating NET in ovim, task=%s: %s", str(task_id), str(e))
+ # return False, str(e)
+
+ def new_vm(self, task):
+ try:
+ params = task["params"]
+ task_id = task["id"]
+ depends = task.get("depends")
+ net_list = params[5]
+ error_text = ""
+ for net in net_list:
+ if "net_id" in net and is_task_id(net["net_id"]): # change task_id into network_id
+ try:
+ task_net = depends[net["net_id"]]
+ with self.task_lock:
+ if task_net["status"] == "error":
+ error_text = "Cannot create VM because depends on a network that cannot be created: " +\
+ str(task_net["result"])
+ break
+ elif task_net["status"] == "enqueued" or task_net["status"] == "processing":
+ error_text = "Cannot create VM because depends on a network still not created"
+ break
+ network_id = task_net["result"]
+ net["net_id"] = network_id
+ except Exception as e:
+ error_text = "Error trying to map from task_id={} to task result: {}".format(
+ net["net_id"],str(e))
+ break
+ if not error_text:
+ vm_id = self.vim.new_vminstance(*params)
+ try:
+ with self.db_lock:
+ if error_text:
+ update = self.db.update_rows("instance_vms",
+ UPDATE={"status": "VIM_ERROR", "error_msg": error_text},
+ WHERE={"vim_vm_id": task_id})
+ else:
+ update = self.db.update_rows("instance_vms", UPDATE={"vim_vm_id": vm_id}, WHERE={"vim_vm_id": task_id})
+ if not update:
+ self.logger.error("task id={} name={} database not updated vim_vm_id={}".format(
+ task["id"], task["name"], vm_id))
+ except db_base_Exception as e:
+ self.logger.error("Error updating database %s", str(e))
+ if error_text:
+ return False, error_text
+ new_refresh_task = {"status": "enqueued",
+ "id": task_id,
+ "name": "get-vm",
+ "vim_id": vm_id,
+ "vim_info": {"interfaces":[]} }
+ self._insert_refresh(new_refresh_task, time.time())
+ return True, vm_id
+ except vimconn.vimconnException as e:
+ self.logger.error("Error creating VM, task=%s: %s", str(task_id), str(e))
+ try:
+ with self.db_lock:
+ self.db.update_rows("instance_vms",
+ UPDATE={"error_msg": self._format_vim_error_msg(str(e)), "status": "VIM_ERROR"},
+ WHERE={"vim_vm_id": task_id})
+ except db_base_Exception as edb:
+ self.logger.error("Error updating database %s", str(edb))
+ return False, str(e)
+
+ def del_vm(self, task):
+ vm_id = task["params"][0]
+ interfaces = task["params"][1]
+ if is_task_id(vm_id):
+ try:
+ task_create = task["depends"][vm_id]
+ with self.task_lock:
+ if task_create["status"] == "error":
+ return True, "VM was not created. It has error: " + str(task_create["result"])
+ elif task_create["status"] == "enqueued" or task_create["status"] == "processing":
+ return False, "Cannot delete VM vim_id={} because still creating".format(vm_id)
+ vm_id = task_create["result"]
+ except Exception as e:
+ return False, "Error trying to get task_id='{}':".format(vm_id, str(e))
+ try:
+ self._remove_refresh("get-vm", vm_id)
+ for iface in interfaces:
+ if iface.get("sdn_port_id"):
+ try:
+ 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)
+ # TODO Set error_msg at instance_nets
+
+ return True, self.vim.delete_vminstance(vm_id)
+ except vimconn.vimconnException as e:
+ return False, str(e)
+
+ def del_net(self, task):
+ net_id = task["params"][0]
+ sdn_net_id = task["params"][1]
+ if is_task_id(net_id):
+ try:
+ task_create = task["depends"][net_id]
+ with self.task_lock:
+ if task_create["status"] == "error":
+ return True, "net was not created. It has error: " + str(task_create["result"])
+ elif task_create["status"] == "enqueued" or task_create["status"] == "processing":
+ return False, "Cannot delete net because still creating"
+ net_id = task_create["result"]
+ except Exception as e:
+ return False, "Error trying to get task_id='{}':".format(net_id, str(e))
+ try:
+ self._remove_refresh("get-vm", net_id)
+ result = self.vim.delete_network(net_id)
+ if sdn_net_id:
+ with self.db_lock:
+ self.ovim.delete_network(sdn_net_id)
+ return True, result
+ except vimconn.vimconnException as e:
+ return False, str(e)
+ except ovimException as e:
+ logging.error("Error deleting network from ovim. net_id: {}, sdn_net_id: {}".format(net_id, sdn_net_id))
+ return False, str(e)
+