+ vim_dict = {}
+ for vim_id in vm_to_refresh_list:
+ vim_dict[vim_id] = {"status": "VIM_ERROR", "error_msg": str(e)}
+
+ for vim_id, vim_info in vim_dict.items():
+ # look for task
+ task_need_update = False
+ task = vm_to_refresh_dict[vim_id]
+ self.logger.debug("get-vm vm_id=%s result=%s", task["vim_id"], str(vim_info))
+
+ # check and update interfaces
+ task_warning_msg = ""
+ for interface in vim_info.get("interfaces", ()):
+ vim_interface_id = interface["vim_interface_id"]
+ if vim_interface_id not in task["extra"]["interfaces"]:
+ self.logger.critical("Interface not found {} on task info {}".format(
+ vim_interface_id, task["extra"]["interfaces"]), exc_info=True)
+ continue
+ task_interface = task["extra"]["interfaces"][vim_interface_id]
+ task_vim_interface = task["vim_interfaces"].get(vim_interface_id)
+ if task_vim_interface != interface:
+ # delete old port
+ if task_interface.get("sdn_port_id"):
+ try:
+ with self.db_lock:
+ self.ovim.delete_port(task_interface["sdn_port_id"])
+ task_interface["sdn_port_id"] = None
+ task_need_update = True
+ except ovimException as e:
+ error_text =" ovimException deleting external_port={} {}".format(
+ task_interface["sdn_port_id"], e)
+ self.logger.error(error_text, exc_info=True)
+ task_warning_msg += error_text
+ # TODO Set error_msg at instance_nets instead of instance VMs
+
+ # Create SDN port
+ sdn_net_id = task_interface.get("sdn_net_id")
+ if sdn_net_id and interface.get("compute_node") and interface.get("pci"):
+ sdn_port_name = sdn_net_id + "." + task["vim_id"]
+ sdn_port_name = sdn_port_name[:63]
+ try:
+ 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")})
+ task_interface["sdn_port_id"] = sdn_port_id
+ task_need_update = True
+ except (ovimException, Exception) as e:
+ error_text = "ovimException creating new_external_port compute_node={} "\
+ "pci={} vlan={} {}".format(
+ interface["compute_node"],
+ interface["pci"],
+ interface.get("vlan"), e)
+ self.logger.error(error_text, exc_info=True)
+ task_warning_msg += error_text
+ # TODO Set error_msg at instance_nets instead of instance VMs
+
+ with self.db_lock:
+ self.db.update_rows(
+ 'instance_interfaces',
+ UPDATE={"mac_address": interface.get("mac_address"),
+ "ip_address": interface.get("ip_address"),
+ "vim_info": interface.get("vim_info"),
+ "sdn_port_id": task_interface.get("sdn_port_id"),
+ "compute_node": interface.get("compute_node"),
+ "pci": interface.get("pci"),
+ "vlan": interface.get("vlan"),
+ },
+ WHERE={'uuid': task_interface["iface_id"]})
+ task["vim_interfaces"][vim_interface_id] = interface
+
+ # check and update task and instance_vms database
+ if vim_info.get("error_msg"):
+ vim_info["error_msg"] = self._format_vim_error_msg(vim_info["error_msg"] + task_warning_msg)
+ elif task_warning_msg:
+ vim_info["error_msg"] = self._format_vim_error_msg(task_warning_msg)
+
+ task_vim_info = task.get("vim_info")
+ task_error_msg = task.get("error_msg")
+ task_vim_status = task["extra"].get("vim_status")
+ if task_vim_status != vim_info["status"] or task_error_msg != vim_info.get("error_msg") or \
+ (vim_info.get("vim_info") and task_vim_info != vim_info["vim_info"]):
+ temp_dict = {"status": vim_info["status"], "error_msg": vim_info.get("error_msg")}
+ if vim_info.get("vim_info"):
+ temp_dict["vim_info"] = vim_info["vim_info"]
+ with self.db_lock:
+ self.db.update_rows('instance_vms', UPDATE=temp_dict, WHERE={"uuid": task["item_id"]})
+ task["extra"]["vim_status"] = vim_info["status"]
+ task["error_msg"] = vim_info.get("error_msg")
+ if vim_info.get("vim_info"):
+ task["vim_info"] = vim_info["vim_info"]
+ task_need_update = True
+
+ if task_need_update:
+ with self.db_lock:
+ self.db.update_rows(
+ 'vim_actions',
+ UPDATE={"extra": yaml.safe_dump(task["extra"], default_flow_style=True, width=256),
+ "error_msg": task.get("error_msg"), "modified_at": now},
+ WHERE={'instance_action_id': task['instance_action_id'],
+ 'task_index': task['task_index']})
+ if task["extra"].get("vim_status") == "BUILD":
+ self._insert_refresh(task, now + self.REFRESH_BUILD)
+ else:
+ self._insert_refresh(task, now + self.REFRESH_ACTIVE)