From bdfae2b73c53341e6aafbaa89987fb536a7eadb9 Mon Sep 17 00:00:00 2001 From: Rokas Maciulaitis Date: Fri, 7 Feb 2020 11:20:32 +0100 Subject: [PATCH] rest: allows to delete queued workflows * In case of trying to start deleted workflow returns 404. Closes reanahub/reana-client/issues/239 --- reana_workflow_controller/errors.py | 4 ++ reana_workflow_controller/rest/utils.py | 50 +++++++++++-------- .../rest/workflows_status.py | 5 +- 3 files changed, 37 insertions(+), 22 deletions(-) diff --git a/reana_workflow_controller/errors.py b/reana_workflow_controller/errors.py index c1a95d2f..e7b14edd 100644 --- a/reana_workflow_controller/errors.py +++ b/reana_workflow_controller/errors.py @@ -31,3 +31,7 @@ class REANAInteractiveSessionError(Exception): class REANAExternalCallError(Exception): """Error when connecting to an external service.""" + + +class REANAWorkflowStatusError(Exception): + """Error when trying to change workflow status.""" diff --git a/reana_workflow_controller/rest/utils.py b/reana_workflow_controller/rest/utils.py index 39c484e8..d3bf8ca2 100644 --- a/reana_workflow_controller/rest/utils.py +++ b/reana_workflow_controller/rest/utils.py @@ -32,7 +32,8 @@ WORKFLOW_TIME_FORMAT) from reana_workflow_controller.errors import (REANAExternalCallError, REANAWorkflowControllerError, - REANAWorkflowDeletionError) + REANAWorkflowDeletionError, + REANAWorkflowStatusError) from reana_workflow_controller.workflow_run_manager import \ KubernetesWorkflowRunManager @@ -66,6 +67,8 @@ def _start_workflow_db(workflow, parameters): raise REANAWorkflowControllerError(failure_message) elif workflow.status not in \ [WorkflowStatus.created, WorkflowStatus.queued]: + if workflow.status == WorkflowStatus.deleted: + raise REANAWorkflowStatusError(failure_message) raise REANAWorkflowControllerError(failure_message) try: @@ -180,27 +183,32 @@ def delete_workflow(workflow, WorkflowStatus.finished, WorkflowStatus.stopped, WorkflowStatus.deleted, - WorkflowStatus.failed]: - to_be_deleted = [workflow] - if all_runs: - to_be_deleted += Session.query(Workflow).\ - filter(Workflow.name == workflow.name, - Workflow.status != WorkflowStatus.running).all() - for workflow in to_be_deleted: - if hard_delete: - remove_workflow_workspace(workflow.workspace_path) - _delete_workflow_row_from_db(workflow) - else: - if workspace: + WorkflowStatus.failed, + WorkflowStatus.queued]: + try: + to_be_deleted = [workflow] + if all_runs: + to_be_deleted += Session.query(Workflow).\ + filter(Workflow.name == workflow.name, + Workflow.status != WorkflowStatus.running).all() + for workflow in to_be_deleted: + if hard_delete: remove_workflow_workspace(workflow.workspace_path) - _mark_workflow_as_deleted_in_db(workflow) - remove_workflow_jobs_from_cache(workflow) - - return jsonify({'message': 'Workflow successfully deleted', - 'workflow_id': workflow.id_, - 'workflow_name': get_workflow_name(workflow), - 'status': workflow.status.name, - 'user': str(workflow.owner_id)}), 200 + _delete_workflow_row_from_db(workflow) + else: + if workspace: + remove_workflow_workspace(workflow.workspace_path) + _mark_workflow_as_deleted_in_db(workflow) + remove_workflow_jobs_from_cache(workflow) + + return jsonify({'message': 'Workflow successfully deleted', + 'workflow_id': workflow.id_, + 'workflow_name': get_workflow_name(workflow), + 'status': workflow.status.name, + 'user': str(workflow.owner_id)}), 200 + except Exception as e: + logging.error(traceback.format_exc()) + return jsonify({"message": str(e)}), 500 elif workflow.status == WorkflowStatus.running: raise REANAWorkflowDeletionError( 'Workflow {0}.{1} cannot be deleted as it' diff --git a/reana_workflow_controller/rest/workflows_status.py b/reana_workflow_controller/rest/workflows_status.py index 2fc2d1c9..4b2f7b78 100644 --- a/reana_workflow_controller/rest/workflows_status.py +++ b/reana_workflow_controller/rest/workflows_status.py @@ -16,7 +16,8 @@ from reana_workflow_controller.config import WORKFLOW_TIME_FORMAT from reana_workflow_controller.errors import (REANAExternalCallError, - REANAWorkflowControllerError) + REANAWorkflowControllerError, + REANAWorkflowStatusError) from reana_workflow_controller.rest.utils import (build_workflow_logs, delete_workflow, get_current_job_progress, @@ -483,6 +484,8 @@ def set_workflow_status(workflow_id_or_name): # noqa format(workflow_id_or_name)}), 404 except REANAWorkflowControllerError as e: return jsonify({"message": str(e)}), 409 + except REANAWorkflowStatusError as e: + return jsonify({"message": str(e)}), 404 except KeyError as e: return jsonify({"message": str(e)}), 400 except NotImplementedError as e: