From 1fb4828152a1303aebeab602da8f8da34d5d1ede Mon Sep 17 00:00:00 2001 From: Rokas Maciulaitis Date: Mon, 10 Feb 2020 15:33:11 +0100 Subject: [PATCH] cli: adds option to get logs of a specific step * Closes #369 --- reana_client/api/client.py | 3 ++- reana_client/cli/workflow.py | 25 ++++++++++++++++++++----- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/reana_client/api/client.py b/reana_client/api/client.py index 794aa877..de794ec5 100644 --- a/reana_client/api/client.py +++ b/reana_client/api/client.py @@ -289,12 +289,13 @@ def upload_file(workflow_id, file_, file_name, access_token): raise e -def get_workflow_logs(workflow_id, access_token): +def get_workflow_logs(workflow_id, access_token, steps=None): """Get logs from a workflow engine.""" try: (response, http_response) = current_rs_api_client.api.get_workflow_logs( workflow_id_or_name=workflow_id, + steps=steps or None, access_token=access_token).result() if http_response.status_code == 200: diff --git a/reana_client/cli/workflow.py b/reana_client/cli/workflow.py index 66cdce16..25623fea 100644 --- a/reana_client/cli/workflow.py +++ b/reana_client/cli/workflow.py @@ -129,7 +129,8 @@ def workflow_workflows(ctx, sessions, _filter, output_format, access_token, response = get_workflows(access_token, type, bool(verbose), block_size) verbose_headers = ['id', 'user', 'size'] headers = { - 'batch': ['name', 'run_number', 'created', 'status'], + 'batch': ['name', 'run_number', 'created', 'started', 'completed', + 'status'], 'interactive': ['name', 'run_number', 'created', 'session_type', 'session_uri'] } @@ -547,6 +548,8 @@ def add_data_from_reponse(row, data, headers): [name, run_number, row['created'], + row['progress']['run_started_at'], + row['progress']['run_finished_at'], row['status'], render_progress(finished_jobs, total_jobs)]))) return data @@ -583,7 +586,8 @@ def add_verbose_data_from_response(response, verbose_headers, parsed_filters = parse_parameters(_filter) _filter = [item['column_name'] for item in parsed_filters] response = get_workflow_status(workflow, access_token) - headers = ['name', 'run_number', 'created', 'status', 'progress'] + headers = ['name', 'run_number', 'created', 'started', 'completed', + 'status', 'progress'] verbose_headers = ['id', 'user', 'command'] data = [] if not isinstance(response, list): @@ -627,9 +631,16 @@ def add_verbose_data_from_response(response, verbose_headers, count=True, help='Get output in JSON format.') @add_access_token_options +@click.option( + '-s', + '--step', + 'steps', + multiple=True, + help='Get logs of a specific step.') @check_connection @click.pass_context -def workflow_logs(ctx, workflow, access_token, json_format): # noqa: D301 +def workflow_logs(ctx, workflow, access_token, json_format, + steps=None): # noqa: D301 """Get workflow logs. The `logs` command allows to retrieve logs of running workflow. Note that @@ -638,15 +649,15 @@ def workflow_logs(ctx, workflow, access_token, json_format): # noqa: D301 Examples: \n \t $ reana-client logs -w myanalysis.42 + \t $ reana-client logs -w myanalysis.42 -s 1st_step """ from reana_client.api.client import get_workflow_logs logging.debug('command: {}'.format(ctx.command_path.replace(" ", "."))) for p in ctx.params: logging.debug('{param}: {value}'.format(param=p, value=ctx.params[p])) - if workflow: try: - response = get_workflow_logs(workflow, access_token) + response = get_workflow_logs(workflow, access_token, steps or None) workflow_logs = json.loads(response['logs']) if json_format: click.echo(json.dumps(workflow_logs, indent=2)) @@ -657,6 +668,10 @@ def workflow_logs(ctx, workflow, access_token, json_format): # noqa: D301 click.echo(workflow_logs['workflow_logs']) first = True + if len(workflow_logs['job_logs'].items()) == 0 and steps: + click.echo( + click.style('Workflow logs of step(s) {} were not found.' + .format(','.join(steps)), fg='red')) for job_id, job_logs in workflow_logs['job_logs'].items(): if job_logs: if first: