107 lines
3.6 KiB
Python
107 lines
3.6 KiB
Python
# Lint as: python3
|
|
"""CLI interface for KFP diagnose_me tool."""
|
|
|
|
import json as json_library
|
|
import sys
|
|
from typing import Dict, Text
|
|
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 as k8
|
|
from kfp.cli.diagnose_me import utility
|
|
|
|
|
|
@click.group()
|
|
def diagnose_me():
|
|
"""Prints diagnoses information for KFP environment."""
|
|
pass
|
|
|
|
|
|
@diagnose_me.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, json, project_id, namespace):
|
|
"""Runs environment diagnostic with specified parameters.
|
|
|
|
Feature stage:
|
|
[Alpha](https://github.com/kubeflow/pipelines/blob/07328e5094ac2981d3059314cc848fbb71437a76/docs/release/feature-stages.md#alpha)
|
|
"""
|
|
# 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(
|
|
'%s is not installed, gcloud, gsutil and kubectl are required '
|
|
% app + '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 = {}
|
|
for gcp_command in gcp.Commands:
|
|
results[gcp_command] = gcp.get_gcp_configuration(
|
|
gcp_command, project_id=project_id, human_readable=not json)
|
|
|
|
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: Dict[str, utility.ExecutorResponse],
|
|
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 = []
|
|
for key, val in results.items():
|
|
if val.has_error:
|
|
output_dict[
|
|
key.
|
|
name] = 'Following error occurred during the diagnoses: %s' % val.stderr
|
|
continue
|
|
|
|
output_dict[key.name] = val.json_output
|
|
human_readable_result.append('================ %s ===================' %
|
|
(key.name))
|
|
human_readable_result.append(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)
|