From b8ff1bae0051a0e5232394ed8eb84f75b30edb8c Mon Sep 17 00:00:00 2001 From: Greg Sheremeta Date: Fri, 23 Aug 2024 18:11:08 -0400 Subject: [PATCH] WIP: delete python based visualizations Signed-off-by: Greg Sheremeta --- .github/workflows/backend-visualization.yml | 26 - api/v2alpha1/go/cachekey/cache_key.pb.go | 6 +- .../go/pipelinespec/pipeline_spec.pb.go | 891 ++++++++++-------- backend/Dockerfile.visualization | 40 - backend/Makefile | 6 +- backend/README.md | 10 - .../api/v1beta1/go_client/visualization.pb.go | 468 --------- .../v1beta1/go_client/visualization.pb.gw.go | 205 ---- .../visualization_client.go | 117 --- .../visualization_service_client.go | 59 -- ...vice_create_visualization_v1_parameters.go | 154 --- ...rvice_create_visualization_v1_responses.go | 112 --- .../visualization_model/api_visualization.go | 88 -- .../api_visualization_type.go | 74 -- .../gatewayruntime_error.go | 89 -- .../visualization_model/protobuf_any.go | 175 ---- .../swagger/visualization.swagger.json | 143 --- backend/api/v1beta1/visualization.proto | 107 --- .../api/v2beta1/go_client/visualization.pb.go | 479 ---------- .../v2beta1/go_client/visualization.pb.gw.go | 205 ---- .../visualization_client.go | 117 --- .../visualization_service_client.go | 59 -- ...vice_create_visualization_v1_parameters.go | 154 --- ...rvice_create_visualization_v1_responses.go | 112 --- .../visualization_model/protobuf_any.go | 175 ---- .../visualization_model/runtime_error.go | 89 -- .../v2beta1_visualization.go | 88 -- .../v2beta1_visualization_type.go | 74 -- .../api/v2beta1/python_http_client/README.md | 3 - .../docs/V2beta1Visualization.md | 14 - .../docs/V2beta1VisualizationType.md | 10 - .../docs/VisualizationServiceApi.md | 86 -- .../api/visualization_service_api.py | 174 ---- .../models/v2beta1_visualization.py | 232 ----- .../models/v2beta1_visualization_type.py | 103 -- .../test/test_v2beta1_visualization.py | 56 -- .../test/test_v2beta1_visualization_type.py | 51 - .../test/test_visualization_service_api.py | 39 - .../swagger/visualization.swagger.json | 143 --- backend/api/v2beta1/visualization.proto | 107 --- .../client_manager/client_manager.go | 3 - backend/src/apiserver/common/const.go | 1 - backend/src/apiserver/main.go | 11 +- backend/src/apiserver/server/auth_server.go | 11 +- .../apiserver/server/visualization_server.go | 161 ---- .../server/visualization_server_test.go | 342 ------- .../src/apiserver/visualization/.gitignore | 4 - backend/src/apiserver/visualization/README.md | 178 ---- .../src/apiserver/visualization/exporter.py | 153 --- .../visualization/requirements-test.txt | 1 - .../apiserver/visualization/requirements.in | 19 - .../apiserver/visualization/requirements.txt | 568 ----------- backend/src/apiserver/visualization/server.py | 149 --- .../snapshots/snap_test_exporter.py | 87 -- .../visualization/templates/basic.tpl | 228 ----- .../visualization/templates/full.tpl | 76 -- .../apiserver/visualization/test_exporter.py | 81 -- .../apiserver/visualization/test_server.py | 100 -- .../visualization/types/roc_curve.py | 74 -- .../apiserver/visualization/types/table.py | 50 - .../src/apiserver/visualization/types/test.py | 20 - .../src/apiserver/visualization/types/tfdv.py | 92 -- .../src/apiserver/visualization/types/tfma.py | 17 - .../visualization/update_requirements.sh | 9 - .../api_server/v1/visualization_client.go | 79 -- .../v1/visualization_client_fake.go | 32 - .../integration/visualization_api_test.go | 91 -- developer_guide.md | 17 - frontend/mock-backend/mock-api-middleware.ts | 4 - frontend/package.json | 6 +- frontend/src/apis/visualization/.gitignore | 3 - .../visualization/.swagger-codegen-ignore | 23 - .../visualization/.swagger-codegen/VERSION | 1 - frontend/src/apis/visualization/api.ts | 334 ------- .../src/apis/visualization/configuration.ts | 65 -- frontend/src/apis/visualization/custom.d.ts | 2 - frontend/src/apis/visualization/git_push.sh | 51 - frontend/src/apis/visualization/index.ts | 15 - .../src/apisv2beta1/visualization/.gitignore | 3 - .../visualization/.swagger-codegen-ignore | 23 - .../visualization/.swagger-codegen/VERSION | 1 - frontend/src/apisv2beta1/visualization/api.ts | 338 ------- .../visualization/configuration.ts | 65 -- .../src/apisv2beta1/visualization/custom.d.ts | 2 - .../src/apisv2beta1/visualization/git_push.sh | 51 - .../src/apisv2beta1/visualization/index.ts | 15 - frontend/src/lib/Apis.test.ts | 4 - frontend/src/lib/Apis.ts | 40 - frontend/src/lib/OutputArtifactLoader.ts | 1 - hack/update-all-requirements.sh | 1 - .../templates/pipeline.yaml | 76 -- .../chart/kubeflow-pipelines/values.yaml | 1 - manifests/gcp_marketplace/schema.yaml | 4 - .../multi-user/api-service/params.env | 2 - .../istio-authorization-config.yaml | 31 - .../pipelines-profile-controller/sync.py | 127 +-- .../pipelines-profile-controller/test_sync.py | 28 +- .../multi-user/view-edit-cluster-roles.yaml | 6 - .../base/pipeline/kustomization.yaml | 5 - .../ml-pipeline-visualization-deployment.yaml | 53 -- .../ml-pipeline-visualization-sa.yaml | 4 - .../ml-pipeline-visualization-service.yaml | 12 - .../kustomize/gcp-workload-identity-setup.sh | 2 +- .../openshift/standalone/anyuid-scc.yaml | 1 - test/deploy-pipeline-lite.sh | 1 - test/presubmit-backend-visualization.sh | 23 - test/tag_for_hosted.sh | 5 - 107 files changed, 525 insertions(+), 8898 deletions(-) delete mode 100644 .github/workflows/backend-visualization.yml delete mode 100644 backend/Dockerfile.visualization delete mode 100644 backend/api/v1beta1/go_client/visualization.pb.go delete mode 100644 backend/api/v1beta1/go_client/visualization.pb.gw.go delete mode 100644 backend/api/v1beta1/go_http_client/visualization_client/visualization_client.go delete mode 100644 backend/api/v1beta1/go_http_client/visualization_client/visualization_service/visualization_service_client.go delete mode 100644 backend/api/v1beta1/go_http_client/visualization_client/visualization_service/visualization_service_create_visualization_v1_parameters.go delete mode 100644 backend/api/v1beta1/go_http_client/visualization_client/visualization_service/visualization_service_create_visualization_v1_responses.go delete mode 100644 backend/api/v1beta1/go_http_client/visualization_model/api_visualization.go delete mode 100644 backend/api/v1beta1/go_http_client/visualization_model/api_visualization_type.go delete mode 100644 backend/api/v1beta1/go_http_client/visualization_model/gatewayruntime_error.go delete mode 100644 backend/api/v1beta1/go_http_client/visualization_model/protobuf_any.go delete mode 100644 backend/api/v1beta1/swagger/visualization.swagger.json delete mode 100644 backend/api/v1beta1/visualization.proto delete mode 100644 backend/api/v2beta1/go_client/visualization.pb.go delete mode 100644 backend/api/v2beta1/go_client/visualization.pb.gw.go delete mode 100644 backend/api/v2beta1/go_http_client/visualization_client/visualization_client.go delete mode 100644 backend/api/v2beta1/go_http_client/visualization_client/visualization_service/visualization_service_client.go delete mode 100644 backend/api/v2beta1/go_http_client/visualization_client/visualization_service/visualization_service_create_visualization_v1_parameters.go delete mode 100644 backend/api/v2beta1/go_http_client/visualization_client/visualization_service/visualization_service_create_visualization_v1_responses.go delete mode 100644 backend/api/v2beta1/go_http_client/visualization_model/protobuf_any.go delete mode 100644 backend/api/v2beta1/go_http_client/visualization_model/runtime_error.go delete mode 100644 backend/api/v2beta1/go_http_client/visualization_model/v2beta1_visualization.go delete mode 100644 backend/api/v2beta1/go_http_client/visualization_model/v2beta1_visualization_type.go delete mode 100644 backend/api/v2beta1/python_http_client/docs/V2beta1Visualization.md delete mode 100644 backend/api/v2beta1/python_http_client/docs/V2beta1VisualizationType.md delete mode 100644 backend/api/v2beta1/python_http_client/docs/VisualizationServiceApi.md delete mode 100644 backend/api/v2beta1/python_http_client/kfp_server_api/api/visualization_service_api.py delete mode 100644 backend/api/v2beta1/python_http_client/kfp_server_api/models/v2beta1_visualization.py delete mode 100644 backend/api/v2beta1/python_http_client/kfp_server_api/models/v2beta1_visualization_type.py delete mode 100644 backend/api/v2beta1/python_http_client/test/test_v2beta1_visualization.py delete mode 100644 backend/api/v2beta1/python_http_client/test/test_v2beta1_visualization_type.py delete mode 100644 backend/api/v2beta1/python_http_client/test/test_visualization_service_api.py delete mode 100644 backend/api/v2beta1/swagger/visualization.swagger.json delete mode 100644 backend/api/v2beta1/visualization.proto delete mode 100644 backend/src/apiserver/server/visualization_server.go delete mode 100644 backend/src/apiserver/server/visualization_server_test.go delete mode 100644 backend/src/apiserver/visualization/.gitignore delete mode 100644 backend/src/apiserver/visualization/README.md delete mode 100644 backend/src/apiserver/visualization/exporter.py delete mode 100644 backend/src/apiserver/visualization/requirements-test.txt delete mode 100644 backend/src/apiserver/visualization/requirements.in delete mode 100644 backend/src/apiserver/visualization/requirements.txt delete mode 100644 backend/src/apiserver/visualization/server.py delete mode 100644 backend/src/apiserver/visualization/snapshots/snap_test_exporter.py delete mode 100644 backend/src/apiserver/visualization/templates/basic.tpl delete mode 100644 backend/src/apiserver/visualization/templates/full.tpl delete mode 100644 backend/src/apiserver/visualization/test_exporter.py delete mode 100644 backend/src/apiserver/visualization/test_server.py delete mode 100644 backend/src/apiserver/visualization/types/roc_curve.py delete mode 100644 backend/src/apiserver/visualization/types/table.py delete mode 100644 backend/src/apiserver/visualization/types/test.py delete mode 100644 backend/src/apiserver/visualization/types/tfdv.py delete mode 100644 backend/src/apiserver/visualization/types/tfma.py delete mode 100755 backend/src/apiserver/visualization/update_requirements.sh delete mode 100644 backend/src/common/client/api_server/v1/visualization_client.go delete mode 100644 backend/src/common/client/api_server/v1/visualization_client_fake.go delete mode 100644 backend/test/integration/visualization_api_test.go delete mode 100644 frontend/src/apis/visualization/.gitignore delete mode 100644 frontend/src/apis/visualization/.swagger-codegen-ignore delete mode 100644 frontend/src/apis/visualization/.swagger-codegen/VERSION delete mode 100644 frontend/src/apis/visualization/api.ts delete mode 100644 frontend/src/apis/visualization/configuration.ts delete mode 100644 frontend/src/apis/visualization/custom.d.ts delete mode 100644 frontend/src/apis/visualization/git_push.sh delete mode 100644 frontend/src/apis/visualization/index.ts delete mode 100644 frontend/src/apisv2beta1/visualization/.gitignore delete mode 100644 frontend/src/apisv2beta1/visualization/.swagger-codegen-ignore delete mode 100644 frontend/src/apisv2beta1/visualization/.swagger-codegen/VERSION delete mode 100644 frontend/src/apisv2beta1/visualization/api.ts delete mode 100644 frontend/src/apisv2beta1/visualization/configuration.ts delete mode 100644 frontend/src/apisv2beta1/visualization/custom.d.ts delete mode 100644 frontend/src/apisv2beta1/visualization/git_push.sh delete mode 100644 frontend/src/apisv2beta1/visualization/index.ts delete mode 100644 manifests/kustomize/base/pipeline/ml-pipeline-visualization-deployment.yaml delete mode 100644 manifests/kustomize/base/pipeline/ml-pipeline-visualization-sa.yaml delete mode 100644 manifests/kustomize/base/pipeline/ml-pipeline-visualization-service.yaml delete mode 100755 test/presubmit-backend-visualization.sh diff --git a/.github/workflows/backend-visualization.yml b/.github/workflows/backend-visualization.yml deleted file mode 100644 index 8df4ff0c7a6..00000000000 --- a/.github/workflows/backend-visualization.yml +++ /dev/null @@ -1,26 +0,0 @@ -name: KFP backend visualization tests - -on: - push: - branches: [ master ] - - pull_request: - paths: - - '.github/workflows/backend-visualization.yml' - - 'backend/src/apiserver/visualization/**' - - 'test/presubmit-backend-visualization.sh' - -jobs: - backend-visualization-test: - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Set up Python - uses: actions/setup-python@v4 - with: - python-version: '3.8' - - - name: Run tests - run: ./test/presubmit-backend-visualization.sh diff --git a/api/v2alpha1/go/cachekey/cache_key.pb.go b/api/v2alpha1/go/cachekey/cache_key.pb.go index eb29fd917c7..1d6fa474c0e 100644 --- a/api/v2alpha1/go/cachekey/cache_key.pb.go +++ b/api/v2alpha1/go/cachekey/cache_key.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.26.0 +// protoc-gen-go v1.33.0 // protoc v3.17.3 // source: cache_key.proto @@ -42,7 +42,7 @@ type CacheKey struct { unknownFields protoimpl.UnknownFields InputArtifactNames map[string]*ArtifactNameList `protobuf:"bytes,1,rep,name=inputArtifactNames,proto3" json:"inputArtifactNames,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - // Deprecated: Do not use. + // Deprecated: Marked as deprecated in cache_key.proto. InputParameters map[string]*pipelinespec.Value `protobuf:"bytes,2,rep,name=inputParameters,proto3" json:"inputParameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` OutputArtifactsSpec map[string]*pipelinespec.RuntimeArtifact `protobuf:"bytes,3,rep,name=outputArtifactsSpec,proto3" json:"outputArtifactsSpec,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` OutputParametersSpec map[string]string `protobuf:"bytes,4,rep,name=outputParametersSpec,proto3" json:"outputParametersSpec,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` @@ -89,7 +89,7 @@ func (x *CacheKey) GetInputArtifactNames() map[string]*ArtifactNameList { return nil } -// Deprecated: Do not use. +// Deprecated: Marked as deprecated in cache_key.proto. func (x *CacheKey) GetInputParameters() map[string]*pipelinespec.Value { if x != nil { return x.InputParameters diff --git a/api/v2alpha1/go/pipelinespec/pipeline_spec.pb.go b/api/v2alpha1/go/pipelinespec/pipeline_spec.pb.go index b5d942ae87f..9ed8867a496 100644 --- a/api/v2alpha1/go/pipelinespec/pipeline_spec.pb.go +++ b/api/v2alpha1/go/pipelinespec/pipeline_spec.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.26.0 +// protoc-gen-go v1.33.0 // protoc v3.17.3 // source: pipeline_spec.proto @@ -26,7 +26,7 @@ const ( // The primitive types. // Deprecated. Use [ParameterType.ParameterTypeEnum][] instead. // -// Deprecated: Do not use. +// Deprecated: Marked as deprecated in pipeline_spec.proto. type PrimitiveType_PrimitiveTypeEnum int32 const ( @@ -521,6 +521,7 @@ type ComponentSpec struct { // Either a DAG or a single execution. // // Types that are assignable to Implementation: + // // *ComponentSpec_Dag // *ComponentSpec_ExecutorLabel Implementation isComponentSpec_Implementation `protobuf_oneof:"implementation"` @@ -968,7 +969,7 @@ func (x *TaskOutputsSpec) GetArtifacts() map[string]*TaskOutputsSpec_OutputArtif // Represent primitive types. The wrapper is needed to give a namespace of // enum value so we don't need add `PRIMITIVE_TYPE_` prefix of each enum value. // -// Deprecated: Do not use. +// Deprecated: Marked as deprecated in pipeline_spec.proto. type PrimitiveType struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1071,11 +1072,11 @@ type PipelineTaskSpec struct { // values of input artifact or parameter. The current task will become the // parent of all the fan-out tasks. The output of the current task follows // the following conventions: - // * Output artifacts with the same name of each iteration will be merged - // into one output artifact channel of the parent iterator task. - // * Output parameters with the same name of each iteration will be merged - // into a string output parameter with the same name with content being a - // JSON array. + // - Output artifacts with the same name of each iteration will be merged + // into one output artifact channel of the parent iterator task. + // - Output parameters with the same name of each iteration will be merged + // into a string output parameter with the same name with content being a + // JSON array. // // For example, if an iterator starts two sub-tasks (t1 and t2) with the // following outputs. @@ -1088,6 +1089,7 @@ type PipelineTaskSpec struct { // parent_task.outputs.aritfacts = { 'a': [a1, a2] } // // Types that are assignable to Iterator: + // // *PipelineTaskSpec_ArtifactIterator // *PipelineTaskSpec_ParameterIterator Iterator isPipelineTaskSpec_Iterator `protobuf_oneof:"iterator"` @@ -1471,6 +1473,7 @@ type ArtifactTypeSchema struct { unknownFields protoimpl.UnknownFields // Types that are assignable to Kind: + // // *ArtifactTypeSchema_SchemaTitle // *ArtifactTypeSchema_SchemaUri // *ArtifactTypeSchema_InstanceSchema @@ -1526,7 +1529,7 @@ func (x *ArtifactTypeSchema) GetSchemaTitle() string { return "" } -// Deprecated: Do not use. +// Deprecated: Marked as deprecated in pipeline_spec.proto. func (x *ArtifactTypeSchema) GetSchemaUri() string { if x, ok := x.GetKind().(*ArtifactTypeSchema_SchemaUri); ok { return x.SchemaUri @@ -1569,7 +1572,7 @@ type ArtifactTypeSchema_SchemaUri struct { // Deprecated. Use [PipelineArtifactTypeSchema.schema_title][] or // [PipelineArtifactTypeSchema.instance_schema][] instead. // - // Deprecated: Do not use. + // Deprecated: Marked as deprecated in pipeline_spec.proto. SchemaUri string `protobuf:"bytes,2,opt,name=schema_uri,json=schemaUri,proto3,oneof"` } @@ -1644,6 +1647,7 @@ type ValueOrRuntimeParameter struct { unknownFields protoimpl.UnknownFields // Types that are assignable to Value: + // // *ValueOrRuntimeParameter_ConstantValue // *ValueOrRuntimeParameter_RuntimeParameter // *ValueOrRuntimeParameter_Constant @@ -1689,7 +1693,7 @@ func (m *ValueOrRuntimeParameter) GetValue() isValueOrRuntimeParameter_Value { return nil } -// Deprecated: Do not use. +// Deprecated: Marked as deprecated in pipeline_spec.proto. func (x *ValueOrRuntimeParameter) GetConstantValue() *Value { if x, ok := x.GetValue().(*ValueOrRuntimeParameter_ConstantValue); ok { return x.ConstantValue @@ -1719,7 +1723,7 @@ type ValueOrRuntimeParameter_ConstantValue struct { // Constant value which is determined in compile time. // Deprecated. Use [ValueOrRuntimeParameter.constant][] instead. // - // Deprecated: Do not use. + // Deprecated: Marked as deprecated in pipeline_spec.proto. ConstantValue *Value `protobuf:"bytes,1,opt,name=constant_value,json=constantValue,proto3,oneof"` } @@ -1796,6 +1800,7 @@ type Value struct { unknownFields protoimpl.UnknownFields // Types that are assignable to Value: + // // *Value_IntValue // *Value_DoubleValue // *Value_StringValue @@ -1902,12 +1907,12 @@ type RuntimeArtifact struct { // The properties of the artifact. // Deprecated. Use [RuntimeArtifact.metadata][] instead. // - // Deprecated: Do not use. + // Deprecated: Marked as deprecated in pipeline_spec.proto. Properties map[string]*Value `protobuf:"bytes,4,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // The custom properties of the artifact. // Deprecated. Use [RuntimeArtifact.metadata][] instead. // - // Deprecated: Do not use. + // Deprecated: Marked as deprecated in pipeline_spec.proto. CustomProperties map[string]*Value `protobuf:"bytes,5,rep,name=custom_properties,json=customProperties,proto3" json:"custom_properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Properties of the Artifact. Metadata *structpb.Struct `protobuf:"bytes,6,opt,name=metadata,proto3" json:"metadata,omitempty"` @@ -1966,7 +1971,7 @@ func (x *RuntimeArtifact) GetUri() string { return "" } -// Deprecated: Do not use. +// Deprecated: Marked as deprecated in pipeline_spec.proto. func (x *RuntimeArtifact) GetProperties() map[string]*Value { if x != nil { return x.Properties @@ -1974,7 +1979,7 @@ func (x *RuntimeArtifact) GetProperties() map[string]*Value { return nil } -// Deprecated: Do not use. +// Deprecated: Marked as deprecated in pipeline_spec.proto. func (x *RuntimeArtifact) GetCustomProperties() map[string]*Value { if x != nil { return x.CustomProperties @@ -2130,7 +2135,7 @@ type ExecutorOutput struct { // The values for output parameters. // Deprecated. Use [ExecutorOutput.parameter_values][] instead. // - // Deprecated: Do not use. + // Deprecated: Marked as deprecated in pipeline_spec.proto. Parameters map[string]*Value `protobuf:"bytes,1,rep,name=parameters,proto3" json:"parameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // The updated metadata for output artifact. Artifacts map[string]*ArtifactList `protobuf:"bytes,2,rep,name=artifacts,proto3" json:"artifacts,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` @@ -2170,7 +2175,7 @@ func (*ExecutorOutput) Descriptor() ([]byte, []int) { return file_pipeline_spec_proto_rawDescGZIP(), []int{24} } -// Deprecated: Do not use. +// Deprecated: Marked as deprecated in pipeline_spec.proto. func (x *ExecutorOutput) GetParameters() map[string]*Value { if x != nil { return x.Parameters @@ -2206,11 +2211,11 @@ type PipelineTaskFinalStatus struct { Error *status.Status `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` // The pipeline job unique id. // - // Deprecated: Do not use. + // Deprecated: Marked as deprecated in pipeline_spec.proto. PipelineJobUuid int64 `protobuf:"varint,3,opt,name=pipeline_job_uuid,json=pipelineJobUuid,proto3" json:"pipeline_job_uuid,omitempty"` // The pipeline job name from the [PipelineJob.name][]. // - // Deprecated: Do not use. + // Deprecated: Marked as deprecated in pipeline_spec.proto. PipelineJobName string `protobuf:"bytes,4,opt,name=pipeline_job_name,json=pipelineJobName,proto3" json:"pipeline_job_name,omitempty"` // The pipeline job resource name, in the format of // `projects/{project}/locations/{location}/pipelineJobs/{pipeline_job}`. @@ -2265,7 +2270,7 @@ func (x *PipelineTaskFinalStatus) GetError() *status.Status { return nil } -// Deprecated: Do not use. +// Deprecated: Marked as deprecated in pipeline_spec.proto. func (x *PipelineTaskFinalStatus) GetPipelineJobUuid() int64 { if x != nil { return x.PipelineJobUuid @@ -2273,7 +2278,7 @@ func (x *PipelineTaskFinalStatus) GetPipelineJobUuid() int64 { return 0 } -// Deprecated: Do not use. +// Deprecated: Marked as deprecated in pipeline_spec.proto. func (x *PipelineTaskFinalStatus) GetPipelineJobName() string { if x != nil { return x.PipelineJobName @@ -2487,7 +2492,7 @@ type PipelineJob_RuntimeConfig struct { // Deprecated. Use [RuntimeConfig.parameter_values][] instead. // - // Deprecated: Do not use. + // Deprecated: Marked as deprecated in pipeline_spec.proto. Parameters map[string]*Value `protobuf:"bytes,1,rep,name=parameters,proto3" json:"parameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // A path in a Cloud Storage bucket which will be treated as the root // output directory of the pipeline. It is used by the system to @@ -2532,7 +2537,7 @@ func (*PipelineJob_RuntimeConfig) Descriptor() ([]byte, []int) { return file_pipeline_spec_proto_rawDescGZIP(), []int{0, 1} } -// Deprecated: Do not use. +// Deprecated: Marked as deprecated in pipeline_spec.proto. func (x *PipelineJob_RuntimeConfig) GetParameters() map[string]*Value { if x != nil { return x.Parameters @@ -2892,6 +2897,7 @@ type DagOutputsSpec_DagOutputParameterSpec struct { unknownFields protoimpl.UnknownFields // Types that are assignable to Kind: + // // *DagOutputsSpec_DagOutputParameterSpec_ValueFromParameter // *DagOutputsSpec_DagOutputParameterSpec_ValueFromOneof Kind isDagOutputsSpec_DagOutputParameterSpec_Kind `protobuf_oneof:"kind"` @@ -3064,7 +3070,7 @@ type ComponentInputsSpec_ParameterSpec struct { // Specifies an input parameter's type. // Deprecated. Use [ParameterSpec.parameter_type][] instead. // - // Deprecated: Do not use. + // Deprecated: Marked as deprecated in pipeline_spec.proto. Type PrimitiveType_PrimitiveTypeEnum `protobuf:"varint,1,opt,name=type,proto3,enum=ml_pipelines.PrimitiveType_PrimitiveTypeEnum" json:"type,omitempty"` // Specifies an input parameter's type. ParameterType ParameterType_ParameterTypeEnum `protobuf:"varint,2,opt,name=parameter_type,json=parameterType,proto3,enum=ml_pipelines.ParameterType_ParameterTypeEnum" json:"parameter_type,omitempty"` @@ -3117,7 +3123,7 @@ func (*ComponentInputsSpec_ParameterSpec) Descriptor() ([]byte, []int) { return file_pipeline_spec_proto_rawDescGZIP(), []int{5, 1} } -// Deprecated: Do not use. +// Deprecated: Marked as deprecated in pipeline_spec.proto. func (x *ComponentInputsSpec_ParameterSpec) GetType() PrimitiveType_PrimitiveTypeEnum { if x != nil { return x.Type @@ -3162,11 +3168,11 @@ type ComponentOutputsSpec_ArtifactSpec struct { ArtifactType *ArtifactTypeSchema `protobuf:"bytes,1,opt,name=artifact_type,json=artifactType,proto3" json:"artifact_type,omitempty"` // Deprecated. Use [ArtifactSpec.metadata][] instead. // - // Deprecated: Do not use. + // Deprecated: Marked as deprecated in pipeline_spec.proto. Properties map[string]*ValueOrRuntimeParameter `protobuf:"bytes,2,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Deprecated. Use [ArtifactSpec.metadata][] instead. // - // Deprecated: Do not use. + // Deprecated: Marked as deprecated in pipeline_spec.proto. CustomProperties map[string]*ValueOrRuntimeParameter `protobuf:"bytes,3,rep,name=custom_properties,json=customProperties,proto3" json:"custom_properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Properties of the Artifact. Metadata *structpb.Struct `protobuf:"bytes,4,opt,name=metadata,proto3" json:"metadata,omitempty"` @@ -3216,7 +3222,7 @@ func (x *ComponentOutputsSpec_ArtifactSpec) GetArtifactType() *ArtifactTypeSchem return nil } -// Deprecated: Do not use. +// Deprecated: Marked as deprecated in pipeline_spec.proto. func (x *ComponentOutputsSpec_ArtifactSpec) GetProperties() map[string]*ValueOrRuntimeParameter { if x != nil { return x.Properties @@ -3224,7 +3230,7 @@ func (x *ComponentOutputsSpec_ArtifactSpec) GetProperties() map[string]*ValueOrR return nil } -// Deprecated: Do not use. +// Deprecated: Marked as deprecated in pipeline_spec.proto. func (x *ComponentOutputsSpec_ArtifactSpec) GetCustomProperties() map[string]*ValueOrRuntimeParameter { if x != nil { return x.CustomProperties @@ -3262,7 +3268,7 @@ type ComponentOutputsSpec_ParameterSpec struct { // Specifies an input parameter's type. // Deprecated. Use [ParameterSpec.parameter_type][] instead. // - // Deprecated: Do not use. + // Deprecated: Marked as deprecated in pipeline_spec.proto. Type PrimitiveType_PrimitiveTypeEnum `protobuf:"varint,1,opt,name=type,proto3,enum=ml_pipelines.PrimitiveType_PrimitiveTypeEnum" json:"type,omitempty"` // Specifies an output parameter's type. ParameterType ParameterType_ParameterTypeEnum `protobuf:"varint,2,opt,name=parameter_type,json=parameterType,proto3,enum=ml_pipelines.ParameterType_ParameterTypeEnum" json:"parameter_type,omitempty"` @@ -3303,7 +3309,7 @@ func (*ComponentOutputsSpec_ParameterSpec) Descriptor() ([]byte, []int) { return file_pipeline_spec_proto_rawDescGZIP(), []int{6, 1} } -// Deprecated: Do not use. +// Deprecated: Marked as deprecated in pipeline_spec.proto. func (x *ComponentOutputsSpec_ParameterSpec) GetType() PrimitiveType_PrimitiveTypeEnum { if x != nil { return x.Type @@ -3332,6 +3338,7 @@ type TaskInputsSpec_InputArtifactSpec struct { unknownFields protoimpl.UnknownFields // Types that are assignable to Kind: + // // *TaskInputsSpec_InputArtifactSpec_TaskOutputArtifact // *TaskInputsSpec_InputArtifactSpec_ComponentInputArtifact Kind isTaskInputsSpec_InputArtifactSpec_Kind `protobuf_oneof:"kind"` @@ -3421,6 +3428,7 @@ type TaskInputsSpec_InputParameterSpec struct { unknownFields protoimpl.UnknownFields // Types that are assignable to Kind: + // // *TaskInputsSpec_InputParameterSpec_TaskOutputParameter // *TaskInputsSpec_InputParameterSpec_RuntimeValue // *TaskInputsSpec_InputParameterSpec_ComponentInputParameter @@ -4160,6 +4168,7 @@ type ParameterIteratorSpec_ItemsSpec struct { // as a new input parameter as specified by [item_input][]. // // Types that are assignable to Kind: + // // *ParameterIteratorSpec_ItemsSpec_Raw // *ParameterIteratorSpec_ItemsSpec_InputParameter Kind isParameterIteratorSpec_ItemsSpec_Kind `protobuf_oneof:"kind"` @@ -4348,12 +4357,12 @@ type PipelineDeploymentConfig_ImporterSpec struct { // The properties of the artifact. // Deprecated. Use [ImporterSpec.metadata][] instead. // - // Deprecated: Do not use. + // Deprecated: Marked as deprecated in pipeline_spec.proto. Properties map[string]*ValueOrRuntimeParameter `protobuf:"bytes,3,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // The custom properties of the artifact. // Deprecated. Use [ImporterSpec.metadata][] instead. // - // Deprecated: Do not use. + // Deprecated: Marked as deprecated in pipeline_spec.proto. CustomProperties map[string]*ValueOrRuntimeParameter `protobuf:"bytes,4,rep,name=custom_properties,json=customProperties,proto3" json:"custom_properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Properties of the Artifact. Metadata *structpb.Struct `protobuf:"bytes,6,opt,name=metadata,proto3" json:"metadata,omitempty"` @@ -4407,7 +4416,7 @@ func (x *PipelineDeploymentConfig_ImporterSpec) GetTypeSchema() *ArtifactTypeSch return nil } -// Deprecated: Do not use. +// Deprecated: Marked as deprecated in pipeline_spec.proto. func (x *PipelineDeploymentConfig_ImporterSpec) GetProperties() map[string]*ValueOrRuntimeParameter { if x != nil { return x.Properties @@ -4415,7 +4424,7 @@ func (x *PipelineDeploymentConfig_ImporterSpec) GetProperties() map[string]*Valu return nil } -// Deprecated: Do not use. +// Deprecated: Marked as deprecated in pipeline_spec.proto. func (x *PipelineDeploymentConfig_ImporterSpec) GetCustomProperties() map[string]*ValueOrRuntimeParameter { if x != nil { return x.CustomProperties @@ -4491,7 +4500,7 @@ func (x *PipelineDeploymentConfig_ResolverSpec) GetOutputArtifactQueries() map[s return nil } -// Deprecated: Do not use. +// Deprecated: Marked as deprecated in pipeline_spec.proto. type PipelineDeploymentConfig_AIPlatformCustomJobSpec struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4554,6 +4563,7 @@ type PipelineDeploymentConfig_ExecutorSpec struct { unknownFields protoimpl.UnknownFields // Types that are assignable to Spec: + // // *PipelineDeploymentConfig_ExecutorSpec_Container // *PipelineDeploymentConfig_ExecutorSpec_Importer // *PipelineDeploymentConfig_ExecutorSpec_Resolver @@ -4621,7 +4631,7 @@ func (x *PipelineDeploymentConfig_ExecutorSpec) GetResolver() *PipelineDeploymen return nil } -// Deprecated: Do not use. +// Deprecated: Marked as deprecated in pipeline_spec.proto. func (x *PipelineDeploymentConfig_ExecutorSpec) GetCustomJob() *PipelineDeploymentConfig_AIPlatformCustomJobSpec { if x, ok := x.GetSpec().(*PipelineDeploymentConfig_ExecutorSpec_CustomJob); ok { return x.CustomJob @@ -4651,7 +4661,7 @@ type PipelineDeploymentConfig_ExecutorSpec_Resolver struct { type PipelineDeploymentConfig_ExecutorSpec_CustomJob struct { // Starts a Google Cloud AI Platform CustomJob. // - // Deprecated: Do not use. + // Deprecated: Marked as deprecated in pipeline_spec.proto. CustomJob *PipelineDeploymentConfig_AIPlatformCustomJobSpec `protobuf:"bytes,4,opt,name=custom_job,json=customJob,proto3,oneof"` } @@ -4733,17 +4743,45 @@ type PipelineDeploymentConfig_PipelineContainerSpec_ResourceSpec struct { // The limit of the number of vCPU cores. This container execution needs // at most cpu_limit vCPU to run. + // Deprecated. Use [ResourceSpec.resource_cpu_limit] instead. + // + // Deprecated: Marked as deprecated in pipeline_spec.proto. CpuLimit float64 `protobuf:"fixed64,1,opt,name=cpu_limit,json=cpuLimit,proto3" json:"cpu_limit,omitempty"` // The memory limit in GB. This container execution needs at most // memory_limit RAM to run. + // Deprecated. Use [ResourceSpec.resource_memory_limit] instead. + // + // Deprecated: Marked as deprecated in pipeline_spec.proto. MemoryLimit float64 `protobuf:"fixed64,2,opt,name=memory_limit,json=memoryLimit,proto3" json:"memory_limit,omitempty"` // The request of the number of vCPU cores. This container execution // needs at least cpu_request vCPU to run. + // Deprecated. Use [ResourceSpec.resource_cpu_request] instead. + // + // Deprecated: Marked as deprecated in pipeline_spec.proto. CpuRequest float64 `protobuf:"fixed64,5,opt,name=cpu_request,json=cpuRequest,proto3" json:"cpu_request,omitempty"` // The memory request in GB. This container execution needs at least // memory_request RAM to run. - MemoryRequest float64 `protobuf:"fixed64,6,opt,name=memory_request,json=memoryRequest,proto3" json:"memory_request,omitempty"` - Accelerator *PipelineDeploymentConfig_PipelineContainerSpec_ResourceSpec_AcceleratorConfig `protobuf:"bytes,3,opt,name=accelerator,proto3" json:"accelerator,omitempty"` + // Deprecated. Use [ResourceSpec.resource_memory_request] instead. + // + // Deprecated: Marked as deprecated in pipeline_spec.proto. + MemoryRequest float64 `protobuf:"fixed64,6,opt,name=memory_request,json=memoryRequest,proto3" json:"memory_request,omitempty"` + // The limit of the number of vCPU cores. This container execution needs + // at most resource_cpu_limit vCPU to run. Handles static values and + // placeholders. + ResourceCpuLimit string `protobuf:"bytes,7,opt,name=resource_cpu_limit,json=resourceCpuLimit,proto3" json:"resource_cpu_limit,omitempty"` + // The memory limit in GB. This container execution needs + // at most resource_memory_limit RAM to run. Handles static values and + // placeholders. + ResourceMemoryLimit string `protobuf:"bytes,8,opt,name=resource_memory_limit,json=resourceMemoryLimit,proto3" json:"resource_memory_limit,omitempty"` + // The request of the number of vCPU cores. This container + // execution needs at least resource_cpu_request vCPU to run. Handles + // static values and placeholders. + ResourceCpuRequest string `protobuf:"bytes,9,opt,name=resource_cpu_request,json=resourceCpuRequest,proto3" json:"resource_cpu_request,omitempty"` + // The memory request in GB. This container execution + // needs at least resource_memory_request RAM to run. Handles static + // values and placeholders. + ResourceMemoryRequest string `protobuf:"bytes,10,opt,name=resource_memory_request,json=resourceMemoryRequest,proto3" json:"resource_memory_request,omitempty"` + Accelerator *PipelineDeploymentConfig_PipelineContainerSpec_ResourceSpec_AcceleratorConfig `protobuf:"bytes,3,opt,name=accelerator,proto3" json:"accelerator,omitempty"` } func (x *PipelineDeploymentConfig_PipelineContainerSpec_ResourceSpec) Reset() { @@ -4778,6 +4816,7 @@ func (*PipelineDeploymentConfig_PipelineContainerSpec_ResourceSpec) Descriptor() return file_pipeline_spec_proto_rawDescGZIP(), []int{19, 0, 1} } +// Deprecated: Marked as deprecated in pipeline_spec.proto. func (x *PipelineDeploymentConfig_PipelineContainerSpec_ResourceSpec) GetCpuLimit() float64 { if x != nil { return x.CpuLimit @@ -4785,6 +4824,7 @@ func (x *PipelineDeploymentConfig_PipelineContainerSpec_ResourceSpec) GetCpuLimi return 0 } +// Deprecated: Marked as deprecated in pipeline_spec.proto. func (x *PipelineDeploymentConfig_PipelineContainerSpec_ResourceSpec) GetMemoryLimit() float64 { if x != nil { return x.MemoryLimit @@ -4792,6 +4832,7 @@ func (x *PipelineDeploymentConfig_PipelineContainerSpec_ResourceSpec) GetMemoryL return 0 } +// Deprecated: Marked as deprecated in pipeline_spec.proto. func (x *PipelineDeploymentConfig_PipelineContainerSpec_ResourceSpec) GetCpuRequest() float64 { if x != nil { return x.CpuRequest @@ -4799,6 +4840,7 @@ func (x *PipelineDeploymentConfig_PipelineContainerSpec_ResourceSpec) GetCpuRequ return 0 } +// Deprecated: Marked as deprecated in pipeline_spec.proto. func (x *PipelineDeploymentConfig_PipelineContainerSpec_ResourceSpec) GetMemoryRequest() float64 { if x != nil { return x.MemoryRequest @@ -4806,6 +4848,34 @@ func (x *PipelineDeploymentConfig_PipelineContainerSpec_ResourceSpec) GetMemoryR return 0 } +func (x *PipelineDeploymentConfig_PipelineContainerSpec_ResourceSpec) GetResourceCpuLimit() string { + if x != nil { + return x.ResourceCpuLimit + } + return "" +} + +func (x *PipelineDeploymentConfig_PipelineContainerSpec_ResourceSpec) GetResourceMemoryLimit() string { + if x != nil { + return x.ResourceMemoryLimit + } + return "" +} + +func (x *PipelineDeploymentConfig_PipelineContainerSpec_ResourceSpec) GetResourceCpuRequest() string { + if x != nil { + return x.ResourceCpuRequest + } + return "" +} + +func (x *PipelineDeploymentConfig_PipelineContainerSpec_ResourceSpec) GetResourceMemoryRequest() string { + if x != nil { + return x.ResourceMemoryRequest + } + return "" +} + func (x *PipelineDeploymentConfig_PipelineContainerSpec_ResourceSpec) GetAccelerator() *PipelineDeploymentConfig_PipelineContainerSpec_ResourceSpec_AcceleratorConfig { if x != nil { return x.Accelerator @@ -4946,9 +5016,23 @@ type PipelineDeploymentConfig_PipelineContainerSpec_ResourceSpec_AcceleratorConf unknownFields protoimpl.UnknownFields // The type of accelerators. + // Deprecated. Use [ResourceSpec.AcceleratorConfig.resource_type] + // instead. + // + // Deprecated: Marked as deprecated in pipeline_spec.proto. Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // The number of accelerators. + // Deprecated. Use [ResourceSpec.AcceleratorConfig.resource_count] + // instead. + // + // Deprecated: Marked as deprecated in pipeline_spec.proto. Count int64 `protobuf:"varint,2,opt,name=count,proto3" json:"count,omitempty"` + // The type of accelerators. Handles static values and + // placeholders. + ResourceType string `protobuf:"bytes,3,opt,name=resource_type,json=resourceType,proto3" json:"resource_type,omitempty"` + // The number of accelerators. Handles static values and + // placeholders. + ResourceCount string `protobuf:"bytes,4,opt,name=resource_count,json=resourceCount,proto3" json:"resource_count,omitempty"` } func (x *PipelineDeploymentConfig_PipelineContainerSpec_ResourceSpec_AcceleratorConfig) Reset() { @@ -4984,6 +5068,7 @@ func (*PipelineDeploymentConfig_PipelineContainerSpec_ResourceSpec_AcceleratorCo return file_pipeline_spec_proto_rawDescGZIP(), []int{19, 0, 1, 0} } +// Deprecated: Marked as deprecated in pipeline_spec.proto. func (x *PipelineDeploymentConfig_PipelineContainerSpec_ResourceSpec_AcceleratorConfig) GetType() string { if x != nil { return x.Type @@ -4991,6 +5076,7 @@ func (x *PipelineDeploymentConfig_PipelineContainerSpec_ResourceSpec_Accelerator return "" } +// Deprecated: Marked as deprecated in pipeline_spec.proto. func (x *PipelineDeploymentConfig_PipelineContainerSpec_ResourceSpec_AcceleratorConfig) GetCount() int64 { if x != nil { return x.Count @@ -4998,6 +5084,20 @@ func (x *PipelineDeploymentConfig_PipelineContainerSpec_ResourceSpec_Accelerator return 0 } +func (x *PipelineDeploymentConfig_PipelineContainerSpec_ResourceSpec_AcceleratorConfig) GetResourceType() string { + if x != nil { + return x.ResourceType + } + return "" +} + +func (x *PipelineDeploymentConfig_PipelineContainerSpec_ResourceSpec_AcceleratorConfig) GetResourceCount() string { + if x != nil { + return x.ResourceCount + } + return "" +} + // The query to fetch artifacts. type PipelineDeploymentConfig_ResolverSpec_ArtifactQuerySpec struct { state protoimpl.MessageState @@ -5074,7 +5174,7 @@ type ExecutorInput_Inputs struct { // Input parameters of the execution. // Deprecated. Use [ExecutorInput.Inputs.parameter_values][] instead. // - // Deprecated: Do not use. + // Deprecated: Marked as deprecated in pipeline_spec.proto. Parameters map[string]*Value `protobuf:"bytes,1,rep,name=parameters,proto3" json:"parameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Input artifacts of the execution. Artifacts map[string]*ArtifactList `protobuf:"bytes,2,rep,name=artifacts,proto3" json:"artifacts,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` @@ -5114,7 +5214,7 @@ func (*ExecutorInput_Inputs) Descriptor() ([]byte, []int) { return file_pipeline_spec_proto_rawDescGZIP(), []int{23, 0} } -// Deprecated: Do not use. +// Deprecated: Marked as deprecated in pipeline_spec.proto. func (x *ExecutorInput_Inputs) GetParameters() map[string]*Value { if x != nil { return x.Parameters @@ -5926,15 +6026,15 @@ var file_pipeline_spec_proto_rawDesc = []byte{ 0x34, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x08, 0x63, 0x6f, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x74, 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x9e, - 0x15, 0x0a, 0x18, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, + 0x73, 0x74, 0x61, 0x6e, 0x74, 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xcf, + 0x17, 0x0a, 0x18, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x53, 0x0a, 0x09, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, - 0x1a, 0xcb, 0x07, 0x0a, 0x15, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6e, + 0x1a, 0xfc, 0x09, 0x0a, 0x15, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, @@ -5969,357 +6069,376 @@ var file_pipeline_spec_proto_rawDesc = []byte{ 0x68, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x1a, 0x34, 0x0a, 0x04, 0x45, 0x78, 0x65, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x72, 0x67, - 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x1a, 0xda, 0x02, - 0x0a, 0x0c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, 0x12, 0x1b, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x1a, 0x8b, 0x05, + 0x0a, 0x0c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, 0x12, 0x1f, 0x0a, 0x09, 0x63, 0x70, 0x75, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x01, 0x52, 0x08, 0x63, 0x70, 0x75, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x6d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x01, 0x52, 0x0b, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1f, - 0x0a, 0x0b, 0x63, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x0a, 0x63, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x25, 0x0a, 0x0e, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0d, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x7d, 0x0a, 0x0b, 0x61, 0x63, 0x63, 0x65, 0x6c, 0x65, - 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x5b, 0x2e, 0x6d, 0x6c, - 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, - 0x69, 0x6e, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x65, 0x72, 0x61, 0x74, - 0x6f, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0b, 0x61, 0x63, 0x63, 0x65, 0x6c, 0x65, - 0x72, 0x61, 0x74, 0x6f, 0x72, 0x1a, 0x3d, 0x0a, 0x11, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x65, 0x72, - 0x61, 0x74, 0x6f, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x1a, 0x32, 0x0a, 0x06, 0x45, 0x6e, - 0x76, 0x56, 0x61, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x1a, 0xa3, - 0x05, 0x0a, 0x0c, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x12, - 0x48, 0x0a, 0x0c, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x5f, 0x75, 0x72, 0x69, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, - 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x72, 0x52, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x52, 0x0b, 0x61, 0x72, - 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x55, 0x72, 0x69, 0x12, 0x41, 0x0a, 0x0b, 0x74, 0x79, 0x70, - 0x65, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, - 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x41, 0x72, - 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x52, 0x0a, 0x74, 0x79, 0x70, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x67, 0x0a, 0x0a, - 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x43, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, - 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, - 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x7a, 0x0a, 0x11, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, - 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x49, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, - 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, - 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x72, 0x6f, 0x70, - 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x02, 0x18, 0x01, 0x52, - 0x10, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, - 0x73, 0x12, 0x33, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x6d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x69, 0x6d, 0x70, 0x6f, - 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x69, 0x6d, 0x70, 0x6f, - 0x72, 0x74, 0x1a, 0x64, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3b, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, - 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x72, 0x52, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x6a, 0x0a, 0x15, 0x43, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x3b, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, - 0x73, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x72, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x1a, 0xec, 0x02, 0x0a, 0x0c, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, - 0x72, 0x53, 0x70, 0x65, 0x63, 0x12, 0x86, 0x01, 0x0a, 0x17, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x5f, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x4e, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, + 0x01, 0x42, 0x02, 0x18, 0x01, 0x52, 0x08, 0x63, 0x70, 0x75, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, + 0x25, 0x0a, 0x0c, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x01, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0b, 0x6d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x23, 0x0a, 0x0b, 0x63, 0x70, 0x75, 0x5f, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x42, 0x02, 0x18, 0x01, 0x52, + 0x0a, 0x63, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x0e, 0x6d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x01, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0d, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x12, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x70, 0x75, 0x4c, + 0x69, 0x6d, 0x69, 0x74, 0x12, 0x32, 0x0a, 0x15, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x13, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x30, 0x0a, 0x14, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x43, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x36, 0x0a, 0x17, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x7d, 0x0a, 0x0b, 0x61, 0x63, 0x63, 0x65, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x6f, + 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x5b, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, - 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x4f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x51, 0x75, 0x65, 0x72, 0x69, - 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x15, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x41, - 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x51, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x1a, 0x41, - 0x0a, 0x11, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, - 0x70, 0x65, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, - 0x74, 0x1a, 0x8f, 0x01, 0x0a, 0x1a, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x41, 0x72, 0x74, 0x69, - 0x66, 0x61, 0x63, 0x74, 0x51, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x5b, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x45, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, + 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x70, + 0x65, 0x63, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0b, 0x61, 0x63, 0x63, 0x65, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x6f, + 0x72, 0x1a, 0x91, 0x01, 0x0a, 0x11, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x6f, + 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x16, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, + 0x18, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x42, 0x02, + 0x18, 0x01, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x25, + 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x1a, 0x32, 0x0a, 0x06, 0x45, + 0x6e, 0x76, 0x56, 0x61, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x1a, + 0xa3, 0x05, 0x0a, 0x0c, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, + 0x12, 0x48, 0x0a, 0x0c, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x5f, 0x75, 0x72, 0x69, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, + 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x72, 0x52, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x52, 0x0b, 0x61, + 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x55, 0x72, 0x69, 0x12, 0x41, 0x0a, 0x0b, 0x74, 0x79, + 0x70, 0x65, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x20, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x41, + 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x52, 0x0a, 0x74, 0x79, 0x70, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x67, 0x0a, + 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x43, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, - 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, - 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x53, 0x70, 0x65, 0x63, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x1a, 0x55, 0x0a, 0x17, 0x41, 0x49, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, - 0x6d, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x12, 0x36, - 0x0a, 0x0a, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6a, 0x6f, 0x62, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x09, 0x63, 0x75, 0x73, - 0x74, 0x6f, 0x6d, 0x4a, 0x6f, 0x62, 0x3a, 0x02, 0x18, 0x01, 0x1a, 0xff, 0x02, 0x0a, 0x0c, 0x45, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x53, 0x70, 0x65, 0x63, 0x12, 0x5c, 0x0a, 0x09, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3c, - 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x50, 0x69, - 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x43, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x48, 0x00, 0x52, 0x09, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x51, 0x0a, 0x08, 0x69, 0x6d, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x6d, 0x6c, - 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, - 0x69, 0x6e, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, - 0x48, 0x00, 0x52, 0x08, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x51, 0x0a, 0x08, - 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, - 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x50, 0x69, - 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x53, - 0x70, 0x65, 0x63, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x12, - 0x63, 0x0a, 0x0a, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6a, 0x6f, 0x62, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, - 0x65, 0x73, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, - 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x41, 0x49, 0x50, 0x6c, - 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4a, 0x6f, 0x62, 0x53, - 0x70, 0x65, 0x63, 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, 0x52, 0x09, 0x63, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x4a, 0x6f, 0x62, 0x42, 0x06, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x1a, 0x71, 0x0a, 0x0e, - 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x49, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x7a, 0x0a, 0x11, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x49, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, + 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, + 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x02, 0x18, 0x01, + 0x52, 0x10, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x12, 0x33, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x69, 0x6d, 0x70, + 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x69, 0x6d, 0x70, + 0x6f, 0x72, 0x74, 0x1a, 0x64, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3b, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, + 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x72, 0x52, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x6a, 0x0a, 0x15, 0x43, 0x75, 0x73, + 0x74, 0x6f, 0x6d, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3b, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, + 0x65, 0x73, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x72, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0xec, 0x02, 0x0a, 0x0c, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, + 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x12, 0x86, 0x01, 0x0a, 0x17, 0x6f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x5f, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x69, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x4e, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, + 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, + 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x4f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x51, 0x75, 0x65, 0x72, + 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x15, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x51, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x1a, + 0x41, 0x0a, 0x11, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x53, 0x70, 0x65, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x1a, 0x8f, 0x01, 0x0a, 0x1a, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x41, 0x72, 0x74, + 0x69, 0x66, 0x61, 0x63, 0x74, 0x51, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x5b, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x45, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, + 0x73, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, + 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x6c, + 0x76, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x70, 0x65, 0x63, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x55, 0x0a, 0x17, 0x41, 0x49, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, + 0x72, 0x6d, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x12, + 0x36, 0x0a, 0x0a, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6a, 0x6f, 0x62, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x09, 0x63, 0x75, + 0x73, 0x74, 0x6f, 0x6d, 0x4a, 0x6f, 0x62, 0x3a, 0x02, 0x18, 0x01, 0x1a, 0xff, 0x02, 0x0a, 0x0c, + 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x53, 0x70, 0x65, 0x63, 0x12, 0x5c, 0x0a, 0x09, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x3c, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x50, + 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, + 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, + 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x48, 0x00, 0x52, + 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x51, 0x0a, 0x08, 0x69, 0x6d, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x6d, + 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x50, 0x69, 0x70, 0x65, + 0x6c, 0x69, 0x6e, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x53, 0x70, 0x65, + 0x63, 0x48, 0x00, 0x52, 0x08, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x51, 0x0a, + 0x08, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, - 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, - 0x53, 0x70, 0x65, 0x63, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0x79, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x5f, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x08, 0x69, - 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x64, 0x6f, 0x75, 0x62, 0x6c, - 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, - 0x0b, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0c, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x89, 0x04, 0x0a, 0x0f, 0x52, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x34, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x20, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, - 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x53, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x69, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x69, 0x12, 0x51, 0x0a, 0x0a, 0x70, 0x72, - 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, - 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x52, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x2e, 0x50, 0x72, - 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x02, 0x18, - 0x01, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x64, 0x0a, - 0x11, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, - 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, - 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x41, - 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x72, - 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x02, 0x18, - 0x01, 0x52, 0x10, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x12, 0x33, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, - 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x52, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, - 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, - 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x58, 0x0a, 0x15, - 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, - 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x4b, 0x0a, 0x0c, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, - 0x63, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x3b, 0x0a, 0x09, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, - 0x63, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, + 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, + 0x53, 0x70, 0x65, 0x63, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, + 0x12, 0x63, 0x0a, 0x0a, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6a, 0x6f, 0x62, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, + 0x6e, 0x65, 0x73, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x44, 0x65, 0x70, 0x6c, + 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x41, 0x49, 0x50, + 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4a, 0x6f, 0x62, + 0x53, 0x70, 0x65, 0x63, 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, 0x52, 0x09, 0x63, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x4a, 0x6f, 0x62, 0x42, 0x06, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x1a, 0x71, 0x0a, + 0x0e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x49, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x33, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, + 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, + 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, + 0x72, 0x53, 0x70, 0x65, 0x63, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x79, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x69, 0x6e, 0x74, + 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x08, + 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x64, 0x6f, 0x75, 0x62, + 0x6c, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, + 0x52, 0x0b, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, + 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x89, 0x04, 0x0a, 0x0f, + 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x34, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x20, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, + 0x2e, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x69, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x69, 0x12, 0x51, 0x0a, 0x0a, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x2d, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x52, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x2e, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x02, + 0x18, 0x01, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x64, + 0x0a, 0x11, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x52, 0x09, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, - 0x63, 0x74, 0x73, 0x22, 0xfa, 0x08, 0x0a, 0x0d, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, - 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x3a, 0x0a, 0x06, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, - 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x70, - 0x75, 0x74, 0x2e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x52, 0x06, 0x69, 0x6e, 0x70, 0x75, 0x74, - 0x73, 0x12, 0x3d, 0x0a, 0x07, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, - 0x73, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2e, - 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x52, 0x07, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, - 0x1a, 0x9f, 0x04, 0x0a, 0x06, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x12, 0x56, 0x0a, 0x0a, 0x70, - 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x32, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x45, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x49, 0x6e, 0x70, - 0x75, 0x74, 0x73, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, - 0x65, 0x72, 0x73, 0x12, 0x4f, 0x0a, 0x09, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, + 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x02, + 0x18, 0x01, 0x52, 0x10, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x12, 0x33, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, + 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x52, 0x0a, 0x0f, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x29, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x58, 0x0a, + 0x15, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, + 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x4b, 0x0a, 0x0c, 0x41, 0x72, 0x74, 0x69, 0x66, + 0x61, 0x63, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x3b, 0x0a, 0x09, 0x61, 0x72, 0x74, 0x69, 0x66, + 0x61, 0x63, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6d, 0x6c, 0x5f, + 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x52, 0x09, 0x61, 0x72, 0x74, 0x69, 0x66, + 0x61, 0x63, 0x74, 0x73, 0x22, 0xfa, 0x08, 0x0a, 0x0d, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, + 0x72, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x3a, 0x0a, 0x06, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x6e, - 0x70, 0x75, 0x74, 0x2e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x2e, 0x41, 0x72, 0x74, 0x69, 0x66, - 0x61, 0x63, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x61, 0x72, 0x74, 0x69, 0x66, - 0x61, 0x63, 0x74, 0x73, 0x12, 0x62, 0x0a, 0x10, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, - 0x72, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, - 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x45, 0x78, - 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x49, 0x6e, 0x70, 0x75, - 0x74, 0x73, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, - 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x1a, 0x52, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, - 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x58, 0x0a, 0x0e, - 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x41, - 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5a, 0x0a, 0x14, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, - 0x74, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x70, 0x75, 0x74, 0x2e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x52, 0x06, 0x69, 0x6e, 0x70, 0x75, + 0x74, 0x73, 0x12, 0x3d, 0x0a, 0x07, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, + 0x65, 0x73, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x70, 0x75, 0x74, + 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x52, 0x07, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x73, 0x1a, 0x9f, 0x04, 0x0a, 0x06, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x12, 0x56, 0x0a, 0x0a, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x32, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, + 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x49, 0x6e, + 0x70, 0x75, 0x74, 0x73, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x12, 0x4f, 0x0a, 0x09, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, + 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x2e, 0x41, 0x72, 0x74, 0x69, + 0x66, 0x61, 0x63, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x61, 0x72, 0x74, 0x69, + 0x66, 0x61, 0x63, 0x74, 0x73, 0x12, 0x62, 0x0a, 0x10, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x37, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x45, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x49, 0x6e, 0x70, + 0x75, 0x74, 0x73, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x1a, 0x52, 0x0a, 0x0f, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x29, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x58, 0x0a, + 0x0e, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, + 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5a, 0x0a, 0x14, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x1a, 0x32, 0x0a, 0x0f, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x97, 0x03, 0x0a, 0x07, 0x4f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x73, 0x12, 0x53, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, + 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x2e, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x50, 0x0a, 0x09, 0x61, 0x72, 0x74, 0x69, + 0x66, 0x61, 0x63, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x6d, 0x6c, + 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, + 0x2e, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x09, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x6a, 0x0a, 0x0f, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x1a, 0x32, 0x0a, 0x0f, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x65, 0x74, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, - 0x66, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6f, 0x75, 0x74, 0x70, - 0x75, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x97, 0x03, 0x0a, 0x07, 0x4f, 0x75, 0x74, 0x70, 0x75, - 0x74, 0x73, 0x12, 0x53, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, - 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x6e, - 0x70, 0x75, 0x74, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x2e, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x61, 0x72, - 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x50, 0x0a, 0x09, 0x61, 0x72, 0x74, 0x69, 0x66, - 0x61, 0x63, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x6d, 0x6c, 0x5f, - 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, - 0x6f, 0x72, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x2e, - 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, - 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x6a, 0x0a, 0x0f, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x41, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, - 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x45, 0x78, - 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x4f, 0x75, 0x74, 0x70, - 0x75, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x58, 0x0a, 0x0e, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, - 0x63, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, - 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, - 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x95, 0x04, 0x0a, 0x0e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x4f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x12, 0x50, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, - 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x4f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, - 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x49, 0x0a, 0x09, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, - 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, + 0x12, 0x41, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2b, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x45, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x4f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x58, 0x0a, 0x0e, 0x41, 0x72, 0x74, 0x69, 0x66, + 0x61, 0x63, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6d, 0x6c, 0x5f, + 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, + 0x63, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0x95, 0x04, 0x0a, 0x0e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x4f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x12, 0x50, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, - 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2e, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, - 0x12, 0x5c, 0x0a, 0x10, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x5f, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x6d, 0x6c, 0x5f, - 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, - 0x6f, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, - 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x70, - 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x1a, 0x52, - 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, - 0x73, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x1a, 0x58, 0x0a, 0x0e, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, - 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5a, 0x0a, 0x14, - 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa4, 0x02, 0x0a, 0x17, 0x50, 0x69, 0x70, - 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x28, 0x0a, 0x05, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x05, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x12, 0x2e, 0x0a, 0x11, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, - 0x5f, 0x6a, 0x6f, 0x62, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, - 0x02, 0x18, 0x01, 0x52, 0x0f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x4a, 0x6f, 0x62, - 0x55, 0x75, 0x69, 0x64, 0x12, 0x2e, 0x0a, 0x11, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, - 0x5f, 0x6a, 0x6f, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x02, 0x18, 0x01, 0x52, 0x0f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x4a, 0x6f, 0x62, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x1a, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, - 0x5f, 0x6a, 0x6f, 0x62, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, - 0x6e, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x74, 0x61, - 0x73, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x70, - 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x22, - 0x9f, 0x02, 0x0a, 0x11, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x22, 0x89, 0x02, 0x0a, 0x11, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, - 0x6e, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x16, 0x54, - 0x41, 0x53, 0x4b, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, - 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x45, 0x4e, 0x44, 0x49, - 0x4e, 0x47, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x5f, - 0x44, 0x52, 0x49, 0x56, 0x45, 0x52, 0x10, 0x02, 0x12, 0x14, 0x0a, 0x10, 0x44, 0x52, 0x49, 0x56, - 0x45, 0x52, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x45, 0x44, 0x45, 0x44, 0x10, 0x03, 0x12, 0x14, - 0x0a, 0x10, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, - 0x4f, 0x52, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x55, 0x43, 0x43, 0x45, 0x45, 0x44, 0x45, - 0x44, 0x10, 0x05, 0x12, 0x12, 0x0a, 0x0e, 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x5f, 0x50, 0x45, - 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, 0x0e, 0x0a, 0x0a, 0x43, 0x41, 0x4e, 0x43, 0x45, - 0x4c, 0x4c, 0x49, 0x4e, 0x47, 0x10, 0x07, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x41, 0x4e, 0x43, 0x45, - 0x4c, 0x4c, 0x45, 0x44, 0x10, 0x08, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, - 0x10, 0x09, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x4b, 0x49, 0x50, 0x50, 0x45, 0x44, 0x10, 0x0a, 0x12, - 0x0a, 0x0a, 0x06, 0x51, 0x55, 0x45, 0x55, 0x45, 0x44, 0x10, 0x0b, 0x12, 0x11, 0x0a, 0x0d, 0x4e, - 0x4f, 0x54, 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x45, 0x44, 0x10, 0x0c, 0x12, 0x11, - 0x0a, 0x0d, 0x55, 0x4e, 0x53, 0x43, 0x48, 0x45, 0x44, 0x55, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, - 0x0d, 0x22, 0xb7, 0x01, 0x0a, 0x0c, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x53, 0x70, - 0x65, 0x63, 0x12, 0x47, 0x0a, 0x09, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, - 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x53, 0x70, 0x65, - 0x63, 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x09, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x1a, 0x5e, 0x0a, 0x0e, 0x50, - 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, - 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x53, 0x69, - 0x6e, 0x67, 0x6c, 0x65, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x53, 0x70, 0x65, 0x63, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x65, 0x0a, 0x12, 0x53, + 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x49, 0x0a, 0x09, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, + 0x63, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, + 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, + 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2e, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, + 0x73, 0x12, 0x5c, 0x0a, 0x10, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x5f, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x6d, 0x6c, + 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x6f, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x1a, + 0x52, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, + 0x65, 0x73, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x1a, 0x58, 0x0a, 0x0e, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, + 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5a, 0x0a, + 0x14, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa4, 0x02, 0x0a, 0x17, 0x50, 0x69, + 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x28, 0x0a, 0x05, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x05, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x2e, 0x0a, 0x11, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, + 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, + 0x42, 0x02, 0x18, 0x01, 0x52, 0x0f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x4a, 0x6f, + 0x62, 0x55, 0x75, 0x69, 0x64, 0x12, 0x2e, 0x0a, 0x11, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, + 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x02, 0x18, 0x01, 0x52, 0x0f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x4a, 0x6f, + 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x1a, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, + 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x70, 0x69, 0x70, 0x65, 0x6c, + 0x69, 0x6e, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x74, + 0x61, 0x73, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, + 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x4e, 0x61, 0x6d, 0x65, + 0x22, 0x9f, 0x02, 0x0a, 0x11, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x22, 0x89, 0x02, 0x0a, 0x11, 0x50, 0x69, 0x70, 0x65, 0x6c, + 0x69, 0x6e, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x16, + 0x54, 0x41, 0x53, 0x4b, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, + 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x45, 0x4e, 0x44, + 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, + 0x5f, 0x44, 0x52, 0x49, 0x56, 0x45, 0x52, 0x10, 0x02, 0x12, 0x14, 0x0a, 0x10, 0x44, 0x52, 0x49, + 0x56, 0x45, 0x52, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x45, 0x44, 0x45, 0x44, 0x10, 0x03, 0x12, + 0x14, 0x0a, 0x10, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x45, 0x58, 0x45, 0x43, 0x55, + 0x54, 0x4f, 0x52, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x55, 0x43, 0x43, 0x45, 0x45, 0x44, + 0x45, 0x44, 0x10, 0x05, 0x12, 0x12, 0x0a, 0x0e, 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x5f, 0x50, + 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, 0x0e, 0x0a, 0x0a, 0x43, 0x41, 0x4e, 0x43, + 0x45, 0x4c, 0x4c, 0x49, 0x4e, 0x47, 0x10, 0x07, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x41, 0x4e, 0x43, + 0x45, 0x4c, 0x4c, 0x45, 0x44, 0x10, 0x08, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x41, 0x49, 0x4c, 0x45, + 0x44, 0x10, 0x09, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x4b, 0x49, 0x50, 0x50, 0x45, 0x44, 0x10, 0x0a, + 0x12, 0x0a, 0x0a, 0x06, 0x51, 0x55, 0x45, 0x55, 0x45, 0x44, 0x10, 0x0b, 0x12, 0x11, 0x0a, 0x0d, + 0x4e, 0x4f, 0x54, 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x45, 0x44, 0x10, 0x0c, 0x12, + 0x11, 0x0a, 0x0d, 0x55, 0x4e, 0x53, 0x43, 0x48, 0x45, 0x44, 0x55, 0x4c, 0x41, 0x42, 0x4c, 0x45, + 0x10, 0x0d, 0x22, 0xb7, 0x01, 0x0a, 0x0c, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x53, + 0x70, 0x65, 0x63, 0x12, 0x47, 0x0a, 0x09, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, + 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x53, 0x70, + 0x65, 0x63, 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x09, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x1a, 0x5e, 0x0a, 0x0e, + 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x20, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x53, 0x70, 0x65, - 0x63, 0x12, 0x4f, 0x0a, 0x0f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, - 0x73, 0x70, 0x65, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x6d, 0x6c, 0x5f, - 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, - 0x72, 0x6d, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x70, - 0x65, 0x63, 0x22, 0xc6, 0x01, 0x0a, 0x18, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x44, - 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x53, 0x0a, 0x09, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, - 0x73, 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, - 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x6f, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x65, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x6f, 0x72, 0x73, 0x1a, 0x55, 0x0a, 0x0e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x3c, 0x5a, 0x3a, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x75, 0x62, 0x65, 0x66, 0x6c, - 0x6f, 0x77, 0x2f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2f, 0x61, 0x70, 0x69, - 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x67, 0x6f, 0x2f, 0x70, 0x69, 0x70, - 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x70, 0x65, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x63, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x65, 0x0a, 0x12, + 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x53, 0x70, + 0x65, 0x63, 0x12, 0x4f, 0x0a, 0x0f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, + 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x6d, 0x6c, + 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, + 0x6f, 0x72, 0x6d, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, + 0x70, 0x65, 0x63, 0x22, 0xc6, 0x01, 0x0a, 0x18, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, + 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x12, 0x53, 0x0a, 0x09, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x6d, 0x6c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, + 0x65, 0x73, 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x44, 0x65, 0x70, 0x6c, 0x6f, + 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x45, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x6f, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x65, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x6f, 0x72, 0x73, 0x1a, 0x55, 0x0a, 0x0e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, + 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x3c, 0x5a, 0x3a, + 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x75, 0x62, 0x65, 0x66, + 0x6c, 0x6f, 0x77, 0x2f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x67, 0x6f, 0x2f, 0x70, 0x69, + 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x70, 0x65, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, } var ( diff --git a/backend/Dockerfile.visualization b/backend/Dockerfile.visualization deleted file mode 100644 index f1e0d8d0d13..00000000000 --- a/backend/Dockerfile.visualization +++ /dev/null @@ -1,40 +0,0 @@ -# Copyright 2019-2021 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. - -# This docker file starts server.py (located at src/apiserver/visualization) -# which accepts a post request that resolves to html that depicts a specified -# visualization. More details about this process can be found in the server.py -# and exporter.py files in the directory specified above. - -# This image should be in sync with image in backend/src/apiserver/visualization/update_requirements.sh. -FROM tensorflow/tensorflow:2.10.1 - -RUN apt-get update \ - && apt-get install -y wget curl tar openssl - -RUN curl https://dl.google.com/dl/cloudsdk/release/google-cloud-sdk.tar.gz > /tmp/google-cloud-sdk.tar.gz -RUN mkdir -p /usr/local/gcloud -RUN tar -C /usr/local/gcloud -xf /tmp/google-cloud-sdk.tar.gz -RUN /usr/local/gcloud/google-cloud-sdk/install.sh -ENV PATH $PATH:/usr/local/gcloud/google-cloud-sdk/bin - -WORKDIR /src - -COPY backend/src/apiserver/visualization/requirements.txt /src - -RUN python3 -m pip install -r requirements.txt --no-cache-dir - -COPY backend/src/apiserver/visualization /src - -ENTRYPOINT [ "python3", "server.py" ] diff --git a/backend/Makefile b/backend/Makefile index 583a0d6674e..cd5457c63c4 100644 --- a/backend/Makefile +++ b/backend/Makefile @@ -9,7 +9,6 @@ IMG_TAG_PERSISTENCEAGENT ?= persistence-agent IMG_TAG_CACHESERVER ?= cache-server IMG_TAG_SCHEDULEDWORKFLOW ?= scheduledworkflow IMG_TAG_VIEWERCONTROLLER ?= viewercontroller -IMG_TAG_VISUALIZATION ?= visualization IMG_TAG_DRIVER ?= kfp-driver IMG_TAG_LAUNCHER ?= kfp-launcher @@ -62,7 +61,7 @@ license_launcher: $(BUILD)/launcher cd $(MOD_ROOT) && go-licenses csv ./backend/src/v2/cmd/launcher-v2 > $(CSV_PATH)/launcher.csv .PHONY: image_all -image_all: image_apiserver image_persistence_agent image_cache image_swf image_viewer image_visualization image_driver image_launcher +image_all: image_apiserver image_persistence_agent image_cache image_swf image_viewer image_driver image_launcher .PHONY: image_apiserver image_apiserver: @@ -79,9 +78,6 @@ image_swf: .PHONY: image_viewer image_viewer: cd $(MOD_ROOT) && ${CONTAINER_ENGINE} build -t ${IMG_TAG_VIEWERCONTROLLER} -f backend/Dockerfile.viewercontroller . -.PHONY: image_visualization -image_visualization: - cd $(MOD_ROOT) && ${CONTAINER_ENGINE} build -t ${IMG_TAG_VISUALIZATION} -f backend/Dockerfile.visualization . .PHONY: image_driver image_driver: cd $(MOD_ROOT) && ${CONTAINER_ENGINE} build -t ${IMG_TAG_DRIVER} -f backend/Dockerfile.driver . diff --git a/backend/README.md b/backend/README.md index 853d83dd6b7..beb63484a3b 100644 --- a/backend/README.md +++ b/backend/README.md @@ -62,16 +62,6 @@ dependencies. To update dependencies, edit [requirements.in](requirements.in) and run `./update_requirements.sh` to update and pin the transitive dependencies. -# Visualization Server Instructions - -## Updating python dependencies - -[pip-tools](https://github.com/jazzband/pip-tools) is used to manage python -dependencies. To update dependencies, edit [requirements.in](requirements.in) -and run `./update_requirements.sh` to update and pin the transitive -dependencies. - - ## Building conformance tests (WIP) Run diff --git a/backend/api/v1beta1/go_client/visualization.pb.go b/backend/api/v1beta1/go_client/visualization.pb.go deleted file mode 100644 index cc07b5be798..00000000000 --- a/backend/api/v1beta1/go_client/visualization.pb.go +++ /dev/null @@ -1,468 +0,0 @@ -// Copyright 2019 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. - -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.33.0 -// protoc v3.17.3 -// source: backend/api/v1beta1/visualization.proto - -package go_client - -import ( - context "context" - _ "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger/options" - _ "google.golang.org/genproto/googleapis/api/annotations" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -// Type of visualization to be generated. -// This is required when creating the pipeline through CreateVisualization -// API. -type Visualization_Type int32 - -const ( - Visualization_ROC_CURVE Visualization_Type = 0 - Visualization_TFDV Visualization_Type = 1 - Visualization_TFMA Visualization_Type = 2 - Visualization_TABLE Visualization_Type = 3 - Visualization_CUSTOM Visualization_Type = 4 -) - -// Enum value maps for Visualization_Type. -var ( - Visualization_Type_name = map[int32]string{ - 0: "ROC_CURVE", - 1: "TFDV", - 2: "TFMA", - 3: "TABLE", - 4: "CUSTOM", - } - Visualization_Type_value = map[string]int32{ - "ROC_CURVE": 0, - "TFDV": 1, - "TFMA": 2, - "TABLE": 3, - "CUSTOM": 4, - } -) - -func (x Visualization_Type) Enum() *Visualization_Type { - p := new(Visualization_Type) - *p = x - return p -} - -func (x Visualization_Type) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (Visualization_Type) Descriptor() protoreflect.EnumDescriptor { - return file_backend_api_v1beta1_visualization_proto_enumTypes[0].Descriptor() -} - -func (Visualization_Type) Type() protoreflect.EnumType { - return &file_backend_api_v1beta1_visualization_proto_enumTypes[0] -} - -func (x Visualization_Type) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use Visualization_Type.Descriptor instead. -func (Visualization_Type) EnumDescriptor() ([]byte, []int) { - return file_backend_api_v1beta1_visualization_proto_rawDescGZIP(), []int{1, 0} -} - -// Create visualization by providing the type of visualization that is desired -// and input data paths. Input dat paths are assumed to be unique and are used -// for determining output path. -type CreateVisualizationRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Visualization *Visualization `protobuf:"bytes,1,opt,name=visualization,proto3" json:"visualization,omitempty"` - Namespace string `protobuf:"bytes,2,opt,name=namespace,proto3" json:"namespace,omitempty"` -} - -func (x *CreateVisualizationRequest) Reset() { - *x = CreateVisualizationRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_backend_api_v1beta1_visualization_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *CreateVisualizationRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CreateVisualizationRequest) ProtoMessage() {} - -func (x *CreateVisualizationRequest) ProtoReflect() protoreflect.Message { - mi := &file_backend_api_v1beta1_visualization_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use CreateVisualizationRequest.ProtoReflect.Descriptor instead. -func (*CreateVisualizationRequest) Descriptor() ([]byte, []int) { - return file_backend_api_v1beta1_visualization_proto_rawDescGZIP(), []int{0} -} - -func (x *CreateVisualizationRequest) GetVisualization() *Visualization { - if x != nil { - return x.Visualization - } - return nil -} - -func (x *CreateVisualizationRequest) GetNamespace() string { - if x != nil { - return x.Namespace - } - return "" -} - -type Visualization struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Type Visualization_Type `protobuf:"varint,1,opt,name=type,proto3,enum=api.Visualization_Type" json:"type,omitempty"` - // Path pattern of input data to be used during generation of visualizations. - // This is required when creating the pipeline through CreateVisualization - // API. - Source string `protobuf:"bytes,2,opt,name=source,proto3" json:"source,omitempty"` - // Variables to be used during generation of a visualization. - // This should be provided as a JSON string. - // This is required when creating the pipeline through CreateVisualization - // API. - Arguments string `protobuf:"bytes,3,opt,name=arguments,proto3" json:"arguments,omitempty"` - // Output. Generated visualization html. - Html string `protobuf:"bytes,4,opt,name=html,proto3" json:"html,omitempty"` - // In case any error happens when generating visualizations, only - // visualization ID and the error message are returned. Client has the - // flexibility of choosing how to handle the error. - Error string `protobuf:"bytes,5,opt,name=error,proto3" json:"error,omitempty"` -} - -func (x *Visualization) Reset() { - *x = Visualization{} - if protoimpl.UnsafeEnabled { - mi := &file_backend_api_v1beta1_visualization_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Visualization) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Visualization) ProtoMessage() {} - -func (x *Visualization) ProtoReflect() protoreflect.Message { - mi := &file_backend_api_v1beta1_visualization_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Visualization.ProtoReflect.Descriptor instead. -func (*Visualization) Descriptor() ([]byte, []int) { - return file_backend_api_v1beta1_visualization_proto_rawDescGZIP(), []int{1} -} - -func (x *Visualization) GetType() Visualization_Type { - if x != nil { - return x.Type - } - return Visualization_ROC_CURVE -} - -func (x *Visualization) GetSource() string { - if x != nil { - return x.Source - } - return "" -} - -func (x *Visualization) GetArguments() string { - if x != nil { - return x.Arguments - } - return "" -} - -func (x *Visualization) GetHtml() string { - if x != nil { - return x.Html - } - return "" -} - -func (x *Visualization) GetError() string { - if x != nil { - return x.Error - } - return "" -} - -var File_backend_api_v1beta1_visualization_proto protoreflect.FileDescriptor - -var file_backend_api_v1beta1_visualization_proto_rawDesc = []byte{ - 0x0a, 0x27, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, - 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x76, 0x69, 0x73, 0x75, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x03, 0x61, 0x70, 0x69, 0x1a, 0x1c, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x62, 0x61, - 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, - 0x31, 0x2f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2c, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x73, 0x77, 0x61, 0x67, 0x67, 0x65, - 0x72, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x74, 0x0a, 0x1a, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0d, 0x76, 0x69, 0x73, - 0x75, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6c, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x76, 0x69, 0x73, 0x75, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x22, 0xde, 0x01, 0x0a, 0x0d, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6c, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x74, 0x6d, 0x6c, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x74, 0x6d, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x22, 0x40, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x4f, 0x43, 0x5f, - 0x43, 0x55, 0x52, 0x56, 0x45, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x54, 0x46, 0x44, 0x56, 0x10, - 0x01, 0x12, 0x08, 0x0a, 0x04, 0x54, 0x46, 0x4d, 0x41, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, 0x54, - 0x41, 0x42, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, - 0x10, 0x04, 0x32, 0xa6, 0x01, 0x0a, 0x14, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6c, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x8d, 0x01, 0x0a, 0x15, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x56, 0x31, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x69, 0x73, - 0x75, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3f, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x39, 0x3a, 0x0d, 0x76, 0x69, 0x73, 0x75, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x22, 0x28, 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, - 0x2f, 0x76, 0x69, 0x73, 0x75, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, - 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x7d, 0x42, 0x91, 0x01, 0x92, 0x41, - 0x51, 0x2a, 0x02, 0x01, 0x02, 0x52, 0x1c, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x12, 0x11, 0x12, 0x0f, 0x0a, 0x0d, 0x1a, 0x0b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x5a, 0x1f, 0x0a, 0x1d, 0x0a, 0x06, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, - 0x13, 0x08, 0x02, 0x1a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, - 0x12, 0x00, 0x5a, 0x3b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, - 0x75, 0x62, 0x65, 0x66, 0x6c, 0x6f, 0x77, 0x2f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, - 0x73, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, - 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x67, 0x6f, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_backend_api_v1beta1_visualization_proto_rawDescOnce sync.Once - file_backend_api_v1beta1_visualization_proto_rawDescData = file_backend_api_v1beta1_visualization_proto_rawDesc -) - -func file_backend_api_v1beta1_visualization_proto_rawDescGZIP() []byte { - file_backend_api_v1beta1_visualization_proto_rawDescOnce.Do(func() { - file_backend_api_v1beta1_visualization_proto_rawDescData = protoimpl.X.CompressGZIP(file_backend_api_v1beta1_visualization_proto_rawDescData) - }) - return file_backend_api_v1beta1_visualization_proto_rawDescData -} - -var file_backend_api_v1beta1_visualization_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_backend_api_v1beta1_visualization_proto_msgTypes = make([]protoimpl.MessageInfo, 2) -var file_backend_api_v1beta1_visualization_proto_goTypes = []interface{}{ - (Visualization_Type)(0), // 0: api.Visualization.Type - (*CreateVisualizationRequest)(nil), // 1: api.CreateVisualizationRequest - (*Visualization)(nil), // 2: api.Visualization -} -var file_backend_api_v1beta1_visualization_proto_depIdxs = []int32{ - 2, // 0: api.CreateVisualizationRequest.visualization:type_name -> api.Visualization - 0, // 1: api.Visualization.type:type_name -> api.Visualization.Type - 1, // 2: api.VisualizationService.CreateVisualizationV1:input_type -> api.CreateVisualizationRequest - 2, // 3: api.VisualizationService.CreateVisualizationV1:output_type -> api.Visualization - 3, // [3:4] is the sub-list for method output_type - 2, // [2:3] is the sub-list for method input_type - 2, // [2:2] is the sub-list for extension type_name - 2, // [2:2] is the sub-list for extension extendee - 0, // [0:2] is the sub-list for field type_name -} - -func init() { file_backend_api_v1beta1_visualization_proto_init() } -func file_backend_api_v1beta1_visualization_proto_init() { - if File_backend_api_v1beta1_visualization_proto != nil { - return - } - file_backend_api_v1beta1_error_proto_init() - if !protoimpl.UnsafeEnabled { - file_backend_api_v1beta1_visualization_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateVisualizationRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_backend_api_v1beta1_visualization_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Visualization); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_backend_api_v1beta1_visualization_proto_rawDesc, - NumEnums: 1, - NumMessages: 2, - NumExtensions: 0, - NumServices: 1, - }, - GoTypes: file_backend_api_v1beta1_visualization_proto_goTypes, - DependencyIndexes: file_backend_api_v1beta1_visualization_proto_depIdxs, - EnumInfos: file_backend_api_v1beta1_visualization_proto_enumTypes, - MessageInfos: file_backend_api_v1beta1_visualization_proto_msgTypes, - }.Build() - File_backend_api_v1beta1_visualization_proto = out.File - file_backend_api_v1beta1_visualization_proto_rawDesc = nil - file_backend_api_v1beta1_visualization_proto_goTypes = nil - file_backend_api_v1beta1_visualization_proto_depIdxs = nil -} - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConnInterface - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion6 - -// VisualizationServiceClient is the client API for VisualizationService service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type VisualizationServiceClient interface { - CreateVisualizationV1(ctx context.Context, in *CreateVisualizationRequest, opts ...grpc.CallOption) (*Visualization, error) -} - -type visualizationServiceClient struct { - cc grpc.ClientConnInterface -} - -func NewVisualizationServiceClient(cc grpc.ClientConnInterface) VisualizationServiceClient { - return &visualizationServiceClient{cc} -} - -func (c *visualizationServiceClient) CreateVisualizationV1(ctx context.Context, in *CreateVisualizationRequest, opts ...grpc.CallOption) (*Visualization, error) { - out := new(Visualization) - err := c.cc.Invoke(ctx, "/api.VisualizationService/CreateVisualizationV1", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// VisualizationServiceServer is the server API for VisualizationService service. -type VisualizationServiceServer interface { - CreateVisualizationV1(context.Context, *CreateVisualizationRequest) (*Visualization, error) -} - -// UnimplementedVisualizationServiceServer can be embedded to have forward compatible implementations. -type UnimplementedVisualizationServiceServer struct { -} - -func (*UnimplementedVisualizationServiceServer) CreateVisualizationV1(context.Context, *CreateVisualizationRequest) (*Visualization, error) { - return nil, status.Errorf(codes.Unimplemented, "method CreateVisualizationV1 not implemented") -} - -func RegisterVisualizationServiceServer(s *grpc.Server, srv VisualizationServiceServer) { - s.RegisterService(&_VisualizationService_serviceDesc, srv) -} - -func _VisualizationService_CreateVisualizationV1_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CreateVisualizationRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(VisualizationServiceServer).CreateVisualizationV1(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/api.VisualizationService/CreateVisualizationV1", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(VisualizationServiceServer).CreateVisualizationV1(ctx, req.(*CreateVisualizationRequest)) - } - return interceptor(ctx, in, info, handler) -} - -var _VisualizationService_serviceDesc = grpc.ServiceDesc{ - ServiceName: "api.VisualizationService", - HandlerType: (*VisualizationServiceServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "CreateVisualizationV1", - Handler: _VisualizationService_CreateVisualizationV1_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "backend/api/v1beta1/visualization.proto", -} diff --git a/backend/api/v1beta1/go_client/visualization.pb.gw.go b/backend/api/v1beta1/go_client/visualization.pb.gw.go deleted file mode 100644 index f3f7d676162..00000000000 --- a/backend/api/v1beta1/go_client/visualization.pb.gw.go +++ /dev/null @@ -1,205 +0,0 @@ -// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. -// source: backend/api/v1beta1/visualization.proto - -/* -Package go_client is a reverse proxy. - -It translates gRPC into RESTful JSON APIs. -*/ -package go_client - -import ( - "context" - "io" - "net/http" - - "github.com/golang/protobuf/descriptor" - "github.com/golang/protobuf/proto" - "github.com/grpc-ecosystem/grpc-gateway/runtime" - "github.com/grpc-ecosystem/grpc-gateway/utilities" - "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/grpclog" - "google.golang.org/grpc/metadata" - "google.golang.org/grpc/status" -) - -// Suppress "imported and not used" errors -var _ codes.Code -var _ io.Reader -var _ status.Status -var _ = runtime.String -var _ = utilities.NewDoubleArray -var _ = descriptor.ForMessage -var _ = metadata.Join - -func request_VisualizationService_CreateVisualizationV1_0(ctx context.Context, marshaler runtime.Marshaler, client VisualizationServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CreateVisualizationRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Visualization); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["namespace"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "namespace") - } - - protoReq.Namespace, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "namespace", err) - } - - msg, err := client.CreateVisualizationV1(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_VisualizationService_CreateVisualizationV1_0(ctx context.Context, marshaler runtime.Marshaler, server VisualizationServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CreateVisualizationRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Visualization); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["namespace"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "namespace") - } - - protoReq.Namespace, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "namespace", err) - } - - msg, err := server.CreateVisualizationV1(ctx, &protoReq) - return msg, metadata, err - -} - -// RegisterVisualizationServiceHandlerServer registers the http handlers for service VisualizationService to "mux". -// UnaryRPC :call VisualizationServiceServer directly. -// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. -// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterVisualizationServiceHandlerFromEndpoint instead. -func RegisterVisualizationServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server VisualizationServiceServer) error { - - mux.Handle("POST", pattern_VisualizationService_CreateVisualizationV1_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_VisualizationService_CreateVisualizationV1_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_VisualizationService_CreateVisualizationV1_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - return nil -} - -// RegisterVisualizationServiceHandlerFromEndpoint is same as RegisterVisualizationServiceHandler but -// automatically dials to "endpoint" and closes the connection when "ctx" gets done. -func RegisterVisualizationServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { - conn, err := grpc.Dial(endpoint, opts...) - if err != nil { - return err - } - defer func() { - if err != nil { - if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) - } - return - } - go func() { - <-ctx.Done() - if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) - } - }() - }() - - return RegisterVisualizationServiceHandler(ctx, mux, conn) -} - -// RegisterVisualizationServiceHandler registers the http handlers for service VisualizationService to "mux". -// The handlers forward requests to the grpc endpoint over "conn". -func RegisterVisualizationServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { - return RegisterVisualizationServiceHandlerClient(ctx, mux, NewVisualizationServiceClient(conn)) -} - -// RegisterVisualizationServiceHandlerClient registers the http handlers for service VisualizationService -// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "VisualizationServiceClient". -// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "VisualizationServiceClient" -// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in -// "VisualizationServiceClient" to call the correct interceptors. -func RegisterVisualizationServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client VisualizationServiceClient) error { - - mux.Handle("POST", pattern_VisualizationService_CreateVisualizationV1_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_VisualizationService_CreateVisualizationV1_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_VisualizationService_CreateVisualizationV1_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - return nil -} - -var ( - pattern_VisualizationService_CreateVisualizationV1_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"apis", "v1beta1", "visualizations", "namespace"}, "", runtime.AssumeColonVerbOpt(true))) -) - -var ( - forward_VisualizationService_CreateVisualizationV1_0 = runtime.ForwardResponseMessage -) diff --git a/backend/api/v1beta1/go_http_client/visualization_client/visualization_client.go b/backend/api/v1beta1/go_http_client/visualization_client/visualization_client.go deleted file mode 100644 index a5467d284d0..00000000000 --- a/backend/api/v1beta1/go_http_client/visualization_client/visualization_client.go +++ /dev/null @@ -1,117 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package visualization_client - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "github.com/go-openapi/runtime" - httptransport "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" - - "github.com/kubeflow/pipelines/backend/api/v1beta1/go_http_client/visualization_client/visualization_service" -) - -// Default visualization HTTP client. -var Default = NewHTTPClient(nil) - -const ( - // DefaultHost is the default Host - // found in Meta (info) section of spec file - DefaultHost string = "localhost" - // DefaultBasePath is the default BasePath - // found in Meta (info) section of spec file - DefaultBasePath string = "/" -) - -// DefaultSchemes are the default schemes found in Meta (info) section of spec file -var DefaultSchemes = []string{"http", "https"} - -// NewHTTPClient creates a new visualization HTTP client. -func NewHTTPClient(formats strfmt.Registry) *Visualization { - return NewHTTPClientWithConfig(formats, nil) -} - -// NewHTTPClientWithConfig creates a new visualization HTTP client, -// using a customizable transport config. -func NewHTTPClientWithConfig(formats strfmt.Registry, cfg *TransportConfig) *Visualization { - // ensure nullable parameters have default - if cfg == nil { - cfg = DefaultTransportConfig() - } - - // create transport and client - transport := httptransport.New(cfg.Host, cfg.BasePath, cfg.Schemes) - return New(transport, formats) -} - -// New creates a new visualization client -func New(transport runtime.ClientTransport, formats strfmt.Registry) *Visualization { - // ensure nullable parameters have default - if formats == nil { - formats = strfmt.Default - } - - cli := new(Visualization) - cli.Transport = transport - - cli.VisualizationService = visualization_service.New(transport, formats) - - return cli -} - -// DefaultTransportConfig creates a TransportConfig with the -// default settings taken from the meta section of the spec file. -func DefaultTransportConfig() *TransportConfig { - return &TransportConfig{ - Host: DefaultHost, - BasePath: DefaultBasePath, - Schemes: DefaultSchemes, - } -} - -// TransportConfig contains the transport related info, -// found in the meta section of the spec file. -type TransportConfig struct { - Host string - BasePath string - Schemes []string -} - -// WithHost overrides the default host, -// provided by the meta section of the spec file. -func (cfg *TransportConfig) WithHost(host string) *TransportConfig { - cfg.Host = host - return cfg -} - -// WithBasePath overrides the default basePath, -// provided by the meta section of the spec file. -func (cfg *TransportConfig) WithBasePath(basePath string) *TransportConfig { - cfg.BasePath = basePath - return cfg -} - -// WithSchemes overrides the default schemes, -// provided by the meta section of the spec file. -func (cfg *TransportConfig) WithSchemes(schemes []string) *TransportConfig { - cfg.Schemes = schemes - return cfg -} - -// Visualization is a client for visualization -type Visualization struct { - VisualizationService *visualization_service.Client - - Transport runtime.ClientTransport -} - -// SetTransport changes the transport on the client and all its subresources -func (c *Visualization) SetTransport(transport runtime.ClientTransport) { - c.Transport = transport - - c.VisualizationService.SetTransport(transport) - -} diff --git a/backend/api/v1beta1/go_http_client/visualization_client/visualization_service/visualization_service_client.go b/backend/api/v1beta1/go_http_client/visualization_client/visualization_service/visualization_service_client.go deleted file mode 100644 index 74320936890..00000000000 --- a/backend/api/v1beta1/go_http_client/visualization_client/visualization_service/visualization_service_client.go +++ /dev/null @@ -1,59 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package visualization_service - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" -) - -// New creates a new visualization service API client. -func New(transport runtime.ClientTransport, formats strfmt.Registry) *Client { - return &Client{transport: transport, formats: formats} -} - -/* -Client for visualization service API -*/ -type Client struct { - transport runtime.ClientTransport - formats strfmt.Registry -} - -/* -VisualizationServiceCreateVisualizationV1 visualization service create visualization v1 API -*/ -func (a *Client) VisualizationServiceCreateVisualizationV1(params *VisualizationServiceCreateVisualizationV1Params, authInfo runtime.ClientAuthInfoWriter) (*VisualizationServiceCreateVisualizationV1OK, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewVisualizationServiceCreateVisualizationV1Params() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "VisualizationService_CreateVisualizationV1", - Method: "POST", - PathPattern: "/apis/v1beta1/visualizations/{namespace}", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &VisualizationServiceCreateVisualizationV1Reader{formats: a.formats}, - AuthInfo: authInfo, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - return result.(*VisualizationServiceCreateVisualizationV1OK), nil - -} - -// SetTransport changes the transport on the client -func (a *Client) SetTransport(transport runtime.ClientTransport) { - a.transport = transport -} diff --git a/backend/api/v1beta1/go_http_client/visualization_client/visualization_service/visualization_service_create_visualization_v1_parameters.go b/backend/api/v1beta1/go_http_client/visualization_client/visualization_service/visualization_service_create_visualization_v1_parameters.go deleted file mode 100644 index 82086e4e212..00000000000 --- a/backend/api/v1beta1/go_http_client/visualization_client/visualization_service/visualization_service_create_visualization_v1_parameters.go +++ /dev/null @@ -1,154 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package visualization_service - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" - - visualization_model "github.com/kubeflow/pipelines/backend/api/v1beta1/go_http_client/visualization_model" -) - -// NewVisualizationServiceCreateVisualizationV1Params creates a new VisualizationServiceCreateVisualizationV1Params object -// with the default values initialized. -func NewVisualizationServiceCreateVisualizationV1Params() *VisualizationServiceCreateVisualizationV1Params { - var () - return &VisualizationServiceCreateVisualizationV1Params{ - - timeout: cr.DefaultTimeout, - } -} - -// NewVisualizationServiceCreateVisualizationV1ParamsWithTimeout creates a new VisualizationServiceCreateVisualizationV1Params object -// with the default values initialized, and the ability to set a timeout on a request -func NewVisualizationServiceCreateVisualizationV1ParamsWithTimeout(timeout time.Duration) *VisualizationServiceCreateVisualizationV1Params { - var () - return &VisualizationServiceCreateVisualizationV1Params{ - - timeout: timeout, - } -} - -// NewVisualizationServiceCreateVisualizationV1ParamsWithContext creates a new VisualizationServiceCreateVisualizationV1Params object -// with the default values initialized, and the ability to set a context for a request -func NewVisualizationServiceCreateVisualizationV1ParamsWithContext(ctx context.Context) *VisualizationServiceCreateVisualizationV1Params { - var () - return &VisualizationServiceCreateVisualizationV1Params{ - - Context: ctx, - } -} - -// NewVisualizationServiceCreateVisualizationV1ParamsWithHTTPClient creates a new VisualizationServiceCreateVisualizationV1Params object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewVisualizationServiceCreateVisualizationV1ParamsWithHTTPClient(client *http.Client) *VisualizationServiceCreateVisualizationV1Params { - var () - return &VisualizationServiceCreateVisualizationV1Params{ - HTTPClient: client, - } -} - -/*VisualizationServiceCreateVisualizationV1Params contains all the parameters to send to the API endpoint -for the visualization service create visualization v1 operation typically these are written to a http.Request -*/ -type VisualizationServiceCreateVisualizationV1Params struct { - - /*Body*/ - Body *visualization_model.APIVisualization - /*Namespace*/ - Namespace string - - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the visualization service create visualization v1 params -func (o *VisualizationServiceCreateVisualizationV1Params) WithTimeout(timeout time.Duration) *VisualizationServiceCreateVisualizationV1Params { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the visualization service create visualization v1 params -func (o *VisualizationServiceCreateVisualizationV1Params) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the visualization service create visualization v1 params -func (o *VisualizationServiceCreateVisualizationV1Params) WithContext(ctx context.Context) *VisualizationServiceCreateVisualizationV1Params { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the visualization service create visualization v1 params -func (o *VisualizationServiceCreateVisualizationV1Params) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the visualization service create visualization v1 params -func (o *VisualizationServiceCreateVisualizationV1Params) WithHTTPClient(client *http.Client) *VisualizationServiceCreateVisualizationV1Params { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the visualization service create visualization v1 params -func (o *VisualizationServiceCreateVisualizationV1Params) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WithBody adds the body to the visualization service create visualization v1 params -func (o *VisualizationServiceCreateVisualizationV1Params) WithBody(body *visualization_model.APIVisualization) *VisualizationServiceCreateVisualizationV1Params { - o.SetBody(body) - return o -} - -// SetBody adds the body to the visualization service create visualization v1 params -func (o *VisualizationServiceCreateVisualizationV1Params) SetBody(body *visualization_model.APIVisualization) { - o.Body = body -} - -// WithNamespace adds the namespace to the visualization service create visualization v1 params -func (o *VisualizationServiceCreateVisualizationV1Params) WithNamespace(namespace string) *VisualizationServiceCreateVisualizationV1Params { - o.SetNamespace(namespace) - return o -} - -// SetNamespace adds the namespace to the visualization service create visualization v1 params -func (o *VisualizationServiceCreateVisualizationV1Params) SetNamespace(namespace string) { - o.Namespace = namespace -} - -// WriteToRequest writes these params to a swagger request -func (o *VisualizationServiceCreateVisualizationV1Params) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - if o.Body != nil { - if err := r.SetBodyParam(o.Body); err != nil { - return err - } - } - - // path param namespace - if err := r.SetPathParam("namespace", o.Namespace); err != nil { - return err - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/backend/api/v1beta1/go_http_client/visualization_client/visualization_service/visualization_service_create_visualization_v1_responses.go b/backend/api/v1beta1/go_http_client/visualization_client/visualization_service/visualization_service_create_visualization_v1_responses.go deleted file mode 100644 index e7bbe9bec0e..00000000000 --- a/backend/api/v1beta1/go_http_client/visualization_client/visualization_service/visualization_service_create_visualization_v1_responses.go +++ /dev/null @@ -1,112 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package visualization_service - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - visualization_model "github.com/kubeflow/pipelines/backend/api/v1beta1/go_http_client/visualization_model" -) - -// VisualizationServiceCreateVisualizationV1Reader is a Reader for the VisualizationServiceCreateVisualizationV1 structure. -type VisualizationServiceCreateVisualizationV1Reader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *VisualizationServiceCreateVisualizationV1Reader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - - case 200: - result := NewVisualizationServiceCreateVisualizationV1OK() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - - default: - result := NewVisualizationServiceCreateVisualizationV1Default(response.Code()) - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - if response.Code()/100 == 2 { - return result, nil - } - return nil, result - } -} - -// NewVisualizationServiceCreateVisualizationV1OK creates a VisualizationServiceCreateVisualizationV1OK with default headers values -func NewVisualizationServiceCreateVisualizationV1OK() *VisualizationServiceCreateVisualizationV1OK { - return &VisualizationServiceCreateVisualizationV1OK{} -} - -/*VisualizationServiceCreateVisualizationV1OK handles this case with default header values. - -A successful response. -*/ -type VisualizationServiceCreateVisualizationV1OK struct { - Payload *visualization_model.APIVisualization -} - -func (o *VisualizationServiceCreateVisualizationV1OK) Error() string { - return fmt.Sprintf("[POST /apis/v1beta1/visualizations/{namespace}][%d] visualizationServiceCreateVisualizationV1OK %+v", 200, o.Payload) -} - -func (o *VisualizationServiceCreateVisualizationV1OK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(visualization_model.APIVisualization) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewVisualizationServiceCreateVisualizationV1Default creates a VisualizationServiceCreateVisualizationV1Default with default headers values -func NewVisualizationServiceCreateVisualizationV1Default(code int) *VisualizationServiceCreateVisualizationV1Default { - return &VisualizationServiceCreateVisualizationV1Default{ - _statusCode: code, - } -} - -/*VisualizationServiceCreateVisualizationV1Default handles this case with default header values. - -An unexpected error response. -*/ -type VisualizationServiceCreateVisualizationV1Default struct { - _statusCode int - - Payload *visualization_model.GatewayruntimeError -} - -// Code gets the status code for the visualization service create visualization v1 default response -func (o *VisualizationServiceCreateVisualizationV1Default) Code() int { - return o._statusCode -} - -func (o *VisualizationServiceCreateVisualizationV1Default) Error() string { - return fmt.Sprintf("[POST /apis/v1beta1/visualizations/{namespace}][%d] VisualizationService_CreateVisualizationV1 default %+v", o._statusCode, o.Payload) -} - -func (o *VisualizationServiceCreateVisualizationV1Default) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(visualization_model.GatewayruntimeError) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/backend/api/v1beta1/go_http_client/visualization_model/api_visualization.go b/backend/api/v1beta1/go_http_client/visualization_model/api_visualization.go deleted file mode 100644 index 13f1dee9cab..00000000000 --- a/backend/api/v1beta1/go_http_client/visualization_model/api_visualization.go +++ /dev/null @@ -1,88 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package visualization_model - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/errors" - "github.com/go-openapi/swag" -) - -// APIVisualization api visualization -// swagger:model apiVisualization -type APIVisualization struct { - - // Variables to be used during generation of a visualization. - // This should be provided as a JSON string. - // This is required when creating the pipeline through CreateVisualization - // API. - Arguments string `json:"arguments,omitempty"` - - // In case any error happens when generating visualizations, only - // visualization ID and the error message are returned. Client has the - // flexibility of choosing how to handle the error. - Error string `json:"error,omitempty"` - - // Output. Generated visualization html. - HTML string `json:"html,omitempty"` - - // Path pattern of input data to be used during generation of visualizations. - // This is required when creating the pipeline through CreateVisualization - // API. - Source string `json:"source,omitempty"` - - // type - Type APIVisualizationType `json:"type,omitempty"` -} - -// Validate validates this api visualization -func (m *APIVisualization) Validate(formats strfmt.Registry) error { - var res []error - - if err := m.validateType(formats); err != nil { - res = append(res, err) - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} - -func (m *APIVisualization) validateType(formats strfmt.Registry) error { - - if swag.IsZero(m.Type) { // not required - return nil - } - - if err := m.Type.Validate(formats); err != nil { - if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("type") - } - return err - } - - return nil -} - -// MarshalBinary interface implementation -func (m *APIVisualization) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *APIVisualization) UnmarshalBinary(b []byte) error { - var res APIVisualization - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/backend/api/v1beta1/go_http_client/visualization_model/api_visualization_type.go b/backend/api/v1beta1/go_http_client/visualization_model/api_visualization_type.go deleted file mode 100644 index 38a388d30b3..00000000000 --- a/backend/api/v1beta1/go_http_client/visualization_model/api_visualization_type.go +++ /dev/null @@ -1,74 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package visualization_model - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "encoding/json" - - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/errors" - "github.com/go-openapi/validate" -) - -// APIVisualizationType Type of visualization to be generated. -// This is required when creating the pipeline through CreateVisualization -// API. -// swagger:model apiVisualizationType -type APIVisualizationType string - -const ( - - // APIVisualizationTypeROCCURVE captures enum value "ROC_CURVE" - APIVisualizationTypeROCCURVE APIVisualizationType = "ROC_CURVE" - - // APIVisualizationTypeTFDV captures enum value "TFDV" - APIVisualizationTypeTFDV APIVisualizationType = "TFDV" - - // APIVisualizationTypeTFMA captures enum value "TFMA" - APIVisualizationTypeTFMA APIVisualizationType = "TFMA" - - // APIVisualizationTypeTABLE captures enum value "TABLE" - APIVisualizationTypeTABLE APIVisualizationType = "TABLE" - - // APIVisualizationTypeCUSTOM captures enum value "CUSTOM" - APIVisualizationTypeCUSTOM APIVisualizationType = "CUSTOM" -) - -// for schema -var apiVisualizationTypeEnum []interface{} - -func init() { - var res []APIVisualizationType - if err := json.Unmarshal([]byte(`["ROC_CURVE","TFDV","TFMA","TABLE","CUSTOM"]`), &res); err != nil { - panic(err) - } - for _, v := range res { - apiVisualizationTypeEnum = append(apiVisualizationTypeEnum, v) - } -} - -func (m APIVisualizationType) validateAPIVisualizationTypeEnum(path, location string, value APIVisualizationType) error { - if err := validate.Enum(path, location, value, apiVisualizationTypeEnum); err != nil { - return err - } - return nil -} - -// Validate validates this api visualization type -func (m APIVisualizationType) Validate(formats strfmt.Registry) error { - var res []error - - // value enum - if err := m.validateAPIVisualizationTypeEnum("", "body", m); err != nil { - return err - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/backend/api/v1beta1/go_http_client/visualization_model/gatewayruntime_error.go b/backend/api/v1beta1/go_http_client/visualization_model/gatewayruntime_error.go deleted file mode 100644 index 22c6e3bf981..00000000000 --- a/backend/api/v1beta1/go_http_client/visualization_model/gatewayruntime_error.go +++ /dev/null @@ -1,89 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package visualization_model - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "strconv" - - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/errors" - "github.com/go-openapi/swag" -) - -// GatewayruntimeError gatewayruntime error -// swagger:model gatewayruntimeError -type GatewayruntimeError struct { - - // code - Code int32 `json:"code,omitempty"` - - // details - Details []*ProtobufAny `json:"details"` - - // error - Error string `json:"error,omitempty"` - - // message - Message string `json:"message,omitempty"` -} - -// Validate validates this gatewayruntime error -func (m *GatewayruntimeError) Validate(formats strfmt.Registry) error { - var res []error - - if err := m.validateDetails(formats); err != nil { - res = append(res, err) - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} - -func (m *GatewayruntimeError) validateDetails(formats strfmt.Registry) error { - - if swag.IsZero(m.Details) { // not required - return nil - } - - for i := 0; i < len(m.Details); i++ { - if swag.IsZero(m.Details[i]) { // not required - continue - } - - if m.Details[i] != nil { - if err := m.Details[i].Validate(formats); err != nil { - if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("details" + "." + strconv.Itoa(i)) - } - return err - } - } - - } - - return nil -} - -// MarshalBinary interface implementation -func (m *GatewayruntimeError) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *GatewayruntimeError) UnmarshalBinary(b []byte) error { - var res GatewayruntimeError - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/backend/api/v1beta1/go_http_client/visualization_model/protobuf_any.go b/backend/api/v1beta1/go_http_client/visualization_model/protobuf_any.go deleted file mode 100644 index a8f3909206e..00000000000 --- a/backend/api/v1beta1/go_http_client/visualization_model/protobuf_any.go +++ /dev/null @@ -1,175 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package visualization_model - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/errors" - "github.com/go-openapi/swag" -) - -// ProtobufAny `Any` contains an arbitrary serialized protocol buffer message along with a -// URL that describes the type of the serialized message. -// -// Protobuf library provides support to pack/unpack Any values in the form -// of utility functions or additional generated methods of the Any type. -// -// Example 1: Pack and unpack a message in C++. -// -// Foo foo = ...; -// Any any; -// any.PackFrom(foo); -// ... -// if (any.UnpackTo(&foo)) { -// ... -// } -// -// Example 2: Pack and unpack a message in Java. -// -// Foo foo = ...; -// Any any = Any.pack(foo); -// ... -// if (any.is(Foo.class)) { -// foo = any.unpack(Foo.class); -// } -// -// Example 3: Pack and unpack a message in Python. -// -// foo = Foo(...) -// any = Any() -// any.Pack(foo) -// ... -// if any.Is(Foo.DESCRIPTOR): -// any.Unpack(foo) -// ... -// -// Example 4: Pack and unpack a message in Go -// -// foo := &pb.Foo{...} -// any, err := anypb.New(foo) -// if err != nil { -// ... -// } -// ... -// foo := &pb.Foo{} -// if err := any.UnmarshalTo(foo); err != nil { -// ... -// } -// -// The pack methods provided by protobuf library will by default use -// 'type.googleapis.com/full.type.name' as the type URL and the unpack -// methods only use the fully qualified type name after the last '/' -// in the type URL, for example "foo.bar.com/x/y.z" will yield type -// name "y.z". -// -// -// JSON -// ==== -// The JSON representation of an `Any` value uses the regular -// representation of the deserialized, embedded message, with an -// additional field `@type` which contains the type URL. Example: -// -// package google.profile; -// message Person { -// string first_name = 1; -// string last_name = 2; -// } -// -// { -// "@type": "type.googleapis.com/google.profile.Person", -// "firstName": , -// "lastName": -// } -// -// If the embedded message type is well-known and has a custom JSON -// representation, that representation will be embedded adding a field -// `value` which holds the custom JSON in addition to the `@type` -// field. Example (for message [google.protobuf.Duration][]): -// -// { -// "@type": "type.googleapis.com/google.protobuf.Duration", -// "value": "1.212s" -// } -// swagger:model protobufAny -type ProtobufAny struct { - - // A URL/resource name that uniquely identifies the type of the serialized - // protocol buffer message. This string must contain at least - // one "/" character. The last segment of the URL's path must represent - // the fully qualified name of the type (as in - // `path/google.protobuf.Duration`). The name should be in a canonical form - // (e.g., leading "." is not accepted). - // - // In practice, teams usually precompile into the binary all types that they - // expect it to use in the context of Any. However, for URLs which use the - // scheme `http`, `https`, or no scheme, one can optionally set up a type - // server that maps type URLs to message definitions as follows: - // - // * If no scheme is provided, `https` is assumed. - // * An HTTP GET on the URL must yield a [google.protobuf.Type][] - // value in binary format, or produce an error. - // * Applications are allowed to cache lookup results based on the - // URL, or have them precompiled into a binary to avoid any - // lookup. Therefore, binary compatibility needs to be preserved - // on changes to types. (Use versioned type names to manage - // breaking changes.) - // - // Note: this functionality is not currently available in the official - // protobuf release, and it is not used for type URLs beginning with - // type.googleapis.com. - // - // Schemes other than `http`, `https` (or the empty scheme) might be - // used with implementation specific semantics. - TypeURL string `json:"type_url,omitempty"` - - // Must be a valid serialized protocol buffer of the above specified type. - // Format: byte - Value strfmt.Base64 `json:"value,omitempty"` -} - -// Validate validates this protobuf any -func (m *ProtobufAny) Validate(formats strfmt.Registry) error { - var res []error - - if err := m.validateValue(formats); err != nil { - res = append(res, err) - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} - -func (m *ProtobufAny) validateValue(formats strfmt.Registry) error { - - if swag.IsZero(m.Value) { // not required - return nil - } - - // Format "byte" (base64 string) is already validated when unmarshalled - - return nil -} - -// MarshalBinary interface implementation -func (m *ProtobufAny) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *ProtobufAny) UnmarshalBinary(b []byte) error { - var res ProtobufAny - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/backend/api/v1beta1/swagger/visualization.swagger.json b/backend/api/v1beta1/swagger/visualization.swagger.json deleted file mode 100644 index 731def0a715..00000000000 --- a/backend/api/v1beta1/swagger/visualization.swagger.json +++ /dev/null @@ -1,143 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "title": "backend/api/v1beta1/visualization.proto", - "version": "version not set" - }, - "schemes": [ - "http", - "https" - ], - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "paths": { - "/apis/v1beta1/visualizations/{namespace}": { - "post": { - "operationId": "VisualizationService_CreateVisualizationV1", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/apiVisualization" - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "$ref": "#/definitions/gatewayruntimeError" - } - } - }, - "parameters": [ - { - "name": "namespace", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/apiVisualization" - } - } - ], - "tags": [ - "VisualizationService" - ] - } - } - }, - "definitions": { - "apiVisualization": { - "type": "object", - "properties": { - "type": { - "$ref": "#/definitions/apiVisualizationType" - }, - "source": { - "type": "string", - "description": "Path pattern of input data to be used during generation of visualizations.\nThis is required when creating the pipeline through CreateVisualization\nAPI." - }, - "arguments": { - "type": "string", - "description": "Variables to be used during generation of a visualization.\nThis should be provided as a JSON string.\nThis is required when creating the pipeline through CreateVisualization\nAPI." - }, - "html": { - "type": "string", - "description": "Output. Generated visualization html." - }, - "error": { - "type": "string", - "description": "In case any error happens when generating visualizations, only\nvisualization ID and the error message are returned. Client has the\nflexibility of choosing how to handle the error." - } - } - }, - "apiVisualizationType": { - "type": "string", - "enum": [ - "ROC_CURVE", - "TFDV", - "TFMA", - "TABLE", - "CUSTOM" - ], - "default": "ROC_CURVE", - "description": "Type of visualization to be generated.\nThis is required when creating the pipeline through CreateVisualization\nAPI." - }, - "gatewayruntimeError": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "$ref": "#/definitions/protobufAny" - } - } - } - }, - "protobufAny": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "type": "string", - "format": "byte", - "description": "Must be a valid serialized protocol buffer of the above specified type." - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(\u0026foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\n Example 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\n Example 4: Pack and unpack a message in Go\n\n foo := \u0026pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := \u0026pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n====\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": \u003cstring\u003e,\n \"lastName\": \u003cstring\u003e\n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - }, - "securityDefinitions": { - "Bearer": { - "type": "apiKey", - "name": "authorization", - "in": "header" - } - }, - "security": [ - { - "Bearer": [] - } - ] -} diff --git a/backend/api/v1beta1/visualization.proto b/backend/api/v1beta1/visualization.proto deleted file mode 100644 index 168f84f1cf3..00000000000 --- a/backend/api/v1beta1/visualization.proto +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright 2019 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. - -syntax = "proto3"; - -option go_package = "github.com/kubeflow/pipelines/backend/api/v1beta1/go_client"; -package api; - -import "google/api/annotations.proto"; -import "backend/api/v1beta1/error.proto"; -import "protoc-gen-swagger/options/annotations.proto"; - -option (grpc.gateway.protoc_gen_swagger.options.openapiv2_swagger) = { - schemes: [1, 2], // http + https - responses: { - key: "default"; - value: { - schema: { - json_schema: { - ref: ".api.Status"; - } - } - } - } - // Use bearer token for authorizing access to job service. - // Kubernetes client library(https://kubernetes.io/docs/reference/using-api/client-libraries/) - // uses bearer token as default for authorization. The section below - // ensures security definition object is generated in the swagger definition. - // For more details see https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#securityDefinitionsObject - security_definitions: { - security: { - key: "Bearer"; - value: { - type: TYPE_API_KEY; - in: IN_HEADER; - name: "authorization"; - } - } - } - security: { - security_requirement: { - key: "Bearer"; - value: {}; - } - } -}; - -service VisualizationService { - rpc CreateVisualizationV1(CreateVisualizationRequest) returns (Visualization) { - option (google.api.http) = { - post: "/apis/v1beta1/visualizations/{namespace}" - body: "visualization" - }; - } -} - -// Create visualization by providing the type of visualization that is desired -// and input data paths. Input dat paths are assumed to be unique and are used -// for determining output path. -message CreateVisualizationRequest { - Visualization visualization = 1; - string namespace = 2; -} - -message Visualization { - // Type of visualization to be generated. - // This is required when creating the pipeline through CreateVisualization - // API. - enum Type { - ROC_CURVE = 0; - TFDV = 1; - TFMA = 2; - TABLE = 3; - CUSTOM = 4; - }; - Type type = 1; - - // Path pattern of input data to be used during generation of visualizations. - // This is required when creating the pipeline through CreateVisualization - // API. - string source = 2; - - // Variables to be used during generation of a visualization. - // This should be provided as a JSON string. - // This is required when creating the pipeline through CreateVisualization - // API. - string arguments = 3; - - // Output. Generated visualization html. - string html = 4; - - // In case any error happens when generating visualizations, only - // visualization ID and the error message are returned. Client has the - // flexibility of choosing how to handle the error. - string error = 5; -} diff --git a/backend/api/v2beta1/go_client/visualization.pb.go b/backend/api/v2beta1/go_client/visualization.pb.go deleted file mode 100644 index 7b991b05ca3..00000000000 --- a/backend/api/v2beta1/go_client/visualization.pb.go +++ /dev/null @@ -1,479 +0,0 @@ -// Copyright 2023 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. - -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.33.0 -// protoc v3.17.3 -// source: backend/api/v2beta1/visualization.proto - -package go_client - -import ( - context "context" - _ "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger/options" - _ "google.golang.org/genproto/googleapis/api/annotations" - _ "google.golang.org/genproto/googleapis/rpc/status" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -// Type of visualization to be generated. -// This is required when creating the pipeline through CreateVisualization -// API. -type Visualization_Type int32 - -const ( - Visualization_ROC_CURVE Visualization_Type = 0 - Visualization_TFDV Visualization_Type = 1 - Visualization_TFMA Visualization_Type = 2 - Visualization_TABLE Visualization_Type = 3 - Visualization_CUSTOM Visualization_Type = 4 -) - -// Enum value maps for Visualization_Type. -var ( - Visualization_Type_name = map[int32]string{ - 0: "ROC_CURVE", - 1: "TFDV", - 2: "TFMA", - 3: "TABLE", - 4: "CUSTOM", - } - Visualization_Type_value = map[string]int32{ - "ROC_CURVE": 0, - "TFDV": 1, - "TFMA": 2, - "TABLE": 3, - "CUSTOM": 4, - } -) - -func (x Visualization_Type) Enum() *Visualization_Type { - p := new(Visualization_Type) - *p = x - return p -} - -func (x Visualization_Type) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (Visualization_Type) Descriptor() protoreflect.EnumDescriptor { - return file_backend_api_v2beta1_visualization_proto_enumTypes[0].Descriptor() -} - -func (Visualization_Type) Type() protoreflect.EnumType { - return &file_backend_api_v2beta1_visualization_proto_enumTypes[0] -} - -func (x Visualization_Type) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use Visualization_Type.Descriptor instead. -func (Visualization_Type) EnumDescriptor() ([]byte, []int) { - return file_backend_api_v2beta1_visualization_proto_rawDescGZIP(), []int{1, 0} -} - -// Create visualization by providing the type of visualization that is desired -// and input data paths. Input dat paths are assumed to be unique and are used -// for determining output path. -type CreateVisualizationRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Visualization *Visualization `protobuf:"bytes,1,opt,name=visualization,proto3" json:"visualization,omitempty"` - Namespace string `protobuf:"bytes,2,opt,name=namespace,proto3" json:"namespace,omitempty"` -} - -func (x *CreateVisualizationRequest) Reset() { - *x = CreateVisualizationRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_backend_api_v2beta1_visualization_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *CreateVisualizationRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CreateVisualizationRequest) ProtoMessage() {} - -func (x *CreateVisualizationRequest) ProtoReflect() protoreflect.Message { - mi := &file_backend_api_v2beta1_visualization_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use CreateVisualizationRequest.ProtoReflect.Descriptor instead. -func (*CreateVisualizationRequest) Descriptor() ([]byte, []int) { - return file_backend_api_v2beta1_visualization_proto_rawDescGZIP(), []int{0} -} - -func (x *CreateVisualizationRequest) GetVisualization() *Visualization { - if x != nil { - return x.Visualization - } - return nil -} - -func (x *CreateVisualizationRequest) GetNamespace() string { - if x != nil { - return x.Namespace - } - return "" -} - -type Visualization struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Type Visualization_Type `protobuf:"varint,1,opt,name=type,proto3,enum=kubeflow.pipelines.backend.api.v2beta1.Visualization_Type" json:"type,omitempty"` - // Path pattern of input data to be used during generation of visualizations. - // This is required when creating the pipeline through CreateVisualization - // API. - Source string `protobuf:"bytes,2,opt,name=source,proto3" json:"source,omitempty"` - // Variables to be used during generation of a visualization. - // This should be provided as a JSON string. - // This is required when creating the pipeline through CreateVisualization - // API. - Arguments string `protobuf:"bytes,3,opt,name=arguments,proto3" json:"arguments,omitempty"` - // Output. Generated visualization html. - Html string `protobuf:"bytes,4,opt,name=html,proto3" json:"html,omitempty"` - // In case any error happens when generating visualizations, only - // visualization ID and the error message are returned. Client has the - // flexibility of choosing how to handle the error. - Error string `protobuf:"bytes,5,opt,name=error,proto3" json:"error,omitempty"` -} - -func (x *Visualization) Reset() { - *x = Visualization{} - if protoimpl.UnsafeEnabled { - mi := &file_backend_api_v2beta1_visualization_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Visualization) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Visualization) ProtoMessage() {} - -func (x *Visualization) ProtoReflect() protoreflect.Message { - mi := &file_backend_api_v2beta1_visualization_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Visualization.ProtoReflect.Descriptor instead. -func (*Visualization) Descriptor() ([]byte, []int) { - return file_backend_api_v2beta1_visualization_proto_rawDescGZIP(), []int{1} -} - -func (x *Visualization) GetType() Visualization_Type { - if x != nil { - return x.Type - } - return Visualization_ROC_CURVE -} - -func (x *Visualization) GetSource() string { - if x != nil { - return x.Source - } - return "" -} - -func (x *Visualization) GetArguments() string { - if x != nil { - return x.Arguments - } - return "" -} - -func (x *Visualization) GetHtml() string { - if x != nil { - return x.Html - } - return "" -} - -func (x *Visualization) GetError() string { - if x != nil { - return x.Error - } - return "" -} - -var File_backend_api_v2beta1_visualization_proto protoreflect.FileDescriptor - -var file_backend_api_v2beta1_visualization_proto_rawDesc = []byte{ - 0x0a, 0x27, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, - 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x76, 0x69, 0x73, 0x75, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x26, 0x6b, 0x75, 0x62, 0x65, 0x66, - 0x6c, 0x6f, 0x77, 0x2e, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x62, 0x61, - 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x62, 0x65, 0x74, 0x61, - 0x31, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, - 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, - 0x2c, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x73, 0x77, 0x61, 0x67, - 0x67, 0x65, 0x72, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x72, 0x70, 0x63, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x97, 0x01, 0x0a, 0x1a, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x5b, 0x0a, 0x0d, 0x76, 0x69, 0x73, 0x75, 0x61, 0x6c, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x6b, - 0x75, 0x62, 0x65, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, - 0x73, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x76, 0x69, 0x73, 0x75, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x22, 0x81, 0x02, 0x0a, 0x0d, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x4e, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x3a, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x70, 0x69, 0x70, 0x65, - 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x32, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6c, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, - 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, - 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x74, 0x6d, 0x6c, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x74, 0x6d, 0x6c, 0x12, 0x14, 0x0a, 0x05, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x22, 0x40, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x4f, - 0x43, 0x5f, 0x43, 0x55, 0x52, 0x56, 0x45, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x54, 0x46, 0x44, - 0x56, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x54, 0x46, 0x4d, 0x41, 0x10, 0x02, 0x12, 0x09, 0x0a, - 0x05, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x55, 0x53, 0x54, - 0x4f, 0x4d, 0x10, 0x04, 0x32, 0xec, 0x01, 0x0a, 0x14, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6c, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xd3, 0x01, - 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6c, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x31, 0x12, 0x42, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x66, 0x6c, - 0x6f, 0x77, 0x2e, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x62, 0x61, 0x63, - 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x62, 0x65, 0x74, 0x61, 0x31, - 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6c, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x6b, 0x75, - 0x62, 0x65, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, - 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x62, - 0x65, 0x74, 0x61, 0x31, 0x2e, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x22, 0x3f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x39, 0x3a, 0x0d, 0x76, 0x69, 0x73, 0x75, - 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x28, 0x2f, 0x61, 0x70, 0x69, 0x73, - 0x2f, 0x76, 0x32, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x76, 0x69, 0x73, 0x75, 0x61, 0x6c, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x7d, 0x42, 0x98, 0x01, 0x92, 0x41, 0x58, 0x2a, 0x02, 0x01, 0x02, 0x52, 0x23, 0x0a, - 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x18, 0x12, 0x16, 0x0a, 0x14, 0x1a, 0x12, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x5a, 0x1f, 0x0a, 0x1d, 0x0a, 0x06, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x13, - 0x08, 0x02, 0x1a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, - 0x00, 0x5a, 0x3b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x75, - 0x62, 0x65, 0x66, 0x6c, 0x6f, 0x77, 0x2f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, - 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x62, - 0x65, 0x74, 0x61, 0x31, 0x2f, 0x67, 0x6f, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_backend_api_v2beta1_visualization_proto_rawDescOnce sync.Once - file_backend_api_v2beta1_visualization_proto_rawDescData = file_backend_api_v2beta1_visualization_proto_rawDesc -) - -func file_backend_api_v2beta1_visualization_proto_rawDescGZIP() []byte { - file_backend_api_v2beta1_visualization_proto_rawDescOnce.Do(func() { - file_backend_api_v2beta1_visualization_proto_rawDescData = protoimpl.X.CompressGZIP(file_backend_api_v2beta1_visualization_proto_rawDescData) - }) - return file_backend_api_v2beta1_visualization_proto_rawDescData -} - -var file_backend_api_v2beta1_visualization_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_backend_api_v2beta1_visualization_proto_msgTypes = make([]protoimpl.MessageInfo, 2) -var file_backend_api_v2beta1_visualization_proto_goTypes = []interface{}{ - (Visualization_Type)(0), // 0: kubeflow.pipelines.backend.api.v2beta1.Visualization.Type - (*CreateVisualizationRequest)(nil), // 1: kubeflow.pipelines.backend.api.v2beta1.CreateVisualizationRequest - (*Visualization)(nil), // 2: kubeflow.pipelines.backend.api.v2beta1.Visualization -} -var file_backend_api_v2beta1_visualization_proto_depIdxs = []int32{ - 2, // 0: kubeflow.pipelines.backend.api.v2beta1.CreateVisualizationRequest.visualization:type_name -> kubeflow.pipelines.backend.api.v2beta1.Visualization - 0, // 1: kubeflow.pipelines.backend.api.v2beta1.Visualization.type:type_name -> kubeflow.pipelines.backend.api.v2beta1.Visualization.Type - 1, // 2: kubeflow.pipelines.backend.api.v2beta1.VisualizationService.CreateVisualizationV1:input_type -> kubeflow.pipelines.backend.api.v2beta1.CreateVisualizationRequest - 2, // 3: kubeflow.pipelines.backend.api.v2beta1.VisualizationService.CreateVisualizationV1:output_type -> kubeflow.pipelines.backend.api.v2beta1.Visualization - 3, // [3:4] is the sub-list for method output_type - 2, // [2:3] is the sub-list for method input_type - 2, // [2:2] is the sub-list for extension type_name - 2, // [2:2] is the sub-list for extension extendee - 0, // [0:2] is the sub-list for field type_name -} - -func init() { file_backend_api_v2beta1_visualization_proto_init() } -func file_backend_api_v2beta1_visualization_proto_init() { - if File_backend_api_v2beta1_visualization_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_backend_api_v2beta1_visualization_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateVisualizationRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_backend_api_v2beta1_visualization_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Visualization); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_backend_api_v2beta1_visualization_proto_rawDesc, - NumEnums: 1, - NumMessages: 2, - NumExtensions: 0, - NumServices: 1, - }, - GoTypes: file_backend_api_v2beta1_visualization_proto_goTypes, - DependencyIndexes: file_backend_api_v2beta1_visualization_proto_depIdxs, - EnumInfos: file_backend_api_v2beta1_visualization_proto_enumTypes, - MessageInfos: file_backend_api_v2beta1_visualization_proto_msgTypes, - }.Build() - File_backend_api_v2beta1_visualization_proto = out.File - file_backend_api_v2beta1_visualization_proto_rawDesc = nil - file_backend_api_v2beta1_visualization_proto_goTypes = nil - file_backend_api_v2beta1_visualization_proto_depIdxs = nil -} - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConnInterface - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion6 - -// VisualizationServiceClient is the client API for VisualizationService service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type VisualizationServiceClient interface { - CreateVisualizationV1(ctx context.Context, in *CreateVisualizationRequest, opts ...grpc.CallOption) (*Visualization, error) -} - -type visualizationServiceClient struct { - cc grpc.ClientConnInterface -} - -func NewVisualizationServiceClient(cc grpc.ClientConnInterface) VisualizationServiceClient { - return &visualizationServiceClient{cc} -} - -func (c *visualizationServiceClient) CreateVisualizationV1(ctx context.Context, in *CreateVisualizationRequest, opts ...grpc.CallOption) (*Visualization, error) { - out := new(Visualization) - err := c.cc.Invoke(ctx, "/kubeflow.pipelines.backend.api.v2beta1.VisualizationService/CreateVisualizationV1", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// VisualizationServiceServer is the server API for VisualizationService service. -type VisualizationServiceServer interface { - CreateVisualizationV1(context.Context, *CreateVisualizationRequest) (*Visualization, error) -} - -// UnimplementedVisualizationServiceServer can be embedded to have forward compatible implementations. -type UnimplementedVisualizationServiceServer struct { -} - -func (*UnimplementedVisualizationServiceServer) CreateVisualizationV1(context.Context, *CreateVisualizationRequest) (*Visualization, error) { - return nil, status.Errorf(codes.Unimplemented, "method CreateVisualizationV1 not implemented") -} - -func RegisterVisualizationServiceServer(s *grpc.Server, srv VisualizationServiceServer) { - s.RegisterService(&_VisualizationService_serviceDesc, srv) -} - -func _VisualizationService_CreateVisualizationV1_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CreateVisualizationRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(VisualizationServiceServer).CreateVisualizationV1(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/kubeflow.pipelines.backend.api.v2beta1.VisualizationService/CreateVisualizationV1", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(VisualizationServiceServer).CreateVisualizationV1(ctx, req.(*CreateVisualizationRequest)) - } - return interceptor(ctx, in, info, handler) -} - -var _VisualizationService_serviceDesc = grpc.ServiceDesc{ - ServiceName: "kubeflow.pipelines.backend.api.v2beta1.VisualizationService", - HandlerType: (*VisualizationServiceServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "CreateVisualizationV1", - Handler: _VisualizationService_CreateVisualizationV1_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "backend/api/v2beta1/visualization.proto", -} diff --git a/backend/api/v2beta1/go_client/visualization.pb.gw.go b/backend/api/v2beta1/go_client/visualization.pb.gw.go deleted file mode 100644 index 178660b4af2..00000000000 --- a/backend/api/v2beta1/go_client/visualization.pb.gw.go +++ /dev/null @@ -1,205 +0,0 @@ -// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. -// source: backend/api/v2beta1/visualization.proto - -/* -Package go_client is a reverse proxy. - -It translates gRPC into RESTful JSON APIs. -*/ -package go_client - -import ( - "context" - "io" - "net/http" - - "github.com/golang/protobuf/descriptor" - "github.com/golang/protobuf/proto" - "github.com/grpc-ecosystem/grpc-gateway/runtime" - "github.com/grpc-ecosystem/grpc-gateway/utilities" - "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/grpclog" - "google.golang.org/grpc/metadata" - "google.golang.org/grpc/status" -) - -// Suppress "imported and not used" errors -var _ codes.Code -var _ io.Reader -var _ status.Status -var _ = runtime.String -var _ = utilities.NewDoubleArray -var _ = descriptor.ForMessage -var _ = metadata.Join - -func request_VisualizationService_CreateVisualizationV1_0(ctx context.Context, marshaler runtime.Marshaler, client VisualizationServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CreateVisualizationRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Visualization); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["namespace"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "namespace") - } - - protoReq.Namespace, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "namespace", err) - } - - msg, err := client.CreateVisualizationV1(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_VisualizationService_CreateVisualizationV1_0(ctx context.Context, marshaler runtime.Marshaler, server VisualizationServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CreateVisualizationRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Visualization); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["namespace"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "namespace") - } - - protoReq.Namespace, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "namespace", err) - } - - msg, err := server.CreateVisualizationV1(ctx, &protoReq) - return msg, metadata, err - -} - -// RegisterVisualizationServiceHandlerServer registers the http handlers for service VisualizationService to "mux". -// UnaryRPC :call VisualizationServiceServer directly. -// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. -// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterVisualizationServiceHandlerFromEndpoint instead. -func RegisterVisualizationServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server VisualizationServiceServer) error { - - mux.Handle("POST", pattern_VisualizationService_CreateVisualizationV1_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_VisualizationService_CreateVisualizationV1_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_VisualizationService_CreateVisualizationV1_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - return nil -} - -// RegisterVisualizationServiceHandlerFromEndpoint is same as RegisterVisualizationServiceHandler but -// automatically dials to "endpoint" and closes the connection when "ctx" gets done. -func RegisterVisualizationServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { - conn, err := grpc.Dial(endpoint, opts...) - if err != nil { - return err - } - defer func() { - if err != nil { - if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) - } - return - } - go func() { - <-ctx.Done() - if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) - } - }() - }() - - return RegisterVisualizationServiceHandler(ctx, mux, conn) -} - -// RegisterVisualizationServiceHandler registers the http handlers for service VisualizationService to "mux". -// The handlers forward requests to the grpc endpoint over "conn". -func RegisterVisualizationServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { - return RegisterVisualizationServiceHandlerClient(ctx, mux, NewVisualizationServiceClient(conn)) -} - -// RegisterVisualizationServiceHandlerClient registers the http handlers for service VisualizationService -// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "VisualizationServiceClient". -// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "VisualizationServiceClient" -// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in -// "VisualizationServiceClient" to call the correct interceptors. -func RegisterVisualizationServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client VisualizationServiceClient) error { - - mux.Handle("POST", pattern_VisualizationService_CreateVisualizationV1_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_VisualizationService_CreateVisualizationV1_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_VisualizationService_CreateVisualizationV1_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - return nil -} - -var ( - pattern_VisualizationService_CreateVisualizationV1_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"apis", "v2beta1", "visualizations", "namespace"}, "", runtime.AssumeColonVerbOpt(true))) -) - -var ( - forward_VisualizationService_CreateVisualizationV1_0 = runtime.ForwardResponseMessage -) diff --git a/backend/api/v2beta1/go_http_client/visualization_client/visualization_client.go b/backend/api/v2beta1/go_http_client/visualization_client/visualization_client.go deleted file mode 100644 index cb722eda14f..00000000000 --- a/backend/api/v2beta1/go_http_client/visualization_client/visualization_client.go +++ /dev/null @@ -1,117 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package visualization_client - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "github.com/go-openapi/runtime" - httptransport "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" - - "github.com/kubeflow/pipelines/backend/api/v2beta1/go_http_client/visualization_client/visualization_service" -) - -// Default visualization HTTP client. -var Default = NewHTTPClient(nil) - -const ( - // DefaultHost is the default Host - // found in Meta (info) section of spec file - DefaultHost string = "localhost" - // DefaultBasePath is the default BasePath - // found in Meta (info) section of spec file - DefaultBasePath string = "/" -) - -// DefaultSchemes are the default schemes found in Meta (info) section of spec file -var DefaultSchemes = []string{"http", "https"} - -// NewHTTPClient creates a new visualization HTTP client. -func NewHTTPClient(formats strfmt.Registry) *Visualization { - return NewHTTPClientWithConfig(formats, nil) -} - -// NewHTTPClientWithConfig creates a new visualization HTTP client, -// using a customizable transport config. -func NewHTTPClientWithConfig(formats strfmt.Registry, cfg *TransportConfig) *Visualization { - // ensure nullable parameters have default - if cfg == nil { - cfg = DefaultTransportConfig() - } - - // create transport and client - transport := httptransport.New(cfg.Host, cfg.BasePath, cfg.Schemes) - return New(transport, formats) -} - -// New creates a new visualization client -func New(transport runtime.ClientTransport, formats strfmt.Registry) *Visualization { - // ensure nullable parameters have default - if formats == nil { - formats = strfmt.Default - } - - cli := new(Visualization) - cli.Transport = transport - - cli.VisualizationService = visualization_service.New(transport, formats) - - return cli -} - -// DefaultTransportConfig creates a TransportConfig with the -// default settings taken from the meta section of the spec file. -func DefaultTransportConfig() *TransportConfig { - return &TransportConfig{ - Host: DefaultHost, - BasePath: DefaultBasePath, - Schemes: DefaultSchemes, - } -} - -// TransportConfig contains the transport related info, -// found in the meta section of the spec file. -type TransportConfig struct { - Host string - BasePath string - Schemes []string -} - -// WithHost overrides the default host, -// provided by the meta section of the spec file. -func (cfg *TransportConfig) WithHost(host string) *TransportConfig { - cfg.Host = host - return cfg -} - -// WithBasePath overrides the default basePath, -// provided by the meta section of the spec file. -func (cfg *TransportConfig) WithBasePath(basePath string) *TransportConfig { - cfg.BasePath = basePath - return cfg -} - -// WithSchemes overrides the default schemes, -// provided by the meta section of the spec file. -func (cfg *TransportConfig) WithSchemes(schemes []string) *TransportConfig { - cfg.Schemes = schemes - return cfg -} - -// Visualization is a client for visualization -type Visualization struct { - VisualizationService *visualization_service.Client - - Transport runtime.ClientTransport -} - -// SetTransport changes the transport on the client and all its subresources -func (c *Visualization) SetTransport(transport runtime.ClientTransport) { - c.Transport = transport - - c.VisualizationService.SetTransport(transport) - -} diff --git a/backend/api/v2beta1/go_http_client/visualization_client/visualization_service/visualization_service_client.go b/backend/api/v2beta1/go_http_client/visualization_client/visualization_service/visualization_service_client.go deleted file mode 100644 index 9c81b3ab5ce..00000000000 --- a/backend/api/v2beta1/go_http_client/visualization_client/visualization_service/visualization_service_client.go +++ /dev/null @@ -1,59 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package visualization_service - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" -) - -// New creates a new visualization service API client. -func New(transport runtime.ClientTransport, formats strfmt.Registry) *Client { - return &Client{transport: transport, formats: formats} -} - -/* -Client for visualization service API -*/ -type Client struct { - transport runtime.ClientTransport - formats strfmt.Registry -} - -/* -VisualizationServiceCreateVisualizationV1 visualization service create visualization v1 API -*/ -func (a *Client) VisualizationServiceCreateVisualizationV1(params *VisualizationServiceCreateVisualizationV1Params, authInfo runtime.ClientAuthInfoWriter) (*VisualizationServiceCreateVisualizationV1OK, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewVisualizationServiceCreateVisualizationV1Params() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "VisualizationService_CreateVisualizationV1", - Method: "POST", - PathPattern: "/apis/v2beta1/visualizations/{namespace}", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &VisualizationServiceCreateVisualizationV1Reader{formats: a.formats}, - AuthInfo: authInfo, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - return result.(*VisualizationServiceCreateVisualizationV1OK), nil - -} - -// SetTransport changes the transport on the client -func (a *Client) SetTransport(transport runtime.ClientTransport) { - a.transport = transport -} diff --git a/backend/api/v2beta1/go_http_client/visualization_client/visualization_service/visualization_service_create_visualization_v1_parameters.go b/backend/api/v2beta1/go_http_client/visualization_client/visualization_service/visualization_service_create_visualization_v1_parameters.go deleted file mode 100644 index fe9fb8a7586..00000000000 --- a/backend/api/v2beta1/go_http_client/visualization_client/visualization_service/visualization_service_create_visualization_v1_parameters.go +++ /dev/null @@ -1,154 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package visualization_service - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" - - visualization_model "github.com/kubeflow/pipelines/backend/api/v2beta1/go_http_client/visualization_model" -) - -// NewVisualizationServiceCreateVisualizationV1Params creates a new VisualizationServiceCreateVisualizationV1Params object -// with the default values initialized. -func NewVisualizationServiceCreateVisualizationV1Params() *VisualizationServiceCreateVisualizationV1Params { - var () - return &VisualizationServiceCreateVisualizationV1Params{ - - timeout: cr.DefaultTimeout, - } -} - -// NewVisualizationServiceCreateVisualizationV1ParamsWithTimeout creates a new VisualizationServiceCreateVisualizationV1Params object -// with the default values initialized, and the ability to set a timeout on a request -func NewVisualizationServiceCreateVisualizationV1ParamsWithTimeout(timeout time.Duration) *VisualizationServiceCreateVisualizationV1Params { - var () - return &VisualizationServiceCreateVisualizationV1Params{ - - timeout: timeout, - } -} - -// NewVisualizationServiceCreateVisualizationV1ParamsWithContext creates a new VisualizationServiceCreateVisualizationV1Params object -// with the default values initialized, and the ability to set a context for a request -func NewVisualizationServiceCreateVisualizationV1ParamsWithContext(ctx context.Context) *VisualizationServiceCreateVisualizationV1Params { - var () - return &VisualizationServiceCreateVisualizationV1Params{ - - Context: ctx, - } -} - -// NewVisualizationServiceCreateVisualizationV1ParamsWithHTTPClient creates a new VisualizationServiceCreateVisualizationV1Params object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewVisualizationServiceCreateVisualizationV1ParamsWithHTTPClient(client *http.Client) *VisualizationServiceCreateVisualizationV1Params { - var () - return &VisualizationServiceCreateVisualizationV1Params{ - HTTPClient: client, - } -} - -/*VisualizationServiceCreateVisualizationV1Params contains all the parameters to send to the API endpoint -for the visualization service create visualization v1 operation typically these are written to a http.Request -*/ -type VisualizationServiceCreateVisualizationV1Params struct { - - /*Body*/ - Body *visualization_model.V2beta1Visualization - /*Namespace*/ - Namespace string - - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the visualization service create visualization v1 params -func (o *VisualizationServiceCreateVisualizationV1Params) WithTimeout(timeout time.Duration) *VisualizationServiceCreateVisualizationV1Params { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the visualization service create visualization v1 params -func (o *VisualizationServiceCreateVisualizationV1Params) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the visualization service create visualization v1 params -func (o *VisualizationServiceCreateVisualizationV1Params) WithContext(ctx context.Context) *VisualizationServiceCreateVisualizationV1Params { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the visualization service create visualization v1 params -func (o *VisualizationServiceCreateVisualizationV1Params) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the visualization service create visualization v1 params -func (o *VisualizationServiceCreateVisualizationV1Params) WithHTTPClient(client *http.Client) *VisualizationServiceCreateVisualizationV1Params { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the visualization service create visualization v1 params -func (o *VisualizationServiceCreateVisualizationV1Params) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WithBody adds the body to the visualization service create visualization v1 params -func (o *VisualizationServiceCreateVisualizationV1Params) WithBody(body *visualization_model.V2beta1Visualization) *VisualizationServiceCreateVisualizationV1Params { - o.SetBody(body) - return o -} - -// SetBody adds the body to the visualization service create visualization v1 params -func (o *VisualizationServiceCreateVisualizationV1Params) SetBody(body *visualization_model.V2beta1Visualization) { - o.Body = body -} - -// WithNamespace adds the namespace to the visualization service create visualization v1 params -func (o *VisualizationServiceCreateVisualizationV1Params) WithNamespace(namespace string) *VisualizationServiceCreateVisualizationV1Params { - o.SetNamespace(namespace) - return o -} - -// SetNamespace adds the namespace to the visualization service create visualization v1 params -func (o *VisualizationServiceCreateVisualizationV1Params) SetNamespace(namespace string) { - o.Namespace = namespace -} - -// WriteToRequest writes these params to a swagger request -func (o *VisualizationServiceCreateVisualizationV1Params) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - if o.Body != nil { - if err := r.SetBodyParam(o.Body); err != nil { - return err - } - } - - // path param namespace - if err := r.SetPathParam("namespace", o.Namespace); err != nil { - return err - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/backend/api/v2beta1/go_http_client/visualization_client/visualization_service/visualization_service_create_visualization_v1_responses.go b/backend/api/v2beta1/go_http_client/visualization_client/visualization_service/visualization_service_create_visualization_v1_responses.go deleted file mode 100644 index dd8907ff380..00000000000 --- a/backend/api/v2beta1/go_http_client/visualization_client/visualization_service/visualization_service_create_visualization_v1_responses.go +++ /dev/null @@ -1,112 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package visualization_service - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - visualization_model "github.com/kubeflow/pipelines/backend/api/v2beta1/go_http_client/visualization_model" -) - -// VisualizationServiceCreateVisualizationV1Reader is a Reader for the VisualizationServiceCreateVisualizationV1 structure. -type VisualizationServiceCreateVisualizationV1Reader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *VisualizationServiceCreateVisualizationV1Reader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - - case 200: - result := NewVisualizationServiceCreateVisualizationV1OK() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - - default: - result := NewVisualizationServiceCreateVisualizationV1Default(response.Code()) - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - if response.Code()/100 == 2 { - return result, nil - } - return nil, result - } -} - -// NewVisualizationServiceCreateVisualizationV1OK creates a VisualizationServiceCreateVisualizationV1OK with default headers values -func NewVisualizationServiceCreateVisualizationV1OK() *VisualizationServiceCreateVisualizationV1OK { - return &VisualizationServiceCreateVisualizationV1OK{} -} - -/*VisualizationServiceCreateVisualizationV1OK handles this case with default header values. - -A successful response. -*/ -type VisualizationServiceCreateVisualizationV1OK struct { - Payload *visualization_model.V2beta1Visualization -} - -func (o *VisualizationServiceCreateVisualizationV1OK) Error() string { - return fmt.Sprintf("[POST /apis/v2beta1/visualizations/{namespace}][%d] visualizationServiceCreateVisualizationV1OK %+v", 200, o.Payload) -} - -func (o *VisualizationServiceCreateVisualizationV1OK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(visualization_model.V2beta1Visualization) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewVisualizationServiceCreateVisualizationV1Default creates a VisualizationServiceCreateVisualizationV1Default with default headers values -func NewVisualizationServiceCreateVisualizationV1Default(code int) *VisualizationServiceCreateVisualizationV1Default { - return &VisualizationServiceCreateVisualizationV1Default{ - _statusCode: code, - } -} - -/*VisualizationServiceCreateVisualizationV1Default handles this case with default header values. - -An unexpected error response. -*/ -type VisualizationServiceCreateVisualizationV1Default struct { - _statusCode int - - Payload *visualization_model.RuntimeError -} - -// Code gets the status code for the visualization service create visualization v1 default response -func (o *VisualizationServiceCreateVisualizationV1Default) Code() int { - return o._statusCode -} - -func (o *VisualizationServiceCreateVisualizationV1Default) Error() string { - return fmt.Sprintf("[POST /apis/v2beta1/visualizations/{namespace}][%d] VisualizationService_CreateVisualizationV1 default %+v", o._statusCode, o.Payload) -} - -func (o *VisualizationServiceCreateVisualizationV1Default) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(visualization_model.RuntimeError) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/backend/api/v2beta1/go_http_client/visualization_model/protobuf_any.go b/backend/api/v2beta1/go_http_client/visualization_model/protobuf_any.go deleted file mode 100644 index a8f3909206e..00000000000 --- a/backend/api/v2beta1/go_http_client/visualization_model/protobuf_any.go +++ /dev/null @@ -1,175 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package visualization_model - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/errors" - "github.com/go-openapi/swag" -) - -// ProtobufAny `Any` contains an arbitrary serialized protocol buffer message along with a -// URL that describes the type of the serialized message. -// -// Protobuf library provides support to pack/unpack Any values in the form -// of utility functions or additional generated methods of the Any type. -// -// Example 1: Pack and unpack a message in C++. -// -// Foo foo = ...; -// Any any; -// any.PackFrom(foo); -// ... -// if (any.UnpackTo(&foo)) { -// ... -// } -// -// Example 2: Pack and unpack a message in Java. -// -// Foo foo = ...; -// Any any = Any.pack(foo); -// ... -// if (any.is(Foo.class)) { -// foo = any.unpack(Foo.class); -// } -// -// Example 3: Pack and unpack a message in Python. -// -// foo = Foo(...) -// any = Any() -// any.Pack(foo) -// ... -// if any.Is(Foo.DESCRIPTOR): -// any.Unpack(foo) -// ... -// -// Example 4: Pack and unpack a message in Go -// -// foo := &pb.Foo{...} -// any, err := anypb.New(foo) -// if err != nil { -// ... -// } -// ... -// foo := &pb.Foo{} -// if err := any.UnmarshalTo(foo); err != nil { -// ... -// } -// -// The pack methods provided by protobuf library will by default use -// 'type.googleapis.com/full.type.name' as the type URL and the unpack -// methods only use the fully qualified type name after the last '/' -// in the type URL, for example "foo.bar.com/x/y.z" will yield type -// name "y.z". -// -// -// JSON -// ==== -// The JSON representation of an `Any` value uses the regular -// representation of the deserialized, embedded message, with an -// additional field `@type` which contains the type URL. Example: -// -// package google.profile; -// message Person { -// string first_name = 1; -// string last_name = 2; -// } -// -// { -// "@type": "type.googleapis.com/google.profile.Person", -// "firstName": , -// "lastName": -// } -// -// If the embedded message type is well-known and has a custom JSON -// representation, that representation will be embedded adding a field -// `value` which holds the custom JSON in addition to the `@type` -// field. Example (for message [google.protobuf.Duration][]): -// -// { -// "@type": "type.googleapis.com/google.protobuf.Duration", -// "value": "1.212s" -// } -// swagger:model protobufAny -type ProtobufAny struct { - - // A URL/resource name that uniquely identifies the type of the serialized - // protocol buffer message. This string must contain at least - // one "/" character. The last segment of the URL's path must represent - // the fully qualified name of the type (as in - // `path/google.protobuf.Duration`). The name should be in a canonical form - // (e.g., leading "." is not accepted). - // - // In practice, teams usually precompile into the binary all types that they - // expect it to use in the context of Any. However, for URLs which use the - // scheme `http`, `https`, or no scheme, one can optionally set up a type - // server that maps type URLs to message definitions as follows: - // - // * If no scheme is provided, `https` is assumed. - // * An HTTP GET on the URL must yield a [google.protobuf.Type][] - // value in binary format, or produce an error. - // * Applications are allowed to cache lookup results based on the - // URL, or have them precompiled into a binary to avoid any - // lookup. Therefore, binary compatibility needs to be preserved - // on changes to types. (Use versioned type names to manage - // breaking changes.) - // - // Note: this functionality is not currently available in the official - // protobuf release, and it is not used for type URLs beginning with - // type.googleapis.com. - // - // Schemes other than `http`, `https` (or the empty scheme) might be - // used with implementation specific semantics. - TypeURL string `json:"type_url,omitempty"` - - // Must be a valid serialized protocol buffer of the above specified type. - // Format: byte - Value strfmt.Base64 `json:"value,omitempty"` -} - -// Validate validates this protobuf any -func (m *ProtobufAny) Validate(formats strfmt.Registry) error { - var res []error - - if err := m.validateValue(formats); err != nil { - res = append(res, err) - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} - -func (m *ProtobufAny) validateValue(formats strfmt.Registry) error { - - if swag.IsZero(m.Value) { // not required - return nil - } - - // Format "byte" (base64 string) is already validated when unmarshalled - - return nil -} - -// MarshalBinary interface implementation -func (m *ProtobufAny) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *ProtobufAny) UnmarshalBinary(b []byte) error { - var res ProtobufAny - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/backend/api/v2beta1/go_http_client/visualization_model/runtime_error.go b/backend/api/v2beta1/go_http_client/visualization_model/runtime_error.go deleted file mode 100644 index d3023542372..00000000000 --- a/backend/api/v2beta1/go_http_client/visualization_model/runtime_error.go +++ /dev/null @@ -1,89 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package visualization_model - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "strconv" - - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/errors" - "github.com/go-openapi/swag" -) - -// RuntimeError runtime error -// swagger:model runtimeError -type RuntimeError struct { - - // code - Code int32 `json:"code,omitempty"` - - // details - Details []*ProtobufAny `json:"details"` - - // error - Error string `json:"error,omitempty"` - - // message - Message string `json:"message,omitempty"` -} - -// Validate validates this runtime error -func (m *RuntimeError) Validate(formats strfmt.Registry) error { - var res []error - - if err := m.validateDetails(formats); err != nil { - res = append(res, err) - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} - -func (m *RuntimeError) validateDetails(formats strfmt.Registry) error { - - if swag.IsZero(m.Details) { // not required - return nil - } - - for i := 0; i < len(m.Details); i++ { - if swag.IsZero(m.Details[i]) { // not required - continue - } - - if m.Details[i] != nil { - if err := m.Details[i].Validate(formats); err != nil { - if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("details" + "." + strconv.Itoa(i)) - } - return err - } - } - - } - - return nil -} - -// MarshalBinary interface implementation -func (m *RuntimeError) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *RuntimeError) UnmarshalBinary(b []byte) error { - var res RuntimeError - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/backend/api/v2beta1/go_http_client/visualization_model/v2beta1_visualization.go b/backend/api/v2beta1/go_http_client/visualization_model/v2beta1_visualization.go deleted file mode 100644 index effbc893b93..00000000000 --- a/backend/api/v2beta1/go_http_client/visualization_model/v2beta1_visualization.go +++ /dev/null @@ -1,88 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package visualization_model - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/errors" - "github.com/go-openapi/swag" -) - -// V2beta1Visualization v2beta1 visualization -// swagger:model v2beta1Visualization -type V2beta1Visualization struct { - - // Variables to be used during generation of a visualization. - // This should be provided as a JSON string. - // This is required when creating the pipeline through CreateVisualization - // API. - Arguments string `json:"arguments,omitempty"` - - // In case any error happens when generating visualizations, only - // visualization ID and the error message are returned. Client has the - // flexibility of choosing how to handle the error. - Error string `json:"error,omitempty"` - - // Output. Generated visualization html. - HTML string `json:"html,omitempty"` - - // Path pattern of input data to be used during generation of visualizations. - // This is required when creating the pipeline through CreateVisualization - // API. - Source string `json:"source,omitempty"` - - // type - Type V2beta1VisualizationType `json:"type,omitempty"` -} - -// Validate validates this v2beta1 visualization -func (m *V2beta1Visualization) Validate(formats strfmt.Registry) error { - var res []error - - if err := m.validateType(formats); err != nil { - res = append(res, err) - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} - -func (m *V2beta1Visualization) validateType(formats strfmt.Registry) error { - - if swag.IsZero(m.Type) { // not required - return nil - } - - if err := m.Type.Validate(formats); err != nil { - if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("type") - } - return err - } - - return nil -} - -// MarshalBinary interface implementation -func (m *V2beta1Visualization) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *V2beta1Visualization) UnmarshalBinary(b []byte) error { - var res V2beta1Visualization - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/backend/api/v2beta1/go_http_client/visualization_model/v2beta1_visualization_type.go b/backend/api/v2beta1/go_http_client/visualization_model/v2beta1_visualization_type.go deleted file mode 100644 index a2bc71e3854..00000000000 --- a/backend/api/v2beta1/go_http_client/visualization_model/v2beta1_visualization_type.go +++ /dev/null @@ -1,74 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package visualization_model - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "encoding/json" - - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/errors" - "github.com/go-openapi/validate" -) - -// V2beta1VisualizationType Type of visualization to be generated. -// This is required when creating the pipeline through CreateVisualization -// API. -// swagger:model v2beta1VisualizationType -type V2beta1VisualizationType string - -const ( - - // V2beta1VisualizationTypeROCCURVE captures enum value "ROC_CURVE" - V2beta1VisualizationTypeROCCURVE V2beta1VisualizationType = "ROC_CURVE" - - // V2beta1VisualizationTypeTFDV captures enum value "TFDV" - V2beta1VisualizationTypeTFDV V2beta1VisualizationType = "TFDV" - - // V2beta1VisualizationTypeTFMA captures enum value "TFMA" - V2beta1VisualizationTypeTFMA V2beta1VisualizationType = "TFMA" - - // V2beta1VisualizationTypeTABLE captures enum value "TABLE" - V2beta1VisualizationTypeTABLE V2beta1VisualizationType = "TABLE" - - // V2beta1VisualizationTypeCUSTOM captures enum value "CUSTOM" - V2beta1VisualizationTypeCUSTOM V2beta1VisualizationType = "CUSTOM" -) - -// for schema -var v2beta1VisualizationTypeEnum []interface{} - -func init() { - var res []V2beta1VisualizationType - if err := json.Unmarshal([]byte(`["ROC_CURVE","TFDV","TFMA","TABLE","CUSTOM"]`), &res); err != nil { - panic(err) - } - for _, v := range res { - v2beta1VisualizationTypeEnum = append(v2beta1VisualizationTypeEnum, v) - } -} - -func (m V2beta1VisualizationType) validateV2beta1VisualizationTypeEnum(path, location string, value V2beta1VisualizationType) error { - if err := validate.Enum(path, location, value, v2beta1VisualizationTypeEnum); err != nil { - return err - } - return nil -} - -// Validate validates this v2beta1 visualization type -func (m V2beta1VisualizationType) Validate(formats strfmt.Registry) error { - var res []error - - // value enum - if err := m.validateV2beta1VisualizationTypeEnum("", "body", m); err != nil { - return err - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/backend/api/v2beta1/python_http_client/README.md b/backend/api/v2beta1/python_http_client/README.md index 2f9a23e30e7..f52d3d23337 100644 --- a/backend/api/v2beta1/python_http_client/README.md +++ b/backend/api/v2beta1/python_http_client/README.md @@ -134,7 +134,6 @@ Class | Method | HTTP request | Description *RunServiceApi* | [**run_service_retry_run**](docs/RunServiceApi.md#run_service_retry_run) | **POST** /apis/v2beta1/runs/{run_id}:retry | Re-initiates a failed or terminated run. *RunServiceApi* | [**run_service_terminate_run**](docs/RunServiceApi.md#run_service_terminate_run) | **POST** /apis/v2beta1/runs/{run_id}:terminate | Terminates an active run. *RunServiceApi* | [**run_service_unarchive_run**](docs/RunServiceApi.md#run_service_unarchive_run) | **POST** /apis/v2beta1/runs/{run_id}:unarchive | Restores an archived run in an experiment given by run ID and experiment ID. -*VisualizationServiceApi* | [**visualization_service_create_visualization_v1**](docs/VisualizationServiceApi.md#visualization_service_create_visualization_v1) | **POST** /apis/v2beta1/visualizations/{namespace} | ## Documentation For Models @@ -181,8 +180,6 @@ Class | Method | HTTP request | Description - [V2beta1RuntimeStatus](docs/V2beta1RuntimeStatus.md) - [V2beta1Trigger](docs/V2beta1Trigger.md) - [V2beta1Url](docs/V2beta1Url.md) - - [V2beta1Visualization](docs/V2beta1Visualization.md) - - [V2beta1VisualizationType](docs/V2beta1VisualizationType.md) ## Documentation For Authorization diff --git a/backend/api/v2beta1/python_http_client/docs/V2beta1Visualization.md b/backend/api/v2beta1/python_http_client/docs/V2beta1Visualization.md deleted file mode 100644 index 62b6c729c17..00000000000 --- a/backend/api/v2beta1/python_http_client/docs/V2beta1Visualization.md +++ /dev/null @@ -1,14 +0,0 @@ -# V2beta1Visualization - -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**type** | [**V2beta1VisualizationType**](V2beta1VisualizationType.md) | | [optional] -**source** | **str** | Path pattern of input data to be used during generation of visualizations. This is required when creating the pipeline through CreateVisualization API. | [optional] -**arguments** | **str** | Variables to be used during generation of a visualization. This should be provided as a JSON string. This is required when creating the pipeline through CreateVisualization API. | [optional] -**html** | **str** | Output. Generated visualization html. | [optional] -**error** | **str** | In case any error happens when generating visualizations, only visualization ID and the error message are returned. Client has the flexibility of choosing how to handle the error. | [optional] - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/backend/api/v2beta1/python_http_client/docs/V2beta1VisualizationType.md b/backend/api/v2beta1/python_http_client/docs/V2beta1VisualizationType.md deleted file mode 100644 index f96247860b1..00000000000 --- a/backend/api/v2beta1/python_http_client/docs/V2beta1VisualizationType.md +++ /dev/null @@ -1,10 +0,0 @@ -# V2beta1VisualizationType - -Type of visualization to be generated. This is required when creating the pipeline through CreateVisualization API. -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/backend/api/v2beta1/python_http_client/docs/VisualizationServiceApi.md b/backend/api/v2beta1/python_http_client/docs/VisualizationServiceApi.md deleted file mode 100644 index 8d13118d4da..00000000000 --- a/backend/api/v2beta1/python_http_client/docs/VisualizationServiceApi.md +++ /dev/null @@ -1,86 +0,0 @@ -# kfp_server_api.VisualizationServiceApi - -All URIs are relative to *http://localhost* - -Method | HTTP request | Description -------------- | ------------- | ------------- -[**visualization_service_create_visualization_v1**](VisualizationServiceApi.md#visualization_service_create_visualization_v1) | **POST** /apis/v2beta1/visualizations/{namespace} | - - -# **visualization_service_create_visualization_v1** -> V2beta1Visualization visualization_service_create_visualization_v1(namespace, body) - - - -### Example - -* Api Key Authentication (Bearer): -```python -from __future__ import print_function -import time -import kfp_server_api -from kfp_server_api.rest import ApiException -from pprint import pprint -# Defining the host is optional and defaults to http://localhost -# See configuration.py for a list of all supported configuration parameters. -configuration = kfp_server_api.Configuration( - host = "http://localhost" -) - -# The client must configure the authentication and authorization parameters -# in accordance with the API server security policy. -# Examples for each auth method are provided below, use the example that -# satisfies your auth use case. - -# Configure API key authorization: Bearer -configuration = kfp_server_api.Configuration( - host = "http://localhost", - api_key = { - 'authorization': 'YOUR_API_KEY' - } -) -# Uncomment below to setup prefix (e.g. Bearer) for API key, if needed -# configuration.api_key_prefix['authorization'] = 'Bearer' - -# Enter a context with an instance of the API client -with kfp_server_api.ApiClient(configuration) as api_client: - # Create an instance of the API class - api_instance = kfp_server_api.VisualizationServiceApi(api_client) - namespace = 'namespace_example' # str | -body = kfp_server_api.V2beta1Visualization() # V2beta1Visualization | - - try: - api_response = api_instance.visualization_service_create_visualization_v1(namespace, body) - pprint(api_response) - except ApiException as e: - print("Exception when calling VisualizationServiceApi->visualization_service_create_visualization_v1: %s\n" % e) -``` - -### Parameters - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **namespace** | **str**| | - **body** | [**V2beta1Visualization**](V2beta1Visualization.md)| | - -### Return type - -[**V2beta1Visualization**](V2beta1Visualization.md) - -### Authorization - -[Bearer](../README.md#Bearer) - -### HTTP request headers - - - **Content-Type**: application/json - - **Accept**: application/json - -### HTTP response details -| Status code | Description | Response headers | -|-------------|-------------|------------------| -**200** | A successful response. | - | -**0** | An unexpected error response. | - | - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) - diff --git a/backend/api/v2beta1/python_http_client/kfp_server_api/api/visualization_service_api.py b/backend/api/v2beta1/python_http_client/kfp_server_api/api/visualization_service_api.py deleted file mode 100644 index 1fc6f6a0292..00000000000 --- a/backend/api/v2beta1/python_http_client/kfp_server_api/api/visualization_service_api.py +++ /dev/null @@ -1,174 +0,0 @@ -# coding: utf-8 - -""" - Kubeflow Pipelines API - - This file contains REST API specification for Kubeflow Pipelines. The file is autogenerated from the swagger definition. - - Contact: kubeflow-pipelines@google.com - Generated by: https://openapi-generator.tech -""" - - -from __future__ import absolute_import - -import re # noqa: F401 - -# python 2 and python 3 compatibility library -import six - -from kfp_server_api.api_client import ApiClient -from kfp_server_api.exceptions import ( # noqa: F401 - ApiTypeError, - ApiValueError -) - - -class VisualizationServiceApi(object): - """NOTE: This class is auto generated by OpenAPI Generator - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - def __init__(self, api_client=None): - if api_client is None: - api_client = ApiClient() - self.api_client = api_client - - def visualization_service_create_visualization_v1(self, namespace, body, **kwargs): # noqa: E501 - """visualization_service_create_visualization_v1 # noqa: E501 - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - - >>> thread = api.visualization_service_create_visualization_v1(namespace, body, async_req=True) - >>> result = thread.get() - - :param namespace: (required) - :type namespace: str - :param body: (required) - :type body: V2beta1Visualization - :param async_req: Whether to execute the request asynchronously. - :type async_req: bool, optional - :param _preload_content: if False, the urllib3.HTTPResponse object will - be returned without reading/decoding response - data. Default is True. - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :return: Returns the result object. - If the method is called asynchronously, - returns the request thread. - :rtype: V2beta1Visualization - """ - kwargs['_return_http_data_only'] = True - return self.visualization_service_create_visualization_v1_with_http_info(namespace, body, **kwargs) # noqa: E501 - - def visualization_service_create_visualization_v1_with_http_info(self, namespace, body, **kwargs): # noqa: E501 - """visualization_service_create_visualization_v1 # noqa: E501 - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - - >>> thread = api.visualization_service_create_visualization_v1_with_http_info(namespace, body, async_req=True) - >>> result = thread.get() - - :param namespace: (required) - :type namespace: str - :param body: (required) - :type body: V2beta1Visualization - :param async_req: Whether to execute the request asynchronously. - :type async_req: bool, optional - :param _return_http_data_only: response data without head status code - and headers - :type _return_http_data_only: bool, optional - :param _preload_content: if False, the urllib3.HTTPResponse object will - be returned without reading/decoding response - data. Default is True. - :type _preload_content: bool, optional - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :return: Returns the result object. - If the method is called asynchronously, - returns the request thread. - :rtype: tuple(V2beta1Visualization, status_code(int), headers(HTTPHeaderDict)) - """ - - local_var_params = locals() - - all_params = [ - 'namespace', - 'body' - ] - all_params.extend( - [ - 'async_req', - '_return_http_data_only', - '_preload_content', - '_request_timeout' - ] - ) - - for key, val in six.iteritems(local_var_params['kwargs']): - if key not in all_params: - raise ApiTypeError( - "Got an unexpected keyword argument '%s'" - " to method visualization_service_create_visualization_v1" % key - ) - local_var_params[key] = val - del local_var_params['kwargs'] - # verify the required parameter 'namespace' is set - if self.api_client.client_side_validation and ('namespace' not in local_var_params or # noqa: E501 - local_var_params['namespace'] is None): # noqa: E501 - raise ApiValueError("Missing the required parameter `namespace` when calling `visualization_service_create_visualization_v1`") # noqa: E501 - # verify the required parameter 'body' is set - if self.api_client.client_side_validation and ('body' not in local_var_params or # noqa: E501 - local_var_params['body'] is None): # noqa: E501 - raise ApiValueError("Missing the required parameter `body` when calling `visualization_service_create_visualization_v1`") # noqa: E501 - - collection_formats = {} - - path_params = {} - if 'namespace' in local_var_params: - path_params['namespace'] = local_var_params['namespace'] # noqa: E501 - - query_params = [] - - header_params = {} - - form_params = [] - local_var_files = {} - - body_params = None - if 'body' in local_var_params: - body_params = local_var_params['body'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - # Authentication setting - auth_settings = ['Bearer'] # noqa: E501 - - return self.api_client.call_api( - '/apis/v2beta1/visualizations/{namespace}', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=form_params, - files=local_var_files, - response_type='V2beta1Visualization', # noqa: E501 - auth_settings=auth_settings, - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats=collection_formats) diff --git a/backend/api/v2beta1/python_http_client/kfp_server_api/models/v2beta1_visualization.py b/backend/api/v2beta1/python_http_client/kfp_server_api/models/v2beta1_visualization.py deleted file mode 100644 index 40736e15d53..00000000000 --- a/backend/api/v2beta1/python_http_client/kfp_server_api/models/v2beta1_visualization.py +++ /dev/null @@ -1,232 +0,0 @@ -# coding: utf-8 - -""" - Kubeflow Pipelines API - - This file contains REST API specification for Kubeflow Pipelines. The file is autogenerated from the swagger definition. - - Contact: kubeflow-pipelines@google.com - Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -import six - -from kfp_server_api.configuration import Configuration - - -class V2beta1Visualization(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'V2beta1VisualizationType', - 'source': 'str', - 'arguments': 'str', - 'html': 'str', - 'error': 'str' - } - - attribute_map = { - 'type': 'type', - 'source': 'source', - 'arguments': 'arguments', - 'html': 'html', - 'error': 'error' - } - - def __init__(self, type=None, source=None, arguments=None, html=None, error=None, local_vars_configuration=None): # noqa: E501 - """V2beta1Visualization - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._type = None - self._source = None - self._arguments = None - self._html = None - self._error = None - self.discriminator = None - - if type is not None: - self.type = type - if source is not None: - self.source = source - if arguments is not None: - self.arguments = arguments - if html is not None: - self.html = html - if error is not None: - self.error = error - - @property - def type(self): - """Gets the type of this V2beta1Visualization. # noqa: E501 - - - :return: The type of this V2beta1Visualization. # noqa: E501 - :rtype: V2beta1VisualizationType - """ - return self._type - - @type.setter - def type(self, type): - """Sets the type of this V2beta1Visualization. - - - :param type: The type of this V2beta1Visualization. # noqa: E501 - :type type: V2beta1VisualizationType - """ - - self._type = type - - @property - def source(self): - """Gets the source of this V2beta1Visualization. # noqa: E501 - - Path pattern of input data to be used during generation of visualizations. This is required when creating the pipeline through CreateVisualization API. # noqa: E501 - - :return: The source of this V2beta1Visualization. # noqa: E501 - :rtype: str - """ - return self._source - - @source.setter - def source(self, source): - """Sets the source of this V2beta1Visualization. - - Path pattern of input data to be used during generation of visualizations. This is required when creating the pipeline through CreateVisualization API. # noqa: E501 - - :param source: The source of this V2beta1Visualization. # noqa: E501 - :type source: str - """ - - self._source = source - - @property - def arguments(self): - """Gets the arguments of this V2beta1Visualization. # noqa: E501 - - Variables to be used during generation of a visualization. This should be provided as a JSON string. This is required when creating the pipeline through CreateVisualization API. # noqa: E501 - - :return: The arguments of this V2beta1Visualization. # noqa: E501 - :rtype: str - """ - return self._arguments - - @arguments.setter - def arguments(self, arguments): - """Sets the arguments of this V2beta1Visualization. - - Variables to be used during generation of a visualization. This should be provided as a JSON string. This is required when creating the pipeline through CreateVisualization API. # noqa: E501 - - :param arguments: The arguments of this V2beta1Visualization. # noqa: E501 - :type arguments: str - """ - - self._arguments = arguments - - @property - def html(self): - """Gets the html of this V2beta1Visualization. # noqa: E501 - - Output. Generated visualization html. # noqa: E501 - - :return: The html of this V2beta1Visualization. # noqa: E501 - :rtype: str - """ - return self._html - - @html.setter - def html(self, html): - """Sets the html of this V2beta1Visualization. - - Output. Generated visualization html. # noqa: E501 - - :param html: The html of this V2beta1Visualization. # noqa: E501 - :type html: str - """ - - self._html = html - - @property - def error(self): - """Gets the error of this V2beta1Visualization. # noqa: E501 - - In case any error happens when generating visualizations, only visualization ID and the error message are returned. Client has the flexibility of choosing how to handle the error. # noqa: E501 - - :return: The error of this V2beta1Visualization. # noqa: E501 - :rtype: str - """ - return self._error - - @error.setter - def error(self, error): - """Sets the error of this V2beta1Visualization. - - In case any error happens when generating visualizations, only visualization ID and the error message are returned. Client has the flexibility of choosing how to handle the error. # noqa: E501 - - :param error: The error of this V2beta1Visualization. # noqa: E501 - :type error: str - """ - - self._error = error - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, V2beta1Visualization): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, V2beta1Visualization): - return True - - return self.to_dict() != other.to_dict() diff --git a/backend/api/v2beta1/python_http_client/kfp_server_api/models/v2beta1_visualization_type.py b/backend/api/v2beta1/python_http_client/kfp_server_api/models/v2beta1_visualization_type.py deleted file mode 100644 index a4afaeab9a0..00000000000 --- a/backend/api/v2beta1/python_http_client/kfp_server_api/models/v2beta1_visualization_type.py +++ /dev/null @@ -1,103 +0,0 @@ -# coding: utf-8 - -""" - Kubeflow Pipelines API - - This file contains REST API specification for Kubeflow Pipelines. The file is autogenerated from the swagger definition. - - Contact: kubeflow-pipelines@google.com - Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -import six - -from kfp_server_api.configuration import Configuration - - -class V2beta1VisualizationType(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - allowed enum values - """ - ROC_CURVE = "ROC_CURVE" - TFDV = "TFDV" - TFMA = "TFMA" - TABLE = "TABLE" - CUSTOM = "CUSTOM" - - allowable_values = [ROC_CURVE, TFDV, TFMA, TABLE, CUSTOM] # noqa: E501 - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - } - - attribute_map = { - } - - def __init__(self, local_vars_configuration=None): # noqa: E501 - """V2beta1VisualizationType - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - self.discriminator = None - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, V2beta1VisualizationType): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, V2beta1VisualizationType): - return True - - return self.to_dict() != other.to_dict() diff --git a/backend/api/v2beta1/python_http_client/test/test_v2beta1_visualization.py b/backend/api/v2beta1/python_http_client/test/test_v2beta1_visualization.py deleted file mode 100644 index 9603e649bbf..00000000000 --- a/backend/api/v2beta1/python_http_client/test/test_v2beta1_visualization.py +++ /dev/null @@ -1,56 +0,0 @@ -# coding: utf-8 - -""" - Kubeflow Pipelines API - - This file contains REST API specification for Kubeflow Pipelines. The file is autogenerated from the swagger definition. - - Contact: kubeflow-pipelines@google.com - Generated by: https://openapi-generator.tech -""" - - -from __future__ import absolute_import - -import unittest -import datetime - -import kfp_server_api -from kfp_server_api.models.v2beta1_visualization import V2beta1Visualization # noqa: E501 -from kfp_server_api.rest import ApiException - -class TestV2beta1Visualization(unittest.TestCase): - """V2beta1Visualization unit test stubs""" - - def setUp(self): - pass - - def tearDown(self): - pass - - def make_instance(self, include_optional): - """Test V2beta1Visualization - include_option is a boolean, when False only required - params are included, when True both required and - optional params are included """ - # model = kfp_server_api.models.v2beta1_visualization.V2beta1Visualization() # noqa: E501 - if include_optional : - return V2beta1Visualization( - type = 'ROC_CURVE', - source = '0', - arguments = '0', - html = '0', - error = '0' - ) - else : - return V2beta1Visualization( - ) - - def testV2beta1Visualization(self): - """Test V2beta1Visualization""" - inst_req_only = self.make_instance(include_optional=False) - inst_req_and_optional = self.make_instance(include_optional=True) - - -if __name__ == '__main__': - unittest.main() diff --git a/backend/api/v2beta1/python_http_client/test/test_v2beta1_visualization_type.py b/backend/api/v2beta1/python_http_client/test/test_v2beta1_visualization_type.py deleted file mode 100644 index caa8901587c..00000000000 --- a/backend/api/v2beta1/python_http_client/test/test_v2beta1_visualization_type.py +++ /dev/null @@ -1,51 +0,0 @@ -# coding: utf-8 - -""" - Kubeflow Pipelines API - - This file contains REST API specification for Kubeflow Pipelines. The file is autogenerated from the swagger definition. - - Contact: kubeflow-pipelines@google.com - Generated by: https://openapi-generator.tech -""" - - -from __future__ import absolute_import - -import unittest -import datetime - -import kfp_server_api -from kfp_server_api.models.v2beta1_visualization_type import V2beta1VisualizationType # noqa: E501 -from kfp_server_api.rest import ApiException - -class TestV2beta1VisualizationType(unittest.TestCase): - """V2beta1VisualizationType unit test stubs""" - - def setUp(self): - pass - - def tearDown(self): - pass - - def make_instance(self, include_optional): - """Test V2beta1VisualizationType - include_option is a boolean, when False only required - params are included, when True both required and - optional params are included """ - # model = kfp_server_api.models.v2beta1_visualization_type.V2beta1VisualizationType() # noqa: E501 - if include_optional : - return V2beta1VisualizationType( - ) - else : - return V2beta1VisualizationType( - ) - - def testV2beta1VisualizationType(self): - """Test V2beta1VisualizationType""" - inst_req_only = self.make_instance(include_optional=False) - inst_req_and_optional = self.make_instance(include_optional=True) - - -if __name__ == '__main__': - unittest.main() diff --git a/backend/api/v2beta1/python_http_client/test/test_visualization_service_api.py b/backend/api/v2beta1/python_http_client/test/test_visualization_service_api.py deleted file mode 100644 index 97892d5ab54..00000000000 --- a/backend/api/v2beta1/python_http_client/test/test_visualization_service_api.py +++ /dev/null @@ -1,39 +0,0 @@ -# coding: utf-8 - -""" - Kubeflow Pipelines API - - This file contains REST API specification for Kubeflow Pipelines. The file is autogenerated from the swagger definition. - - Contact: kubeflow-pipelines@google.com - Generated by: https://openapi-generator.tech -""" - - -from __future__ import absolute_import - -import unittest - -import kfp_server_api -from kfp_server_api.api.visualization_service_api import VisualizationServiceApi # noqa: E501 -from kfp_server_api.rest import ApiException - - -class TestVisualizationServiceApi(unittest.TestCase): - """VisualizationServiceApi unit test stubs""" - - def setUp(self): - self.api = kfp_server_api.api.visualization_service_api.VisualizationServiceApi() # noqa: E501 - - def tearDown(self): - pass - - def test_visualization_service_create_visualization_v1(self): - """Test case for visualization_service_create_visualization_v1 - - """ - pass - - -if __name__ == '__main__': - unittest.main() diff --git a/backend/api/v2beta1/swagger/visualization.swagger.json b/backend/api/v2beta1/swagger/visualization.swagger.json deleted file mode 100644 index e6caf8cf36e..00000000000 --- a/backend/api/v2beta1/swagger/visualization.swagger.json +++ /dev/null @@ -1,143 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "title": "backend/api/v2beta1/visualization.proto", - "version": "version not set" - }, - "schemes": [ - "http", - "https" - ], - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "paths": { - "/apis/v2beta1/visualizations/{namespace}": { - "post": { - "operationId": "VisualizationService_CreateVisualizationV1", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/v2beta1Visualization" - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "$ref": "#/definitions/runtimeError" - } - } - }, - "parameters": [ - { - "name": "namespace", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/v2beta1Visualization" - } - } - ], - "tags": [ - "VisualizationService" - ] - } - } - }, - "definitions": { - "protobufAny": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "type": "string", - "format": "byte", - "description": "Must be a valid serialized protocol buffer of the above specified type." - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(\u0026foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\n Example 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\n Example 4: Pack and unpack a message in Go\n\n foo := \u0026pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := \u0026pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n====\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": \u003cstring\u003e,\n \"lastName\": \u003cstring\u003e\n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - }, - "runtimeError": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "$ref": "#/definitions/protobufAny" - } - } - } - }, - "v2beta1Visualization": { - "type": "object", - "properties": { - "type": { - "$ref": "#/definitions/v2beta1VisualizationType" - }, - "source": { - "type": "string", - "description": "Path pattern of input data to be used during generation of visualizations.\nThis is required when creating the pipeline through CreateVisualization\nAPI." - }, - "arguments": { - "type": "string", - "description": "Variables to be used during generation of a visualization.\nThis should be provided as a JSON string.\nThis is required when creating the pipeline through CreateVisualization\nAPI." - }, - "html": { - "type": "string", - "description": "Output. Generated visualization html." - }, - "error": { - "type": "string", - "description": "In case any error happens when generating visualizations, only\nvisualization ID and the error message are returned. Client has the\nflexibility of choosing how to handle the error." - } - } - }, - "v2beta1VisualizationType": { - "type": "string", - "enum": [ - "ROC_CURVE", - "TFDV", - "TFMA", - "TABLE", - "CUSTOM" - ], - "default": "ROC_CURVE", - "description": "Type of visualization to be generated.\nThis is required when creating the pipeline through CreateVisualization\nAPI." - } - }, - "securityDefinitions": { - "Bearer": { - "type": "apiKey", - "name": "authorization", - "in": "header" - } - }, - "security": [ - { - "Bearer": [] - } - ] -} diff --git a/backend/api/v2beta1/visualization.proto b/backend/api/v2beta1/visualization.proto deleted file mode 100644 index 5b6746e8f16..00000000000 --- a/backend/api/v2beta1/visualization.proto +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright 2023 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. - -syntax = "proto3"; - -option go_package = "github.com/kubeflow/pipelines/backend/api/v2beta1/go_client"; -package kubeflow.pipelines.backend.api.v2beta1; - -import "google/api/annotations.proto"; -import "protoc-gen-swagger/options/annotations.proto"; -import "google/rpc/status.proto"; - -option (grpc.gateway.protoc_gen_swagger.options.openapiv2_swagger) = { - schemes: [1, 2], // http + https - responses: { - key: "default"; - value: { - schema: { - json_schema: { - ref: ".google.rpc.Status"; - } - } - } - } - // Use bearer token for authorizing access to job service. - // Kubernetes client library(https://kubernetes.io/docs/reference/using-api/client-libraries/) - // uses bearer token as default for authorization. The section below - // ensures security definition object is generated in the swagger definition. - // For more details see https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#securityDefinitionsObject - security_definitions: { - security: { - key: "Bearer"; - value: { - type: TYPE_API_KEY; - in: IN_HEADER; - name: "authorization"; - } - } - } - security: { - security_requirement: { - key: "Bearer"; - value: {}; - } - } -}; - -service VisualizationService { - rpc CreateVisualizationV1(CreateVisualizationRequest) returns (Visualization) { - option (google.api.http) = { - post: "/apis/v2beta1/visualizations/{namespace}" - body: "visualization" - }; - } -} - -// Create visualization by providing the type of visualization that is desired -// and input data paths. Input dat paths are assumed to be unique and are used -// for determining output path. -message CreateVisualizationRequest { - Visualization visualization = 1; - string namespace = 2; -} - -message Visualization { - // Type of visualization to be generated. - // This is required when creating the pipeline through CreateVisualization - // API. - enum Type { - ROC_CURVE = 0; - TFDV = 1; - TFMA = 2; - TABLE = 3; - CUSTOM = 4; - }; - Type type = 1; - - // Path pattern of input data to be used during generation of visualizations. - // This is required when creating the pipeline through CreateVisualization - // API. - string source = 2; - - // Variables to be used during generation of a visualization. - // This should be provided as a JSON string. - // This is required when creating the pipeline through CreateVisualization - // API. - string arguments = 3; - - // Output. Generated visualization html. - string html = 4; - - // In case any error happens when generating visualizations, only - // visualization ID and the error message are returned. Client has the - // flexibility of choosing how to handle the error. - string error = 5; -} diff --git a/backend/src/apiserver/client_manager/client_manager.go b/backend/src/apiserver/client_manager/client_manager.go index 2368666e3ff..f9afb5e388e 100644 --- a/backend/src/apiserver/client_manager/client_manager.go +++ b/backend/src/apiserver/client_manager/client_manager.go @@ -62,9 +62,6 @@ const ( archiveLogPathPrefix = "ARCHIVE_CONFIG_LOG_PATH_PREFIX" dbConMaxLifeTime = "DBConfig.ConMaxLifeTime" - VisualizationServiceHost = "ML_PIPELINE_VISUALIZATIONSERVER_SERVICE_HOST" - VisualizationServicePort = "ML_PIPELINE_VISUALIZATIONSERVER_SERVICE_PORT" - initConnectionTimeout = "InitConnectionTimeout" clientQPS = "ClientQPS" diff --git a/backend/src/apiserver/common/const.go b/backend/src/apiserver/common/const.go index 85fd9814197..22ed32c64b0 100644 --- a/backend/src/apiserver/common/const.go +++ b/backend/src/apiserver/common/const.go @@ -24,7 +24,6 @@ const ( RbacResourceTypeRuns = "runs" RbacResourceTypeJobs = "jobs" RbacResourceTypeViewers = "viewers" - RbacResourceTypeVisualizations = "visualizations" RbacResourceTypeScheduledWorkflows = "scheduledworkflows" RbacResourceTypeWorkflows = "workflows" diff --git a/backend/src/apiserver/main.go b/backend/src/apiserver/main.go index 5430674897b..9a7c75b106c 100644 --- a/backend/src/apiserver/main.go +++ b/backend/src/apiserver/main.go @@ -19,7 +19,6 @@ import ( "encoding/json" "flag" "fmt" - "github.com/kubeflow/pipelines/backend/src/apiserver/client" "io" "io/ioutil" "math" @@ -30,6 +29,8 @@ import ( "strings" "time" + "github.com/kubeflow/pipelines/backend/src/apiserver/client" + "github.com/fsnotify/fsnotify" "github.com/golang/glog" "github.com/gorilla/mux" @@ -147,13 +148,6 @@ func startRpcServer(resourceManager *resource.ResourceManager) { apiv1beta1.RegisterTaskServiceServer(s, server.NewTaskServer(resourceManager)) apiv1beta1.RegisterReportServiceServer(s, sharedReportServer) - apiv1beta1.RegisterVisualizationServiceServer( - s, - server.NewVisualizationServer( - resourceManager, - common.GetStringConfig(cm.VisualizationServiceHost), - common.GetStringConfig(cm.VisualizationServicePort), - )) apiv1beta1.RegisterAuthServiceServer(s, server.NewAuthServer(resourceManager)) apiv2beta1.RegisterExperimentServiceServer(s, sharedExperimentServer) @@ -185,7 +179,6 @@ func startHttpProxy(resourceManager *resource.ResourceManager) { registerHttpHandlerFromEndpoint(apiv1beta1.RegisterRunServiceHandlerFromEndpoint, "RunService", ctx, runtimeMux) registerHttpHandlerFromEndpoint(apiv1beta1.RegisterTaskServiceHandlerFromEndpoint, "TaskService", ctx, runtimeMux) registerHttpHandlerFromEndpoint(apiv1beta1.RegisterReportServiceHandlerFromEndpoint, "ReportService", ctx, runtimeMux) - registerHttpHandlerFromEndpoint(apiv1beta1.RegisterVisualizationServiceHandlerFromEndpoint, "Visualization", ctx, runtimeMux) registerHttpHandlerFromEndpoint(apiv1beta1.RegisterAuthServiceHandlerFromEndpoint, "AuthService", ctx, runtimeMux) // Create gRPC HTTP MUX and register services for v2beta1 api. diff --git a/backend/src/apiserver/server/auth_server.go b/backend/src/apiserver/server/auth_server.go index ae3216c4e8c..b833590f738 100644 --- a/backend/src/apiserver/server/auth_server.go +++ b/backend/src/apiserver/server/auth_server.go @@ -27,12 +27,11 @@ import ( ) var rbacResourceTypeToGroup = map[string]string{ - common.RbacResourceTypePipelines: common.RbacPipelinesGroup, - common.RbacResourceTypeExperiments: common.RbacPipelinesGroup, - common.RbacResourceTypeRuns: common.RbacPipelinesGroup, - common.RbacResourceTypeJobs: common.RbacPipelinesGroup, - common.RbacResourceTypeViewers: common.RbacKubeflowGroup, - common.RbacResourceTypeVisualizations: common.RbacPipelinesGroup, + common.RbacResourceTypePipelines: common.RbacPipelinesGroup, + common.RbacResourceTypeExperiments: common.RbacPipelinesGroup, + common.RbacResourceTypeRuns: common.RbacPipelinesGroup, + common.RbacResourceTypeJobs: common.RbacPipelinesGroup, + common.RbacResourceTypeViewers: common.RbacKubeflowGroup, } type AuthServer struct { diff --git a/backend/src/apiserver/server/visualization_server.go b/backend/src/apiserver/server/visualization_server.go deleted file mode 100644 index 31f6094daa2..00000000000 --- a/backend/src/apiserver/server/visualization_server.go +++ /dev/null @@ -1,161 +0,0 @@ -// Copyright 2018 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 -// -// https://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. - -package server - -import ( - "context" - "encoding/json" - "fmt" - "io/ioutil" - "net/http" - "net/url" - "strings" - - "github.com/golang/glog" - "github.com/kubeflow/pipelines/backend/api/v1beta1/go_client" - "github.com/kubeflow/pipelines/backend/src/apiserver/common" - "github.com/kubeflow/pipelines/backend/src/apiserver/resource" - "github.com/kubeflow/pipelines/backend/src/common/util" - "github.com/pkg/errors" - authorizationv1 "k8s.io/api/authorization/v1" -) - -const ( - visualizationServiceName = "VisualizationService.Name" - visualizationServicePort = "VisualizationService.Port" -) - -type VisualizationServer struct { - resourceManager *resource.ResourceManager - serviceURL string -} - -func (s *VisualizationServer) CreateVisualizationV1(ctx context.Context, request *go_client.CreateVisualizationRequest) (*go_client.Visualization, error) { - if err := s.validateCreateVisualizationRequest(request); err != nil { - return nil, err - } - - // In multi-user mode, we allow empty namespace in which case we fall back to use the visualization service in system namespace. - // See getVisualizationServiceURL() for details. - if common.IsMultiUserMode() && len(request.Namespace) > 0 { - resourceAttributes := &authorizationv1.ResourceAttributes{ - Namespace: request.Namespace, - Verb: common.RbacResourceVerbCreate, - Group: common.RbacPipelinesGroup, - Version: common.RbacPipelinesVersion, - Resource: common.RbacResourceTypeVisualizations, - Subresource: "", - Name: "", - } - err := s.resourceManager.IsAuthorized(ctx, resourceAttributes) - if err != nil { - return nil, util.Wrap(err, "Failed to authorize on namespace") - } - } - - body, err := s.generateVisualizationFromRequest(request) - if err != nil { - return nil, err - } - request.Visualization.Html = string(body) - return request.Visualization, nil -} - -// validateCreateVisualizationRequest ensures that a go_client.Visualization -// object has valid values. -// It returns an error if a go_client.Visualization object does not have valid -// values. -func (s *VisualizationServer) validateCreateVisualizationRequest(request *go_client.CreateVisualizationRequest) error { - // Only validate that a source is provided for non-custom visualizations. - if request.Visualization.Type != go_client.Visualization_CUSTOM { - if len(request.Visualization.Source) == 0 { - return util.NewInvalidInputError("A visualization requires a Source to be provided. Received %s", request.Visualization.Source) - } - } - // Manually set Arguments to empty JSON if nothing is provided. This is done - // because visualizations such as TFDV and TFMA only require a Source to - // be provided for a visualization to be generated. If no JSON is provided - // json.Valid will fail without this check as an empty string is provided for - // those visualizations. - if len(request.Visualization.Arguments) == 0 { - request.Visualization.Arguments = "{}" - } - if !json.Valid([]byte(request.Visualization.Arguments)) { - return util.NewInvalidInputError("A visualization requires valid JSON to be provided as Arguments. Received %s", request.Visualization.Arguments) - } - return nil -} - -// generateVisualizationFromRequest communicates with the python visualization -// service to generate HTML visualizations from a request. -// It returns the generated HTML as a string and any error that is encountered. -func (s *VisualizationServer) generateVisualizationFromRequest(request *go_client.CreateVisualizationRequest) ([]byte, error) { - serviceURL := s.getVisualizationServiceURL(request) - if err := isVisualizationServiceAlive(serviceURL); err != nil { - return nil, util.Wrap(err, "Cannot generate visualization") - } - visualizationType := strings.ToLower(go_client.Visualization_Type_name[int32(request.Visualization.Type)]) - urlValues := url.Values{ - "arguments": {request.Visualization.Arguments}, - "source": {request.Visualization.Source}, - "type": {visualizationType}, - } - resp, err := http.PostForm(serviceURL, urlValues) - if err != nil { - return nil, util.Wrap(err, "Unable to initialize visualization request") - } - if resp.StatusCode != http.StatusOK { - return nil, fmt.Errorf(resp.Status) - } - defer resp.Body.Close() - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - return nil, util.Wrap(err, "Unable to parse visualization response") - } - return body, nil -} - -func (s *VisualizationServer) getVisualizationServiceURL(request *go_client.CreateVisualizationRequest) string { - if common.IsMultiUserMode() && len(request.Namespace) > 0 { - return fmt.Sprintf("http://%s.%s:%s", - common.GetStringConfig(visualizationServiceName), - request.Namespace, - common.GetStringConfig(visualizationServicePort)) - } - return s.serviceURL -} - -func isVisualizationServiceAlive(serviceURL string) error { - resp, err := http.Get(serviceURL) - if err != nil { - wrappedErr := util.Wrapf(err, "Unable to verify visualization service aliveness by sending request to %s", serviceURL) - glog.Error(wrappedErr) - return wrappedErr - } else if resp.StatusCode != http.StatusOK { - defer resp.Body.Close() - wrappedErr := errors.New(fmt.Sprintf("Unable to verify visualization service aliveness by sending request to %s and get response code: %s !", serviceURL, resp.Status)) - glog.Error(wrappedErr) - return wrappedErr - } - return nil -} - -func NewVisualizationServer(resourceManager *resource.ResourceManager, serviceHost string, servicePort string) *VisualizationServer { - serviceURL := fmt.Sprintf("http://%s:%s", serviceHost, servicePort) - return &VisualizationServer{ - resourceManager: resourceManager, - serviceURL: serviceURL, - } -} diff --git a/backend/src/apiserver/server/visualization_server_test.go b/backend/src/apiserver/server/visualization_server_test.go deleted file mode 100644 index da6ecfee1fc..00000000000 --- a/backend/src/apiserver/server/visualization_server_test.go +++ /dev/null @@ -1,342 +0,0 @@ -// Copyright 2018 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 -// -// https://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. - -package server - -import ( - "context" - "fmt" - "net/http" - "net/http/httptest" - "testing" - - apiv1beta1 "github.com/kubeflow/pipelines/backend/api/v1beta1/go_client" - "github.com/kubeflow/pipelines/backend/src/apiserver/client" - "github.com/kubeflow/pipelines/backend/src/apiserver/common" - "github.com/kubeflow/pipelines/backend/src/apiserver/resource" - "github.com/kubeflow/pipelines/backend/src/common/util" - "github.com/spf13/viper" - "github.com/stretchr/testify/assert" - "google.golang.org/grpc/metadata" - authorizationv1 "k8s.io/api/authorization/v1" -) - -func TestValidateCreateVisualizationRequest(t *testing.T) { - clients, manager, _ := initWithExperiment(t) - defer clients.Close() - server := &VisualizationServer{ - resourceManager: manager, - } - visualization := &apiv1beta1.Visualization{ - Type: apiv1beta1.Visualization_ROC_CURVE, - Source: "gs://ml-pipeline/roc/data.csv", - Arguments: "{}", - } - request := &apiv1beta1.CreateVisualizationRequest{ - Visualization: visualization, - } - err := server.validateCreateVisualizationRequest(request) - assert.Nil(t, err) -} - -func TestValidateCreateVisualizationRequest_ArgumentsAreEmpty(t *testing.T) { - clients, manager, _ := initWithExperiment(t) - defer clients.Close() - server := &VisualizationServer{ - resourceManager: manager, - } - visualization := &apiv1beta1.Visualization{ - Type: apiv1beta1.Visualization_ROC_CURVE, - Source: "gs://ml-pipeline/roc/data.csv", - Arguments: "", - } - request := &apiv1beta1.CreateVisualizationRequest{ - Visualization: visualization, - } - err := server.validateCreateVisualizationRequest(request) - assert.Nil(t, err) -} - -func TestValidateCreateVisualizationRequest_SourceIsEmpty(t *testing.T) { - clients, manager, _ := initWithExperiment(t) - defer clients.Close() - server := &VisualizationServer{ - resourceManager: manager, - } - visualization := &apiv1beta1.Visualization{ - Type: apiv1beta1.Visualization_ROC_CURVE, - Source: "", - Arguments: "{}", - } - request := &apiv1beta1.CreateVisualizationRequest{ - Visualization: visualization, - } - err := server.validateCreateVisualizationRequest(request) - assert.Contains(t, err.Error(), "A visualization requires a Source to be provided. Received") -} - -func TestValidateCreateVisualizationRequest_SourceIsEmptyAndTypeIsCustom(t *testing.T) { - clients, manager, _ := initWithExperiment(t) - defer clients.Close() - server := &VisualizationServer{ - resourceManager: manager, - } - visualization := &apiv1beta1.Visualization{ - Type: apiv1beta1.Visualization_CUSTOM, - Arguments: "{}", - } - request := &apiv1beta1.CreateVisualizationRequest{ - Visualization: visualization, - } - err := server.validateCreateVisualizationRequest(request) - assert.Nil(t, err) -} - -func TestValidateCreateVisualizationRequest_ArgumentsNotValidJSON(t *testing.T) { - clients, manager, _ := initWithExperiment(t) - defer clients.Close() - server := &VisualizationServer{ - resourceManager: manager, - } - visualization := &apiv1beta1.Visualization{ - Type: apiv1beta1.Visualization_ROC_CURVE, - Source: "gs://ml-pipeline/roc/data.csv", - Arguments: "{", - } - request := &apiv1beta1.CreateVisualizationRequest{ - Visualization: visualization, - } - err := server.validateCreateVisualizationRequest(request) - assert.Contains(t, err.Error(), "A visualization requires valid JSON to be provided as Arguments. Received {") -} - -func TestGenerateVisualization(t *testing.T) { - clients, manager, _ := initWithExperiment(t) - defer clients.Close() - httpServer := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { - assert.Equal(t, "/", req.URL.String()) - rw.Write([]byte("roc_curve")) - })) - defer httpServer.Close() - server := &VisualizationServer{ - resourceManager: manager, - serviceURL: httpServer.URL, - } - visualization := &apiv1beta1.Visualization{ - Type: apiv1beta1.Visualization_ROC_CURVE, - Source: "gs://ml-pipeline/roc/data.csv", - Arguments: "{}", - } - request := &apiv1beta1.CreateVisualizationRequest{ - Visualization: visualization, - } - body, err := server.generateVisualizationFromRequest(request) - assert.Nil(t, err) - assert.Equal(t, []byte("roc_curve"), body) -} - -func TestGenerateVisualization_ServiceNotAvailableError(t *testing.T) { - clients, manager, _ := initWithExperiment(t) - defer clients.Close() - httpServer := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { - assert.Equal(t, "/", req.URL.String()) - if req.Method == http.MethodGet { - rw.WriteHeader(500) - } else { - rw.WriteHeader(200) - } - })) - server := &VisualizationServer{ - resourceManager: manager, - serviceURL: httpServer.URL, - } - visualization := &apiv1beta1.Visualization{ - Type: apiv1beta1.Visualization_ROC_CURVE, - Source: "gs://ml-pipeline/roc/data.csv", - Arguments: "{}", - } - request := &apiv1beta1.CreateVisualizationRequest{ - Visualization: visualization, - } - body, err := server.generateVisualizationFromRequest(request) - assert.Nil(t, body) - assert.Contains(t, err.Error(), "500 Internal Server Error") -} - -func TestGenerateVisualization_ServiceHostNotExistError(t *testing.T) { - clients, manager, _ := initWithExperiment(t) - defer clients.Close() - nonExistingServerURL := "http://127.0.0.2:53484" - server := &VisualizationServer{ - resourceManager: manager, - serviceURL: nonExistingServerURL, - } - visualization := &apiv1beta1.Visualization{ - Type: apiv1beta1.Visualization_ROC_CURVE, - Source: "gs://ml-pipeline/roc/data.csv", - Arguments: "{}", - } - request := &apiv1beta1.CreateVisualizationRequest{ - Visualization: visualization, - } - body, err := server.generateVisualizationFromRequest(request) - assert.Nil(t, body) - errMsg := err.Error() - assert.Contains(t, errMsg, "Unable to verify visualization service aliveness") - assert.Contains(t, err.Error(), fmt.Sprintf("dial tcp %s", nonExistingServerURL[7:])) -} - -func TestGenerateVisualization_ServerError(t *testing.T) { - clients, manager, _ := initWithExperiment(t) - defer clients.Close() - httpServer := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { - assert.Equal(t, "/", req.URL.String()) - // The get requests 200s to indicate the service is alive, but the - // visualization request fails with a 500. - if req.Method == http.MethodGet { - rw.WriteHeader(200) - } else { - rw.WriteHeader(500) - } - })) - defer httpServer.Close() - server := &VisualizationServer{ - resourceManager: manager, - serviceURL: httpServer.URL, - } - visualization := &apiv1beta1.Visualization{ - Type: apiv1beta1.Visualization_ROC_CURVE, - Source: "gs://ml-pipeline/roc/data.csv", - Arguments: "{}", - } - request := &apiv1beta1.CreateVisualizationRequest{ - Visualization: visualization, - } - body, err := server.generateVisualizationFromRequest(request) - assert.Nil(t, body) - assert.Equal(t, "500 Internal Server Error", err.Error()) -} - -func TestGetVisualizationServiceURL(t *testing.T) { - server := &VisualizationServer{ - resourceManager: nil, - serviceURL: "http://host:port", - } - request := &apiv1beta1.CreateVisualizationRequest{ - Visualization: nil, - } - url := server.getVisualizationServiceURL(request) - assert.Equal(t, "http://host:port", url) -} - -func TestGetVisualizationServiceURL_Multiuser(t *testing.T) { - viper.Set(common.MultiUserMode, "true") - defer viper.Set(common.MultiUserMode, "false") - viper.Set("VisualizationService.Name", "ml-pipeline-visualizationserver") - viper.Set("VisualizationService.Port", "8888") - - server := &VisualizationServer{ - resourceManager: nil, - serviceURL: "http://host:port", - } - - request := &apiv1beta1.CreateVisualizationRequest{ - Visualization: nil, - Namespace: "ns1", - } - url := server.getVisualizationServiceURL(request) - assert.Equal(t, "http://ml-pipeline-visualizationserver.ns1:8888", url) - - // when namespace is not provided, we fall back to the default visuliaztion service - request = &apiv1beta1.CreateVisualizationRequest{ - Visualization: nil, - } - url = server.getVisualizationServiceURL(request) - assert.Equal(t, "http://host:port", url) -} - -func TestCreateVisualization_Unauthorized(t *testing.T) { - viper.Set(common.MultiUserMode, "true") - defer viper.Set(common.MultiUserMode, "false") - - userIdentity := "user@google.com" - md := metadata.New(map[string]string{common.GoogleIAPUserIdentityHeader: common.GoogleIAPUserIdentityPrefix + userIdentity}) - ctx := metadata.NewIncomingContext(context.Background(), md) - - clientManager := resource.NewFakeClientManagerOrFatal(util.NewFakeTimeForEpoch()) - clientManager.SubjectAccessReviewClientFake = client.NewFakeSubjectAccessReviewClientUnauthorized() - resourceManager := resource.NewResourceManager(clientManager, &resource.ResourceManagerOptions{CollectMetrics: false}) - defer clientManager.Close() - - server := &VisualizationServer{ - resourceManager: resourceManager, - } - visualization := &apiv1beta1.Visualization{ - Type: apiv1beta1.Visualization_ROC_CURVE, - Source: "gs://ml-pipeline/roc/data.csv", - Arguments: "{}", - } - - request := &apiv1beta1.CreateVisualizationRequest{ - Visualization: visualization, - Namespace: "ns1", - } - _, err := server.CreateVisualizationV1(ctx, request) - assert.NotNil(t, err) - resourceAttributes := &authorizationv1.ResourceAttributes{ - Namespace: "ns1", - Verb: common.RbacResourceVerbCreate, - Group: common.RbacPipelinesGroup, - Version: common.RbacPipelinesVersion, - Resource: common.RbacResourceTypeVisualizations, - } - assert.EqualError( - t, - err, - util.Wrap(getPermissionDeniedError(userIdentity, resourceAttributes), "Failed to authorize on namespace").Error(), - ) -} - -func TestCreateVisualization_Unauthenticated(t *testing.T) { - viper.Set(common.MultiUserMode, "true") - defer viper.Set(common.MultiUserMode, "false") - - md := metadata.New(map[string]string{"no-identity-header": "user"}) - ctx := metadata.NewIncomingContext(context.Background(), md) - - clientManager := resource.NewFakeClientManagerOrFatal(util.NewFakeTimeForEpoch()) - resourceManager := resource.NewResourceManager(clientManager, &resource.ResourceManagerOptions{CollectMetrics: false}) - defer clientManager.Close() - - server := &VisualizationServer{ - resourceManager: resourceManager, - } - visualization := &apiv1beta1.Visualization{ - Type: apiv1beta1.Visualization_ROC_CURVE, - Source: "gs://ml-pipeline/roc/data.csv", - Arguments: "{}", - } - - request := &apiv1beta1.CreateVisualizationRequest{ - Visualization: visualization, - Namespace: "ns1", - } - _, err := server.CreateVisualizationV1(ctx, request) - assert.NotNil(t, err) - assert.Contains( - t, - err.Error(), - "there is no user identity header", - ) -} diff --git a/backend/src/apiserver/visualization/.gitignore b/backend/src/apiserver/visualization/.gitignore deleted file mode 100644 index d8fe3a26651..00000000000 --- a/backend/src/apiserver/visualization/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -*.html -*.csv -*.json -__init__.py diff --git a/backend/src/apiserver/visualization/README.md b/backend/src/apiserver/visualization/README.md deleted file mode 100644 index 87e4c0eef99..00000000000 --- a/backend/src/apiserver/visualization/README.md +++ /dev/null @@ -1,178 +0,0 @@ -# Python based visualizations guideline - -This document describes the architecture of python based visualizations, -development guidelines to contribute new predefined visualizations to the -Kubeflow Pipelines project, and current limitations. Python based visualizations -are a new method of generating visualizations within Kubeflow Pipelines that -allow for rapid development, experimentation, and customization when -visualizing results. For information about Python based visualizations and how -to use them, please visit the [documentation page](https://www.kubeflow.org/docs/pipelines/sdk/python-based-visualizations). - -Please check the [developer guidelines](https://github.com/kubeflow/pipelines/blob/master/developer_guide.md) -for additional development guidelines. - -## Architecture - -Python based visualizations rely on three parts: the frontend, the API server, -and the Python visualization service. The frontend is responsible for creating -the visualization request and displaying the results of the created requests. -The API server is responsible for transposing the request provided by the -frontend to a request that is understandable by the python visualization -service, returning the result of the transposed request to the frontend, and -gracefully handling incorrectly formatted requests from the frontend and any -errors encountered with the Python visualization service. Finally, the Python -visualization service is responsible for generating a visualization from a -provided request. - -## How to create predefined visualizations - -1. Determine if the visualization should become a predefined visualization. -Consider the following: - * How often will it be used? - * Frequently used visualizations are a good candidate for predefine - visualization. - * How complex is it? - * The complexity of a visualization can reduce its usability. Predefined - visualizations are intended to be powerful and simple. Visualizations - that require extensive or complex variables are not good candidates for - predefined visualizations. -2. Fork the Kubeflow Pipelines repository. -3. Add a new type for the visualization within the [visualization.proto](https://github.com/kubeflow/pipelines/blob/master/backend/api/visualization.proto#L78) -file in the `backend/api` directory. - * The name of the visualization should be in screaming snake case (that is - `VISUALIZATION_NAME`). -4. Run [`./generate_api.sh`](https://github.com/kubeflow/pipelines/blob/master/backend/api/generate_api.sh) -within the `backend/api` directory to generate the Swagger API definition for -the backend. -5. Download the [Swagger Codegen](https://swagger.io/tools/swagger-codegen/) -jar file. - * Currently, version 2.3.1 of the Swagger Codegen jar file is used to - generate the frontend API. Should this become out of date, the version can - be checked within the [VERSION](https://github.com/kubeflow/pipelines/blob/master/frontend/src/apis/visualization/.swagger-codegen/VERSION) - file for the visualization [Swagger Codegen directory](https://github.com/kubeflow/pipelines/tree/master/frontend/src/apis/visualization/.swagger-codegen). - * This step is only required if the Swagger Codegen jar file is not present - in the `frontend` directory. If you already have the jar file, you can skip - steps 6 and 7. -6. Place the Swagger Codegen jar file in the `frontend` directory. -7. Rename the Swagger Codegen jar file to **swagger-codegen-cli.jar**. -8. Run `npm run apis:visualization` within the `frontend` directory to generate -the Swagger API definition for the frontend. -9. Create a new Python file that will be executed to generate a visualization. - * Python 3 **MUST** be used. - * The new Python file should be created within the - `backend/src/apiserver/visualization` directory and it should have the same - name as the type that was created earlier, use snake case instead of - screaming snake case (that is `visualization_name.py`). - * Dependency injection is used to pass variables from the Kubeflow Pipelines - UI to a visualization. - * To obtain a path or path pattern from the Kubeflow Pipelines UI, you - can use the following syntax: - - ```python - # The variable "source" will be injected to any visualization. The - # value of "source" will be provided by the Kubeflow Pipelines UI - # and will never be an empty string. - ... - # Open a file with a provided path or path pattern from the - # Kubeflow Pipelines UI and append DataFrame to an array of - # DataFrames - dfs = [] - for f in file_io.get_matching_files(source): - dfs.append(pd.read_csv(f)) - ... - # Get a path from the Kubeflow Pipelines UI and create a DataFrame - df = pd.read_csv(source) - ... - ``` - * Additional details about how this is implemented can be found in - the [server.py](https://github.com/kubeflow/pipelines/blob/master/backend/src/apiserver/visualization/server.py#L127) - file. - * To obtain additional variables from the Pipelines UI, you can use - the following syntax: - - ```python - # Get a value for a specified key - key = variables.get("key") - # Get a value for a specified key with a default - key = variables.get("key", "default_value") - # Check if a value for a specified key exists - if variables.get("key", "default_value") is "default_value": - # Value for a specified key does not exist - pass - else: - # Value for a specified key does exist - pass - ``` - * Additional details about how this is implemented can be found in - the [exporter.py](https://github.com/kubeflow/pipelines/blob/master/backend/src/apiserver/visualization/exporter.py#L93) - file and the [Python documentation](https://docs.python.org/3/library/stdtypes.html?highlight=dict#dict.get). -10. Add any new dependencies to the [requirements.txt](https://github.com/kubeflow/pipelines/blob/master/backend/src/apiserver/visualization/requirements.txt) -file in the `backend/src/apiserver/visualization` directory. -11. Add any new dependencies to the [third_party_licenses.csv](https://github.com/kubeflow/pipelines/blob/master/backend/src/apiserver/visualization/third_party_licenses.csv) -file. - * The following format is used: - ```csv - package_name,url_to_package_license,license_name - ``` - * The columns of the csv are as follows: - * `package_name` is the name of the package on [pypi](https://pypi.org/). - * `url_to_package_license` is the url where the license of the package - can be downloaded from. - * `license_name` is the name of package license. - * Examples for all the columns can be found in the [third_party_licenses.csv](https://github.com/kubeflow/pipelines/blob/master/backend/src/apiserver/visualization/third_party_licenses.csv) - file. -12. Submit these changes as a Pull Request or build docker image for usage -within your cluster. - -## Known limitations - -* Multiple visualizations cannot be generated concurrently. - * This is because a single Python kernel is used to generate visualizations. - * If visualizations are a major part of your workflow, it is recommended to - increase the number of replicas within the [visualization deployment YAML](https://github.com/kubeflow/pipelines/tree/master/manifests/kustomize/base/pipeline/ml-pipeline-visualization-deployment.yaml) - file or within the visualization service deployment itself. - * _Please note that this does not directly solve the issue, instead it - decreases the likelihood of experiencing delays when generating - visualizations._ -* Visualizations that take longer than 30 seconds will fail to generate. - * For visualizations where the 30 second timeout is reached, you can add the - **TimeoutValue** header to the request made by the frontend, specifying a - _positive integer as ASCII string of at most 8 digits_ for the length of - time required to generate a visualization as specified by the - [grpc documentation](https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests). - * For visualizations that take longer than 100 seconds, you will have to - specify a **TimeoutValue** within the request headers **AND** change the - default kernel timeout of the visualization service. To change the default - kernel timeout of the visualization service, set the **KERNEL_TIMEOUT** - environment variable of the visualization service deployment to be the new - timeout length in seconds within the [visualization deployment YAML](https://github.com/kubeflow/pipelines/tree/master/manifests/kustomize/base/pipeline/ml-pipeline-visualization-deployment.yaml) - file or within the visualization service deployment itself. - - ```YAML - - env: - - name: KERNEL_TIMEOUT - value: 100 - ``` -* The HTML content of the generated visualizations cannot be larger than 4MB. - * gRPC by default imposes a limit of 4MB as the maximum size that can be - sent and received by a server. To allow for visualizations that are larger - than 4MB in size to be generated, you must manually set - **MaxCallRecvMsgSize** for gRPC. This can be done by editing the provided - options given to the gRPC server within [main.go](https://github.com/kubeflow/pipelines/blob/master/backend/src/apiserver/main.go#L128) - to - ```golang - var maxCallRecvMsgSize = 4 * 1024 * 1024 - if serviceName == "Visualization" { - // Only change the maxCallRecvMesSize if it is for visualizations - maxCallRecvMsgSize = 50 * 1024 * 1024 - } - opts := []grpc.DialOption{ - grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(maxCallRecvMsgSize)), - grpc.WithInsecure(), - } - ``` - -## Update python dependencies -1. Edit `requirements.in` with additional changes. -1. Run `./update_requirements.sh` to re-resolve dependencies. -1. Pinned dependencies are in `requirements.txt`. diff --git a/backend/src/apiserver/visualization/exporter.py b/backend/src/apiserver/visualization/exporter.py deleted file mode 100644 index 757be271cc6..00000000000 --- a/backend/src/apiserver/visualization/exporter.py +++ /dev/null @@ -1,153 +0,0 @@ -""" -exporter.py provides utility functions for generating NotebookNode objects and -converting those objects to HTML. -""" - -# Copyright 2019 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 enum import Enum -from pathlib import Path -from typing import Text -from jupyter_client import KernelManager -from nbconvert import HTMLExporter -from nbconvert.preprocessors import ExecutePreprocessor -from nbformat import NotebookNode -from nbformat.v4 import new_code_cell - - -# Visualization Template types: -# - Basic: Uses the basic.tpl file within the templates directory to generate -# a visualization that contains no styling and minimal HTML tags. This is ideal -# for testing as it reduces size of generated visualization. However, for usage -# with actual visualizations it is not ideal due to its lack of javascript and -# styling which can limit usability of a visualization. -# - Full: Uses the full.tpl file within the template directory to generate a -# visualization that can be viewed as a standalone web page. The full.tpl file -# utilizes the basic.tpl file for visualizations then wraps that output with -# additional tags for javascript and style support. This is ideal for generating -# visualizations that will be displayed via the frontend. -class TemplateType(Enum): - BASIC = 'basic' - FULL = 'full' - - -def create_cell_from_args(variables: dict) -> NotebookNode: - """Creates NotebookNode object containing dict of provided variables. - - Args: - variables: Arguments that need to be injected into a NotebookNode. - - Returns: - NotebookNode with provided arguments as variables. - - """ - return new_code_cell("variables = {}".format(repr(variables))) - - -def create_cell_from_file(filepath: Text) -> NotebookNode: - """Creates a NotebookNode object with provided file as code in node. - - Args: - filepath: Path to file that should be used. - - Returns: - NotebookNode with specified file as code within node. - - """ - with open(filepath, 'r') as f: - code = f.read() - - return new_code_cell(code) - - -def create_cell_from_custom_code(code: list) -> NotebookNode: - """Creates a NotebookNode object with provided list as code in node. - - Args: - code: list representing lines of code to be run. - - Returns: - NotebookNode with specified file as code within node. - - """ - cell = new_code_cell("\n".join(code)) - cell.get("metadata")["hide_logging"] = False - return cell - - -class Exporter: - """Handler for interaction with NotebookNodes, including output generation. - - Attributes: - timeout (int): Amount of time in seconds that a visualization can run - for before being stopped. - template_type (TemplateType): Type of template to use when generating - visualization output. - km (KernelManager): Custom KernelManager that stays alive between - visualizations. - ep (ExecutePreprocessor): Process that is responsible for generating - outputs from NotebookNodes. - - """ - - def __init__( - self, - timeout: int = 100, - template_type: TemplateType = TemplateType.FULL - ): - """ - Initializes Exporter with default timeout (100 seconds) and template - (FULL) and handles instantiation of km and ep variables for usage when - generating NotebookNodes and their outputs. - - Args: - timeout (int): Amount of time in seconds that a visualization can - run for before being stopped. - template_type (TemplateType): Type of template to use when - generating visualization output. - """ - self.timeout = timeout - self.template_type = template_type - # Create custom KernelManager. - # This will circumvent issues where kernel is shutdown after - # preprocessing. Due to the shutdown, latency would be introduced - # because a kernel must be started per visualization. - self.km = KernelManager() - self.km.start_kernel() - self.ep = ExecutePreprocessor( - timeout=self.timeout, - kernel_name='python3', - allow_errors=True - ) - - def generate_html_from_notebook(self, nb: NotebookNode) -> Text: - """Converts a provided NotebookNode to HTML. - - Args: - nb: NotebookNode that should be converted to HTML. - - Returns: - HTML from converted NotebookNode as a string. - - """ - # HTML generator and exporter object - html_exporter = HTMLExporter() - template_file = "templates/{}.tpl".format(self.template_type.value) - html_exporter.template_file = str(Path.cwd() / template_file) - # Output generator - self.ep.preprocess(nb, {"metadata": {"path": Path.cwd()}}, self.km) - # Export all html and outputs - body, _ = html_exporter.from_notebook_node(nb, resources={}) - return body diff --git a/backend/src/apiserver/visualization/requirements-test.txt b/backend/src/apiserver/visualization/requirements-test.txt deleted file mode 100644 index dc9791f7f27..00000000000 --- a/backend/src/apiserver/visualization/requirements-test.txt +++ /dev/null @@ -1 +0,0 @@ -snapshottest==0.6.0 diff --git a/backend/src/apiserver/visualization/requirements.in b/backend/src/apiserver/visualization/requirements.in deleted file mode 100644 index 61ebd737bad..00000000000 --- a/backend/src/apiserver/visualization/requirements.in +++ /dev/null @@ -1,19 +0,0 @@ -bokeh==1.2.0 -gcsfs==0.2.3 -google-api-python-client==1.7.* -itables==0.1.0 -ipykernel==5.1.1 -ipython==7.12.0 -jinja2==2.11.3 -jupyter_client==5.3.* -markupsafe==2.0.1 -nbconvert==5.5.0 -nbformat==4.4.0 -scikit-learn==0.24.2 -tensorflow==2.10.1 -tensorflow-metadata==1.9.* -tensorflow-model-analysis==0.40.* -tensorflow-data-validation==1.9.* -tensorflow-serving-api==2.10.1 -tornado==6.* -mistune<2.0.0 \ No newline at end of file diff --git a/backend/src/apiserver/visualization/requirements.txt b/backend/src/apiserver/visualization/requirements.txt deleted file mode 100644 index 00cc9a82e4a..00000000000 --- a/backend/src/apiserver/visualization/requirements.txt +++ /dev/null @@ -1,568 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.8 -# by the following command: -# -# pip-compile --output-file=- --resolver=backtracking - -# -absl-py==1.4.0 - # via - # tensorboard - # tensorflow - # tensorflow-data-validation - # tensorflow-metadata - # tensorflow-model-analysis - # tfx-bsl -apache-beam[gcp]==2.46.0 - # via - # tensorflow-data-validation - # tensorflow-model-analysis - # tfx-bsl -argon2-cffi==23.1.0 - # via notebook -argon2-cffi-bindings==21.2.0 - # via argon2-cffi -astunparse==1.6.3 - # via tensorflow -attrs==23.1.0 - # via - # jsonschema - # referencing -backcall==0.2.0 - # via ipython -bleach==6.0.0 - # via nbconvert -bokeh==1.2.0 - # via -r requirements.in -cachetools==4.2.4 - # via - # apache-beam - # google-auth -certifi==2023.7.22 - # via requests -cffi==1.15.1 - # via argon2-cffi-bindings -charset-normalizer==3.2.0 - # via requests -cloudpickle==2.2.1 - # via apache-beam -comm==0.1.4 - # via ipywidgets -crcmod==1.7 - # via apache-beam -decorator==5.1.1 - # via - # gcsfs - # ipython -defusedxml==0.7.1 - # via nbconvert -dill==0.3.1.1 - # via apache-beam -docopt==0.6.2 - # via hdfs -entrypoints==0.4 - # via nbconvert -fastavro==1.8.3 - # via apache-beam -fasteners==0.19 - # via - # apache-beam - # google-apitools -flatbuffers==23.5.26 - # via tensorflow -gast==0.4.0 - # via tensorflow -gcsfs==0.2.3 - # via -r requirements.in -google-api-core[grpc]==2.11.1 - # via - # google-cloud-bigquery - # google-cloud-bigquery-storage - # google-cloud-bigtable - # google-cloud-core - # google-cloud-datastore - # google-cloud-dlp - # google-cloud-language - # google-cloud-pubsub - # google-cloud-pubsublite - # google-cloud-recommendations-ai - # google-cloud-spanner - # google-cloud-videointelligence - # google-cloud-vision -google-api-python-client==1.7.12 - # via - # -r requirements.in - # tfx-bsl -google-apitools==0.5.31 - # via apache-beam -google-auth==2.23.0 - # via - # apache-beam - # gcsfs - # google-api-core - # google-api-python-client - # google-auth-httplib2 - # google-auth-oauthlib - # google-cloud-core - # tensorboard -google-auth-httplib2==0.1.1 - # via - # apache-beam - # google-api-python-client -google-auth-oauthlib==0.4.6 - # via - # gcsfs - # tensorboard -google-cloud-bigquery==3.11.4 - # via apache-beam -google-cloud-bigquery-storage==2.16.2 - # via apache-beam -google-cloud-bigtable==1.7.3 - # via apache-beam -google-cloud-core==2.3.3 - # via - # apache-beam - # google-cloud-bigquery - # google-cloud-bigtable - # google-cloud-datastore - # google-cloud-spanner -google-cloud-datastore==1.15.5 - # via apache-beam -google-cloud-dlp==3.12.3 - # via apache-beam -google-cloud-language==1.3.2 - # via apache-beam -google-cloud-pubsub==2.18.4 - # via - # apache-beam - # google-cloud-pubsublite -google-cloud-pubsublite==1.8.3 - # via apache-beam -google-cloud-recommendations-ai==0.7.1 - # via apache-beam -google-cloud-spanner==3.40.1 - # via apache-beam -google-cloud-videointelligence==1.16.3 - # via apache-beam -google-cloud-vision==3.4.4 - # via apache-beam -google-crc32c==1.5.0 - # via google-resumable-media -google-pasta==0.2.0 - # via tensorflow -google-resumable-media==2.6.0 - # via google-cloud-bigquery -googleapis-common-protos[grpc]==1.60.0 - # via - # google-api-core - # grpc-google-iam-v1 - # grpcio-status - # tensorflow-metadata -grpc-google-iam-v1==0.12.6 - # via - # google-cloud-bigtable - # google-cloud-pubsub - # google-cloud-spanner -grpcio==1.58.0 - # via - # apache-beam - # google-api-core - # google-cloud-bigquery - # google-cloud-pubsub - # google-cloud-pubsublite - # googleapis-common-protos - # grpc-google-iam-v1 - # grpcio-status - # tensorboard - # tensorflow - # tensorflow-serving-api -grpcio-status==1.48.2 - # via - # google-api-core - # google-cloud-pubsub - # google-cloud-pubsublite -h5py==3.9.0 - # via tensorflow -hdfs==2.7.2 - # via apache-beam -httplib2==0.21.0 - # via - # apache-beam - # google-api-python-client - # google-apitools - # google-auth-httplib2 - # oauth2client -idna==3.4 - # via requests -importlib-metadata==6.8.0 - # via markdown -importlib-resources==6.1.0 - # via - # jsonschema - # jsonschema-specifications -ipykernel==5.1.1 - # via - # -r requirements.in - # notebook -ipython==7.12.0 - # via - # -r requirements.in - # ipykernel - # ipywidgets - # tensorflow-model-analysis -ipython-genutils==0.2.0 - # via - # ipywidgets - # nbformat - # notebook -ipywidgets==7.8.1 - # via tensorflow-model-analysis -itables==0.1.0 - # via -r requirements.in -jedi==0.19.0 - # via ipython -jinja2==2.11.3 - # via - # -r requirements.in - # bokeh - # nbconvert - # notebook -joblib==0.14.1 - # via - # scikit-learn - # tensorflow-data-validation -jsonschema==4.19.1 - # via nbformat -jsonschema-specifications==2023.7.1 - # via jsonschema -jupyter-client==5.3.5 - # via - # -r requirements.in - # ipykernel - # notebook -jupyter-core==5.3.1 - # via - # jupyter-client - # nbconvert - # nbformat - # notebook -jupyterlab-widgets==1.1.7 - # via ipywidgets -keras==2.10.0 - # via tensorflow -keras-preprocessing==1.1.2 - # via tensorflow -libclang==16.0.6 - # via tensorflow -markdown==3.4.4 - # via tensorboard -markupsafe==2.0.1 - # via - # -r requirements.in - # jinja2 -mistune==0.8.4 - # via - # -r requirements.in - # nbconvert -nbconvert==5.5.0 - # via - # -r requirements.in - # notebook -nbformat==4.4.0 - # via - # -r requirements.in - # nbconvert - # notebook -nest-asyncio==1.5.8 - # via notebook -notebook==6.4.13 - # via widgetsnbextension -numpy==1.24.4 - # via - # apache-beam - # bokeh - # h5py - # keras-preprocessing - # opt-einsum - # pandas - # pyarrow - # scikit-learn - # scipy - # tensorboard - # tensorflow - # tensorflow-data-validation - # tensorflow-model-analysis - # tfx-bsl -oauth2client==4.1.3 - # via google-apitools -oauthlib==3.2.2 - # via requests-oauthlib -objsize==0.6.1 - # via apache-beam -opt-einsum==3.3.0 - # via tensorflow -orjson==3.9.7 - # via apache-beam -overrides==6.5.0 - # via google-cloud-pubsublite -packaging==23.1 - # via - # bokeh - # google-cloud-bigquery - # tensorflow -pandas==1.5.3 - # via - # itables - # tensorflow-data-validation - # tensorflow-model-analysis - # tfx-bsl -pandocfilters==1.5.0 - # via nbconvert -parso==0.8.3 - # via jedi -pexpect==4.8.0 - # via ipython -pickleshare==0.7.5 - # via ipython -pillow==10.3.0 - # via bokeh -pkgutil-resolve-name==1.3.10 - # via jsonschema -platformdirs==3.10.0 - # via jupyter-core -prometheus-client==0.17.1 - # via notebook -prompt-toolkit==3.0.39 - # via ipython -proto-plus==1.22.3 - # via - # apache-beam - # google-cloud-bigquery - # google-cloud-bigquery-storage - # google-cloud-dlp - # google-cloud-pubsub - # google-cloud-recommendations-ai - # google-cloud-spanner - # google-cloud-vision -protobuf==3.19.6 - # via - # apache-beam - # google-api-core - # google-cloud-bigquery - # google-cloud-bigquery-storage - # google-cloud-bigtable - # google-cloud-datastore - # google-cloud-dlp - # google-cloud-language - # google-cloud-pubsub - # google-cloud-recommendations-ai - # google-cloud-spanner - # google-cloud-videointelligence - # google-cloud-vision - # googleapis-common-protos - # grpc-google-iam-v1 - # grpcio-status - # proto-plus - # tensorboard - # tensorflow - # tensorflow-data-validation - # tensorflow-metadata - # tensorflow-model-analysis - # tensorflow-serving-api - # tfx-bsl -ptyprocess==0.7.0 - # via - # pexpect - # terminado -pyarrow==5.0.0 - # via - # apache-beam - # tensorflow-data-validation - # tensorflow-model-analysis - # tfx-bsl -pyasn1==0.5.0 - # via - # oauth2client - # pyasn1-modules - # rsa -pyasn1-modules==0.3.0 - # via - # google-auth - # oauth2client -pycparser==2.21 - # via cffi -pydot==1.4.2 - # via apache-beam -pyfarmhash==0.3.2 - # via tensorflow-data-validation -pygments==2.16.1 - # via - # ipython - # nbconvert -pymongo==3.13.0 - # via apache-beam -pyparsing==3.1.1 - # via - # httplib2 - # pydot -python-dateutil==2.8.2 - # via - # apache-beam - # bokeh - # google-cloud-bigquery - # jupyter-client - # pandas -pytz==2023.3.post1 - # via - # apache-beam - # pandas -pyyaml==6.0.1 - # via bokeh -pyzmq==25.1.1 - # via - # jupyter-client - # notebook -referencing==0.30.2 - # via - # jsonschema - # jsonschema-specifications -regex==2023.8.8 - # via apache-beam -requests==2.32.2 - # via - # apache-beam - # gcsfs - # google-api-core - # google-cloud-bigquery - # hdfs - # requests-oauthlib - # tensorboard -requests-oauthlib==1.3.1 - # via google-auth-oauthlib -rpds-py==0.10.3 - # via - # jsonschema - # referencing -rsa==4.9 - # via - # google-auth - # oauth2client -scikit-learn==0.24.2 - # via -r requirements.in -scipy==1.10.1 - # via - # scikit-learn - # tensorflow-model-analysis -send2trash==1.8.2 - # via notebook -six==1.16.0 - # via - # astunparse - # bleach - # bokeh - # google-api-python-client - # google-apitools - # google-pasta - # hdfs - # keras-preprocessing - # oauth2client - # python-dateutil - # tensorflow - # tensorflow-data-validation - # tensorflow-model-analysis -sqlparse==0.5.0 - # via google-cloud-spanner -tensorboard==2.10.1 - # via tensorflow -tensorboard-data-server==0.6.1 - # via tensorboard -tensorboard-plugin-wit==1.8.1 - # via tensorboard -tensorflow==2.10.1 - # via - # -r requirements.in - # tensorflow-data-validation - # tensorflow-model-analysis - # tensorflow-serving-api - # tfx-bsl -tensorflow-data-validation==1.9.0 - # via -r requirements.in -tensorflow-estimator==2.10.0 - # via tensorflow -tensorflow-io-gcs-filesystem==0.34.0 - # via tensorflow -tensorflow-metadata==1.9.0 - # via - # -r requirements.in - # tensorflow-data-validation - # tensorflow-model-analysis - # tfx-bsl -tensorflow-model-analysis==0.40.0 - # via -r requirements.in -tensorflow-serving-api==2.10.1 - # via - # -r requirements.in - # tfx-bsl -termcolor==2.3.0 - # via tensorflow -terminado==0.17.1 - # via notebook -testpath==0.6.0 - # via nbconvert -tfx-bsl==1.9.0 - # via - # tensorflow-data-validation - # tensorflow-model-analysis -threadpoolctl==3.2.0 - # via scikit-learn -tornado==6.3.3 - # via - # -r requirements.in - # bokeh - # ipykernel - # jupyter-client - # notebook - # terminado -traitlets==5.10.0 - # via - # comm - # ipykernel - # ipython - # ipywidgets - # jupyter-client - # jupyter-core - # nbconvert - # nbformat - # notebook -typing-extensions==4.8.0 - # via - # apache-beam - # tensorflow -uritemplate==3.0.1 - # via google-api-python-client -urllib3==1.26.16 - # via - # google-auth - # requests -wcwidth==0.2.6 - # via prompt-toolkit -webencodings==0.5.1 - # via bleach -werkzeug==2.1.2 - # via tensorboard -wheel==0.41.2 - # via - # astunparse - # tensorboard -widgetsnbextension==3.6.6 - # via ipywidgets -wrapt==1.15.0 - # via tensorflow -zipp==3.17.0 - # via - # importlib-metadata - # importlib-resources -zstandard==0.21.0 - # via apache-beam - -# The following packages are considered to be unsafe in a requirements file: -# setuptools diff --git a/backend/src/apiserver/visualization/server.py b/backend/src/apiserver/visualization/server.py deleted file mode 100644 index a9cbb09777c..00000000000 --- a/backend/src/apiserver/visualization/server.py +++ /dev/null @@ -1,149 +0,0 @@ -# Copyright 2019 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. - -import argparse -import importlib -import json -import os -from pathlib import Path -from typing import Text - -from nbformat import NotebookNode -from nbformat.v4 import new_notebook, new_code_cell -import tornado.ioloop -import tornado.web - -exporter = importlib.import_module("exporter") - -parser = argparse.ArgumentParser(description="Server Arguments") -parser.add_argument( - "--timeout", - type=int, - default=os.getenv('KERNEL_TIMEOUT', 100), - help="Amount of time in seconds that a visualization can run for before " + - "being stopped." -) - -args = parser.parse_args() -_exporter = exporter.Exporter(args.timeout) - - -class VisualizationHandler(tornado.web.RequestHandler): - """Custom RequestHandler that generates visualizations via post requests. - """ - - def validate_and_get_arguments_from_body(self) -> dict: - """Validates and converts arguments from post request to dict. - - Returns: - Arguments provided from post request as a dict. - """ - try: - arguments = { - "arguments": "{}", - "type": self.get_body_argument("type") - } - except tornado.web.MissingArgumentError: - raise Exception("No type provided.") - - try: - arguments["arguments"] = self.get_body_argument("arguments") - except tornado.web.MissingArgumentError: - # If no arguments are provided, ignore error as arguments has been - # set to a stringified JSON object by default. - pass - - try: - arguments["arguments"] = json.loads(arguments.get("arguments")) - except json.decoder.JSONDecodeError as e: - raise Exception("Invalid JSON provided as arguments: {}".format(str(e))) - - # If invalid JSON is provided that is incorretly escaped - # arguments.get("arguments") can be a string. This Ensure that - # json.loads properly converts stringified JSON to dict. - if type(arguments.get("arguments")) != dict: - raise Exception("Invalid JSON provided as arguments!") - - try: - arguments["source"] = self.get_body_argument("source") - except tornado.web.MissingArgumentError: - arguments["source"] = "" - - if arguments.get("type") != "custom": - if len(arguments.get("source")) == 0: - raise Exception("No source provided.") - - return arguments - - def generate_notebook_from_arguments( - self, - arguments: dict, - source: Text, - visualization_type: Text - ) -> NotebookNode: - """Generates a NotebookNode from provided arguments. - - Args: - arguments: JSON object containing provided arguments. - source: Path or path pattern to be used as data reference for - visualization. - visualization_type: Name of visualization to be generated. - - Returns: - NotebookNode that contains all parameters from a post request. - """ - nb = new_notebook() - nb.cells.append(exporter.create_cell_from_args(arguments)) - nb.cells.append(new_code_cell('source = "{}"'.format(source))) - if visualization_type == "custom": - code = arguments.get("code", []) - nb.cells.append(exporter.create_cell_from_custom_code(code)) - else: - visualization_file = str(Path.cwd() / "types/{}.py".format(visualization_type)) - nb.cells.append(exporter.create_cell_from_file(visualization_file)) - - return nb - - def get(self): - """Health check. - """ - self.write("alive") - - def post(self): - """Generates visualization based on provided arguments. - """ - # Validate arguments from request and return them as a dictionary. - try: - request_arguments = self.validate_and_get_arguments_from_body() - except Exception as e: - return self.send_error(400, reason=str(e)) - - # Create notebook with arguments from request. - nb = self.generate_notebook_from_arguments( - request_arguments.get("arguments"), - request_arguments.get("source"), - request_arguments.get("type") - ) - - # Generate visualization (output for notebook). - html = _exporter.generate_html_from_notebook(nb) - self.write(html) - - -if __name__ == "__main__": - application = tornado.web.Application([ - (r"/", VisualizationHandler), - ]) - application.listen(8888) - tornado.ioloop.IOLoop.current().start() diff --git a/backend/src/apiserver/visualization/snapshots/snap_test_exporter.py b/backend/src/apiserver/visualization/snapshots/snap_test_exporter.py deleted file mode 100644 index c28e506ad1b..00000000000 --- a/backend/src/apiserver/visualization/snapshots/snap_test_exporter.py +++ /dev/null @@ -1,87 +0,0 @@ -# -*- coding: utf-8 -*- -# snapshottest: v1 - https://goo.gl/zC4yUc -from __future__ import unicode_literals - -from snapshottest import Snapshot - - -snapshots = Snapshot() - -snapshots['TestExporterMethods::test_create_cell_from_args_with_multiple_args 1'] = ''' -
-
- - -
- -
- - - -
-
gs://ml-pipeline/data.csv
-lambda x: (x['target'] > x['fare'] * 0.2)
-
-
- -
- -
-
- - - -''' - -snapshots['TestExporterMethods::test_create_cell_from_args_with_no_args 1'] = 'variables = {}' - -snapshots['TestExporterMethods::test_create_cell_from_args_with_one_arg 1'] = "variables = {'source': 'gs://ml-pipeline/data.csv'}" - -snapshots['TestExporterMethods::test_create_cell_from_custom_code 1'] = '''x = 2 -print(x)''' - -snapshots['TestExporterMethods::test_create_cell_from_file 1'] = '''""" -test.py provides a basic predefined visualization that can be used for testing -because it does not have dependencies and had a low chance of being updated. -""" - -# Copyright 2019 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. - -print(2)''' - -snapshots['TestExporterMethods::test_generate_custom_visualization_html_from_notebook 1'] = ''' -
-
- - -
- -
- - - -
-
2
-
-
- -
- -
-
- - - -''' diff --git a/backend/src/apiserver/visualization/templates/basic.tpl b/backend/src/apiserver/visualization/templates/basic.tpl deleted file mode 100644 index 9c803e8a9fc..00000000000 --- a/backend/src/apiserver/visualization/templates/basic.tpl +++ /dev/null @@ -1,228 +0,0 @@ -{%- extends 'display_priority.tpl' -%} - -{% block output_group %} -
-
-{{ super() }} -
-
-{% endblock output_group %} - -{# - output_prompt doesn't do anything in HTML, - because there is a prompt div in each output area (see output block) -#} -{% block output_prompt %} -{% endblock output_prompt %} - -{% block output_area_prompt %} -{%- if output.output_type == 'execute_result' -%} -
- {%- if cell.execution_count is defined -%} - Out[{{ cell.execution_count|replace(None, " ") }}]: - {%- else -%} - Out[ ]: - {%- endif -%} -{%- else -%} -
-{%- endif -%} -
-{% endblock output_area_prompt %} - -{% block output %} -
-{% if resources.global_content_filter.include_output_prompt %} - {{ self.output_area_prompt() }} -{% endif %} -{{ super() }} -
-{% endblock output %} - -{% block markdowncell scoped %} -
-{%- if resources.global_content_filter.include_input_prompt-%} - {{ self.empty_in_prompt() }} -{%- endif -%} -
-
-{{ cell.source | markdown2html | strip_files_prefix }} -
-
-
-{%- endblock markdowncell %} - -{% block unknowncell scoped %} -unknown type {{ cell.type }} -{% endblock unknowncell %} - -{% block execute_result -%} -{%- set extra_class="output_execute_result" -%} -{% block data_priority scoped %} -{{ super() }} -{% endblock data_priority %} -{%- set extra_class="" -%} -{%- endblock execute_result %} - -{% block stream_stdout -%} - {% if not cell['metadata'].get('hide_logging', True) %} -
-
-{{- output.text | ansi2html -}}
-
-
- {% endif %} -{%- endblock stream_stdout %} - - -{% block stream_stderr -%} - {% if not cell['metadata'].get('hide_logging', True) %} -
-
-{{- output.text | ansi2html -}}
-
-
- {% endif %} -{%- endblock stream_stderr %} - -{% block data_svg scoped -%} -
-{%- if output.svg_filename %} - -{%- else %} -{{ output.data['image/svg+xml'] }} -{%- endif %} -
-{%- endblock data_svg %} - -{% block data_html scoped -%} -
-{{ output.data['text/html'] }} -
-{%- endblock data_html %} - -{% block data_markdown scoped -%} -
-{{ output.data['text/markdown'] | markdown2html }} -
-{%- endblock data_markdown %} - -{% block data_png scoped %} -
-{%- if 'image/png' in output.metadata.get('filenames', {}) %} - -
-{%- endblock data_png %} - -{% block data_jpg scoped %} -
-{%- if 'image/jpeg' in output.metadata.get('filenames', {}) %} - -
-{%- endblock data_jpg %} - -{% block data_latex scoped %} -
-{{ output.data['text/latex'] }} -
-{%- endblock data_latex %} - -{% block error -%} -
-
-{{- super() -}}
-
-
-{%- endblock error %} - -{%- block traceback_line %} -{{ line | ansi2html }} -{%- endblock traceback_line %} - -{%- block data_text scoped %} -
-
-{{- output.data['text/plain'] | ansi2html -}}
-
-
-{%- endblock -%} - -{%- block data_javascript scoped %} -{% set div_id = uuid4() %} -
-
- -
-{%- endblock -%} - -{%- block data_widget_state scoped %} -{% set div_id = uuid4() %} -{% set datatype_list = output.data | filter_data_type %} -{% set datatype = datatype_list[0]%} -
-
- - -
-{%- endblock data_widget_state -%} - -{%- block data_widget_view scoped %} -{% set div_id = uuid4() %} -{% set datatype_list = output.data | filter_data_type %} -{% set datatype = datatype_list[0]%} -
-
- - -
-{%- endblock data_widget_view -%} - -{%- block footer %} -{% set mimetype = 'application/vnd.jupyter.widget-state+json'%} -{% if mimetype in nb.metadata.get("widgets",{})%} - -{% endif %} -{{ super() }} -{%- endblock footer-%} \ No newline at end of file diff --git a/backend/src/apiserver/visualization/templates/full.tpl b/backend/src/apiserver/visualization/templates/full.tpl deleted file mode 100644 index 2aac4185414..00000000000 --- a/backend/src/apiserver/visualization/templates/full.tpl +++ /dev/null @@ -1,76 +0,0 @@ -{%- extends 'basic.tpl' -%} -{% from 'mathjax.tpl' import mathjax %} - - -{%- block header -%} - - - -{%- block html_head -%} - -{% set nb_title = nb.metadata.get('title', '') or resources['metadata']['name'] %} -{{nb_title}} - - - - -{% block ipywidgets %} - -{% endblock ipywidgets %} - -{% for css in resources.inlining.css -%} - -{% endfor %} - - - - -{{ mathjax() }} -{%- endblock html_head -%} - -{%- endblock header -%} - -{% block body %} - -{{ super() }} - -{%- endblock body %} - -{% block footer %} -{{ super() }} - -{% endblock footer %} diff --git a/backend/src/apiserver/visualization/test_exporter.py b/backend/src/apiserver/visualization/test_exporter.py deleted file mode 100644 index c7591e041a8..00000000000 --- a/backend/src/apiserver/visualization/test_exporter.py +++ /dev/null @@ -1,81 +0,0 @@ -# Copyright 2019 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. - -import importlib -import unittest -from nbformat.v4 import new_notebook -import snapshottest - -exporter = importlib.import_module("exporter") - - -class TestExporterMethods(snapshottest.TestCase): - - def setUp(self): - self.maxDiff = None - self.exporter = exporter.Exporter(100, exporter.TemplateType.BASIC) - - def test_create_cell_from_args_with_no_args(self): - args = {} - cell = exporter.create_cell_from_args(args) - self.assertMatchSnapshot(cell.source) - - def test_create_cell_from_args_with_one_arg(self): - args = {"source": "gs://ml-pipeline/data.csv"} - cell = exporter.create_cell_from_args(args) - self.assertMatchSnapshot(cell.source) - - # Test generates html to avoid issues with Python 3.5 where dict objects - # do not retain order upon object creation. Due to this, we test that the - # provided arguments exist and equal the provided value. - def test_create_cell_from_args_with_multiple_args(self): - nb = new_notebook() - args = { - "source": "gs://ml-pipeline/data.csv", - "target_lambda": "lambda x: (x['target'] > x['fare'] * 0.2)" - } - code = [ - "print(variables.get('source'))", - "print(variables.get('target_lambda'))" - ] - nb.cells.append(exporter.create_cell_from_args(args)) - nb.cells.append(exporter.create_cell_from_custom_code(code)) - html = self.exporter.generate_html_from_notebook(nb) - self.assertMatchSnapshot(html) - - def test_create_cell_from_file(self): - cell = exporter.create_cell_from_file("types/test.py") - self.assertMatchSnapshot(cell.source) - - def test_create_cell_from_custom_code(self): - code = [ - "x = 2", - "print(x)" - ] - cell = exporter.create_cell_from_custom_code(code) - self.assertMatchSnapshot(cell.source) - - # Tests to ensure output is generated for custom visualizations. - def test_generate_custom_visualization_html_from_notebook(self): - nb = new_notebook() - args = {"x": 2} - code = ["print(variables.get('x'))"] - nb.cells.append(exporter.create_cell_from_args(args)) - nb.cells.append(exporter.create_cell_from_custom_code(code)) - html = self.exporter.generate_html_from_notebook(nb) - self.assertMatchSnapshot(html) - - -if __name__ == "__main__": - unittest.main() diff --git a/backend/src/apiserver/visualization/test_server.py b/backend/src/apiserver/visualization/test_server.py deleted file mode 100644 index 331fab8597e..00000000000 --- a/backend/src/apiserver/visualization/test_server.py +++ /dev/null @@ -1,100 +0,0 @@ -# Copyright 2019 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. - -import importlib -from typing import Text -import unittest -import tornado.testing -import tornado.web - -server = importlib.import_module("server") - - -def wrap_error_in_html(error: Text) -> bytes: - html = "{}{}".format(error, error) - return bytes(html, "utf-8") - - -class TestServerEndpoints(tornado.testing.AsyncHTTPTestCase): - def get_app(self): - return tornado.web.Application([ - (r"/", server.VisualizationHandler), - ]) - - def test_healthcheck(self): - response = self.fetch("/") - self.assertEqual(200, response.code) - self.assertEqual(b"alive", response.body) - - def test_create_visualization_fails_when_nothing_is_provided(self): - response = self.fetch( - "/", - method="POST", - body="") - self.assertEqual(400, response.code) - self.assertEqual( - wrap_error_in_html("400: No type provided."), - response.body - ) - - def test_create_visualization_fails_when_missing_type(self): - response = self.fetch( - "/", - method="POST", - body="source=gs://ml-pipeline/data.csv") - self.assertEqual(400, response.code) - self.assertEqual( - wrap_error_in_html("400: No type provided."), - response.body - ) - - def test_create_visualization_fails_when_missing_source(self): - response = self.fetch( - "/", - method="POST", - body='type=test') - self.assertEqual(400, response.code) - self.assertEqual( - wrap_error_in_html("400: No source provided."), - response.body - ) - - def test_create_visualization_passes_when_missing_source_and_type_is_custom(self): - response = self.fetch( - "/", - method="POST", - body='type=custom') - self.assertEqual(200, response.code) - - def test_create_visualization_fails_when_invalid_json_is_provided(self): - response = self.fetch( - "/", - method="POST", - body='type=test&source=gs://ml-pipeline/data.csv&arguments={') - self.assertEqual(400, response.code) - self.assertEqual( - wrap_error_in_html("400: Invalid JSON provided as arguments: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)"), - response.body - ) - - def test_create_visualization(self): - response = self.fetch( - "/", - method="POST", - body='type=test&source=gs://ml-pipeline/data.csv') - self.assertEqual(200, response.code) - - -if __name__ == "__main__": - unittest.main() diff --git a/backend/src/apiserver/visualization/types/roc_curve.py b/backend/src/apiserver/visualization/types/roc_curve.py deleted file mode 100644 index a2dd16b6d3f..00000000000 --- a/backend/src/apiserver/visualization/types/roc_curve.py +++ /dev/null @@ -1,74 +0,0 @@ -# Copyright 2019 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. - -import json -from pathlib import Path -from bokeh.layouts import row -from bokeh.plotting import figure -from bokeh.io import output_notebook, show -from bokeh.models import HoverTool -# gcsfs is required for pandas GCS integration. -import gcsfs -import pandas as pd -from sklearn.metrics import roc_curve -from tensorflow.python.lib.io import file_io - -# The following variables are provided through dependency injection. These -# variables come from the specified input path and arguments provided by the -# API post request. -# -# is_generated -# source -# target_lambda -# trueclass -# true_score_column - -if not variables.get("is_generated", False): - # Create data from specified csv file(s). - # The schema file provides column names for the csv file that will be used - # to generate the roc curve. - schema_file = Path(source) / "schema.json" - schema = json.loads(file_io.read_file_to_string(schema_file)) - names = [x["name"] for x in schema] - - dfs = [] - files = file_io.get_matching_files(source) - for f in files: - dfs.append(pd.read_csv(f, names=names)) - - df = pd.concat(dfs) - if variables.get("target_lambda", False): - df["target"] = df.apply(eval(variables.get("target_lambda", "")), axis=1) - else: - df["target"] = df["target"].apply(lambda x: 1 if x == variables.get("trueclass", "true") else 0) - fpr, tpr, thresholds = roc_curve(df["target"], df[variables.get("true_score_column", "true")]) - df = pd.DataFrame({"fpr": fpr, "tpr": tpr, "thresholds": thresholds}) -else: - # Load data from generated csv file. - df = pd.read_csv( - source, - header=None, - names=["fpr", "tpr", "thresholds"] - ) - -# Create visualization. -output_notebook() - -p = figure(tools="pan,wheel_zoom,box_zoom,reset,hover,previewsave") -p.line("fpr", "tpr", line_width=2, source=df) - -hover = p.select(dict(type=HoverTool)) -hover.tooltips = [("Threshold", "@thresholds")] - -show(row(p, sizing_mode="scale_width")) diff --git a/backend/src/apiserver/visualization/types/table.py b/backend/src/apiserver/visualization/types/table.py deleted file mode 100644 index d4322a1b3c7..00000000000 --- a/backend/src/apiserver/visualization/types/table.py +++ /dev/null @@ -1,50 +0,0 @@ -# Copyright 2019 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. - -# gcsfs is required for pandas GCS integration. -import gcsfs -from itables import show -# itables is requires as importing it changes the way pandas DataFrames are -# rendered. -import itables.interactive -from itables.javascript import load_datatables -import itables.options as opts -import pandas as pd -from tensorflow.python.lib.io import file_io - -# Forcefully load required JavaScript and CSS for datatables. -load_datatables() - -# Remove maxByte limit to prevent issues where entire table cannot be rendered -# due to size of data. -opts.maxBytes = 0 - -dfs = [] -files = file_io.get_matching_files(source) - -# Read data from file and write it to a DataFrame object. -if not variables.get("headers", False): - # If no headers are provided, use the first row as headers - for f in files: - dfs.append(pd.read_csv(f)) -else: - # If headers are provided, do not set headers for DataFrames - for f in files: - dfs.append(pd.read_csv(f, header=None)) - -# Display DataFrame as output. -df = pd.concat(dfs) -if variables.get("headers", False): - df.columns = variables.get("headers") -show(df) diff --git a/backend/src/apiserver/visualization/types/test.py b/backend/src/apiserver/visualization/types/test.py deleted file mode 100644 index 92877ad402c..00000000000 --- a/backend/src/apiserver/visualization/types/test.py +++ /dev/null @@ -1,20 +0,0 @@ -""" -test.py provides a basic predefined visualization that can be used for testing -because it does not have dependencies and had a low chance of being updated. -""" - -# Copyright 2019 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. - -print(2) \ No newline at end of file diff --git a/backend/src/apiserver/visualization/types/tfdv.py b/backend/src/apiserver/visualization/types/tfdv.py deleted file mode 100644 index c8abfa849c3..00000000000 --- a/backend/src/apiserver/visualization/types/tfdv.py +++ /dev/null @@ -1,92 +0,0 @@ -# Copyright 2019 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. - -import base64 -import tensorflow_data_validation as tfdv -from IPython.display import display -from IPython.display import HTML -from tensorflow_metadata.proto.v0 import statistics_pb2 -from typing import Text - -# The following variables are provided through dependency injection. These -# variables come from the specified input path and arguments provided by the -# API post request. -# -# source - -# train_stats = tfdv.generate_statistics_from_csv(data_location=source) -# tfdv.visualize_statistics(train_stats) - -def get_statistics_html( - lhs_statistics: statistics_pb2.DatasetFeatureStatisticsList -) -> Text: - """Build the HTML for visualizing the input statistics using Facets. - Args: - lhs_statistics: A DatasetFeatureStatisticsList protocol buffer. - Returns: - HTML to be embedded for visualization. - Raises: - TypeError: If the input argument is not of the expected type. - ValueError: If the input statistics protos does not have only one dataset. - """ - - rhs_statistics = None - lhs_name = 'lhs_statistics' - rhs_name = 'rhs_statistics' - - if not isinstance(lhs_statistics, - statistics_pb2.DatasetFeatureStatisticsList): - raise TypeError( - 'lhs_statistics is of type %s, should be ' - 'a DatasetFeatureStatisticsList proto.' % type(lhs_statistics).__name__) - - if len(lhs_statistics.datasets) != 1: - raise ValueError('lhs_statistics proto contains multiple datasets. Only ' - 'one dataset is currently supported.') - - if lhs_statistics.datasets[0].name: - lhs_name = lhs_statistics.datasets[0].name - - # Add lhs stats. - combined_statistics = statistics_pb2.DatasetFeatureStatisticsList() - lhs_stats_copy = combined_statistics.datasets.add() - lhs_stats_copy.MergeFrom(lhs_statistics.datasets[0]) - lhs_stats_copy.name = lhs_name - - protostr = base64.b64encode( - combined_statistics.SerializeToString()).decode('utf-8') - - # pylint: disable=line-too-long - # Note that in the html template we currently assign a temporary id to the - # facets element and then remove it once we have appended the serialized proto - # string to the element. We do this to avoid any collision of ids when - # displaying multiple facets output in the notebook. - html_template = """ - """ - # pylint: enable=line-too-long - html = html_template.replace('protostr', protostr) - - return html - -stats = tfdv.load_statistics(source) -html = get_statistics_html(stats) -display(HTML(html)) diff --git a/backend/src/apiserver/visualization/types/tfma.py b/backend/src/apiserver/visualization/types/tfma.py deleted file mode 100644 index 33416dda842..00000000000 --- a/backend/src/apiserver/visualization/types/tfma.py +++ /dev/null @@ -1,17 +0,0 @@ -# Copyright 2019 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. - -import tensorflow_model_analysis as tfma - -tfma.view.render_slicing_metrics(source, slicing_column=variables.get('slicing_column', None)) diff --git a/backend/src/apiserver/visualization/update_requirements.sh b/backend/src/apiserver/visualization/update_requirements.sh deleted file mode 100755 index a1d22db67a6..00000000000 --- a/backend/src/apiserver/visualization/update_requirements.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash - -# This image should be in sync with Dockerfile.visualization. -IMAGE="tensorflow/tensorflow:2.10.1" -# tensorflow/tfx default entrypoint is Apache BEAM, because Apache BEAM doesn't -# support custom entrypoint for now. We need to override with --entrypoint "" -# for other `docker run` usecase. -# https://github.com/tensorflow/tfx/blob/master/tfx/tools/docker/Dockerfile#L71 -../../../../hack/update-requirements.sh $IMAGE requirements.txt diff --git a/backend/src/common/client/api_server/v1/visualization_client.go b/backend/src/common/client/api_server/v1/visualization_client.go deleted file mode 100644 index 7ce7f2f90ec..00000000000 --- a/backend/src/common/client/api_server/v1/visualization_client.go +++ /dev/null @@ -1,79 +0,0 @@ -package api_server - -import ( - "fmt" - - rt "github.com/go-openapi/runtime" - "github.com/go-openapi/strfmt" - apiclient "github.com/kubeflow/pipelines/backend/api/v1beta1/go_http_client/visualization_client" - params "github.com/kubeflow/pipelines/backend/api/v1beta1/go_http_client/visualization_client/visualization_service" - model "github.com/kubeflow/pipelines/backend/api/v1beta1/go_http_client/visualization_model" - "github.com/kubeflow/pipelines/backend/src/common/client/api_server" - "github.com/kubeflow/pipelines/backend/src/common/util" - "golang.org/x/net/context" - _ "k8s.io/client-go/plugin/pkg/client/auth/gcp" - "k8s.io/client-go/tools/clientcmd" -) - -type VisualizationInterface interface { - Create(params *params.VisualizationServiceCreateVisualizationV1Params) (*model.APIVisualization, error) -} - -type VisualizationClient struct { - apiClient *apiclient.Visualization - authInfoWriter rt.ClientAuthInfoWriter -} - -func NewVisualizationClient(clientConfig clientcmd.ClientConfig, debug bool) ( - *VisualizationClient, error) { - - runtime, err := api_server.NewHTTPRuntime(clientConfig, debug) - if err != nil { - return nil, fmt.Errorf("Error occurred when creating visualization client: %w", err) - } - - apiClient := apiclient.New(runtime, strfmt.Default) - - // Creating upload client - return &VisualizationClient{ - apiClient: apiClient, - }, nil -} - -func NewKubeflowInClusterVisualizationClient(namespace string, debug bool) ( - *VisualizationClient, error) { - - runtime := api_server.NewKubeflowInClusterHTTPRuntime(namespace, debug) - - apiClient := apiclient.New(runtime, strfmt.Default) - - // Creating upload client - return &VisualizationClient{ - apiClient: apiClient, - authInfoWriter: api_server.SATokenVolumeProjectionAuth, - }, nil -} - -func (c *VisualizationClient) Create(parameters *params.VisualizationServiceCreateVisualizationV1Params) (*model.APIVisualization, - error) { - // Create context with timeout - ctx, cancel := context.WithTimeout(context.Background(), api_server.APIServerDefaultTimeout) - defer cancel() - - // Make service call - parameters.Context = ctx - response, err := c.apiClient.VisualizationService.VisualizationServiceCreateVisualizationV1(parameters, api_server.PassThroughAuth) - if err != nil { - if defaultError, ok := err.(*params.VisualizationServiceCreateVisualizationV1Default); ok { - err = api_server.CreateErrorFromAPIStatus(defaultError.Payload.Error, defaultError.Payload.Code) - } else { - err = api_server.CreateErrorCouldNotRecoverAPIStatus(err) - } - - return nil, util.NewUserError(err, - fmt.Sprintf("Failed to create visualizaiton. Params: '%+v'. Body: '%+v'", parameters, parameters.Body), - fmt.Sprintf("Failed to create visualization '%v'", parameters.Body.Type)) - } - - return response.Payload, nil -} diff --git a/backend/src/common/client/api_server/v1/visualization_client_fake.go b/backend/src/common/client/api_server/v1/visualization_client_fake.go deleted file mode 100644 index 5afb2ca331e..00000000000 --- a/backend/src/common/client/api_server/v1/visualization_client_fake.go +++ /dev/null @@ -1,32 +0,0 @@ -package api_server - -import ( - "encoding/json" - "fmt" - - params "github.com/kubeflow/pipelines/backend/api/v1beta1/go_http_client/visualization_client/visualization_service" - model "github.com/kubeflow/pipelines/backend/api/v1beta1/go_http_client/visualization_model" -) - -type VisualizationArguments struct { - fail bool -} - -type VisualizationClientFake struct{} - -func NewVisualizationClientFake() *VisualizationClientFake { - return &VisualizationClientFake{} -} - -func (c *VisualizationClientFake) Create(params *params.VisualizationServiceCreateVisualizationV1Params) ( - *model.APIVisualization, error) { - var arguments VisualizationArguments - err := json.Unmarshal([]byte(params.Body.Arguments), &arguments) - if err != nil { - return nil, err - } - if arguments.fail { - return nil, fmt.Errorf(ClientErrorString) - } - return params.Body, nil -} diff --git a/backend/test/integration/visualization_api_test.go b/backend/test/integration/visualization_api_test.go deleted file mode 100644 index 0519aaae39d..00000000000 --- a/backend/test/integration/visualization_api_test.go +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright 2018-2023 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 -// -// https://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. - -package integration - -import ( - "testing" - - "github.com/golang/glog" - params "github.com/kubeflow/pipelines/backend/api/v1beta1/go_http_client/visualization_client/visualization_service" - "github.com/kubeflow/pipelines/backend/api/v1beta1/go_http_client/visualization_model" - api_server "github.com/kubeflow/pipelines/backend/src/common/client/api_server/v1" - "github.com/kubeflow/pipelines/backend/test" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/suite" -) - -type VisualizationApiTest struct { - suite.Suite - namespace string - resourceNamespace string - visualizationClient *api_server.VisualizationClient -} - -// Check the namespace have ML job installed and ready -func (s *VisualizationApiTest) SetupTest() { - if !*runIntegrationTests { - s.T().SkipNow() - return - } - - if !*isDevMode { - err := test.WaitForReady(*initializeTimeout) - if err != nil { - glog.Exitf("Failed to initialize test. Error: %v", err) - } - } - s.namespace = *namespace - - var newVisualizationClient func() (*api_server.VisualizationClient, error) - - if *isKubeflowMode { - s.resourceNamespace = *resourceNamespace - - newVisualizationClient = func() (*api_server.VisualizationClient, error) { - return api_server.NewKubeflowInClusterVisualizationClient(s.namespace, *isDebugMode) - } - } else { - clientConfig := test.GetClientConfig(*namespace) - - newVisualizationClient = func() (*api_server.VisualizationClient, error) { - return api_server.NewVisualizationClient(clientConfig, *isDebugMode) - } - } - - var err error - s.visualizationClient, err = newVisualizationClient() - if err != nil { - glog.Exitf("Failed to get visualization client. Error: %v", err) - } -} - -func (s *VisualizationApiTest) TestVisualizationAPI() { - t := s.T() - - /* ---------- Generate custom visualization --------- */ - visualization := &visualization_model.APIVisualization{ - Arguments: `{"code": ["print(2)"]}`, - Type: visualization_model.APIVisualizationTypeCUSTOM, - } - customVisualization, err := s.visualizationClient.Create(¶ms.VisualizationServiceCreateVisualizationV1Params{ - Body: visualization, - }) - assert.Nil(t, err) - assert.NotNil(t, customVisualization.HTML) -} - -func TestVisualizationAPI(t *testing.T) { - suite.Run(t, new(VisualizationApiTest)) -} diff --git a/developer_guide.md b/developer_guide.md index 39e72e6b10d..c191a2d80f0 100644 --- a/developer_guide.md +++ b/developer_guide.md @@ -62,16 +62,6 @@ $ gcloud auth configure-docker $ docker push gcr.io//persistenceagent:latest ``` -To build the visualization server image and upload it to GCR: - -```bash -# Run in the repository root directory -$ docker build -t gcr.io//visualization:latest -f backend/Dockerfile.visualization . -# Push to GCR -$ gcloud auth configure-docker -$ docker push gcr.io//visualization:latest -``` - To build the frontend image and upload it to GCR: ```bash @@ -92,13 +82,6 @@ For example, to build API server image $ docker build -t ml-pipeline-api-server -f backend/Dockerfile . ``` -## Python based visualizations - -Python based visualizations are a new method to visualize results within the -Kubeflow Pipelines UI. For more information about Python based visualizations -please visit the [documentation page](https://www.kubeflow.org/docs/pipelines/sdk/python-based-visualizations). -To create predefine visualizations please check the [developer guide](https://github.com/kubeflow/pipelines/blob/master/backend/src/apiserver/visualization/README.md). - ## Unit test ### API server diff --git a/frontend/mock-backend/mock-api-middleware.ts b/frontend/mock-backend/mock-api-middleware.ts index 2cbad278054..b9ce696701b 100644 --- a/frontend/mock-backend/mock-api-middleware.ts +++ b/frontend/mock-backend/mock-api-middleware.ts @@ -727,10 +727,6 @@ export default (app: express.Application) => { }, 300); }); - app.get('/visualizations/allowed', (req, res) => { - res.send(true); - }); - // Uncomment this instead to test 404 endpoints. // app.get('/system/cluster-name', (_, res) => { // res.status(404).send('404 Not Found'); diff --git a/frontend/package.json b/frontend/package.json index be8929f3964..e0852450feb 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -47,21 +47,19 @@ }, "scripts": { "analyze-bundle": "node analyze_bundle.js", - "apis": "npm run apis:experiment && npm run apis:job && npm run apis:pipeline && npm run apis:run && npm run apis:filter && npm run apis:visualization && npm run apis:auth", + "apis": "npm run apis:experiment && npm run apis:job && npm run apis:pipeline && npm run apis:run && npm run apis:filter && npm run apis:auth", "apis:experiment": "java -jar swagger-codegen-cli.jar generate -i ../backend/api/swagger/experiment.swagger.json -l typescript-fetch -o ./src/apis/experiment -c ./swagger-config.json", "apis:job": "java -jar swagger-codegen-cli.jar generate -i ../backend/api/swagger/job.swagger.json -l typescript-fetch -o ./src/apis/job -c ./swagger-config.json", "apis:pipeline": "java -jar swagger-codegen-cli.jar generate -i ../backend/api/swagger/pipeline.swagger.json -l typescript-fetch -o ./src/apis/pipeline -c ./swagger-config.json", "apis:run": "java -jar swagger-codegen-cli.jar generate -i ../backend/api/swagger/run.swagger.json -l typescript-fetch -o ./src/apis/run -c ./swagger-config.json", "apis:filter": "java -jar swagger-codegen-cli.jar generate -i ../backend/api/swagger/filter.swagger.json -l typescript-fetch -o ./src/apis/filter -c ./swagger-config.json", - "apis:visualization": "java -jar swagger-codegen-cli.jar generate -i ../backend/api/swagger/visualization.swagger.json -l typescript-fetch -o ./src/apis/visualization -c ./swagger-config.json", "apis:auth": "java -jar swagger-codegen-cli.jar generate -i ../backend/api/swagger/auth.swagger.json -l typescript-fetch -o ./server/src/generated/apis/auth -c ./swagger-config.json", - "apis:v2beta1": "npm run apis:v2beta1:experiment && npm run apis:v2beta1:recurringrun && npm run apis:v2beta1:pipeline && npm run apis:v2beta1:run && npm run apis:v2beta1:filter && npm run apis:v2beta1:visualization && npm run apis:v2beta1:auth", + "apis:v2beta1": "npm run apis:v2beta1:experiment && npm run apis:v2beta1:recurringrun && npm run apis:v2beta1:pipeline && npm run apis:v2beta1:run && npm run apis:v2beta1:filter && npm run apis:v2beta1:auth", "apis:v2beta1:experiment": "java -jar swagger-codegen-cli.jar generate -i ../backend/api/v2beta1/swagger/experiment.swagger.json -l typescript-fetch -o ./src/apisv2beta1/experiment -c ./swagger-config.json", "apis:v2beta1:recurringrun": "java -jar swagger-codegen-cli.jar generate -i ../backend/api/v2beta1/swagger/recurring_run.swagger.json -l typescript-fetch -o ./src/apisv2beta1/recurringrun -c ./swagger-config.json", "apis:v2beta1:pipeline": "java -jar swagger-codegen-cli.jar generate -i ../backend/api/v2beta1/swagger/pipeline.swagger.json -l typescript-fetch -o ./src/apisv2beta1/pipeline -c ./swagger-config.json", "apis:v2beta1:run": "java -jar swagger-codegen-cli.jar generate -i ../backend/api/v2beta1/swagger/run.swagger.json -l typescript-fetch -o ./src/apisv2beta1/run -c ./swagger-config.json", "apis:v2beta1:filter": "java -jar swagger-codegen-cli.jar generate -i ../backend/api/v2beta1/swagger/filter.swagger.json -l typescript-fetch -o ./src/apisv2beta1/filter -c ./swagger-config.json", - "apis:v2beta1:visualization": "java -jar swagger-codegen-cli.jar generate -i ../backend/api/v2beta1/swagger/visualization.swagger.json -l typescript-fetch -o ./src/apisv2beta1/visualization -c ./swagger-config.json", "apis:v2beta1:auth": "java -jar swagger-codegen-cli.jar generate -i ../backend/api/v2beta1/swagger/auth.swagger.json -l typescript-fetch -o ./server/src/generated/apisv2beta1/auth -c ./swagger-config.json", "build:tailwind": "npx tailwindcss build -i src/tailwind.css -o src/build/tailwind.output.css", "prestart": "npm run build:tailwind", diff --git a/frontend/src/apis/visualization/.gitignore b/frontend/src/apis/visualization/.gitignore deleted file mode 100644 index 35e2fb2b02e..00000000000 --- a/frontend/src/apis/visualization/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -wwwroot/*.js -node_modules -typings diff --git a/frontend/src/apis/visualization/.swagger-codegen-ignore b/frontend/src/apis/visualization/.swagger-codegen-ignore deleted file mode 100644 index c5fa491b4c5..00000000000 --- a/frontend/src/apis/visualization/.swagger-codegen-ignore +++ /dev/null @@ -1,23 +0,0 @@ -# Swagger Codegen Ignore -# Generated by swagger-codegen https://github.com/swagger-api/swagger-codegen - -# Use this file to prevent files from being overwritten by the generator. -# The patterns follow closely to .gitignore or .dockerignore. - -# As an example, the C# client generator defines ApiClient.cs. -# You can make changes and tell Swagger Codgen to ignore just this file by uncommenting the following line: -#ApiClient.cs - -# You can match any string of characters against a directory, file or extension with a single asterisk (*): -#foo/*/qux -# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux - -# You can recursively match patterns against a directory, file or extension with a double asterisk (**): -#foo/**/qux -# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux - -# You can also negate patterns with an exclamation (!). -# For example, you can ignore all files in a docs folder with the file extension .md: -#docs/*.md -# Then explicitly reverse the ignore rule for a single file: -#!docs/README.md diff --git a/frontend/src/apis/visualization/.swagger-codegen/VERSION b/frontend/src/apis/visualization/.swagger-codegen/VERSION deleted file mode 100644 index 48a6b508dc9..00000000000 --- a/frontend/src/apis/visualization/.swagger-codegen/VERSION +++ /dev/null @@ -1 +0,0 @@ -2.4.7 \ No newline at end of file diff --git a/frontend/src/apis/visualization/api.ts b/frontend/src/apis/visualization/api.ts deleted file mode 100644 index 46bc0e7b140..00000000000 --- a/frontend/src/apis/visualization/api.ts +++ /dev/null @@ -1,334 +0,0 @@ -/// -// tslint:disable -/** - * backend/api/visualization.proto - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * OpenAPI spec version: version not set - * - * - * NOTE: This class is auto generated by the swagger code generator program. - * https://github.com/swagger-api/swagger-codegen.git - * Do not edit the class manually. - */ - -import * as url from 'url'; -import * as portableFetch from 'portable-fetch'; -import { Configuration } from './configuration'; - -const BASE_PATH = 'http://localhost'.replace(/\/+$/, ''); - -/** - * - * @export - */ -export const COLLECTION_FORMATS = { - csv: ',', - ssv: ' ', - tsv: '\t', - pipes: '|', -}; - -/** - * - * @export - * @interface FetchAPI - */ -export interface FetchAPI { - (url: string, init?: any): Promise; -} - -/** - * - * @export - * @interface FetchArgs - */ -export interface FetchArgs { - url: string; - options: any; -} - -/** - * - * @export - * @class BaseAPI - */ -export class BaseAPI { - protected configuration: Configuration; - - constructor( - configuration?: Configuration, - protected basePath: string = BASE_PATH, - protected fetch: FetchAPI = portableFetch, - ) { - if (configuration) { - this.configuration = configuration; - this.basePath = configuration.basePath || this.basePath; - } - } -} - -/** - * - * @export - * @class RequiredError - * @extends {Error} - */ -export class RequiredError extends Error { - name: 'RequiredError'; - constructor(public field: string, msg?: string) { - super(msg); - } -} - -/** - * - * @export - * @interface ApiStatus - */ -export interface ApiStatus { - /** - * - * @type {string} - * @memberof ApiStatus - */ - error?: string; - /** - * - * @type {number} - * @memberof ApiStatus - */ - code?: number; - /** - * - * @type {Array} - * @memberof ApiStatus - */ - details?: Array; -} - -/** - * - * @export - * @interface ApiVisualization - */ -export interface ApiVisualization { - /** - * - * @type {ApiVisualizationType} - * @memberof ApiVisualization - */ - type?: ApiVisualizationType; - /** - * Path pattern of input data to be used during generation of visualizations. This is required when creating the pipeline through CreateVisualization API. - * @type {string} - * @memberof ApiVisualization - */ - source?: string; - /** - * Variables to be used during generation of a visualization. This should be provided as a JSON string. This is required when creating the pipeline through CreateVisualization API. - * @type {string} - * @memberof ApiVisualization - */ - arguments?: string; - /** - * Output. Generated visualization html. - * @type {string} - * @memberof ApiVisualization - */ - html?: string; - /** - * In case any error happens when generating visualizations, only visualization ID and the error message are returned. Client has the flexibility of choosing how to handle the error. - * @type {string} - * @memberof ApiVisualization - */ - error?: string; -} - -/** - * Type of visualization to be generated. This is required when creating the pipeline through CreateVisualization API. - * @export - * @enum {string} - */ -export enum ApiVisualizationType { - ROCCURVE = 'ROC_CURVE', - TFDV = 'TFDV', - TFMA = 'TFMA', - TABLE = 'TABLE', - CUSTOM = 'CUSTOM', -} - -/** - * `Any` contains an arbitrary serialized protocol buffer message along with a URL that describes the type of the serialized message. Protobuf library provides support to pack/unpack Any values in the form of utility functions or additional generated methods of the Any type. Example 1: Pack and unpack a message in C++. Foo foo = ...; Any any; any.PackFrom(foo); ... if (any.UnpackTo(&foo)) { ... } Example 2: Pack and unpack a message in Java. Foo foo = ...; Any any = Any.pack(foo); ... if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } Example 3: Pack and unpack a message in Python. foo = Foo(...) any = Any() any.Pack(foo) ... if any.Is(Foo.DESCRIPTOR): any.Unpack(foo) ... Example 4: Pack and unpack a message in Go foo := &pb.Foo{...} any, err := anypb.New(foo) if err != nil { ... } ... foo := &pb.Foo{} if err := any.UnmarshalTo(foo); err != nil { ... } The pack methods provided by protobuf library will by default use 'type.googleapis.com/full.type.name' as the type URL and the unpack methods only use the fully qualified type name after the last '/' in the type URL, for example \"foo.bar.com/x/y.z\" will yield type name \"y.z\". JSON ==== The JSON representation of an `Any` value uses the regular representation of the deserialized, embedded message, with an additional field `@type` which contains the type URL. Example: package google.profile; message Person { string first_name = 1; string last_name = 2; } { \"@type\": \"type.googleapis.com/google.profile.Person\", \"firstName\": , \"lastName\": } If the embedded message type is well-known and has a custom JSON representation, that representation will be embedded adding a field `value` which holds the custom JSON in addition to the `@type` field. Example (for message [google.protobuf.Duration][]): { \"@type\": \"type.googleapis.com/google.protobuf.Duration\", \"value\": \"1.212s\" } - * @export - * @interface ProtobufAny - */ -export interface ProtobufAny { - /** - * A URL/resource name that uniquely identifies the type of the serialized protocol buffer message. This string must contain at least one \"/\" character. The last segment of the URL's path must represent the fully qualified name of the type (as in `path/google.protobuf.Duration`). The name should be in a canonical form (e.g., leading \".\" is not accepted). In practice, teams usually precompile into the binary all types that they expect it to use in the context of Any. However, for URLs which use the scheme `http`, `https`, or no scheme, one can optionally set up a type server that maps type URLs to message definitions as follows: * If no scheme is provided, `https` is assumed. * An HTTP GET on the URL must yield a [google.protobuf.Type][] value in binary format, or produce an error. * Applications are allowed to cache lookup results based on the URL, or have them precompiled into a binary to avoid any lookup. Therefore, binary compatibility needs to be preserved on changes to types. (Use versioned type names to manage breaking changes.) Note: this functionality is not currently available in the official protobuf release, and it is not used for type URLs beginning with type.googleapis.com. Schemes other than `http`, `https` (or the empty scheme) might be used with implementation specific semantics. - * @type {string} - * @memberof ProtobufAny - */ - type_url?: string; - /** - * Must be a valid serialized protocol buffer of the above specified type. - * @type {string} - * @memberof ProtobufAny - */ - value?: string; -} - -/** - * VisualizationServiceApi - fetch parameter creator - * @export - */ -export const VisualizationServiceApiFetchParamCreator = function(configuration?: Configuration) { - return { - /** - * - * @param {string} namespace - * @param {ApiVisualization} body - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - createVisualization(namespace: string, body: ApiVisualization, options: any = {}): FetchArgs { - // verify required parameter 'namespace' is not null or undefined - if (namespace === null || namespace === undefined) { - throw new RequiredError( - 'namespace', - 'Required parameter namespace was null or undefined when calling createVisualization.', - ); - } - // verify required parameter 'body' is not null or undefined - if (body === null || body === undefined) { - throw new RequiredError( - 'body', - 'Required parameter body was null or undefined when calling createVisualization.', - ); - } - const localVarPath = `/apis/v1beta1/visualizations/{namespace}`.replace( - `{${'namespace'}}`, - encodeURIComponent(String(namespace)), - ); - const localVarUrlObj = url.parse(localVarPath, true); - const localVarRequestOptions = Object.assign({ method: 'POST' }, options); - const localVarHeaderParameter = {} as any; - const localVarQueryParameter = {} as any; - - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = - typeof configuration.apiKey === 'function' - ? configuration.apiKey('authorization') - : configuration.apiKey; - localVarHeaderParameter['authorization'] = localVarApiKeyValue; - } - - localVarHeaderParameter['Content-Type'] = 'application/json'; - - localVarUrlObj.query = Object.assign( - {}, - localVarUrlObj.query, - localVarQueryParameter, - options.query, - ); - // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 - delete localVarUrlObj.search; - localVarRequestOptions.headers = Object.assign({}, localVarHeaderParameter, options.headers); - const needsSerialization = - 'ApiVisualization' !== 'string' || - localVarRequestOptions.headers['Content-Type'] === 'application/json'; - localVarRequestOptions.body = needsSerialization ? JSON.stringify(body || {}) : body || ''; - - return { - url: url.format(localVarUrlObj), - options: localVarRequestOptions, - }; - }, - }; -}; - -/** - * VisualizationServiceApi - functional programming interface - * @export - */ -export const VisualizationServiceApiFp = function(configuration?: Configuration) { - return { - /** - * - * @param {string} namespace - * @param {ApiVisualization} body - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - createVisualization( - namespace: string, - body: ApiVisualization, - options?: any, - ): (fetch?: FetchAPI, basePath?: string) => Promise { - const localVarFetchArgs = VisualizationServiceApiFetchParamCreator( - configuration, - ).createVisualization(namespace, body, options); - return (fetch: FetchAPI = portableFetch, basePath: string = BASE_PATH) => { - return fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options).then(response => { - if (response.status >= 200 && response.status < 300) { - return response.json(); - } else { - throw response; - } - }); - }; - }, - }; -}; - -/** - * VisualizationServiceApi - factory interface - * @export - */ -export const VisualizationServiceApiFactory = function( - configuration?: Configuration, - fetch?: FetchAPI, - basePath?: string, -) { - return { - /** - * - * @param {string} namespace - * @param {ApiVisualization} body - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - createVisualization(namespace: string, body: ApiVisualization, options?: any) { - return VisualizationServiceApiFp(configuration).createVisualization( - namespace, - body, - options, - )(fetch, basePath); - }, - }; -}; - -/** - * VisualizationServiceApi - object-oriented interface - * @export - * @class VisualizationServiceApi - * @extends {BaseAPI} - */ -export class VisualizationServiceApi extends BaseAPI { - /** - * - * @param {string} namespace - * @param {ApiVisualization} body - * @param {*} [options] Override http request option. - * @throws {RequiredError} - * @memberof VisualizationServiceApi - */ - public createVisualization(namespace: string, body: ApiVisualization, options?: any) { - return VisualizationServiceApiFp(this.configuration).createVisualization( - namespace, - body, - options, - )(this.fetch, this.basePath); - } -} diff --git a/frontend/src/apis/visualization/configuration.ts b/frontend/src/apis/visualization/configuration.ts deleted file mode 100644 index f560abd043e..00000000000 --- a/frontend/src/apis/visualization/configuration.ts +++ /dev/null @@ -1,65 +0,0 @@ -// tslint:disable -/** - * backend/api/visualization.proto - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * OpenAPI spec version: version not set - * - * - * NOTE: This class is auto generated by the swagger code generator program. - * https://github.com/swagger-api/swagger-codegen.git - * Do not edit the class manually. - */ - -export interface ConfigurationParameters { - apiKey?: string | ((name: string) => string); - username?: string; - password?: string; - accessToken?: string | ((name: string, scopes?: string[]) => string); - basePath?: string; -} - -export class Configuration { - /** - * parameter for apiKey security - * @param name security name - * @memberof Configuration - */ - apiKey?: string | ((name: string) => string); - /** - * parameter for basic security - * - * @type {string} - * @memberof Configuration - */ - username?: string; - /** - * parameter for basic security - * - * @type {string} - * @memberof Configuration - */ - password?: string; - /** - * parameter for oauth2 security - * @param name security name - * @param scopes oauth2 scope - * @memberof Configuration - */ - accessToken?: string | ((name: string, scopes?: string[]) => string); - /** - * override base path - * - * @type {string} - * @memberof Configuration - */ - basePath?: string; - - constructor(param: ConfigurationParameters = {}) { - this.apiKey = param.apiKey; - this.username = param.username; - this.password = param.password; - this.accessToken = param.accessToken; - this.basePath = param.basePath; - } -} diff --git a/frontend/src/apis/visualization/custom.d.ts b/frontend/src/apis/visualization/custom.d.ts deleted file mode 100644 index 4c611cc3216..00000000000 --- a/frontend/src/apis/visualization/custom.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -declare module 'portable-fetch'; -declare module 'url'; diff --git a/frontend/src/apis/visualization/git_push.sh b/frontend/src/apis/visualization/git_push.sh deleted file mode 100644 index a1ff4c9bcba..00000000000 --- a/frontend/src/apis/visualization/git_push.sh +++ /dev/null @@ -1,51 +0,0 @@ -#!/bin/sh -# ref: https://help.github.com/articles/adding-an-existing-project-to-github-using-the-command-line/ -# -# Usage example: /bin/sh ./git_push.sh wing328 swagger-petstore-perl "minor update" - -git_user_id=$1 -git_repo_id=$2 -release_note=$3 - -if [ "$git_user_id" = "" ]; then - git_user_id="GIT_USER_ID" - echo "[INFO] No command line input provided. Set \$git_user_id to $git_user_id" -fi - -if [ "$git_repo_id" = "" ]; then - git_repo_id="GIT_REPO_ID" - echo "[INFO] No command line input provided. Set \$git_repo_id to $git_repo_id" -fi - -if [ "$release_note" = "" ]; then - release_note="Minor update" - echo "[INFO] No command line input provided. Set \$release_note to $release_note" -fi - -# Initialize the local directory as a Git repository -git init - -# Adds the files in the local repository and stages them for commit. -git add . - -# Commits the tracked changes and prepares them to be pushed to a remote repository. -git commit -m "$release_note" - -# Sets the new remote -git_remote=`git remote` -if [ "$git_remote" = "" ]; then # git remote not defined - - if [ "$GIT_TOKEN" = "" ]; then - echo "[INFO] \$GIT_TOKEN (environment variable) is not set. Using the git credential in your environment." - git remote add origin https://github.com/${git_user_id}/${git_repo_id}.git - else - git remote add origin https://${git_user_id}:${GIT_TOKEN}@github.com/${git_user_id}/${git_repo_id}.git - fi - -fi - -git pull origin master - -# Pushes (Forces) the changes in the local repository up to the remote repository -echo "Git pushing to https://github.com/${git_user_id}/${git_repo_id}.git" -git push origin master 2>&1 | grep -v 'To https' diff --git a/frontend/src/apis/visualization/index.ts b/frontend/src/apis/visualization/index.ts deleted file mode 100644 index 37241e7909f..00000000000 --- a/frontend/src/apis/visualization/index.ts +++ /dev/null @@ -1,15 +0,0 @@ -// tslint:disable -/** - * backend/api/visualization.proto - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * OpenAPI spec version: version not set - * - * - * NOTE: This class is auto generated by the swagger code generator program. - * https://github.com/swagger-api/swagger-codegen.git - * Do not edit the class manually. - */ - -export * from './api'; -export * from './configuration'; diff --git a/frontend/src/apisv2beta1/visualization/.gitignore b/frontend/src/apisv2beta1/visualization/.gitignore deleted file mode 100644 index 35e2fb2b02e..00000000000 --- a/frontend/src/apisv2beta1/visualization/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -wwwroot/*.js -node_modules -typings diff --git a/frontend/src/apisv2beta1/visualization/.swagger-codegen-ignore b/frontend/src/apisv2beta1/visualization/.swagger-codegen-ignore deleted file mode 100644 index c5fa491b4c5..00000000000 --- a/frontend/src/apisv2beta1/visualization/.swagger-codegen-ignore +++ /dev/null @@ -1,23 +0,0 @@ -# Swagger Codegen Ignore -# Generated by swagger-codegen https://github.com/swagger-api/swagger-codegen - -# Use this file to prevent files from being overwritten by the generator. -# The patterns follow closely to .gitignore or .dockerignore. - -# As an example, the C# client generator defines ApiClient.cs. -# You can make changes and tell Swagger Codgen to ignore just this file by uncommenting the following line: -#ApiClient.cs - -# You can match any string of characters against a directory, file or extension with a single asterisk (*): -#foo/*/qux -# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux - -# You can recursively match patterns against a directory, file or extension with a double asterisk (**): -#foo/**/qux -# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux - -# You can also negate patterns with an exclamation (!). -# For example, you can ignore all files in a docs folder with the file extension .md: -#docs/*.md -# Then explicitly reverse the ignore rule for a single file: -#!docs/README.md diff --git a/frontend/src/apisv2beta1/visualization/.swagger-codegen/VERSION b/frontend/src/apisv2beta1/visualization/.swagger-codegen/VERSION deleted file mode 100644 index 48a6b508dc9..00000000000 --- a/frontend/src/apisv2beta1/visualization/.swagger-codegen/VERSION +++ /dev/null @@ -1 +0,0 @@ -2.4.7 \ No newline at end of file diff --git a/frontend/src/apisv2beta1/visualization/api.ts b/frontend/src/apisv2beta1/visualization/api.ts deleted file mode 100644 index 0348187a3c8..00000000000 --- a/frontend/src/apisv2beta1/visualization/api.ts +++ /dev/null @@ -1,338 +0,0 @@ -/// -// tslint:disable -/** - * backend/api/v2beta1/visualization.proto - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * OpenAPI spec version: version not set - * - * - * NOTE: This class is auto generated by the swagger code generator program. - * https://github.com/swagger-api/swagger-codegen.git - * Do not edit the class manually. - */ - -import * as url from 'url'; -import * as portableFetch from 'portable-fetch'; -import { Configuration } from './configuration'; - -const BASE_PATH = 'http://localhost'.replace(/\/+$/, ''); - -/** - * - * @export - */ -export const COLLECTION_FORMATS = { - csv: ',', - ssv: ' ', - tsv: '\t', - pipes: '|', -}; - -/** - * - * @export - * @interface FetchAPI - */ -export interface FetchAPI { - (url: string, init?: any): Promise; -} - -/** - * - * @export - * @interface FetchArgs - */ -export interface FetchArgs { - url: string; - options: any; -} - -/** - * - * @export - * @class BaseAPI - */ -export class BaseAPI { - protected configuration: Configuration; - - constructor( - configuration?: Configuration, - protected basePath: string = BASE_PATH, - protected fetch: FetchAPI = portableFetch, - ) { - if (configuration) { - this.configuration = configuration; - this.basePath = configuration.basePath || this.basePath; - } - } -} - -/** - * - * @export - * @class RequiredError - * @extends {Error} - */ -export class RequiredError extends Error { - name: 'RequiredError'; - constructor(public field: string, msg?: string) { - super(msg); - } -} - -/** - * The `Status` type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by [gRPC](https://github.com/grpc). Each `Status` message contains three pieces of data: error code, error message, and error details. You can find out more about this error model and how to work with it in the [API Design Guide](https://cloud.google.com/apis/design/errors). - * @export - * @interface GooglerpcStatus - */ -export interface GooglerpcStatus { - /** - * The status code, which should be an enum value of [google.rpc.Code][google.rpc.Code]. - * @type {number} - * @memberof GooglerpcStatus - */ - code?: number; - /** - * A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the [google.rpc.Status.details][google.rpc.Status.details] field, or localized by the client. - * @type {string} - * @memberof GooglerpcStatus - */ - message?: string; - /** - * A list of messages that carry the error details. There is a common set of message types for APIs to use. - * @type {Array} - * @memberof GooglerpcStatus - */ - details?: Array; -} - -/** - * `Any` contains an arbitrary serialized protocol buffer message along with a URL that describes the type of the serialized message. Protobuf library provides support to pack/unpack Any values in the form of utility functions or additional generated methods of the Any type. Example 1: Pack and unpack a message in C++. Foo foo = ...; Any any; any.PackFrom(foo); ... if (any.UnpackTo(&foo)) { ... } Example 2: Pack and unpack a message in Java. Foo foo = ...; Any any = Any.pack(foo); ... if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } Example 3: Pack and unpack a message in Python. foo = Foo(...) any = Any() any.Pack(foo) ... if any.Is(Foo.DESCRIPTOR): any.Unpack(foo) ... Example 4: Pack and unpack a message in Go foo := &pb.Foo{...} any, err := anypb.New(foo) if err != nil { ... } ... foo := &pb.Foo{} if err := any.UnmarshalTo(foo); err != nil { ... } The pack methods provided by protobuf library will by default use 'type.googleapis.com/full.type.name' as the type URL and the unpack methods only use the fully qualified type name after the last '/' in the type URL, for example \"foo.bar.com/x/y.z\" will yield type name \"y.z\". JSON ==== The JSON representation of an `Any` value uses the regular representation of the deserialized, embedded message, with an additional field `@type` which contains the type URL. Example: package google.profile; message Person { string first_name = 1; string last_name = 2; } { \"@type\": \"type.googleapis.com/google.profile.Person\", \"firstName\": , \"lastName\": } If the embedded message type is well-known and has a custom JSON representation, that representation will be embedded adding a field `value` which holds the custom JSON in addition to the `@type` field. Example (for message [google.protobuf.Duration][]): { \"@type\": \"type.googleapis.com/google.protobuf.Duration\", \"value\": \"1.212s\" } - * @export - * @interface ProtobufAny - */ -export interface ProtobufAny { - /** - * A URL/resource name that uniquely identifies the type of the serialized protocol buffer message. This string must contain at least one \"/\" character. The last segment of the URL's path must represent the fully qualified name of the type (as in `path/google.protobuf.Duration`). The name should be in a canonical form (e.g., leading \".\" is not accepted). In practice, teams usually precompile into the binary all types that they expect it to use in the context of Any. However, for URLs which use the scheme `http`, `https`, or no scheme, one can optionally set up a type server that maps type URLs to message definitions as follows: * If no scheme is provided, `https` is assumed. * An HTTP GET on the URL must yield a [google.protobuf.Type][] value in binary format, or produce an error. * Applications are allowed to cache lookup results based on the URL, or have them precompiled into a binary to avoid any lookup. Therefore, binary compatibility needs to be preserved on changes to types. (Use versioned type names to manage breaking changes.) Note: this functionality is not currently available in the official protobuf release, and it is not used for type URLs beginning with type.googleapis.com. Schemes other than `http`, `https` (or the empty scheme) might be used with implementation specific semantics. - * @type {string} - * @memberof ProtobufAny - */ - type_url?: string; - /** - * Must be a valid serialized protocol buffer of the above specified type. - * @type {string} - * @memberof ProtobufAny - */ - value?: string; -} - -/** - * - * @export - * @interface V2beta1Visualization - */ -export interface V2beta1Visualization { - /** - * - * @type {V2beta1VisualizationType} - * @memberof V2beta1Visualization - */ - type?: V2beta1VisualizationType; - /** - * Path pattern of input data to be used during generation of visualizations. This is required when creating the pipeline through CreateVisualization API. - * @type {string} - * @memberof V2beta1Visualization - */ - source?: string; - /** - * Variables to be used during generation of a visualization. This should be provided as a JSON string. This is required when creating the pipeline through CreateVisualization API. - * @type {string} - * @memberof V2beta1Visualization - */ - arguments?: string; - /** - * Output. Generated visualization html. - * @type {string} - * @memberof V2beta1Visualization - */ - html?: string; - /** - * In case any error happens when generating visualizations, only visualization ID and the error message are returned. Client has the flexibility of choosing how to handle the error. - * @type {string} - * @memberof V2beta1Visualization - */ - error?: string; -} - -/** - * Type of visualization to be generated. This is required when creating the pipeline through CreateVisualization API. - * @export - * @enum {string} - */ -export enum V2beta1VisualizationType { - ROCCURVE = 'ROC_CURVE', - TFDV = 'TFDV', - TFMA = 'TFMA', - TABLE = 'TABLE', - CUSTOM = 'CUSTOM', -} - -/** - * VisualizationServiceApi - fetch parameter creator - * @export - */ -export const VisualizationServiceApiFetchParamCreator = function(configuration?: Configuration) { - return { - /** - * - * @param {string} namespace - * @param {V2beta1Visualization} body - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - createVisualizationV1( - namespace: string, - body: V2beta1Visualization, - options: any = {}, - ): FetchArgs { - // verify required parameter 'namespace' is not null or undefined - if (namespace === null || namespace === undefined) { - throw new RequiredError( - 'namespace', - 'Required parameter namespace was null or undefined when calling createVisualizationV1.', - ); - } - // verify required parameter 'body' is not null or undefined - if (body === null || body === undefined) { - throw new RequiredError( - 'body', - 'Required parameter body was null or undefined when calling createVisualizationV1.', - ); - } - const localVarPath = `/apis/v2beta1/visualizations/{namespace}`.replace( - `{${'namespace'}}`, - encodeURIComponent(String(namespace)), - ); - const localVarUrlObj = url.parse(localVarPath, true); - const localVarRequestOptions = Object.assign({ method: 'POST' }, options); - const localVarHeaderParameter = {} as any; - const localVarQueryParameter = {} as any; - - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = - typeof configuration.apiKey === 'function' - ? configuration.apiKey('authorization') - : configuration.apiKey; - localVarHeaderParameter['authorization'] = localVarApiKeyValue; - } - - localVarHeaderParameter['Content-Type'] = 'application/json'; - - localVarUrlObj.query = Object.assign( - {}, - localVarUrlObj.query, - localVarQueryParameter, - options.query, - ); - // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 - delete localVarUrlObj.search; - localVarRequestOptions.headers = Object.assign({}, localVarHeaderParameter, options.headers); - const needsSerialization = - 'V2beta1Visualization' !== 'string' || - localVarRequestOptions.headers['Content-Type'] === 'application/json'; - localVarRequestOptions.body = needsSerialization ? JSON.stringify(body || {}) : body || ''; - - return { - url: url.format(localVarUrlObj), - options: localVarRequestOptions, - }; - }, - }; -}; - -/** - * VisualizationServiceApi - functional programming interface - * @export - */ -export const VisualizationServiceApiFp = function(configuration?: Configuration) { - return { - /** - * - * @param {string} namespace - * @param {V2beta1Visualization} body - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - createVisualizationV1( - namespace: string, - body: V2beta1Visualization, - options?: any, - ): (fetch?: FetchAPI, basePath?: string) => Promise { - const localVarFetchArgs = VisualizationServiceApiFetchParamCreator( - configuration, - ).createVisualizationV1(namespace, body, options); - return (fetch: FetchAPI = portableFetch, basePath: string = BASE_PATH) => { - return fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options).then(response => { - if (response.status >= 200 && response.status < 300) { - return response.json(); - } else { - throw response; - } - }); - }; - }, - }; -}; - -/** - * VisualizationServiceApi - factory interface - * @export - */ -export const VisualizationServiceApiFactory = function( - configuration?: Configuration, - fetch?: FetchAPI, - basePath?: string, -) { - return { - /** - * - * @param {string} namespace - * @param {V2beta1Visualization} body - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - createVisualizationV1(namespace: string, body: V2beta1Visualization, options?: any) { - return VisualizationServiceApiFp(configuration).createVisualizationV1( - namespace, - body, - options, - )(fetch, basePath); - }, - }; -}; - -/** - * VisualizationServiceApi - object-oriented interface - * @export - * @class VisualizationServiceApi - * @extends {BaseAPI} - */ -export class VisualizationServiceApi extends BaseAPI { - /** - * - * @param {string} namespace - * @param {V2beta1Visualization} body - * @param {*} [options] Override http request option. - * @throws {RequiredError} - * @memberof VisualizationServiceApi - */ - public createVisualizationV1(namespace: string, body: V2beta1Visualization, options?: any) { - return VisualizationServiceApiFp(this.configuration).createVisualizationV1( - namespace, - body, - options, - )(this.fetch, this.basePath); - } -} diff --git a/frontend/src/apisv2beta1/visualization/configuration.ts b/frontend/src/apisv2beta1/visualization/configuration.ts deleted file mode 100644 index f7d6da0144e..00000000000 --- a/frontend/src/apisv2beta1/visualization/configuration.ts +++ /dev/null @@ -1,65 +0,0 @@ -// tslint:disable -/** - * backend/api/v2beta1/visualization.proto - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * OpenAPI spec version: version not set - * - * - * NOTE: This class is auto generated by the swagger code generator program. - * https://github.com/swagger-api/swagger-codegen.git - * Do not edit the class manually. - */ - -export interface ConfigurationParameters { - apiKey?: string | ((name: string) => string); - username?: string; - password?: string; - accessToken?: string | ((name: string, scopes?: string[]) => string); - basePath?: string; -} - -export class Configuration { - /** - * parameter for apiKey security - * @param name security name - * @memberof Configuration - */ - apiKey?: string | ((name: string) => string); - /** - * parameter for basic security - * - * @type {string} - * @memberof Configuration - */ - username?: string; - /** - * parameter for basic security - * - * @type {string} - * @memberof Configuration - */ - password?: string; - /** - * parameter for oauth2 security - * @param name security name - * @param scopes oauth2 scope - * @memberof Configuration - */ - accessToken?: string | ((name: string, scopes?: string[]) => string); - /** - * override base path - * - * @type {string} - * @memberof Configuration - */ - basePath?: string; - - constructor(param: ConfigurationParameters = {}) { - this.apiKey = param.apiKey; - this.username = param.username; - this.password = param.password; - this.accessToken = param.accessToken; - this.basePath = param.basePath; - } -} diff --git a/frontend/src/apisv2beta1/visualization/custom.d.ts b/frontend/src/apisv2beta1/visualization/custom.d.ts deleted file mode 100644 index 4c611cc3216..00000000000 --- a/frontend/src/apisv2beta1/visualization/custom.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -declare module 'portable-fetch'; -declare module 'url'; diff --git a/frontend/src/apisv2beta1/visualization/git_push.sh b/frontend/src/apisv2beta1/visualization/git_push.sh deleted file mode 100644 index a1ff4c9bcba..00000000000 --- a/frontend/src/apisv2beta1/visualization/git_push.sh +++ /dev/null @@ -1,51 +0,0 @@ -#!/bin/sh -# ref: https://help.github.com/articles/adding-an-existing-project-to-github-using-the-command-line/ -# -# Usage example: /bin/sh ./git_push.sh wing328 swagger-petstore-perl "minor update" - -git_user_id=$1 -git_repo_id=$2 -release_note=$3 - -if [ "$git_user_id" = "" ]; then - git_user_id="GIT_USER_ID" - echo "[INFO] No command line input provided. Set \$git_user_id to $git_user_id" -fi - -if [ "$git_repo_id" = "" ]; then - git_repo_id="GIT_REPO_ID" - echo "[INFO] No command line input provided. Set \$git_repo_id to $git_repo_id" -fi - -if [ "$release_note" = "" ]; then - release_note="Minor update" - echo "[INFO] No command line input provided. Set \$release_note to $release_note" -fi - -# Initialize the local directory as a Git repository -git init - -# Adds the files in the local repository and stages them for commit. -git add . - -# Commits the tracked changes and prepares them to be pushed to a remote repository. -git commit -m "$release_note" - -# Sets the new remote -git_remote=`git remote` -if [ "$git_remote" = "" ]; then # git remote not defined - - if [ "$GIT_TOKEN" = "" ]; then - echo "[INFO] \$GIT_TOKEN (environment variable) is not set. Using the git credential in your environment." - git remote add origin https://github.com/${git_user_id}/${git_repo_id}.git - else - git remote add origin https://${git_user_id}:${GIT_TOKEN}@github.com/${git_user_id}/${git_repo_id}.git - fi - -fi - -git pull origin master - -# Pushes (Forces) the changes in the local repository up to the remote repository -echo "Git pushing to https://github.com/${git_user_id}/${git_repo_id}.git" -git push origin master 2>&1 | grep -v 'To https' diff --git a/frontend/src/apisv2beta1/visualization/index.ts b/frontend/src/apisv2beta1/visualization/index.ts deleted file mode 100644 index f9009018e1d..00000000000 --- a/frontend/src/apisv2beta1/visualization/index.ts +++ /dev/null @@ -1,15 +0,0 @@ -// tslint:disable -/** - * backend/api/v2beta1/visualization.proto - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * OpenAPI spec version: version not set - * - * - * NOTE: This class is auto generated by the swagger code generator program. - * https://github.com/swagger-api/swagger-codegen.git - * Do not edit the class manually. - */ - -export * from './api'; -export * from './configuration'; diff --git a/frontend/src/lib/Apis.test.ts b/frontend/src/lib/Apis.test.ts index b85f883d949..7fa3439f27a 100644 --- a/frontend/src/lib/Apis.test.ts +++ b/frontend/src/lib/Apis.test.ts @@ -54,10 +54,6 @@ describe('Apis', () => { expect(Apis.runServiceApi).toBe(Apis.runServiceApi); }); - it('hosts a singleton visualizationServiceApi', () => { - expect(Apis.visualizationServiceApi).toBe(Apis.visualizationServiceApi); - }); - it('getPodLogs', async () => { const spy = fetchSpy('http://some/address'); expect(await Apis.getPodLogs('a-run-id', 'some-pod-name', 'ns', '')).toEqual( diff --git a/frontend/src/lib/Apis.ts b/frontend/src/lib/Apis.ts index 83ade5db2e0..fa104d8da42 100644 --- a/frontend/src/lib/Apis.ts +++ b/frontend/src/lib/Apis.ts @@ -25,7 +25,6 @@ import { } from 'src/apisv2beta1/pipeline'; import { RunServiceApi as RunServiceApiV1 } from 'src/apis/run'; import { RunServiceApi as RunServiceApiV2 } from 'src/apisv2beta1/run'; -import { ApiVisualization, VisualizationServiceApi } from 'src/apis/visualization'; import { HTMLViewerConfig } from 'src/components/viewers/HTMLViewer'; import { PlotType } from 'src/components/viewers/Viewer'; import * as Utils from './Utils'; @@ -78,33 +77,6 @@ export class Apis { return customVisualizationsAllowed; } - public static async buildPythonVisualizationConfig( - visualizationData: ApiVisualization, - namespace?: string, - ): Promise { - const visualization = await Apis.visualizationServiceApi.createVisualization( - namespace || '', - visualizationData, - ); - if (visualization.html) { - const htmlContent = visualization.html - // Fixes issue with TFX components (and other iframe based - // visualizations), where the method in which javascript interacts - // with embedded iframes is not allowed when embedded in an additional - // iframe. This is resolved by setting the srcdoc value rather that - // manipulating the document directly. - .replace('contentWindow.document.write', 'srcdoc='); - return { - htmlContent, - type: PlotType.WEB_APP, - } as HTMLViewerConfig; - } else { - // This should never be thrown as the html property of a generated - // visualization is always set for successful visualization generations. - throw new Error('Visualization was generated successfully but generated HTML was not found.'); - } - } - /** * Get pod logs */ @@ -244,17 +216,6 @@ export class Apis { return this._runServiceApiV2; } - public static get visualizationServiceApi(): VisualizationServiceApi { - if (!this._visualizationServiceApi) { - this._visualizationServiceApi = new VisualizationServiceApi( - { basePath: this.basePath }, - undefined, - crossBrowserFetch, - ); - } - return this._visualizationServiceApi; - } - /** * Retrieve various information about the build. */ @@ -511,7 +472,6 @@ export class Apis { private static _pipelineServiceApiV2?: PipelineServiceApiV2; private static _runServiceApiV1?: RunServiceApiV1; private static _runServiceApiV2?: RunServiceApiV2; - private static _visualizationServiceApi?: VisualizationServiceApi; /** * This function will call this._fetch() and parse the resulting JSON into an object of type T. diff --git a/frontend/src/lib/OutputArtifactLoader.ts b/frontend/src/lib/OutputArtifactLoader.ts index fa1182cb4f5..5af7364a7ba 100644 --- a/frontend/src/lib/OutputArtifactLoader.ts +++ b/frontend/src/lib/OutputArtifactLoader.ts @@ -16,7 +16,6 @@ import { csvParseRows } from 'd3-dsv'; import { Artifact, ArtifactType, Execution } from 'src/third_party/mlmd'; -import { ApiVisualization, ApiVisualizationType } from '../apis/visualization'; import { ConfusionMatrixConfig } from '../components/viewers/ConfusionMatrix'; import { HTMLViewerConfig } from '../components/viewers/HTMLViewer'; import { MarkdownViewerConfig } from '../components/viewers/MarkdownViewer'; diff --git a/hack/update-all-requirements.sh b/hack/update-all-requirements.sh index 0b4cd533ba3..8cf1651fc39 100755 --- a/hack/update-all-requirements.sh +++ b/hack/update-all-requirements.sh @@ -18,7 +18,6 @@ set -euo pipefail DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" > /dev/null && pwd)" REPO_ROOT="${DIR}/.." -cd "${REPO_ROOT}/backend/src/apiserver/visualization" && bash update_requirements.sh cd "${REPO_ROOT}/test/sample-test/hack" && bash update_requirements.sh cd "${REPO_ROOT}/backend/metadata_writer" && bash update_requirements.sh cd "${REPO_ROOT}/backend" && bash update_requirements.sh diff --git a/manifests/gcp_marketplace/chart/kubeflow-pipelines/templates/pipeline.yaml b/manifests/gcp_marketplace/chart/kubeflow-pipelines/templates/pipeline.yaml index 3807b02fb8d..28ea8df077e 100644 --- a/manifests/gcp_marketplace/chart/kubeflow-pipelines/templates/pipeline.yaml +++ b/manifests/gcp_marketplace/chart/kubeflow-pipelines/templates/pipeline.yaml @@ -107,13 +107,6 @@ metadata: --- apiVersion: v1 kind: ServiceAccount -metadata: - name: ml-pipeline-visualizationserver - labels: - app.kubernetes.io/name: {{ .Release.Name }} ---- -apiVersion: v1 -kind: ServiceAccount metadata: name: ml-pipeline labels: @@ -510,20 +503,6 @@ spec: --- apiVersion: v1 kind: Service -metadata: - name: ml-pipeline-visualizationserver -spec: - ports: - - name: http - port: 8888 - protocol: TCP - targetPort: 8888 - selector: - app: ml-pipeline-visualizationserver - app.kubernetes.io/name: {{ .Release.Name }} ---- -apiVersion: v1 -kind: Service metadata: name: ml-pipeline labels: @@ -705,61 +684,6 @@ spec: --- apiVersion: apps/v1 kind: Deployment -metadata: - labels: - app: ml-pipeline-visualizationserver - app.kubernetes.io/name: {{ .Release.Name }} - name: ml-pipeline-visualizationserver -spec: - selector: - matchLabels: - app: ml-pipeline-visualizationserver - app.kubernetes.io/name: {{ .Release.Name }} - template: - metadata: - labels: - app: ml-pipeline-visualizationserver - app.kubernetes.io/name: {{ .Release.Name }} - spec: - containers: - - image: {{ .Values.images.visualizationserver }} - imagePullPolicy: IfNotPresent - name: ml-pipeline-visualizationserver - ports: - - name: http - containerPort: 8888 - readinessProbe: - exec: - command: - - wget - - -q # quiet - - -S # show server response - - -O - - "-" # Redirect output to stdout - - http://localhost:8888/ - initialDelaySeconds: 3 - periodSeconds: 5 - timeoutSeconds: 2 - livenessProbe: - exec: - command: - - wget - - -q # quiet - - -S # show server response - - -O - - "-" # Redirect output to stdout - - http://localhost:8888/ - initialDelaySeconds: 3 - periodSeconds: 5 - timeoutSeconds: 2 - resources: - requests: - cpu: 30m - memory: 500Mi - serviceAccountName: ml-pipeline-visualizationserver ---- -apiVersion: apps/v1 -kind: Deployment metadata: labels: app: ml-pipeline diff --git a/manifests/gcp_marketplace/chart/kubeflow-pipelines/values.yaml b/manifests/gcp_marketplace/chart/kubeflow-pipelines/values.yaml index 799c339a584..61acf550226 100644 --- a/manifests/gcp_marketplace/chart/kubeflow-pipelines/values.yaml +++ b/manifests/gcp_marketplace/chart/kubeflow-pipelines/values.yaml @@ -11,7 +11,6 @@ images: proxyagent: gcr.io/ml-pipeline/google/pipelines/proxyagent:dummy scheduledworkflow: gcr.io/ml-pipeline/google/pipelines/scheduledworkflow:dummy viewercrd: gcr.io/ml-pipeline/google/pipelines/viewercrd:dummy - visualizationserver: gcr.io/ml-pipeline/google/pipelines/visualizationserver:dummy metadataenvoy: gcr.io/ml-pipeline/google/pipelines/metadataenvoy:dummy metadatawriter: gcr.io/ml-pipeline/google/pipelines/metadatawriter:dummy cacheserver: gcr.io/ml-pipeline/google/pipelines/cacheserver:dummy diff --git a/manifests/gcp_marketplace/schema.yaml b/manifests/gcp_marketplace/schema.yaml index bea8cd4d8bb..b9a8c81a55f 100644 --- a/manifests/gcp_marketplace/schema.yaml +++ b/manifests/gcp_marketplace/schema.yaml @@ -52,10 +52,6 @@ x-google-marketplace: properties: images.viewercrd: type: FULL - visualizationserver: - properties: - images.visualizationserver: - type: FULL metadataserver: properties: images.metadataserver: diff --git a/manifests/kustomize/base/installs/multi-user/api-service/params.env b/manifests/kustomize/base/installs/multi-user/api-service/params.env index 5bb1e0a3e99..2221be9a447 100644 --- a/manifests/kustomize/base/installs/multi-user/api-service/params.env +++ b/manifests/kustomize/base/installs/multi-user/api-service/params.env @@ -1,4 +1,2 @@ MULTIUSER=true DEFAULTPIPELINERUNNERSERVICEACCOUNT=default-editor -VISUALIZATIONSERVICE_NAME=ml-pipeline-visualizationserver -VISUALIZATIONSERVICE_PORT=8888 diff --git a/manifests/kustomize/base/installs/multi-user/istio-authorization-config.yaml b/manifests/kustomize/base/installs/multi-user/istio-authorization-config.yaml index a9a45e5eb1b..d58b60f01f6 100644 --- a/manifests/kustomize/base/installs/multi-user/istio-authorization-config.yaml +++ b/manifests/kustomize/base/installs/multi-user/istio-authorization-config.yaml @@ -39,27 +39,6 @@ spec: --- apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy -metadata: - name: ml-pipeline-visualizationserver - namespace: kubeflow -spec: - selector: - matchLabels: - app: ml-pipeline-visualizationserver - rules: - - from: - - source: - principals: - - cluster.local/ns/kubeflow/sa/ml-pipeline - - cluster.local/ns/kubeflow/sa/ml-pipeline-ui - - cluster.local/ns/kubeflow/sa/ml-pipeline-persistenceagent - - cluster.local/ns/kubeflow/sa/ml-pipeline-scheduledworkflow - - cluster.local/ns/kubeflow/sa/ml-pipeline-viewer-crd-service-account - - cluster.local/ns/kubeflow/sa/kubeflow-pipelines-cache - ---- -apiVersion: security.istio.io/v1beta1 -kind: AuthorizationPolicy metadata: name: service-cache-server namespace: kubeflow @@ -90,13 +69,3 @@ spec: trafficPolicy: tls: mode: ISTIO_MUTUAL ---- -apiVersion: "networking.istio.io/v1alpha3" -kind: DestinationRule -metadata: - name: ml-pipeline-visualizationserver -spec: - host: ml-pipeline-visualizationserver.kubeflow.svc.cluster.local - trafficPolicy: - tls: - mode: ISTIO_MUTUAL diff --git a/manifests/kustomize/base/installs/multi-user/pipelines-profile-controller/sync.py b/manifests/kustomize/base/installs/multi-user/pipelines-profile-controller/sync.py index 031a3fa268b..725e828e85c 100644 --- a/manifests/kustomize/base/installs/multi-user/pipelines-profile-controller/sync.py +++ b/manifests/kustomize/base/installs/multi-user/pipelines-profile-controller/sync.py @@ -25,8 +25,7 @@ def main(): def get_settings_from_env(controller_port=None, - visualization_server_image=None, frontend_image=None, - visualization_server_tag=None, frontend_tag=None, disable_istio_sidecar=None, + frontend_image=None, frontend_tag=None, disable_istio_sidecar=None, minio_access_key=None, minio_secret_key=None, kfp_default_pipeline_root=None): """ Returns a dict of settings from environment variables relevant to the controller @@ -36,8 +35,6 @@ def get_settings_from_env(controller_port=None, Settings are pulled from the all-caps version of the setting name. The following defaults are used if those environment variables are not set to enable backwards compatibility with previous versions of this script: - visualization_server_image: gcr.io/ml-pipeline/visualization-server - visualization_server_tag: value of KFP_VERSION environment variable frontend_image: gcr.io/ml-pipeline/frontend frontend_tag: value of KFP_VERSION environment variable disable_istio_sidecar: Required (no default) @@ -49,10 +46,6 @@ def get_settings_from_env(controller_port=None, controller_port or \ os.environ.get("CONTROLLER_PORT", "8080") - settings["visualization_server_image"] = \ - visualization_server_image or \ - os.environ.get("VISUALIZATION_SERVER_IMAGE", "gcr.io/ml-pipeline/visualization-server") - settings["frontend_image"] = \ frontend_image or \ os.environ.get("FRONTEND_IMAGE", "gcr.io/ml-pipeline/frontend") @@ -60,11 +53,6 @@ def get_settings_from_env(controller_port=None, # Look for specific tags for each image first, falling back to # previously used KFP_VERSION environment variable for backwards # compatibility - settings["visualization_server_tag"] = \ - visualization_server_tag or \ - os.environ.get("VISUALIZATION_SERVER_TAG") or \ - os.environ["KFP_VERSION"] - settings["frontend_tag"] = \ frontend_tag or \ os.environ.get("FRONTEND_TAG") or \ @@ -90,8 +78,7 @@ def get_settings_from_env(controller_port=None, return settings -def server_factory(visualization_server_image, - visualization_server_tag, frontend_image, frontend_tag, +def server_factory(frontend_image, frontend_tag, disable_istio_sidecar, minio_access_key, minio_secret_key, kfp_default_pipeline_root=None, url="", controller_port=8080): @@ -153,116 +140,6 @@ def sync(self, parent, children): "METADATA_GRPC_SERVICE_PORT": "8080", }, }, - # Visualization server related manifests below - { - "apiVersion": "apps/v1", - "kind": "Deployment", - "metadata": { - "labels": { - "app": "ml-pipeline-visualizationserver" - }, - "name": "ml-pipeline-visualizationserver", - "namespace": namespace, - }, - "spec": { - "selector": { - "matchLabels": { - "app": "ml-pipeline-visualizationserver" - }, - }, - "template": { - "metadata": { - "labels": { - "app": "ml-pipeline-visualizationserver" - }, - "annotations": disable_istio_sidecar and { - "sidecar.istio.io/inject": "false" - } or {}, - }, - "spec": { - "containers": [{ - "image": f"{visualization_server_image}:{visualization_server_tag}", - "imagePullPolicy": - "IfNotPresent", - "name": - "ml-pipeline-visualizationserver", - "ports": [{ - "containerPort": 8888 - }], - "resources": { - "requests": { - "cpu": "50m", - "memory": "200Mi" - }, - "limits": { - "cpu": "500m", - "memory": "1Gi" - }, - } - }], - "serviceAccountName": - "default-editor", - }, - }, - }, - }, - { - "apiVersion": "networking.istio.io/v1alpha3", - "kind": "DestinationRule", - "metadata": { - "name": "ml-pipeline-visualizationserver", - "namespace": namespace, - }, - "spec": { - "host": "ml-pipeline-visualizationserver", - "trafficPolicy": { - "tls": { - "mode": "ISTIO_MUTUAL" - } - } - } - }, - { - "apiVersion": "security.istio.io/v1beta1", - "kind": "AuthorizationPolicy", - "metadata": { - "name": "ml-pipeline-visualizationserver", - "namespace": namespace, - }, - "spec": { - "selector": { - "matchLabels": { - "app": "ml-pipeline-visualizationserver" - } - }, - "rules": [{ - "from": [{ - "source": { - "principals": ["cluster.local/ns/kubeflow/sa/ml-pipeline"] - } - }] - }] - } - }, - { - "apiVersion": "v1", - "kind": "Service", - "metadata": { - "name": "ml-pipeline-visualizationserver", - "namespace": namespace, - }, - "spec": { - "ports": [{ - "name": "http", - "port": 8888, - "protocol": "TCP", - "targetPort": 8888, - }], - "selector": { - "app": "ml-pipeline-visualizationserver", - }, - }, - }, # Artifact fetcher related resources below. { "apiVersion": "apps/v1", diff --git a/manifests/kustomize/base/installs/multi-user/pipelines-profile-controller/test_sync.py b/manifests/kustomize/base/installs/multi-user/pipelines-profile-controller/test_sync.py index 50362d60fdb..710faa07099 100644 --- a/manifests/kustomize/base/installs/multi-user/pipelines-profile-controller/test_sync.py +++ b/manifests/kustomize/base/installs/multi-user/pipelines-profile-controller/test_sync.py @@ -50,11 +50,8 @@ # Default values when environments are not explicit DEFAULT_FRONTEND_IMAGE = "gcr.io/ml-pipeline/frontend" -DEFAULT_VISUALIZATION_IMAGE = "gcr.io/ml-pipeline/visualization-server" # Variables used for environment variable sets -VISUALIZATION_SERVER_IMAGE = "vis-image" -VISUALIZATION_SERVER_TAG = "somenumber.1.2.3" FRONTEND_IMAGE = "frontend-image" FRONTEND_TAG = "somehash" @@ -79,16 +76,13 @@ ENV_IMAGES_NO_TAGS = dict(ENV_VARIABLES_BASE, **{ "KFP_VERSION": KFP_VERSION, - "VISUALIZATION_SERVER_IMAGE": VISUALIZATION_SERVER_IMAGE, "FRONTEND_IMAGE": FRONTEND_IMAGE, } ) ENV_IMAGES_WITH_TAGS = dict(ENV_VARIABLES_BASE, **{ - "VISUALIZATION_SERVER_IMAGE": VISUALIZATION_SERVER_IMAGE, "FRONTEND_IMAGE": FRONTEND_IMAGE, - "VISUALIZATION_SERVER_TAG": VISUALIZATION_SERVER_TAG, "FRONTEND_TAG": FRONTEND_TAG, } ) @@ -151,43 +145,36 @@ def sync_server_from_arguments(request): @pytest.mark.parametrize( - "sync_server, data, expected_status, expected_visualization_server_image, expected_frontend_server_image", + "sync_server, data, expected_status, expected_frontend_server_image", [ ( ENV_KFP_VERSION_ONLY, DATA_INCORRECT_CHILDREN, {"kubeflow-pipelines-ready": "False"}, - generate_image_name(DEFAULT_VISUALIZATION_IMAGE, KFP_VERSION), generate_image_name(DEFAULT_FRONTEND_IMAGE, KFP_VERSION), ), ( ENV_IMAGES_NO_TAGS, DATA_INCORRECT_CHILDREN, {"kubeflow-pipelines-ready": "False"}, - generate_image_name(ENV_IMAGES_NO_TAGS["VISUALIZATION_SERVER_IMAGE"], KFP_VERSION), generate_image_name(ENV_IMAGES_NO_TAGS["FRONTEND_IMAGE"], KFP_VERSION), ), ( ENV_IMAGES_WITH_TAGS, DATA_INCORRECT_CHILDREN, {"kubeflow-pipelines-ready": "False"}, - generate_image_name(ENV_IMAGES_WITH_TAGS["VISUALIZATION_SERVER_IMAGE"], - ENV_IMAGES_WITH_TAGS["VISUALIZATION_SERVER_TAG"]), generate_image_name(ENV_IMAGES_WITH_TAGS["FRONTEND_IMAGE"], ENV_IMAGES_WITH_TAGS["FRONTEND_TAG"]), ), ( ENV_IMAGES_WITH_TAGS, DATA_CORRECT_CHILDREN, {"kubeflow-pipelines-ready": "True"}, - generate_image_name(ENV_IMAGES_WITH_TAGS["VISUALIZATION_SERVER_IMAGE"], - ENV_IMAGES_WITH_TAGS["VISUALIZATION_SERVER_TAG"]), generate_image_name(ENV_IMAGES_WITH_TAGS["FRONTEND_IMAGE"], ENV_IMAGES_WITH_TAGS["FRONTEND_TAG"]), ), ], indirect=["sync_server"] ) -def test_sync_server_with_pipeline_enabled(sync_server, data, expected_status, - expected_visualization_server_image, expected_frontend_server_image): +def test_sync_server_with_pipeline_enabled(sync_server, data, expected_status, expected_frontend_server_image): """ Nearly end-to-end test of how Controller serves .sync as a POST @@ -210,30 +197,25 @@ def test_sync_server_with_pipeline_enabled(sync_server, data, expected_status, assert results['status'] == expected_status # Poke a few children to test things that can vary by environment variable - assert results['children'][1]["spec"]["template"]["spec"]["containers"][0][ - "image"] == expected_visualization_server_image assert results['children'][5]["spec"]["template"]["spec"]["containers"][0][ "image"] == expected_frontend_server_image @pytest.mark.parametrize( - "sync_server_from_arguments, data, expected_status, expected_visualization_server_image, " + "sync_server_from_arguments, data, expected_status, " "expected_frontend_server_image", [ ( ENV_IMAGES_WITH_TAGS_AND_ISTIO, DATA_CORRECT_CHILDREN, {"kubeflow-pipelines-ready": "True"}, - generate_image_name(ENV_IMAGES_WITH_TAGS["VISUALIZATION_SERVER_IMAGE"], - ENV_IMAGES_WITH_TAGS["VISUALIZATION_SERVER_TAG"]), generate_image_name(ENV_IMAGES_WITH_TAGS["FRONTEND_IMAGE"], ENV_IMAGES_WITH_TAGS["FRONTEND_TAG"]), ), ], indirect=["sync_server_from_arguments"] ) def test_sync_server_with_direct_passing_of_settings( - sync_server_from_arguments, data, expected_status, expected_visualization_server_image, - expected_frontend_server_image): + sync_server_from_arguments, data, expected_status, expected_frontend_server_image): """ Nearly end-to-end test of how Controller serves .sync as a POST, taking variables as arguments @@ -253,8 +235,6 @@ def test_sync_server_with_direct_passing_of_settings( assert results['status'] == expected_status # Poke a few children to test things that can vary by environment variable - assert results['children'][1]["spec"]["template"]["spec"]["containers"][0][ - "image"] == expected_visualization_server_image assert results['children'][5]["spec"]["template"]["spec"]["containers"][0][ "image"] == expected_frontend_server_image diff --git a/manifests/kustomize/base/installs/multi-user/view-edit-cluster-roles.yaml b/manifests/kustomize/base/installs/multi-user/view-edit-cluster-roles.yaml index ed2e2ba0e44..678bd36e9cd 100644 --- a/manifests/kustomize/base/installs/multi-user/view-edit-cluster-roles.yaml +++ b/manifests/kustomize/base/installs/multi-user/view-edit-cluster-roles.yaml @@ -134,9 +134,3 @@ rules: - create - get - delete -- apiGroups: - - pipelines.kubeflow.org - resources: - - visualizations - verbs: - - create diff --git a/manifests/kustomize/base/pipeline/kustomization.yaml b/manifests/kustomize/base/pipeline/kustomization.yaml index f7bbf17e1ca..278d860d801 100644 --- a/manifests/kustomize/base/pipeline/kustomization.yaml +++ b/manifests/kustomize/base/pipeline/kustomization.yaml @@ -25,9 +25,6 @@ resources: - ml-pipeline-viewer-crd-rolebinding.yaml - ml-pipeline-viewer-crd-deployment.yaml - ml-pipeline-viewer-crd-sa.yaml - - ml-pipeline-visualization-deployment.yaml - - ml-pipeline-visualization-sa.yaml - - ml-pipeline-visualization-service.yaml - pipeline-runner-role.yaml - pipeline-runner-rolebinding.yaml - pipeline-runner-sa.yaml @@ -45,5 +42,3 @@ images: newTag: 2.2.0 - name: gcr.io/ml-pipeline/viewer-crd-controller newTag: 2.2.0 - - name: gcr.io/ml-pipeline/visualization-server - newTag: 2.2.0 diff --git a/manifests/kustomize/base/pipeline/ml-pipeline-visualization-deployment.yaml b/manifests/kustomize/base/pipeline/ml-pipeline-visualization-deployment.yaml deleted file mode 100644 index b6d1e1184e6..00000000000 --- a/manifests/kustomize/base/pipeline/ml-pipeline-visualization-deployment.yaml +++ /dev/null @@ -1,53 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - app: ml-pipeline-visualizationserver - name: ml-pipeline-visualizationserver -spec: - selector: - matchLabels: - app: ml-pipeline-visualizationserver - template: - metadata: - labels: - app: ml-pipeline-visualizationserver - annotations: - cluster-autoscaler.kubernetes.io/safe-to-evict: "true" - spec: - containers: - - image: gcr.io/ml-pipeline/visualization-server:dummy - imagePullPolicy: IfNotPresent - name: ml-pipeline-visualizationserver - ports: - - name: http - containerPort: 8888 - readinessProbe: - exec: - command: - - wget - - -q # quiet - - -S # show server response - - -O - - "-" # Redirect output to stdout - - http://localhost:8888/ - initialDelaySeconds: 3 - periodSeconds: 5 - timeoutSeconds: 2 - livenessProbe: - exec: - command: - - wget - - -q # quiet - - -S # show server response - - -O - - "-" # Redirect output to stdout - - http://localhost:8888/ - initialDelaySeconds: 3 - periodSeconds: 5 - timeoutSeconds: 2 - resources: - requests: - cpu: 30m - memory: 500Mi - serviceAccountName: ml-pipeline-visualizationserver diff --git a/manifests/kustomize/base/pipeline/ml-pipeline-visualization-sa.yaml b/manifests/kustomize/base/pipeline/ml-pipeline-visualization-sa.yaml deleted file mode 100644 index e1bbc6ad273..00000000000 --- a/manifests/kustomize/base/pipeline/ml-pipeline-visualization-sa.yaml +++ /dev/null @@ -1,4 +0,0 @@ -apiVersion: v1 -kind: ServiceAccount -metadata: - name: ml-pipeline-visualizationserver diff --git a/manifests/kustomize/base/pipeline/ml-pipeline-visualization-service.yaml b/manifests/kustomize/base/pipeline/ml-pipeline-visualization-service.yaml deleted file mode 100644 index 83c7dd67504..00000000000 --- a/manifests/kustomize/base/pipeline/ml-pipeline-visualization-service.yaml +++ /dev/null @@ -1,12 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: ml-pipeline-visualizationserver -spec: - ports: - - name: http - port: 8888 - protocol: TCP - targetPort: 8888 - selector: - app: ml-pipeline-visualizationserver \ No newline at end of file diff --git a/manifests/kustomize/gcp-workload-identity-setup.sh b/manifests/kustomize/gcp-workload-identity-setup.sh index 79f86c95c85..aa588cd4986 100755 --- a/manifests/kustomize/gcp-workload-identity-setup.sh +++ b/manifests/kustomize/gcp-workload-identity-setup.sh @@ -28,7 +28,7 @@ USER_GSA=${USER_GSA:-$RESOURCE_PREFIX-kfp-user} # to the array of SYSTEM_KSA: # * kubeflow-pipelines-minio-gcs-gateway needs gcs permissions # * kubeflow-pipelines-cloudsql-proxy needs cloudsql permissions -SYSTEM_KSA=(ml-pipeline-ui ml-pipeline-visualizationserver) +SYSTEM_KSA=(ml-pipeline-ui) USER_KSA=(pipeline-runner kubeflow-pipelines-container-builder kubeflow-pipelines-viewer) if [ -n $USE_GCP_MANAGED_STORAGE ]; then diff --git a/manifests/kustomize/third-party/openshift/standalone/anyuid-scc.yaml b/manifests/kustomize/third-party/openshift/standalone/anyuid-scc.yaml index c7c3e13d389..56832221fdb 100644 --- a/manifests/kustomize/third-party/openshift/standalone/anyuid-scc.yaml +++ b/manifests/kustomize/third-party/openshift/standalone/anyuid-scc.yaml @@ -45,7 +45,6 @@ users: - system:serviceaccount:kubeflow:ml-pipeline-scheduledworkflow - system:serviceaccount:kubeflow:ml-pipeline-ui - system:serviceaccount:kubeflow:ml-pipeline-viewer-crd-service-account -- system:serviceaccount:kubeflow:ml-pipeline-visualizationserver - system:serviceaccount:kubeflow:mysql - system:serviceaccount:kubeflow:kfp-csi-s3 - system:serviceaccount:kubeflow:kfp-csi-attacher diff --git a/test/deploy-pipeline-lite.sh b/test/deploy-pipeline-lite.sh index d7f6b42a213..453561e0eb0 100755 --- a/test/deploy-pipeline-lite.sh +++ b/test/deploy-pipeline-lite.sh @@ -58,7 +58,6 @@ if [ -z "$KFP_DEPLOY_RELEASE" ]; then kustomize edit set image gcr.io/ml-pipeline/scheduledworkflow=${GCR_IMAGE_BASE_DIR}/scheduledworkflow:${GCR_IMAGE_TAG} kustomize edit set image gcr.io/ml-pipeline/frontend=${GCR_IMAGE_BASE_DIR}/frontend:${GCR_IMAGE_TAG} kustomize edit set image gcr.io/ml-pipeline/viewer-crd-controller=${GCR_IMAGE_BASE_DIR}/viewer-crd-controller:${GCR_IMAGE_TAG} - kustomize edit set image gcr.io/ml-pipeline/visualization-server=${GCR_IMAGE_BASE_DIR}/visualization-server:${GCR_IMAGE_TAG} kustomize edit set image gcr.io/ml-pipeline/inverse-proxy-agent=${GCR_IMAGE_BASE_DIR}/inverse-proxy-agent:${GCR_IMAGE_TAG} kustomize edit set image gcr.io/ml-pipeline/metadata-writer=${GCR_IMAGE_BASE_DIR}/metadata-writer:${GCR_IMAGE_TAG} kustomize edit set image gcr.io/ml-pipeline/cache-server=${GCR_IMAGE_BASE_DIR}/cache-server:${GCR_IMAGE_TAG} diff --git a/test/presubmit-backend-visualization.sh b/test/presubmit-backend-visualization.sh deleted file mode 100755 index 832e757c608..00000000000 --- a/test/presubmit-backend-visualization.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -ex -# Copyright 2020 Kubeflow Pipelines contributors -# -# 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. - -source_root=$(pwd) - -# Visualization test -cd "$source_root/backend/src/apiserver/visualization" -python3 -m pip install --upgrade pip -python3 -m pip install -r requirements.txt -r requirements-test.txt -python3 test_exporter.py -python3 test_server.py diff --git a/test/tag_for_hosted.sh b/test/tag_for_hosted.sh index b919c58c82b..570c3fcf48a 100755 --- a/test/tag_for_hosted.sh +++ b/test/tag_for_hosted.sh @@ -56,11 +56,6 @@ docker tag gcr.io/$PROJECT_ID/inverse-proxy-agent:$COMMIT_SHA gcr.io/$PROJECT_ID docker push gcr.io/$PROJECT_ID/hosted/$COMMIT_SHA/proxyagent:$SEM_VER docker push gcr.io/$PROJECT_ID/hosted/$COMMIT_SHA/proxyagent:$MM_VER -docker tag gcr.io/$PROJECT_ID/visualization-server:$COMMIT_SHA gcr.io/$PROJECT_ID/hosted/$COMMIT_SHA/visualizationserver:$SEM_VER -docker tag gcr.io/$PROJECT_ID/visualization-server:$COMMIT_SHA gcr.io/$PROJECT_ID/hosted/$COMMIT_SHA/visualizationserver:$MM_VER -docker push gcr.io/$PROJECT_ID/hosted/$COMMIT_SHA/visualizationserver:$SEM_VER -docker push gcr.io/$PROJECT_ID/hosted/$COMMIT_SHA/visualizationserver:$MM_VER - docker tag gcr.io/$PROJECT_ID/metadata-writer:$COMMIT_SHA gcr.io/$PROJECT_ID/hosted/$COMMIT_SHA/metadatawriter:$SEM_VER docker tag gcr.io/$PROJECT_ID/metadata-writer:$COMMIT_SHA gcr.io/$PROJECT_ID/hosted/$COMMIT_SHA/metadatawriter:$MM_VER docker push gcr.io/$PROJECT_ID/hosted/$COMMIT_SHA/metadatawriter:$SEM_VER