- if task["status"] == "SUPERSEDED":
- # not needed to do anything but update database with the new status
- result = True
- database_update = None
- elif not self.vim:
- task["status"] == "ERROR"
- task["error_msg"] = self.error_status
- result = False
- database_update = {"status": "VIM_ERROR", "error_msg": task["error_msg"]}
- elif task["item"] == 'instance_vms':
- if task["action"] == "CREATE":
- result, database_update = self.new_vm(task)
- nb_created += 1
- elif task["action"] == "DELETE":
- result, database_update = self.del_vm(task)
- else:
- raise vimconn.vimconnException(self.name + "unknown task action {}".format(task["action"]))
- elif task["item"] == 'instance_nets':
- if task["action"] == "CREATE":
- result, database_update = self.new_net(task)
- nb_created += 1
- elif task["action"] == "DELETE":
- result, database_update = self.del_net(task)
- elif task["action"] == "FIND":
- result, database_update = self.get_net(task)
+ try:
+ # check if tasks that this depends on have been completed
+ dependency_not_completed = False
+ for task_index in task["extra"].get("depends_on", ()):
+ task_dependency = task["depends"].get("TASK-" + str(task_index))
+ if not task_dependency:
+ task_dependency = self._look_for_task(task["instance_action_id"], "TASK-" + str(task_index))
+ if not task_dependency:
+ raise VimThreadException(
+ "Cannot get depending net task trying to get depending task {}.{}".format(
+ task["instance_action_id"], task_index))
+ # task["depends"]["TASK-" + str(task_index)] = task_dependency #it references another object,so database must be look again
+ if task_dependency["status"] == "SCHEDULED":
+ dependency_not_completed = True
+ break
+ elif task_dependency["status"] == "FAILED":
+ raise VimThreadException(
+ "Cannot {} {}, task {}.{} {} because depends on failed {} {}, task{}.{}"
+ "task {}.{}".format(task["action"], task["item"],
+ task["instance_action_id"], task["task_index"],
+ task_dependency["instance_action_id"], task_dependency["task_index"],
+ task_dependency["action"], task_dependency["item"] ))
+ if dependency_not_completed:
+ # Move this task to the end.
+ task["extra"]["tries"] = task["extra"].get("tries", 0) + 1
+ if task["extra"]["tries"] <= 3:
+ self.pending_tasks.append(task)
+ continue
+ else:
+ raise VimThreadException(
+ "Cannot {} {}, (task {}.{}) because timeout waiting to complete {} {}, "
+ "(task {}.{})".format(task["action"], task["item"],
+ task["instance_action_id"], task["task_index"],
+ task_dependency["instance_action_id"], task_dependency["task_index"],
+ task_dependency["action"], task_dependency["item"]))
+
+ if task["status"] == "SUPERSEDED":
+ # not needed to do anything but update database with the new status
+ result = True
+ database_update = None
+ elif not self.vim:
+ task["status"] == "ERROR"
+ task["error_msg"] = self.error_status
+ result = False
+ database_update = {"status": "VIM_ERROR", "error_msg": task["error_msg"]}
+ elif task["item"] == 'instance_vms':
+ if task["action"] == "CREATE":
+ result, database_update = self.new_vm(task)
+ nb_created += 1
+ elif task["action"] == "DELETE":
+ result, database_update = self.del_vm(task)
+ else:
+ raise vimconn.vimconnException(self.name + "unknown task action {}".format(task["action"]))
+ elif task["item"] == 'instance_nets':
+ if task["action"] == "CREATE":
+ result, database_update = self.new_net(task)
+ nb_created += 1
+ elif task["action"] == "DELETE":
+ result, database_update = self.del_net(task)
+ elif task["action"] == "FIND":
+ result, database_update = self.get_net(task)
+ else:
+ raise vimconn.vimconnException(self.name + "unknown task action {}".format(task["action"]))