diff --git a/docs/openapi.json b/docs/openapi.json index e5710436..787074d6 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -95,6 +95,9 @@ "name": { "type": "string" }, + "progress": { + "type": "object" + }, "size": { "type": "string" }, diff --git a/reana_workflow_controller/rest/utils.py b/reana_workflow_controller/rest/utils.py index d3bf8ca2..6fb1486d 100644 --- a/reana_workflow_controller/rest/utils.py +++ b/reana_workflow_controller/rest/utils.py @@ -459,3 +459,40 @@ def get_workspace_diff(workflow_a, workflow_b, brief=False, context_lines=5): if not reana_fs.exists(workspace_b): raise ValueError('Workspace of {} does not exist.'.format( get_workflow_name(workflow_b))) + + +def get_workflow_progress(workflow): + """Return workflow progress information. + + :param workflow: The workflow to get progress information from. + :type: reana_db.models.Workflow instance. + + :return: Dictionary with workflow progress information. + """ + current_job_progress = get_current_job_progress(workflow.id_) + cmd_and_step_name = {} + try: + _, cmd_and_step_name = current_job_progress.popitem() + except Exception: + pass + run_started_at = (workflow.run_started_at. + strftime(WORKFLOW_TIME_FORMAT) + if workflow.run_started_at else None) + run_finished_at = (workflow.run_finished_at. + strftime(WORKFLOW_TIME_FORMAT) + if workflow.run_finished_at else None) + initial_progress_status = {'total': 0, 'job_ids': []} + return { + 'total': (workflow.job_progress.get('total') or + initial_progress_status), + 'running': (workflow.job_progress.get('running') or + initial_progress_status), + 'finished': (workflow.job_progress.get('finished') or + initial_progress_status), + 'failed': (workflow.job_progress.get('failed') or + initial_progress_status), + 'current_command': cmd_and_step_name.get('prettified_cmd'), + 'current_step_name': cmd_and_step_name.get('current_job_name'), + 'run_started_at': run_started_at, + 'run_finished_at': run_finished_at + } diff --git a/reana_workflow_controller/rest/workflows.py b/reana_workflow_controller/rest/workflows.py index 81a6881e..808acefb 100644 --- a/reana_workflow_controller/rest/workflows.py +++ b/reana_workflow_controller/rest/workflows.py @@ -25,8 +25,9 @@ REANAWorkflowNameError) from reana_workflow_controller.rest.utils import ( get_specification_diff, get_workflow_name) -from reana_workflow_controller.rest.utils import \ - create_workflow_workspace, get_workspace_diff +from reana_workflow_controller.rest.utils import (create_workflow_workspace, + get_workspace_diff, + get_workflow_progress) START = 'start' @@ -94,6 +95,8 @@ def get_workflows(): # noqa type: string created: type: string + progress: + type: object examples: application/json: [ @@ -168,6 +171,7 @@ def get_workflows(): # noqa 'user': user_uuid, 'created': workflow.created. strftime(WORKFLOW_TIME_FORMAT), + 'progress': get_workflow_progress(workflow), 'size': '-'} if type == 'interactive': if not workflow.interactive_session or \ diff --git a/reana_workflow_controller/rest/workflows_status.py b/reana_workflow_controller/rest/workflows_status.py index 4b2f7b78..2bd77c3b 100644 --- a/reana_workflow_controller/rest/workflows_status.py +++ b/reana_workflow_controller/rest/workflows_status.py @@ -22,6 +22,7 @@ delete_workflow, get_current_job_progress, get_workflow_name, + get_workflow_progress, start_workflow, stop_workflow) @@ -238,45 +239,12 @@ def get_workflow_status(workflow_id_or_name): # noqa return jsonify( {'message': 'User {} is not allowed to access workflow {}' .format(user_uuid, workflow_id_or_name)}), 403 - - current_job_progress = get_current_job_progress(workflow.id_) - cmd_and_step_name = {} - try: - current_job_id, cmd_and_step_name = current_job_progress.\ - popitem() - except Exception: - pass - run_started_at = None - if workflow.run_started_at: - run_started_at = workflow.run_started_at.\ - strftime(WORKFLOW_TIME_FORMAT) - initial_progress_status = {'total': 0, 'job_ids': []} - progress = {'total': - workflow.job_progress.get('total') or - initial_progress_status, - 'running': - workflow.job_progress.get('running') or - initial_progress_status, - 'finished': - workflow.job_progress.get('finished') or - initial_progress_status, - 'failed': - workflow.job_progress.get('failed') or - initial_progress_status, - 'current_command': - cmd_and_step_name.get('prettified_cmd'), - 'current_step_name': - cmd_and_step_name.get('current_job_name'), - 'run_started_at': - run_started_at - } - return jsonify({'id': workflow.id_, 'name': get_workflow_name(workflow), 'created': workflow.created.strftime(WORKFLOW_TIME_FORMAT), 'status': workflow.status.name, - 'progress': progress, + 'progress': get_workflow_progress(workflow), 'user': user_uuid, 'logs': json.dumps(workflow_logs)}), 200 except ValueError: diff --git a/tests/test_views.py b/tests/test_views.py index bc16d52f..6e3f7666 100644 --- a/tests/test_views.py +++ b/tests/test_views.py @@ -57,6 +57,7 @@ def test_get_workflows(app, session, default_user, cwl_workflow_with_name): "status": workflow.status.name, "user": str(workflow.owner_id), "created": response_data[0]["created"], + "progress": response_data[0]["progress"], "size": "-" } ]