def logs(ctx: click.Context, workflow_name: str): try: namespace = get_kubectl_current_context_namespace() workflow: ArgoWorkflow = ArgoWorkflow.get(namespace=namespace, name=workflow_name) if not workflow: click.echo(Texts.NOT_FOUND_MSG.format(workflow_name=workflow_name)) exit(0) es_client = K8sElasticSearchClient( host=f'{get_kubectl_host(with_port=True)}' f'/api/v1/namespaces/nauta/services/nauta-elasticsearch:nauta/proxy', verify_certs=False, use_ssl=True, headers={'Authorization': get_api_key()}) start_date = workflow.started_at workflow_logs_generator = es_client.get_argo_workflow_logs_generator( workflow=workflow, namespace=namespace, start_date=start_date) for log_entry in workflow_logs_generator: if not log_entry.content.isspace(): click.echo( f'{log_entry.date} {log_entry.pod_name} {log_entry.content}' ) except Exception: handle_error(logger, Texts.OTHER_ERROR_MSG, Texts.OTHER_ERROR_MSG, add_verbosity_msg=True) exit(1)
def status(state: State, model_name: str, status: PodPhase, username: str): """ Returns status of a model :param model_name: name of a model data of which should be displayed :param status: status of a model step that should be displayed :param username; if checked - searches for model for a certain user """ try: if not username: namespace = get_kubectl_current_context_namespace() else: namespace = username with spinner(text=Texts.LOAD_DATA_MSG): workflow: ArgoWorkflow = ArgoWorkflow.get(namespace=namespace, name=model_name) if not workflow: click.echo(Texts.MODEL_NOT_FOUND.format(model_name=model_name)) exit(0) click.echo('\nOperation details:\n') click.echo(tabulate([workflow.cli_representation], headers=MODEL_HEADERS, tablefmt=TBLT_TABLE_FORMAT)) click.echo('\nOperation steps:\n') if workflow.steps: click.echo(tabulate([step.cli_representation for step in workflow.steps if status is None or status == step.phase], headers=STEP_HEADERS, tablefmt=TBLT_TABLE_FORMAT)) else: click.echo(Texts.LACK_OF_STEPS) except Exception: handle_error(logger, Texts.OTHER_ERROR_MSG, Texts.OTHER_ERROR_MSG, add_verbosity_msg=True) exit(1)
def logs(state: State, workflow_name: str): try: namespace = get_kubectl_current_context_namespace() workflow: ArgoWorkflow = ArgoWorkflow.get(namespace=namespace, name=workflow_name) if not workflow: click.echo(Texts.NOT_FOUND_MSG.format(workflow_name=workflow_name)) exit(0) with K8sProxy(NAUTAAppNames.ELASTICSEARCH) as proxy: es_client = K8sElasticSearchClient(host="127.0.0.1", port=proxy.tunnel_port, verify_certs=False, use_ssl=False) start_date = workflow.started_at workflow_logs_generator = es_client.get_argo_workflow_logs_generator(workflow=workflow, namespace=namespace, start_date=start_date) for log_entry in workflow_logs_generator: if not log_entry.content.isspace(): click.echo(f'{log_entry.date} {log_entry.pod_name} {log_entry.content}') except K8sProxyCloseError: handle_error(logger, Texts.PROXY_CLOSE_LOG_ERROR_MSG, Texts.PROXY_CLOSE_USER_ERROR_MSG) exit(1) except LocalPortOccupiedError as exe: handle_error(logger, Texts.LOCAL_PORT_OCCUPIED_ERROR_MSG.format(exception_message=exe.message), Texts.LOCAL_PORT_OCCUPIED_ERROR_MSG.format(exception_message=exe.message)) exit(1) except K8sProxyOpenError: handle_error(logger, Texts.PROXY_CREATION_ERROR_MSG, Texts.PROXY_CREATION_ERROR_MSG) exit(1) except Exception: handle_error(logger, Texts.OTHER_ERROR_MSG, Texts.OTHER_ERROR_MSG, add_verbosity_msg=True) exit(1)
def export(path: str, format: str, operation_options: Tuple[str, ...]): if path == FORMATS_OPTION: try: list_of_workflows = get_list_of_workflows(EXPORT_WORKFLOWS_LOCATION) except Exception: handle_error(logger, Texts.EXPORT_LIST_ERROR_MSG, Texts.EXPORT_LIST_ERROR_MSG) sys.exit(1) click.echo(tabulate(list_of_workflows, headers=EXPORT_LIST_HEADERS, tablefmt=TBLT_TABLE_FORMAT)) sys.exit(0) config_path = Config().config_path formats: List[str] = [] # noqa: E701 if os.path.isdir(config_path): workflow_exports_files = os.listdir(f'{config_path}/workflows/exports') formats = [os.path.splitext(file)[0] for file in workflow_exports_files if file.endswith('.yaml')] if not format: click.echo(Texts.MISSING_EXPORT_FORMAT.format(formats=formats)) sys.exit(2) format = format.lower() if format not in formats: click.echo(Texts.WRONG_EXPORT_FORMAT.format(format=format, formats=formats)) sys.exit(2) additional_params_str = " ".join(operation_options) try: current_namespace = get_kubectl_current_context_namespace() export_workflow = ArgoWorkflow.from_yaml(f'{Config().config_path}/workflows/exports/{format}.yaml') export_workflow.parameters = { 'cluster-registry-address': NAUTAConfigMap().registry, 'saved-model-dir-path': path, 'additional-params': additional_params_str } export_workflow.create(namespace=current_namespace) workflow: ArgoWorkflow = ArgoWorkflow.get(namespace=current_namespace, name=export_workflow.name) except Exception: error_msg = 'Failed to create export workflow.' click.echo(error_msg) logger.exception(error_msg) sys.exit(1) click.echo(tabulate([workflow.cli_representation], headers=MODEL_HEADERS, tablefmt=TBLT_TABLE_FORMAT)) click.echo(f'\nSuccessfully created export workflow')
def view(state: State, workflow_name: str): try: namespace = get_kubectl_current_context_namespace() workflow: ArgoWorkflow = ArgoWorkflow.get(namespace=namespace, name=workflow_name) if not workflow: click.echo(Texts.NOT_FOUND_MSG.format(workflow_name=workflow_name)) exit(0) click.echo(tabulate([workflow.cli_representation], headers=HEADERS, tablefmt="orgtbl")) click.echo('\nWorkflow status:\n') click.echo(yaml.dump(workflow.status)) except Exception: handle_error(logger, Texts.OTHER_ERROR_MSG, Texts.OTHER_ERROR_MSG, add_verbosity_msg=True) exit(1)
def cancel(state: State, workflow_name: str): try: namespace = get_kubectl_current_context_namespace() workflow: ArgoWorkflow = ArgoWorkflow.get(name=workflow_name, namespace=namespace) if not workflow: click.echo(Texts.NOT_FOUND_MSG.format(workflow_name=workflow_name)) exit(0) with spinner(text=Texts.PROGRESS_MSG.format( workflow_name=workflow_name)): workflow.delete() click.echo(Texts.SUCCESS_MSG.format(workflow_name=workflow_name)) except Exception: handle_error(logger, Texts.OTHER_ERROR_MSG, Texts.OTHER_ERROR_MSG, add_verbosity_msg=True) exit(1)