def add_data_from_reponse(row, data, headers): name, run_number = get_workflow_name_and_run_number(row["name"]) total_jobs = row["progress"].get("total") if total_jobs: total_jobs = total_jobs.get("total") else: total_jobs = 0 finished_jobs = row["progress"].get("finished") if finished_jobs: finished_jobs = finished_jobs.get("total") else: finished_jobs = 0 parsed_response = list( map(str, [name, run_number, row["created"], row["status"]]) ) if row["progress"]["total"].get("total") or 0 > 0: if "progress" not in headers: headers += ["progress"] parsed_response.append(render_progress(finished_jobs, total_jobs)) if row["status"] in ["running", "finished", "failed", "stopped"]: started_at = row["progress"].get("run_started_at") finished_at = row["progress"].get("run_finished_at") if started_at: after_created_pos = headers.index("created") + 1 headers.insert(after_created_pos, "started") parsed_response.insert(after_created_pos, started_at) if finished_at: after_started_pos = headers.index("started") + 1 headers.insert(after_started_pos, "ended") parsed_response.insert(after_started_pos, finished_at) data.append(parsed_response) return data
def add_data_from_reponse(row, data, headers): name, run_number = get_workflow_name_and_run_number(row['name']) total_jobs = row['progress'].get('total') if total_jobs: total_jobs = total_jobs.get('total') else: total_jobs = 0 finished_jobs = row['progress'].get('finished') if finished_jobs: finished_jobs = finished_jobs.get('total') else: finished_jobs = 0 parsed_response = list( map(str, [name, run_number, row['created'], row['status']])) if row['progress']['total'].get('total') or 0 > 0: if 'progress' not in headers: headers += ['progress'] parsed_response.append( render_progress(finished_jobs, total_jobs)) if row['status'] in ['running', 'finished', 'failed', 'stopped']: started_at = row['progress'].get('run_started_at') finished_at = row['progress'].get('run_finished_at') if started_at: after_created_pos = headers.index('created') + 1 headers.insert(after_created_pos, 'started') parsed_response.insert(after_created_pos, started_at) if finished_at: after_started_pos = headers.index('started') + 1 headers.insert(after_started_pos, 'ended') parsed_response.insert(after_started_pos, finished_at) data.append(parsed_response) return data
def add_data_from_reponse(row, data, headers): name, run_number = get_workflow_name_and_run_number( row['name']) total_jobs = row['progress'].get('total') if total_jobs: total_jobs = total_jobs.get('total') else: total_jobs = 0 finished_jobs = row['progress'].get('finished') if finished_jobs: finished_jobs = finished_jobs.get('total') else: finished_jobs = 0 if row['progress']['total'].get('total') or 0 > 0: if 'progress' not in headers: headers += ['progress'] data.append(list(map( str, [name, run_number, row['created'], row['status'], render_progress(finished_jobs, total_jobs)]))) return data
def workflow_workflows(ctx, sessions, _filter, output_format, access_token, show_all, verbose): """List all workflows user has.""" logging.debug('command: {}'.format(ctx.command_path.replace(" ", "."))) for p in ctx.params: logging.debug('{param}: {value}'.format(param=p, value=ctx.params[p])) type = 'interactive' if sessions else 'batch' try: _url = current_rs_api_client.swagger_spec.api_url except MissingAPIClientConfiguration as e: click.secho('REANA client is not connected to any REANA cluster.', fg='red', err=True) sys.exit(1) if not access_token: click.echo(click.style(ERROR_MESSAGES['missing_access_token'], fg='red'), err=True) sys.exit(1) if _filter: parsed_filters = parse_parameters(_filter) try: response = get_workflows(access_token, type, bool(verbose)) verbose_headers = ['id', 'user', 'size'] headers = { 'batch': ['name', 'run_number', 'created', 'status'], 'interactive': ['name', 'run_number', 'created', 'session_type', 'session_uri'] } if verbose: headers[type] += verbose_headers data = [] for workflow in response: if workflow['status'] == 'deleted' and not show_all: continue name, run_number = get_workflow_name_and_run_number( workflow['name']) workflow['name'] = name workflow['run_number'] = run_number if type == 'interactive': workflow['session_uri'] = format_session_uri( reana_server_url=ctx.obj.reana_server_url, path=workflow['session_uri'], access_token=access_token) data.append([str(workflow[k]) for k in headers[type]]) data = sorted(data, key=lambda x: int(x[1])) workflow_ids = ['{0}.{1}'.format(w[0], w[1]) for w in data] if os.getenv('REANA_WORKON', '') in workflow_ids: active_workflow_idx = \ workflow_ids.index(os.getenv('REANA_WORKON', '')) for idx, row in enumerate(data): if idx == active_workflow_idx: data[idx][headers[type].index('run_number')] += ' *' tablib_data = tablib.Dataset() tablib_data.headers = headers[type] for row in data: tablib_data.append(row=row, tags=row) if _filter: tablib_data, filtered_headers = \ filter_data(parsed_filters, headers[type], tablib_data) if output_format: click.echo(json.dumps(tablib_data)) else: tablib_data = [list(item.values()) for item in tablib_data] click_table_printer(filtered_headers, filtered_headers, tablib_data) else: if output_format: click.echo(tablib_data.export(output_format)) else: click_table_printer(headers[type], _filter, data) except Exception as e: logging.debug(traceback.format_exc()) logging.debug(str(e)) click.echo(click.style( 'Workflow list could not be retrieved: \n{}'.format(str(e)), fg='red'), err=True)
def workflow_workflows( # noqa: C901 ctx, workflow, sessions, _format, output_format, access_token, show_all, verbose, human_readable_or_raw, sort_columm_name, page, size, filters, include_progress, include_workspace_size, ): # noqa: D301 """List all workflows and sessions. The ``list`` command lists workflows and sessions. By default, the list of workflows is returned. If you would like to see the list of your open interactive sessions, you need to pass the ``--sessions`` command-line option. Example: \n \t $ reana-client list --all \n \t $ reana-client list --sessions \n \t $ reana-client list --verbose --bytes """ import tablib from reana_client.api.client import get_workflows logging.debug("command: {}".format(ctx.command_path.replace(" ", "."))) for p in ctx.params: logging.debug("{param}: {value}".format(param=p, value=ctx.params[p])) type = "interactive" if sessions else "batch" status_filter = None search_filter = None if filters: filter_names = ["name", "status"] status_filter, search_filter = parse_filter_parameters(filters, filter_names) if _format: parsed_format_filters = parse_format_parameters(_format) try: response = get_workflows( access_token, type, verbose=bool(verbose), page=page, size=size, status=status_filter, search=search_filter, include_progress=include_progress, include_workspace_size=include_workspace_size, workflow=workflow, ) verbose_headers = ["id", "user"] workspace_size_header = ["size"] progress_header = ["progress"] headers = { "batch": ["name", "run_number", "created", "started", "ended", "status"], "interactive": [ "name", "run_number", "created", "session_type", "session_uri", "session_status", ], } if verbose: headers[type] += verbose_headers if verbose or include_workspace_size: headers[type] += workspace_size_header if verbose or include_progress: headers[type] += progress_header data = [] for workflow in response: workflow["size"] = workflow["size"][human_readable_or_raw] if workflow["status"] == "deleted" and not show_all: continue name, run_number = get_workflow_name_and_run_number(workflow["name"]) workflow["name"] = name workflow["run_number"] = run_number if type == "interactive": workflow["session_uri"] = format_session_uri( reana_server_url=ctx.obj.reana_server_url, path=workflow["session_uri"], access_token=access_token, ) row = [] for header in headers[type]: value = None if header in progress_header: value = get_formatted_progress(workflow.get("progress")) elif header in ["started", "ended"]: _key = ( "run_started_at" if header == "started" else "run_finished_at" ) value = workflow.get("progress", {}).get(_key) or "-" if not value: value = workflow.get(header) row.append(value) data.append(row) sort_column_id = 2 if sort_columm_name.lower() in headers[type]: sort_column_id = headers[type].index(sort_columm_name.lower()) data = sorted(data, key=lambda x: x[sort_column_id], reverse=True) workflow_ids = ["{0}.{1}".format(w[0], w[1]) for w in data] if os.getenv("REANA_WORKON", "") in workflow_ids: active_workflow_idx = workflow_ids.index(os.getenv("REANA_WORKON", "")) for idx, row in enumerate(data): if idx == active_workflow_idx: run_number = str(data[idx][headers[type].index("run_number")]) run_number += " *" tablib_data = tablib.Dataset() tablib_data.headers = headers[type] for row in data: tablib_data.append(row=row, tags=row) if _format: tablib_data, filtered_headers = format_data( parsed_format_filters, headers[type], tablib_data ) if output_format: display_message(json.dumps(tablib_data)) else: tablib_data = [list(item.values()) for item in tablib_data] click_table_printer(filtered_headers, filtered_headers, tablib_data) else: if output_format: display_message(tablib_data.export(output_format)) else: click_table_printer(headers[type], _format, data) except Exception as e: logging.debug(traceback.format_exc()) logging.debug(str(e)) display_message( "Workflow list could not be retrieved: \n{}".format(str(e)), msg_type="error", )
def workflow_workflows(ctx, sessions, _filter, output_format, access_token, show_all, verbose, block_size, sort_columm_name): # noqa: D301 """List all workflows and sessions. The `list` command lists workflows and sessions. By default, the list of workflows is returned. If you would like to see the list of your open interactive sessions, you need to pass the `--sessions` command-line option. Example: \n \t $ reana-client list --all \n \t $ reana-client list --sessions \n \t $ reana-client list --verbose --bytes """ import tablib from reana_client.api.client import get_workflows logging.debug('command: {}'.format(ctx.command_path.replace(" ", "."))) for p in ctx.params: logging.debug('{param}: {value}'.format(param=p, value=ctx.params[p])) type = 'interactive' if sessions else 'batch' if _filter: parsed_filters = parse_parameters(_filter) try: if not verbose: block_size = None response = get_workflows(access_token, type, bool(verbose), block_size) verbose_headers = ['id', 'user', 'size'] headers = { 'batch': ['name', 'run_number', 'created', 'started', 'ended', 'status'], 'interactive': ['name', 'run_number', 'created', 'session_type', 'session_uri'] } if verbose: headers[type] += verbose_headers data = [] for workflow in response: if workflow['status'] == 'deleted' and not show_all: continue name, run_number = get_workflow_name_and_run_number( workflow['name']) workflow['name'] = name workflow['run_number'] = run_number if type == 'interactive': workflow['session_uri'] = format_session_uri( reana_server_url=ctx.obj.reana_server_url, path=workflow['session_uri'], access_token=access_token) row = [] for header in headers[type]: if header == 'started': header = 'run_started_at' elif header == 'ended': header = 'run_finished_at' value = workflow.get(header) if not value: value = workflow.get('progress', {}).get(header) or '-' row.append(value) data.append(row) sort_column_id = 2 if sort_columm_name.lower() in headers[type]: sort_column_id = headers[type].index(sort_columm_name.lower()) data = sorted(data, key=lambda x: x[sort_column_id], reverse=True) workflow_ids = ['{0}.{1}'.format(w[0], w[1]) for w in data] if os.getenv('REANA_WORKON', '') in workflow_ids: active_workflow_idx = \ workflow_ids.index(os.getenv('REANA_WORKON', '')) for idx, row in enumerate(data): if idx == active_workflow_idx: run_number = \ str(data[idx][headers[type].index('run_number')]) run_number += ' *' tablib_data = tablib.Dataset() tablib_data.headers = headers[type] for row in data: tablib_data.append(row=row, tags=row) if _filter: tablib_data, filtered_headers = \ filter_data(parsed_filters, headers[type], tablib_data) if output_format: click.echo(json.dumps(tablib_data)) else: tablib_data = [list(item.values()) for item in tablib_data] click_table_printer(filtered_headers, filtered_headers, tablib_data) else: if output_format: click.echo(tablib_data.export(output_format)) else: click_table_printer(headers[type], _filter, data) except Exception as e: logging.debug(traceback.format_exc()) logging.debug(str(e)) click.echo(click.style( 'Workflow list could not be retrieved: \n{}'.format(str(e)), fg='red'), err=True)