diff --git a/sdk/python/kfp/compiler/compiler.py b/sdk/python/kfp/compiler/compiler.py index 30d71870424a..c763fc6506e5 100644 --- a/sdk/python/kfp/compiler/compiler.py +++ b/sdk/python/kfp/compiler/compiler.py @@ -655,6 +655,10 @@ def _compile(self, pipeline_func): op_transformers = [add_pod_env] op_transformers.extend(p.conf.op_transformers) workflow = self._create_pipeline_workflow(args_list_with_defaults, p, op_transformers) + + import json + workflow.setdefault('metadata', {}).setdefault('annotations', {})['kubeflow.org/pipelines/pipeline_spec'] = json.dumps(pipeline_meta.to_dict()) + return workflow def compile(self, pipeline_func, package_path, type_check=True): diff --git a/sdk/python/tests/compiler/testdata/artifact_location.yaml b/sdk/python/tests/compiler/testdata/artifact_location.yaml index 0bd8432ff8ca..dffd0fb6f22a 100644 --- a/sdk/python/tests/compiler/testdata/artifact_location.yaml +++ b/sdk/python/tests/compiler/testdata/artifact_location.yaml @@ -14,6 +14,11 @@ apiVersion: argoproj.io/v1alpha1 kind: Workflow metadata: + annotations: + kubeflow.org/pipelines/pipeline_spec: '{"name": "foo", "description": "hello world", + "inputs": [{"name": "tag", "description": "", "type": "", "default": null}, + {"name": "namespace", "description": "", "type": "", "default": "kubeflow"}, + {"name": "bucket", "description": "", "type": "", "default": "foobar"}]}' generateName: foo- spec: arguments: diff --git a/sdk/python/tests/compiler/testdata/basic.yaml b/sdk/python/tests/compiler/testdata/basic.yaml index 3a88a734f5ab..9c30654e6c22 100644 --- a/sdk/python/tests/compiler/testdata/basic.yaml +++ b/sdk/python/tests/compiler/testdata/basic.yaml @@ -14,6 +14,11 @@ apiVersion: argoproj.io/v1alpha1 kind: Workflow metadata: + annotations: + kubeflow.org/pipelines/pipeline_spec: '{"name": "Save Most Frequent", "description": + "Get Most Frequent Word and Save to GCS", "inputs": [{"name": "message", "description": + "", "type": "", "default": null}, {"name": "outputpath", "description": "", + "type": "", "default": null}]}' generateName: save-most-frequent- spec: arguments: diff --git a/sdk/python/tests/compiler/testdata/coin.yaml b/sdk/python/tests/compiler/testdata/coin.yaml index 5a044b747ff7..f6d0a90d388b 100644 --- a/sdk/python/tests/compiler/testdata/coin.yaml +++ b/sdk/python/tests/compiler/testdata/coin.yaml @@ -14,6 +14,9 @@ apiVersion: argoproj.io/v1alpha1 kind: Workflow metadata: + annotations: + kubeflow.org/pipelines/pipeline_spec: '{"name": "pipeline flip coin", "description": + "shows how to use dsl.Condition.", "inputs": []}' generateName: pipeline-flip-coin- spec: arguments: diff --git a/sdk/python/tests/compiler/testdata/compose.yaml b/sdk/python/tests/compiler/testdata/compose.yaml index 645eb5d20186..4295524cc604 100644 --- a/sdk/python/tests/compiler/testdata/compose.yaml +++ b/sdk/python/tests/compiler/testdata/compose.yaml @@ -14,6 +14,11 @@ apiVersion: argoproj.io/v1alpha1 kind: Workflow metadata: + annotations: + kubeflow.org/pipelines/pipeline_spec: '{"name": "Download and Save Most Frequent", + "description": "Download and Get Most Frequent Word and Save to GCS", "inputs": + [{"name": "url", "description": "", "type": "", "default": null}, {"name": "outputpath", + "description": "", "type": "", "default": null}]}' generateName: download-and-save-most-frequent- spec: arguments: diff --git a/sdk/python/tests/compiler/testdata/default_value.yaml b/sdk/python/tests/compiler/testdata/default_value.yaml index daa6140c9782..f0fba1784ed1 100644 --- a/sdk/python/tests/compiler/testdata/default_value.yaml +++ b/sdk/python/tests/compiler/testdata/default_value.yaml @@ -14,6 +14,10 @@ apiVersion: argoproj.io/v1alpha1 kind: Workflow metadata: + annotations: + kubeflow.org/pipelines/pipeline_spec: '{"name": "Default Value", "description": + "A pipeline with parameter and default value.", "inputs": [{"name": "url", "description": + "", "type": "", "default": "gs://ml-pipeline/shakespeare1.txt"}]}' generateName: default-value- spec: arguments: diff --git a/sdk/python/tests/compiler/testdata/imagepullsecret.yaml b/sdk/python/tests/compiler/testdata/imagepullsecret.yaml index b7a5a91c8d33..ec82ccddcf05 100644 --- a/sdk/python/tests/compiler/testdata/imagepullsecret.yaml +++ b/sdk/python/tests/compiler/testdata/imagepullsecret.yaml @@ -1,6 +1,10 @@ apiVersion: argoproj.io/v1alpha1 kind: Workflow metadata: + annotations: + kubeflow.org/pipelines/pipeline_spec: '{"name": "Save Most Frequent", "description": + "Get Most Frequent Word and Save to GCS", "inputs": [{"name": "message", "description": + "", "type": "", "default": null}]}' generateName: save-most-frequent- spec: arguments: diff --git a/sdk/python/tests/compiler/testdata/param_substitutions.yaml b/sdk/python/tests/compiler/testdata/param_substitutions.yaml index b29d212be15e..5146906fd9df 100644 --- a/sdk/python/tests/compiler/testdata/param_substitutions.yaml +++ b/sdk/python/tests/compiler/testdata/param_substitutions.yaml @@ -1,6 +1,10 @@ apiVersion: argoproj.io/v1alpha1 kind: Workflow metadata: + annotations: + kubeflow.org/pipelines/pipeline_spec: '{"name": "Param Substitutions", "description": + "Test the same PipelineParam getting substituted in multiple places", "inputs": + []}' generateName: param-substitutions- spec: arguments: diff --git a/sdk/python/tests/compiler/testdata/pipelineparams.yaml b/sdk/python/tests/compiler/testdata/pipelineparams.yaml index f5c5c30222a6..76c02a024eac 100644 --- a/sdk/python/tests/compiler/testdata/pipelineparams.yaml +++ b/sdk/python/tests/compiler/testdata/pipelineparams.yaml @@ -14,6 +14,11 @@ --- apiVersion: argoproj.io/v1alpha1 metadata: + annotations: + kubeflow.org/pipelines/pipeline_spec: '{"name": "PipelineParams", "description": + "A pipeline with multiple pipeline params.", "inputs": [{"name": "tag", "description": + "", "type": "", "default": "latest"}, {"name": "sleep_ms", "description": "", + "type": "", "default": 10}]}' generateName: pipelineparams- spec: entrypoint: pipelineparams diff --git a/sdk/python/tests/compiler/testdata/recursive_do_while.yaml b/sdk/python/tests/compiler/testdata/recursive_do_while.yaml index f3f18980b575..9621e1425bdd 100644 --- a/sdk/python/tests/compiler/testdata/recursive_do_while.yaml +++ b/sdk/python/tests/compiler/testdata/recursive_do_while.yaml @@ -1,6 +1,9 @@ apiVersion: argoproj.io/v1alpha1 kind: Workflow metadata: + annotations: + kubeflow.org/pipelines/pipeline_spec: '{"name": "pipeline flip coin", "description": + "shows how to use graph_component.", "inputs": []}' generateName: pipeline-flip-coin- spec: arguments: diff --git a/sdk/python/tests/compiler/testdata/recursive_while.yaml b/sdk/python/tests/compiler/testdata/recursive_while.yaml index d07fa97722bd..8085ab9735d5 100644 --- a/sdk/python/tests/compiler/testdata/recursive_while.yaml +++ b/sdk/python/tests/compiler/testdata/recursive_while.yaml @@ -1,6 +1,9 @@ apiVersion: argoproj.io/v1alpha1 kind: Workflow metadata: + annotations: + kubeflow.org/pipelines/pipeline_spec: '{"name": "pipeline flip coin", "description": + "shows how to use dsl.Condition.", "inputs": []}' generateName: pipeline-flip-coin- spec: arguments: diff --git a/sdk/python/tests/compiler/testdata/resourceop_basic.yaml b/sdk/python/tests/compiler/testdata/resourceop_basic.yaml index 2da6dfd2188b..476d0cc51944 100644 --- a/sdk/python/tests/compiler/testdata/resourceop_basic.yaml +++ b/sdk/python/tests/compiler/testdata/resourceop_basic.yaml @@ -1,6 +1,11 @@ apiVersion: argoproj.io/v1alpha1 kind: Workflow metadata: + annotations: + kubeflow.org/pipelines/pipeline_spec: '{"name": "ResourceOp Basic", "description": + "A Basic Example on ResourceOp Usage.", "inputs": [{"name": "username", "description": + "", "type": "", "default": null}, {"name": "password", "description": "", "type": + "", "default": null}]}' generateName: resourceop-basic- spec: arguments: diff --git a/sdk/python/tests/compiler/testdata/retry.yaml b/sdk/python/tests/compiler/testdata/retry.yaml index 8e9c927a1a06..699ab038b2da 100644 --- a/sdk/python/tests/compiler/testdata/retry.yaml +++ b/sdk/python/tests/compiler/testdata/retry.yaml @@ -1,6 +1,10 @@ apiVersion: argoproj.io/v1alpha1 kind: Workflow metadata: + annotations: + kubeflow.org/pipelines/pipeline_spec: '{"name": "pipeline includes two steps which + fail randomly.", "description": "shows how to use ContainerOp set_retry().", + "inputs": []}' generateName: pipeline-includes-two-steps-which-fail-randomly- spec: arguments: diff --git a/sdk/python/tests/compiler/testdata/sidecar.yaml b/sdk/python/tests/compiler/testdata/sidecar.yaml index be267bfb0383..368a13863036 100644 --- a/sdk/python/tests/compiler/testdata/sidecar.yaml +++ b/sdk/python/tests/compiler/testdata/sidecar.yaml @@ -13,6 +13,9 @@ # limitations under the License. kind: Workflow metadata: + annotations: + kubeflow.org/pipelines/pipeline_spec: '{"name": "Sidecar", "description": "A pipeline + with sidecars.", "inputs": []}' generateName: sidecar- apiVersion: argoproj.io/v1alpha1 spec: diff --git a/sdk/python/tests/compiler/testdata/volume.yaml b/sdk/python/tests/compiler/testdata/volume.yaml index 73175df6e917..fd2ef39d900a 100644 --- a/sdk/python/tests/compiler/testdata/volume.yaml +++ b/sdk/python/tests/compiler/testdata/volume.yaml @@ -14,6 +14,9 @@ apiVersion: argoproj.io/v1alpha1 kind: Workflow metadata: + annotations: + kubeflow.org/pipelines/pipeline_spec: '{"name": "Volume", "description": "A pipeline + with volume.", "inputs": []}' generateName: volume- spec: arguments: diff --git a/sdk/python/tests/compiler/testdata/volume_snapshotop_rokurl.yaml b/sdk/python/tests/compiler/testdata/volume_snapshotop_rokurl.yaml index 20106baef007..fa8e4d05ea67 100644 --- a/sdk/python/tests/compiler/testdata/volume_snapshotop_rokurl.yaml +++ b/sdk/python/tests/compiler/testdata/volume_snapshotop_rokurl.yaml @@ -1,6 +1,10 @@ apiVersion: argoproj.io/v1alpha1 kind: Workflow metadata: + annotations: + kubeflow.org/pipelines/pipeline_spec: '{"name": "VolumeSnapshotOp RokURL", "description": + "The fifth example of the design doc.", "inputs": [{"name": "rok_url", "description": + "", "type": "", "default": null}]}' generateName: volumesnapshotop-rokurl- spec: arguments: diff --git a/sdk/python/tests/compiler/testdata/volume_snapshotop_sequential.yaml b/sdk/python/tests/compiler/testdata/volume_snapshotop_sequential.yaml index d6a772ad94a2..ecd3de71b393 100644 --- a/sdk/python/tests/compiler/testdata/volume_snapshotop_sequential.yaml +++ b/sdk/python/tests/compiler/testdata/volume_snapshotop_sequential.yaml @@ -1,6 +1,10 @@ apiVersion: argoproj.io/v1alpha1 kind: Workflow metadata: + annotations: + kubeflow.org/pipelines/pipeline_spec: '{"name": "VolumeSnapshotOp Sequential", + "description": "The fourth example of the design doc.", "inputs": [{"name": + "url", "description": "", "type": "", "default": null}]}' generateName: volumesnapshotop-sequential- spec: arguments: diff --git a/sdk/python/tests/compiler/testdata/volumeop_basic.yaml b/sdk/python/tests/compiler/testdata/volumeop_basic.yaml index 4172075e989c..57aae209ba68 100644 --- a/sdk/python/tests/compiler/testdata/volumeop_basic.yaml +++ b/sdk/python/tests/compiler/testdata/volumeop_basic.yaml @@ -1,6 +1,10 @@ apiVersion: argoproj.io/v1alpha1 kind: Workflow metadata: + annotations: + kubeflow.org/pipelines/pipeline_spec: '{"name": "VolumeOp Basic", "description": + "A Basic Example on VolumeOp Usage.", "inputs": [{"name": "size", "description": + "", "type": "", "default": null}]}' generateName: volumeop-basic- spec: arguments: diff --git a/sdk/python/tests/compiler/testdata/volumeop_dag.yaml b/sdk/python/tests/compiler/testdata/volumeop_dag.yaml index 3f8836927a84..42742b4a6929 100644 --- a/sdk/python/tests/compiler/testdata/volumeop_dag.yaml +++ b/sdk/python/tests/compiler/testdata/volumeop_dag.yaml @@ -1,6 +1,9 @@ apiVersion: argoproj.io/v1alpha1 kind: Workflow metadata: + annotations: + kubeflow.org/pipelines/pipeline_spec: '{"name": "Volume Op DAG", "description": + "The second example of the design doc.", "inputs": []}' generateName: volume-op-dag- spec: arguments: diff --git a/sdk/python/tests/compiler/testdata/volumeop_parallel.yaml b/sdk/python/tests/compiler/testdata/volumeop_parallel.yaml index 83e11f021b92..0bd43804edf9 100644 --- a/sdk/python/tests/compiler/testdata/volumeop_parallel.yaml +++ b/sdk/python/tests/compiler/testdata/volumeop_parallel.yaml @@ -1,6 +1,9 @@ apiVersion: argoproj.io/v1alpha1 kind: Workflow metadata: + annotations: + kubeflow.org/pipelines/pipeline_spec: '{"name": "VolumeOp Parallel", "description": + "The first example of the design doc.", "inputs": []}' generateName: volumeop-parallel- spec: arguments: diff --git a/sdk/python/tests/compiler/testdata/volumeop_sequential.yaml b/sdk/python/tests/compiler/testdata/volumeop_sequential.yaml index 8fd38be9a003..af07c56385ab 100644 --- a/sdk/python/tests/compiler/testdata/volumeop_sequential.yaml +++ b/sdk/python/tests/compiler/testdata/volumeop_sequential.yaml @@ -1,6 +1,9 @@ apiVersion: argoproj.io/v1alpha1 kind: Workflow metadata: + annotations: + kubeflow.org/pipelines/pipeline_spec: '{"name": "VolumeOp Sequential", "description": + "The third example of the design doc.", "inputs": []}' generateName: volumeop-sequential- spec: arguments: