We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
[sdk] `kfp run submit` fails when paramerer values contain '=' with "dictionary update sequence element"
### Environment

*  KFP version: 
<!-- For more information, see an overview of KFP installation options: https://www.kubeflow.org/docs/pipelines/installation/overview/. -->
*  KFP SDK version: 1.4.0, 1.5.0
<!-- Specify the version of Kubeflow Pipelines that you are using. The version number appears in the left side navigation of user interface.
To find the version number, See version number shows on bottom of KFP UI left sidenav. -->
*  All dependencies version: n/a
<!-- Specify the output of the following shell command: $pip list | grep kfp -->

### Steps to reproduce

* Compile test pipeline below (run py script)

```py
import kfp as kfp

@kfp.components.func_to_container_op
def print_func(param: str):
    print(str(param))
    return

@kfp.dsl.pipeline(name='pipeline')
def pipeline(param: str):
    print_func(param)
    return

if __name__ == '__main__':
    kfp.compiler.Compiler().compile(pipeline, __file__ + ".zip")
```

* Upload to KF
* Grab the `pipeline-id` to use it in the command line sdk
* Using the command line SDK, run the following:

```sh
$ kfp run submit --pipeline-id <pipeline-id> --experiment-name 'Test = parsing' param=12345   # Succeeds
$ kfp run submit --pipeline-id <pipeline-id> --experiment-name 'Test = parsing' param=some_name=4567    # Fails
dictionary update sequence element #0 has length 3; 2 is required
```

Running the parameter directly from the KFP UI with value `some_name=4567` works fine and prints `some_name=4567`.


#### Problem Explanation
The pipeline expects an input parameter named `param` to run and it prints the value of that param. The SDK will parse pipeline parameters on the `=` sign [here](https://github.com/kubeflow/pipelines/blob/master/sdk/python/kfp/cli/run.py#L79). The value contains an `=` sign, so we are trying to update the `dict()` with `('param', 'some_name', '4567')` when the goal is to update it with `('param', 'some_name=4567')`.

#### Problem Significance
The equality sign `=` is typically used to partition datasets in distributed storage (S3, HDFS, etc) leading to paths like
```
hdfs://path/to/table/year_partition=2020/month_partition=01/other_partition=other_value/file1.parquet
hdfs://path/to/table/year_partition=2020/month_partition=02/other_partition=other_value/file1.parquet
...
```
Due to the problem discussed above, we cannot use the CLI SDK to provide parameters that contain the `=` sign. However, we _can_ use the KFP UI and pass such paramters, leading to inconsistent behavior.

<!--
Specify how to reproduce the problem. 
This may include information such as: a description of the process, code snippets, log output, or screenshots.
-->

### Expected result

<!-- What should the correct behavior be? -->

Running
```sh
$ kfp run submit --pipeline-id <pipeline-id> --experiment-name 'Test = parsing' param=some_name=4567 
```
should succeed just like running the pipeline via the KFP UI with the value `some_name=4567` for the run parameter **param**.



### Materials and Reference

<!-- Help us debug this issue by providing resources such as: sample code, background context, or links to references. -->

#### Suggested Solution
[This line](https://github.com/kubeflow/pipelines/blob/master/sdk/python/kfp/cli/run.py#L79) should be
```py
    arg_dict = dict(arg.split('=', maxsplit=1) for arg in args)
```

---

<!-- Don't delete message below to encourage users to support your issue! -->
Impacted by this bug? Give it a 👍. We prioritise the issues with the most 👍.


--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `sdk/python/kfp/cli/run.py`
Content:
```
1 # Copyright 2018 The Kubeflow Authors
2 #
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
6 #
7 #      http://www.apache.org/licenses/LICENSE-2.0
8 #
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
14 
15 
16 import sys
17 import subprocess
18 import time
19 import json
20 import click
21 import shutil
22 
23 from .output import print_output, OutputFormat
24 
25 
26 @click.group()
27 def run():
28     """manage run resources"""
29     pass
30 
31 
32 @run.command()
33 @click.option('-e', '--experiment-id', help='Parent experiment ID of listed runs.')
34 @click.option('-m', '--max-size', default=100, help='Max size of the listed runs.')
35 @click.pass_context
36 def list(ctx, experiment_id, max_size):
37     """list recent KFP runs"""
38     client = ctx.obj['client']
39     output_format = ctx.obj['output']
40     response = client.list_runs(experiment_id=experiment_id, page_size=max_size, sort_by='created_at desc')
41     if response and response.runs:
42         _print_runs(response.runs, output_format)
43     else:
44         if output_format == OutputFormat.json.name:
45             msg = json.dumps([])
46         else:
47             msg = 'No runs found.'
48         click.echo(msg)
49 
50 
51 @run.command()
52 @click.option('-e', '--experiment-name', required=True, help='Experiment name of the run.')
53 @click.option('-r', '--run-name', help='Name of the run.')
54 @click.option('-f', '--package-file', type=click.Path(exists=True, dir_okay=False),
55               help='Path of the pipeline package file.')
56 @click.option('-p', '--pipeline-id', help='ID of the pipeline template.')
57 @click.option('-n', '--pipeline-name', help='Name of the pipeline template.')
58 @click.option('-w', '--watch', is_flag=True, default=False,
59               help='Watch the run status until it finishes.')
60 @click.option('-v', '--version', help='ID of the pipeline version.')
61 @click.argument('args', nargs=-1)
62 @click.pass_context
63 def submit(ctx, experiment_name, run_name, package_file, pipeline_id, pipeline_name, watch,
64            version, args):
65     """submit a KFP run"""
66     client = ctx.obj['client']
67     namespace = ctx.obj['namespace']
68     output_format = ctx.obj['output']
69     if not run_name:
70         run_name = experiment_name
71 
72     if not pipeline_id and pipeline_name:
73         pipeline_id = client.get_pipeline_id(name=pipeline_name)
74 
75     if not package_file and not pipeline_id and not version:
76         click.echo('You must provide one of [package_file, pipeline_id, version].', err=True)
77         sys.exit(1)
78 
79     arg_dict = dict(arg.split('=') for arg in args)
80     experiment = client.create_experiment(experiment_name)
81     run = client.run_pipeline(experiment.id, run_name, package_file, arg_dict, pipeline_id,
82                               version_id=version)
83     _display_run(client, namespace, run.id, watch, output_format)
84 
85 
86 @run.command()
87 @click.option('-w', '--watch', is_flag=True, default=False,
88               help='Watch the run status until it finishes.')
89 @click.argument('run-id')
90 @click.pass_context
91 def get(ctx, watch, run_id):
92     """display the details of a KFP run"""
93     client = ctx.obj['client']
94     namespace = ctx.obj['namespace']
95     output_format = ctx.obj['output']
96     _display_run(client, namespace, run_id, watch, output_format)
97 
98 
99 def _display_run(client, namespace, run_id, watch, output_format):
100     run = client.get_run(run_id).run
101     _print_runs([run], output_format)
102     if not watch:
103         return
104     argo_path = shutil.which('argo')
105     if not argo_path:
106         raise RuntimeError("argo isn't found in $PATH. It's necessary for watch. "
107                            "Please make sure it's installed and available. "
108                            "Installation instructions be found here - "
109                            "https://github.com/argoproj/argo/releases")
110 
111     argo_workflow_name = None
112     while True:
113         time.sleep(1)
114         run_detail = client.get_run(run_id)
115         run = run_detail.run
116         if run_detail.pipeline_runtime and run_detail.pipeline_runtime.workflow_manifest:
117             manifest = json.loads(run_detail.pipeline_runtime.workflow_manifest)
118             if manifest['metadata'] and manifest['metadata']['name']:
119                 argo_workflow_name = manifest['metadata']['name']
120                 break
121         if run_detail.run.status in ['Succeeded', 'Skipped', 'Failed', 'Error']:
122             click.echo('Run is finished with status {}.'.format(run_detail.run.status))
123             return
124     if argo_workflow_name:
125         subprocess.run([argo_path, 'watch', argo_workflow_name, '-n', namespace])
126         _print_runs([run], output_format)
127 
128 
129 def _print_runs(runs, output_format):
130     headers = ['run id', 'name', 'status', 'created at']
131     data = [[run.id, run.name, run.status, run.created_at.isoformat()] for run in runs]
132     print_output(data, headers, output_format, table_format='grid')
133
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/sdk/python/kfp/cli/run.py b/sdk/python/kfp/cli/run.py
--- a/sdk/python/kfp/cli/run.py
+++ b/sdk/python/kfp/cli/run.py
@@ -76,7 +76,8 @@
         click.echo('You must provide one of [package_file, pipeline_id, version].', err=True)
         sys.exit(1)
 
-    arg_dict = dict(arg.split('=') for arg in args)
+    arg_dict = dict(arg.split('=', maxsplit=1) for arg in args)
+
     experiment = client.create_experiment(experiment_name)
     run = client.run_pipeline(experiment.id, run_name, package_file, arg_dict, pipeline_id,
                               version_id=version)

{"golden_diff": "diff --git a/sdk/python/kfp/cli/run.py b/sdk/python/kfp/cli/run.py\n--- a/sdk/python/kfp/cli/run.py\n+++ b/sdk/python/kfp/cli/run.py\n@@ -76,7 +76,8 @@\n         click.echo('You must provide one of [package_file, pipeline_id, version].', err=True)\n         sys.exit(1)\n \n-    arg_dict = dict(arg.split('=') for arg in args)\n+    arg_dict = dict(arg.split('=', maxsplit=1) for arg in args)\n+\n     experiment = client.create_experiment(experiment_name)\n     run = client.run_pipeline(experiment.id, run_name, package_file, arg_dict, pipeline_id,\n                               version_id=version)\n", "issue": "[sdk] `kfp run submit` fails when paramerer values contain '=' with \"dictionary update sequence element\"\n### Environment\r\n\r\n*  KFP version: \r\n<!-- For more information, see an overview of KFP installation options: https://www.kubeflow.org/docs/pipelines/installation/overview/. -->\r\n*  KFP SDK version: 1.4.0, 1.5.0\r\n<!-- Specify the version of Kubeflow Pipelines that you are using. The version number appears in the left side navigation of user interface.\r\nTo find the version number, See version number shows on bottom of KFP UI left sidenav. -->\r\n*  All dependencies version: n/a\r\n<!-- Specify the output of the following shell command: $pip list | grep kfp -->\r\n\r\n### Steps to reproduce\r\n\r\n* Compile test pipeline below (run py script)\r\n\r\n```py\r\nimport kfp as kfp\r\n\r\n@kfp.components.func_to_container_op\r\ndef print_func(param: str):\r\n    print(str(param))\r\n    return\r\n\r\n@kfp.dsl.pipeline(name='pipeline')\r\ndef pipeline(param: str):\r\n    print_func(param)\r\n    return\r\n\r\nif __name__ == '__main__':\r\n    kfp.compiler.Compiler().compile(pipeline, __file__ + \".zip\")\r\n```\r\n\r\n* Upload to KF\r\n* Grab the `pipeline-id` to use it in the command line sdk\r\n* Using the command line SDK, run the following:\r\n\r\n```sh\r\n$ kfp run submit --pipeline-id <pipeline-id> --experiment-name 'Test = parsing' param=12345   # Succeeds\r\n$ kfp run submit --pipeline-id <pipeline-id> --experiment-name 'Test = parsing' param=some_name=4567    # Fails\r\ndictionary update sequence element #0 has length 3; 2 is required\r\n```\r\n\r\nRunning the parameter directly from the KFP UI with value `some_name=4567` works fine and prints `some_name=4567`.\r\n\r\n\r\n#### Problem Explanation\r\nThe pipeline expects an input parameter named `param` to run and it prints the value of that param. The SDK will parse pipeline parameters on the `=` sign [here](https://github.com/kubeflow/pipelines/blob/master/sdk/python/kfp/cli/run.py#L79). The value contains an `=` sign, so we are trying to update the `dict()` with `('param', 'some_name', '4567')` when the goal is to update it with `('param', 'some_name=4567')`.\r\n\r\n#### Problem Significance\r\nThe equality sign `=` is typically used to partition datasets in distributed storage (S3, HDFS, etc) leading to paths like\r\n```\r\nhdfs://path/to/table/year_partition=2020/month_partition=01/other_partition=other_value/file1.parquet\r\nhdfs://path/to/table/year_partition=2020/month_partition=02/other_partition=other_value/file1.parquet\r\n...\r\n```\r\nDue to the problem discussed above, we cannot use the CLI SDK to provide parameters that contain the `=` sign. However, we _can_ use the KFP UI and pass such paramters, leading to inconsistent behavior.\r\n\r\n<!--\r\nSpecify how to reproduce the problem. \r\nThis may include information such as: a description of the process, code snippets, log output, or screenshots.\r\n-->\r\n\r\n### Expected result\r\n\r\n<!-- What should the correct behavior be? -->\r\n\r\nRunning\r\n```sh\r\n$ kfp run submit --pipeline-id <pipeline-id> --experiment-name 'Test = parsing' param=some_name=4567 \r\n```\r\nshould succeed just like running the pipeline via the KFP UI with the value `some_name=4567` for the run parameter **param**.\r\n\r\n\r\n\r\n### Materials and Reference\r\n\r\n<!-- Help us debug this issue by providing resources such as: sample code, background context, or links to references. -->\r\n\r\n#### Suggested Solution\r\n[This line](https://github.com/kubeflow/pipelines/blob/master/sdk/python/kfp/cli/run.py#L79) should be\r\n```py\r\n    arg_dict = dict(arg.split('=', maxsplit=1) for arg in args)\r\n```\r\n\r\n---\r\n\r\n<!-- Don't delete message below to encourage users to support your issue! -->\r\nImpacted by this bug? Give it a \ud83d\udc4d. We prioritise the issues with the most \ud83d\udc4d.\r\n\n", "before_files": [{"content": "# Copyright 2018 The Kubeflow Authors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n\nimport sys\nimport subprocess\nimport time\nimport json\nimport click\nimport shutil\n\nfrom .output import print_output, OutputFormat\n\n\n@click.group()\ndef run():\n    \"\"\"manage run resources\"\"\"\n    pass\n\n\n@run.command()\n@click.option('-e', '--experiment-id', help='Parent experiment ID of listed runs.')\n@click.option('-m', '--max-size', default=100, help='Max size of the listed runs.')\n@click.pass_context\ndef list(ctx, experiment_id, max_size):\n    \"\"\"list recent KFP runs\"\"\"\n    client = ctx.obj['client']\n    output_format = ctx.obj['output']\n    response = client.list_runs(experiment_id=experiment_id, page_size=max_size, sort_by='created_at desc')\n    if response and response.runs:\n        _print_runs(response.runs, output_format)\n    else:\n        if output_format == OutputFormat.json.name:\n            msg = json.dumps([])\n        else:\n            msg = 'No runs found.'\n        click.echo(msg)\n\n\n@run.command()\n@click.option('-e', '--experiment-name', required=True, help='Experiment name of the run.')\n@click.option('-r', '--run-name', help='Name of the run.')\n@click.option('-f', '--package-file', type=click.Path(exists=True, dir_okay=False),\n              help='Path of the pipeline package file.')\n@click.option('-p', '--pipeline-id', help='ID of the pipeline template.')\n@click.option('-n', '--pipeline-name', help='Name of the pipeline template.')\n@click.option('-w', '--watch', is_flag=True, default=False,\n              help='Watch the run status until it finishes.')\n@click.option('-v', '--version', help='ID of the pipeline version.')\n@click.argument('args', nargs=-1)\n@click.pass_context\ndef submit(ctx, experiment_name, run_name, package_file, pipeline_id, pipeline_name, watch,\n           version, args):\n    \"\"\"submit a KFP run\"\"\"\n    client = ctx.obj['client']\n    namespace = ctx.obj['namespace']\n    output_format = ctx.obj['output']\n    if not run_name:\n        run_name = experiment_name\n\n    if not pipeline_id and pipeline_name:\n        pipeline_id = client.get_pipeline_id(name=pipeline_name)\n\n    if not package_file and not pipeline_id and not version:\n        click.echo('You must provide one of [package_file, pipeline_id, version].', err=True)\n        sys.exit(1)\n\n    arg_dict = dict(arg.split('=') for arg in args)\n    experiment = client.create_experiment(experiment_name)\n    run = client.run_pipeline(experiment.id, run_name, package_file, arg_dict, pipeline_id,\n                              version_id=version)\n    _display_run(client, namespace, run.id, watch, output_format)\n\n\n@run.command()\n@click.option('-w', '--watch', is_flag=True, default=False,\n              help='Watch the run status until it finishes.')\n@click.argument('run-id')\n@click.pass_context\ndef get(ctx, watch, run_id):\n    \"\"\"display the details of a KFP run\"\"\"\n    client = ctx.obj['client']\n    namespace = ctx.obj['namespace']\n    output_format = ctx.obj['output']\n    _display_run(client, namespace, run_id, watch, output_format)\n\n\ndef _display_run(client, namespace, run_id, watch, output_format):\n    run = client.get_run(run_id).run\n    _print_runs([run], output_format)\n    if not watch:\n        return\n    argo_path = shutil.which('argo')\n    if not argo_path:\n        raise RuntimeError(\"argo isn't found in $PATH. It's necessary for watch. \"\n                           \"Please make sure it's installed and available. \"\n                           \"Installation instructions be found here - \"\n                           \"https://github.com/argoproj/argo/releases\")\n\n    argo_workflow_name = None\n    while True:\n        time.sleep(1)\n        run_detail = client.get_run(run_id)\n        run = run_detail.run\n        if run_detail.pipeline_runtime and run_detail.pipeline_runtime.workflow_manifest:\n            manifest = json.loads(run_detail.pipeline_runtime.workflow_manifest)\n            if manifest['metadata'] and manifest['metadata']['name']:\n                argo_workflow_name = manifest['metadata']['name']\n                break\n        if run_detail.run.status in ['Succeeded', 'Skipped', 'Failed', 'Error']:\n            click.echo('Run is finished with status {}.'.format(run_detail.run.status))\n            return\n    if argo_workflow_name:\n        subprocess.run([argo_path, 'watch', argo_workflow_name, '-n', namespace])\n        _print_runs([run], output_format)\n\n\ndef _print_runs(runs, output_format):\n    headers = ['run id', 'name', 'status', 'created at']\n    data = [[run.id, run.name, run.status, run.created_at.isoformat()] for run in runs]\n    print_output(data, headers, output_format, table_format='grid')\n", "path": "sdk/python/kfp/cli/run.py"}], "after_files": [{"content": "# Copyright 2018 The Kubeflow Authors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n\nimport sys\nimport subprocess\nimport time\nimport json\nimport click\nimport shutil\n\nfrom .output import print_output, OutputFormat\n\n\n@click.group()\ndef run():\n    \"\"\"manage run resources\"\"\"\n    pass\n\n\n@run.command()\n@click.option('-e', '--experiment-id', help='Parent experiment ID of listed runs.')\n@click.option('-m', '--max-size', default=100, help='Max size of the listed runs.')\n@click.pass_context\ndef list(ctx, experiment_id, max_size):\n    \"\"\"list recent KFP runs\"\"\"\n    client = ctx.obj['client']\n    output_format = ctx.obj['output']\n    response = client.list_runs(experiment_id=experiment_id, page_size=max_size, sort_by='created_at desc')\n    if response and response.runs:\n        _print_runs(response.runs, output_format)\n    else:\n        if output_format == OutputFormat.json.name:\n            msg = json.dumps([])\n        else:\n            msg = 'No runs found.'\n        click.echo(msg)\n\n\n@run.command()\n@click.option('-e', '--experiment-name', required=True, help='Experiment name of the run.')\n@click.option('-r', '--run-name', help='Name of the run.')\n@click.option('-f', '--package-file', type=click.Path(exists=True, dir_okay=False),\n              help='Path of the pipeline package file.')\n@click.option('-p', '--pipeline-id', help='ID of the pipeline template.')\n@click.option('-n', '--pipeline-name', help='Name of the pipeline template.')\n@click.option('-w', '--watch', is_flag=True, default=False,\n              help='Watch the run status until it finishes.')\n@click.option('-v', '--version', help='ID of the pipeline version.')\n@click.argument('args', nargs=-1)\n@click.pass_context\ndef submit(ctx, experiment_name, run_name, package_file, pipeline_id, pipeline_name, watch,\n           version, args):\n    \"\"\"submit a KFP run\"\"\"\n    client = ctx.obj['client']\n    namespace = ctx.obj['namespace']\n    output_format = ctx.obj['output']\n    if not run_name:\n        run_name = experiment_name\n\n    if not pipeline_id and pipeline_name:\n        pipeline_id = client.get_pipeline_id(name=pipeline_name)\n\n    if not package_file and not pipeline_id and not version:\n        click.echo('You must provide one of [package_file, pipeline_id, version].', err=True)\n        sys.exit(1)\n\n    arg_dict = dict(arg.split('=', maxsplit=1) for arg in args)\n\n    experiment = client.create_experiment(experiment_name)\n    run = client.run_pipeline(experiment.id, run_name, package_file, arg_dict, pipeline_id,\n                              version_id=version)\n    _display_run(client, namespace, run.id, watch, output_format)\n\n\n@run.command()\n@click.option('-w', '--watch', is_flag=True, default=False,\n              help='Watch the run status until it finishes.')\n@click.argument('run-id')\n@click.pass_context\ndef get(ctx, watch, run_id):\n    \"\"\"display the details of a KFP run\"\"\"\n    client = ctx.obj['client']\n    namespace = ctx.obj['namespace']\n    output_format = ctx.obj['output']\n    _display_run(client, namespace, run_id, watch, output_format)\n\n\ndef _display_run(client, namespace, run_id, watch, output_format):\n    run = client.get_run(run_id).run\n    _print_runs([run], output_format)\n    if not watch:\n        return\n    argo_path = shutil.which('argo')\n    if not argo_path:\n        raise RuntimeError(\"argo isn't found in $PATH. It's necessary for watch. \"\n                           \"Please make sure it's installed and available. \"\n                           \"Installation instructions be found here - \"\n                           \"https://github.com/argoproj/argo/releases\")\n\n    argo_workflow_name = None\n    while True:\n        time.sleep(1)\n        run_detail = client.get_run(run_id)\n        run = run_detail.run\n        if run_detail.pipeline_runtime and run_detail.pipeline_runtime.workflow_manifest:\n            manifest = json.loads(run_detail.pipeline_runtime.workflow_manifest)\n            if manifest['metadata'] and manifest['metadata']['name']:\n                argo_workflow_name = manifest['metadata']['name']\n                break\n        if run_detail.run.status in ['Succeeded', 'Skipped', 'Failed', 'Error']:\n            click.echo('Run is finished with status {}.'.format(run_detail.run.status))\n            return\n    if argo_workflow_name:\n        subprocess.run([argo_path, 'watch', argo_workflow_name, '-n', namespace])\n        _print_runs([run], output_format)\n\n\ndef _print_runs(runs, output_format):\n    headers = ['run id', 'name', 'status', 'created at']\n    data = [[run.id, run.name, run.status, run.created_at.isoformat()] for run in runs]\n    print_output(data, headers, output_format, table_format='grid')\n", "path": "sdk/python/kfp/cli/run.py"}]}