diff --git a/drydock_provisioner/objects/task.py b/drydock_provisioner/objects/task.py index 2ca4a779..51cd9894 100644 --- a/drydock_provisioner/objects/task.py +++ b/drydock_provisioner/objects/task.py @@ -296,7 +296,11 @@ class Task(object): :param reset_status: Whether to reset the result status of this task before aligning """ if reset_status: - self.result.status = hd_fields.ActionResult.Incomplete + # Defaults the ActionResult to Success if there are no tasks + if not self.statemgr.get_all_subtasks(self.task_id): + self.result.status = hd_fields.ActionResult.Success + else: + self.result.status = hd_fields.ActionResult.Incomplete for st in self.statemgr.get_complete_subtasks(self.task_id): if action_filter is None or (action_filter is not None and st.action == action_filter): diff --git a/drydock_provisioner/orchestrator/actions/orchestrator.py b/drydock_provisioner/orchestrator/actions/orchestrator.py index e20b3f42..e5195c57 100644 --- a/drydock_provisioner/orchestrator/actions/orchestrator.py +++ b/drydock_provisioner/orchestrator/actions/orchestrator.py @@ -529,7 +529,6 @@ class PrepareNodes(BaseAction): :param node_driver: driver instance to use for execution :param node_list: a list of objects.BaremetalNode instances - :return: list of uuid.UUID task ids of the tasks executing this step """ if len(node_list) > 0: self.logger.info( @@ -560,12 +559,10 @@ class PrepareNodes(BaseAction): except errors.MaxRetriesReached: self.task.failure() break - return [node_commission_task.get_id()] else: self.logger.warning( "No nodes successfully identified, skipping commissioning subtask" ) - return list() def step_node_identify(self, node_driver, node_list): """Execute the IdentifyNode step of this action on a list of nodes. diff --git a/drydock_provisioner/statemgmt/state.py b/drydock_provisioner/statemgmt/state.py index e5375eb4..f92c2893 100644 --- a/drydock_provisioner/statemgmt/state.py +++ b/drydock_provisioner/statemgmt/state.py @@ -106,26 +106,12 @@ class DrydockState(object): :param task_id: uuid.UUID ID of the parent task for subtasks """ - try: - conn = self.db_engine.connect() - query_text = sql.text( - "SELECT * FROM tasks WHERE " # nosec no strings are user-sourced - "parent_task_id = :parent_task_id AND " - "status IN ('" + hd_fields.TaskStatus.Terminated + "','" + - hd_fields.TaskStatus.Complete + "')") - - rs = conn.execute(query_text, parent_task_id=task_id.bytes) - task_list = [objects.Task.from_db(dict(r)) for r in rs] - conn.close() - - self._assemble_tasks(task_list=task_list) - for t in task_list: - t.statemgr = self - - return task_list - except Exception as ex: - self.logger.error("Error querying complete subtask: %s" % str(ex)) - return [] + query_text = sql.text( + "SELECT * FROM tasks WHERE " # nosec no strings are user-sourced + "parent_task_id = :parent_task_id AND " + "status IN ('" + hd_fields.TaskStatus.Terminated + "','" + + hd_fields.TaskStatus.Complete + "')") + return self._query_subtasks(task_id, query_text, "Error querying complete subtask: %s") def get_active_subtasks(self, task_id): """Query database for subtasks of the provided task that are active. @@ -135,27 +121,35 @@ class DrydockState(object): :param task_id: uuid.UUID ID of the parent task for subtasks """ + query_text = sql.text( + "SELECT * FROM tasks WHERE " # nosec no strings are user-sourced + "parent_task_id = :parent_task_id AND " + "status NOT IN ['" + hd_fields.TaskStatus.Terminated + "','" + + hd_fields.TaskStatus.Complete + "']") + return self._query_subtasks(task_id, query_text, "Error querying active subtask: %s") + + def get_all_subtasks(self, task_id): + """Query database for all subtasks of the provided task. + + :param task_id: uuid.UUID ID of the parent task for subtasks + """ + query_text = sql.text( + "SELECT * FROM tasks WHERE " # nosec no strings are user-sourced + "parent_task_id = :parent_task_id") + return self._query_subtasks(task_id, query_text, "Error querying all subtask: %s") + + def _query_subtasks(self, task_id, query_text, error): try: - conn = self.db_engine.connect() - query_text = sql.text( - "SELECT * FROM tasks WHERE " # nosec no strings are user-sourced - "parent_task_id = :parent_task_id AND " - "status NOT IN ['" + hd_fields.TaskStatus.Terminated + "','" + - hd_fields.TaskStatus.Complete + "']") + with self.db_engine.connect() as conn: + rs = conn.execute(query_text, parent_task_id=task_id.bytes) + task_list = [objects.Task.from_db(dict(r)) for r in rs] - rs = conn.execute(query_text, parent_task_id=task_id.bytes) - - task_list = [objects.Task.from_db(dict(r)) for r in rs] - conn.close() - - self._assemble_tasks(task_list=task_list) - - for t in task_list: - t.statemgr = self - - return task_list + self._assemble_tasks(task_list=task_list) + for t in task_list: + t.statemgr = self + return task_list except Exception as ex: - self.logger.error("Error querying active subtask: %s" % str(ex)) + self.logger.error(error % str(ex)) return [] def get_next_queued_task(self, allowed_actions=None):