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

266 lines
8.2 KiB
Python

# Copyright 2019-2022 The Kubeflow Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from typing import Optional
import click
from kfp import client
from kfp.cli import output
from kfp.cli.utils import deprecated_alias_group
from kfp.cli.utils import parsing
@click.group(
cls=deprecated_alias_group.deprecated_alias_group_factory({
'upload': 'create',
'upload-version': 'create-version'
}))
def pipeline():
"""Manage pipeline resources."""
@pipeline.command()
@click.option(
'-p',
'--pipeline-name',
help=parsing.get_param_descr(client.Client.upload_pipeline,
'pipeline_name'))
@click.option(
'-d',
'--description',
help=parsing.get_param_descr(client.Client.upload_pipeline, 'description'))
@click.argument('package-file')
@click.pass_context
def create(ctx: click.Context,
pipeline_name: str,
package_file: str,
description: str = None):
"""Upload a pipeline."""
client_obj: client.Client = ctx.obj['client']
output_format = ctx.obj['output']
pipeline = client_obj.upload_pipeline(package_file, pipeline_name,
description)
output.print_output(
pipeline,
output.ModelType.PIPELINE,
output_format,
)
either_option_required = 'Either --pipeline-id or --pipeline-name is required.'
@pipeline.command()
@click.argument('package-file', type=click.Path(exists=True, dir_okay=False))
@click.option(
'-v',
'--pipeline-version',
help=parsing.get_param_descr(client.Client.upload_pipeline_version,
'pipeline_version_name'),
required=True,
)
@click.option(
'-p',
'--pipeline-id',
required=False,
help=parsing.get_param_descr(client.Client.upload_pipeline_version,
'pipeline_id') + ' ' + either_option_required)
@click.option(
'-n',
'--pipeline-name',
required=False,
help=parsing.get_param_descr(client.Client.upload_pipeline_version,
'pipeline_name') + ' ' + either_option_required
)
@click.option(
'-d',
'--description',
help=parsing.get_param_descr(client.Client.upload_pipeline_version,
'description'))
@click.pass_context
def create_version(ctx: click.Context,
package_file: str,
pipeline_version: str,
pipeline_id: Optional[str] = None,
pipeline_name: Optional[str] = None,
description: Optional[str] = None):
"""Upload a version of a pipeline."""
client_obj: client.Client = ctx.obj['client']
output_format = ctx.obj['output']
if bool(pipeline_id) == bool(pipeline_name):
raise ValueError(either_option_required)
if pipeline_name is not None:
pipeline_id = client_obj.get_pipeline_id(name=pipeline_name)
if pipeline_id is None:
raise ValueError(
f"Can't find a pipeline with name: {pipeline_name}")
version = client_obj.upload_pipeline_version(
pipeline_package_path=package_file,
pipeline_version_name=pipeline_version,
pipeline_id=pipeline_id,
pipeline_name=pipeline_name,
description=description)
output.print_output(
version,
output.ModelType.PIPELINE,
output_format,
)
@pipeline.command()
@click.option(
'--page-token',
default='',
help=parsing.get_param_descr(client.Client.list_pipelines, 'page_token'))
@click.option(
'-m',
'--max-size',
default=100,
help=parsing.get_param_descr(client.Client.list_pipelines, 'page_size'))
@click.option(
'--sort-by',
default='created_at desc',
help=parsing.get_param_descr(client.Client.list_pipelines, 'sort_by'))
@click.option(
'--filter',
help=parsing.get_param_descr(client.Client.list_pipelines, 'filter'))
@click.pass_context
def list(ctx: click.Context, page_token: str, max_size: int, sort_by: str,
filter: str):
"""List pipelines."""
client_obj: client.Client = ctx.obj['client']
output_format = ctx.obj['output']
response = client_obj.list_pipelines(
page_token=page_token,
page_size=max_size,
sort_by=sort_by,
filter=filter)
output.print_output(
response.pipelines or [],
output.ModelType.PIPELINE,
output_format,
)
@pipeline.command()
@click.argument('pipeline-id')
@click.option(
'--page-token',
default='',
help=parsing.get_param_descr(client.Client.list_pipeline_versions,
'page_token'))
@click.option(
'-m',
'--max-size',
default=100,
help=parsing.get_param_descr(client.Client.list_pipeline_versions,
'page_size'))
@click.option(
'--sort-by',
default='created_at desc',
help=parsing.get_param_descr(client.Client.list_pipeline_versions,
'sort_by'))
@click.option(
'--filter',
help=parsing.get_param_descr(client.Client.list_pipeline_versions,
'filter'))
@click.pass_context
def list_versions(ctx: click.Context, pipeline_id: str, page_token: str,
max_size: int, sort_by: str, filter: str):
"""List versions of a pipeline."""
client_obj: client.Client = ctx.obj['client']
output_format = ctx.obj['output']
response = client_obj.list_pipeline_versions(
pipeline_id,
page_token=page_token,
page_size=max_size,
sort_by=sort_by,
filter=filter)
output.print_output(
response.pipeline_versions or [],
output.ModelType.PIPELINE_VERSION,
output_format,
)
@pipeline.command()
@click.argument('pipeline-id')
@click.argument('version-id')
@click.pass_context
def delete_version(ctx: click.Context, pipeline_id: str, version_id: str):
"""Delete a version of a pipeline."""
confirmation = f'Are you sure you want to delete pipeline version {version_id}?'
if not click.confirm(confirmation):
return
client_obj: client.Client = ctx.obj['client']
output_format = ctx.obj['output']
client_obj.delete_pipeline_version(
pipeline_id=pipeline_id, pipeline_version_id=version_id)
output.print_deleted_text('pipeline version', version_id, output_format)
@pipeline.command()
@click.argument('pipeline-id')
@click.pass_context
def get(ctx: click.Context, pipeline_id: str):
"""Get information about a pipeline."""
client_obj: client.Client = ctx.obj['client']
output_format = ctx.obj['output']
pipeline = client_obj.get_pipeline(pipeline_id)
output.print_output(
pipeline,
output.ModelType.PIPELINE,
output_format,
)
@pipeline.command()
@click.argument('pipeline-id')
@click.argument('version-id')
@click.pass_context
def get_version(ctx: click.Context, pipeline_id: str, version_id: str):
"""Get information about a version of a pipeline."""
client_obj: client.Client = ctx.obj['client']
output_format = ctx.obj['output']
version = client_obj.get_pipeline_version(
pipeline_id=pipeline_id, pipeline_version_id=version_id)
output.print_output(
version,
output.ModelType.PIPELINE,
output_format,
)
@pipeline.command()
@click.argument('pipeline-id')
@click.pass_context
def delete(ctx: click.Context, pipeline_id: str):
"""Delete a pipeline."""
client_obj: client.Client = ctx.obj['client']
output_format = ctx.obj['output']
confirmation = f'Are you sure you want to delete pipeline {pipeline_id}?'
if not click.confirm(confirmation):
return
client_obj.delete_pipeline(pipeline_id)
output.print_deleted_text('pipeline', pipeline_id, output_format)