pipelines/sdk/python/kfp/cli/diagnose_me_cli.py

102 lines
3.4 KiB
Python

"""CLI interface for KFP diagnose_me tool."""
import json as json_library
import sys
from typing import Dict, List, Text, Union
import click
from kfp.cli.diagnose_me import dev_env
from kfp.cli.diagnose_me import gcp
from kfp.cli.diagnose_me import kubernetes_cluster
from kfp.cli.diagnose_me import kubernetes_cluster as k8
from kfp.cli.diagnose_me import utility
ResultsType = Dict[Union[gcp.Commands, dev_env.Commands,
kubernetes_cluster.Commands], utility.ExecutorResponse]
@click.command()
@click.option(
'-j',
'--json',
is_flag=True,
help='Output in Json format, human readable format is set by default.')
@click.option(
'-p',
'--project-id',
type=Text,
help='Target project id. It will use environment default if not specified.')
@click.option(
'-n',
'--namespace',
type=Text,
help='Namespace to use for Kubernetes cluster.all-namespaces is used if not specified.'
)
@click.pass_context
def diagnose_me(ctx: click.Context, json: bool, project_id: str,
namespace: str):
"""Runs KFP environment diagnostic."""
# validate kubectl, gcloud , and gsutil exist
local_env_gcloud_sdk = gcp.get_gcp_configuration(
gcp.Commands.GET_GCLOUD_VERSION,
project_id=project_id,
human_readable=False)
for app in ['Google Cloud SDK', 'gsutil', 'kubectl']:
if app not in local_env_gcloud_sdk.json_output:
raise RuntimeError(
f'{app} is not installed, gcloud, gsutil and kubectl are required '
+ 'for this app to run. Please follow instructions at ' +
'https://cloud.google.com/sdk/install to install the SDK.')
click.echo('Collecting diagnostic information ...', file=sys.stderr)
# default behaviour dump all configurations
results: ResultsType = {
gcp_command: gcp.get_gcp_configuration(
gcp_command, project_id=project_id, human_readable=not json)
for gcp_command in gcp.Commands
}
for k8_command in k8.Commands:
results[k8_command] = k8.get_kubectl_configuration(
k8_command, human_readable=not json)
for dev_env_command in dev_env.Commands:
results[dev_env_command] = dev_env.get_dev_env_configuration(
dev_env_command, human_readable=not json)
print_to_sdtout(results, not json)
def print_to_sdtout(results: ResultsType, human_readable: bool):
"""Viewer to print the ExecutorResponse results to stdout.
Args:
results: A dictionary with key:command names and val: Execution response
human_readable: Print results in human readable format. If set to True
command names will be printed as visual delimiters in new lines. If False
results are printed as a dictionary with command as key.
"""
output_dict = {}
human_readable_result: List[str] = []
for key, val in results.items():
if val.has_error:
output_dict[
key.
name] = f'Following error occurred during the diagnoses: {val.stderr}'
continue
output_dict[key.name] = val.json_output
human_readable_result.extend(
(f'================ {key.name} ===================',
val.parsed_output))
if human_readable:
result = '\n'.join(human_readable_result)
else:
result = json_library.dumps(
output_dict, sort_keys=True, indent=2, separators=(',', ': '))
click.echo(result)