From 6ee1e9efdb41fdf8192e1700d9ce426029c7989f Mon Sep 17 00:00:00 2001 From: Alexey Volkov Date: Sat, 23 May 2020 01:22:54 -0700 Subject: [PATCH 1/2] SDK - Compiler - Using properly serialized pipeline parameter defaults Fixes https://github.com/kubeflow/pipelines/issues/3806 --- sdk/python/kfp/compiler/compiler.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/sdk/python/kfp/compiler/compiler.py b/sdk/python/kfp/compiler/compiler.py index d6cbddb203f..d047918304d 100644 --- a/sdk/python/kfp/compiler/compiler.py +++ b/sdk/python/kfp/compiler/compiler.py @@ -812,11 +812,10 @@ def _create_workflow(self, # Fill in the default values. args_list_with_defaults = [] if pipeline_meta.inputs: - args_list_with_defaults = [dsl.PipelineParam(sanitize_k8s_name(arg_name, True)) - for arg_name in argspec.args] - if argspec.defaults: - for arg, default in zip(reversed(args_list_with_defaults), reversed(argspec.defaults)): - arg.value = default.value if isinstance(default, dsl.PipelineParam) else default + args_list_with_defaults = [ + dsl.PipelineParam(sanitize_k8s_name(input_spec.name, True), value=input_spec.default) + for input_spec in pipeline_meta.inputs + ] elif params_list: # Or, if args are provided by params_list, fill in pipeline_meta. for param in params_list: From ea9d8501c781d7d7ad398d370021cc82af9a7d13 Mon Sep 17 00:00:00 2001 From: Alexey Volkov Date: Fri, 29 May 2020 00:50:58 -0700 Subject: [PATCH 2/2] Sort the keys so that the serialized defaults are stable in python 3.5 --- sdk/python/kfp/components/_data_passing.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/python/kfp/components/_data_passing.py b/sdk/python/kfp/components/_data_passing.py index f36ae778c26..12615e52a77 100644 --- a/sdk/python/kfp/components/_data_passing.py +++ b/sdk/python/kfp/components/_data_passing.py @@ -83,7 +83,7 @@ def default_serializer(obj): return obj.to_struct() else: raise TypeError("Object of type '%s' is not JSON serializable and does not have .to_struct() method." % obj.__class__.__name__) - return json.dumps(obj, default=default_serializer) + return json.dumps(obj, default=default_serializer, sort_keys=True) def _serialize_base64_pickle(obj) -> str: