Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

rest: return workflow progress #294

Merged
merged 1 commit into from Feb 10, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 3 additions & 0 deletions docs/openapi.json
Expand Up @@ -95,6 +95,9 @@
"name": {
"type": "string"
},
"progress": {
"type": "object"
},
"size": {
"type": "string"
},
Expand Down
37 changes: 37 additions & 0 deletions reana_workflow_controller/rest/utils.py
Expand Up @@ -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
}
8 changes: 6 additions & 2 deletions reana_workflow_controller/rest/workflows.py
Expand Up @@ -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'
Expand Down Expand Up @@ -94,6 +95,8 @@ def get_workflows(): # noqa
type: string
created:
type: string
progress:
type: object
examples:
application/json:
[
Expand Down Expand Up @@ -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 \
Expand Down
36 changes: 2 additions & 34 deletions reana_workflow_controller/rest/workflows_status.py
Expand Up @@ -22,6 +22,7 @@
delete_workflow,
get_current_job_progress,
get_workflow_name,
get_workflow_progress,
start_workflow,
stop_workflow)

Expand Down Expand Up @@ -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:
Expand Down
1 change: 1 addition & 0 deletions tests/test_views.py
Expand Up @@ -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": "-"
}
]
Expand Down