diff --git a/e2e/testdata/fn-render/all-resource-deletion/.expected/diff.patch b/e2e/testdata/fn-render/all-resource-deletion/.expected/diff.patch index 34218ae522..7d2838c497 100644 --- a/e2e/testdata/fn-render/all-resource-deletion/.expected/diff.patch +++ b/e2e/testdata/fn-render/all-resource-deletion/.expected/diff.patch @@ -1,5 +1,5 @@ diff --git a/Kptfile b/Kptfile -index 3c93e9e..fe0bc96 100644 +index 3c93e9e..5404a5a 100644 --- a/Kptfile +++ b/Kptfile @@ -2,6 +2,9 @@ apiVersion: kpt.dev/v1 @@ -12,7 +12,7 @@ index 3c93e9e..fe0bc96 100644 pipeline: mutators: - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest -@@ -12,3 +15,8 @@ pipeline: +@@ -12,3 +15,16 @@ pipeline: - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 configMap: tier: backend @@ -21,6 +21,14 @@ index 3c93e9e..fe0bc96 100644 + - type: Rendered + status: "True" + reason: RenderSuccess ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 ++ exitCode: 0 diff --git a/delete-all.yaml b/delete-all.yaml index 3c86d8b..6754b0a 100644 --- a/delete-all.yaml diff --git a/e2e/testdata/fn-render/basicpipeline-semver/.expected/diff.patch b/e2e/testdata/fn-render/basicpipeline-semver/.expected/diff.patch index fea4f539a1..e38282bfdb 100644 --- a/e2e/testdata/fn-render/basicpipeline-semver/.expected/diff.patch +++ b/e2e/testdata/fn-render/basicpipeline-semver/.expected/diff.patch @@ -1,8 +1,8 @@ diff --git a/Kptfile b/Kptfile -index 2336da4..eae3be3 100644 +index 2336da4..c1090e8 100644 --- a/Kptfile +++ b/Kptfile -@@ -2,13 +2,20 @@ apiVersion: kpt.dev/v1 +@@ -2,13 +2,34 @@ apiVersion: kpt.dev/v1 kind: Kptfile metadata: name: app @@ -25,6 +25,20 @@ index 2336da4..eae3be3 100644 + - type: Rendered + status: "True" + reason: RenderSuccess ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace ++ exitCode: 0 ++ results: ++ - message: namespace [default] updated to "staging", 1 value(s) changed ++ severity: info ++ - message: all `depends-on` annotations are up-to-date. no `namespace` changed ++ severity: info ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels ++ exitCode: 0 ++ results: ++ - message: set 4 labels in total ++ severity: info diff --git a/resources.yaml b/resources.yaml index 1f15150..936d957 100644 --- a/resources.yaml diff --git a/e2e/testdata/fn-render/basicpipeline-symlink/.expected/diff.patch b/e2e/testdata/fn-render/basicpipeline-symlink/.expected/diff.patch index 16337308e3..114ed718fa 100644 --- a/e2e/testdata/fn-render/basicpipeline-symlink/.expected/diff.patch +++ b/e2e/testdata/fn-render/basicpipeline-symlink/.expected/diff.patch @@ -1,5 +1,5 @@ diff --git a/Kptfile b/Kptfile -index 1307fb5..f645d75 100644 +index 1307fb5..fee64dc 100644 --- a/Kptfile +++ b/Kptfile @@ -2,6 +2,9 @@ apiVersion: kpt.dev/v1 @@ -12,7 +12,7 @@ index 1307fb5..f645d75 100644 pipeline: mutators: - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 -@@ -10,3 +13,8 @@ pipeline: +@@ -10,3 +13,14 @@ pipeline: - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 configMap: tier: backend @@ -21,6 +21,12 @@ index 1307fb5..f645d75 100644 + - type: Rendered + status: "True" + reason: RenderSuccess ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 ++ exitCode: 0 diff --git a/resources.yaml b/resources.yaml index f2eec52..84cfb26 100644 --- a/resources.yaml diff --git a/e2e/testdata/fn-render/basicpipeline-wasm/.expected/diff.patch b/e2e/testdata/fn-render/basicpipeline-wasm/.expected/diff.patch index 9c2bb0566e..19a2818f6c 100644 --- a/e2e/testdata/fn-render/basicpipeline-wasm/.expected/diff.patch +++ b/e2e/testdata/fn-render/basicpipeline-wasm/.expected/diff.patch @@ -1,8 +1,8 @@ diff --git a/Kptfile b/Kptfile -index 17a7822..94b6f80 100644 +index 17a7822..98fa855 100644 --- a/Kptfile +++ b/Kptfile -@@ -12,3 +12,8 @@ pipeline: +@@ -12,3 +12,22 @@ pipeline: - image: ghcr.io/kptdev/krm-functions-catalog/wasm/set-labels:v0.2.4 configMap: tier: backend @@ -11,6 +11,20 @@ index 17a7822..94b6f80 100644 + - type: Rendered + status: "True" + reason: RenderSuccess ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/wasm/set-namespace:v0.5.1 ++ exitCode: 0 ++ results: ++ - message: namespace [default] updated to "staging", 1 value(s) changed ++ severity: info ++ - message: all `depends-on` annotations are up-to-date. no `namespace` changed ++ severity: info ++ - image: ghcr.io/kptdev/krm-functions-catalog/wasm/set-labels:v0.2.4 ++ exitCode: 0 ++ results: ++ - message: set 4 labels in total ++ severity: info diff --git a/resources.yaml b/resources.yaml index eed43d6..c1de2b0 100644 --- a/resources.yaml diff --git a/e2e/testdata/fn-render/basicpipeline/.expected/diff.patch b/e2e/testdata/fn-render/basicpipeline/.expected/diff.patch index 16337308e3..114ed718fa 100644 --- a/e2e/testdata/fn-render/basicpipeline/.expected/diff.patch +++ b/e2e/testdata/fn-render/basicpipeline/.expected/diff.patch @@ -1,5 +1,5 @@ diff --git a/Kptfile b/Kptfile -index 1307fb5..f645d75 100644 +index 1307fb5..fee64dc 100644 --- a/Kptfile +++ b/Kptfile @@ -2,6 +2,9 @@ apiVersion: kpt.dev/v1 @@ -12,7 +12,7 @@ index 1307fb5..f645d75 100644 pipeline: mutators: - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 -@@ -10,3 +13,8 @@ pipeline: +@@ -10,3 +13,14 @@ pipeline: - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 configMap: tier: backend @@ -21,6 +21,12 @@ index 1307fb5..f645d75 100644 + - type: Rendered + status: "True" + reason: RenderSuccess ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 ++ exitCode: 0 diff --git a/resources.yaml b/resources.yaml index f2eec52..84cfb26 100644 --- a/resources.yaml diff --git a/e2e/testdata/fn-render/default-runtime/.expected/diff.patch b/e2e/testdata/fn-render/default-runtime/.expected/diff.patch index 16337308e3..114ed718fa 100644 --- a/e2e/testdata/fn-render/default-runtime/.expected/diff.patch +++ b/e2e/testdata/fn-render/default-runtime/.expected/diff.patch @@ -1,5 +1,5 @@ diff --git a/Kptfile b/Kptfile -index 1307fb5..f645d75 100644 +index 1307fb5..fee64dc 100644 --- a/Kptfile +++ b/Kptfile @@ -2,6 +2,9 @@ apiVersion: kpt.dev/v1 @@ -12,7 +12,7 @@ index 1307fb5..f645d75 100644 pipeline: mutators: - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 -@@ -10,3 +13,8 @@ pipeline: +@@ -10,3 +13,14 @@ pipeline: - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 configMap: tier: backend @@ -21,6 +21,12 @@ index 1307fb5..f645d75 100644 + - type: Rendered + status: "True" + reason: RenderSuccess ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 ++ exitCode: 0 diff --git a/resources.yaml b/resources.yaml index f2eec52..84cfb26 100644 --- a/resources.yaml diff --git a/e2e/testdata/fn-render/exec-function-stderr/.expected/diff.patch b/e2e/testdata/fn-render/exec-function-stderr/.expected/diff.patch index 3174051755..99cec3474c 100644 --- a/e2e/testdata/fn-render/exec-function-stderr/.expected/diff.patch +++ b/e2e/testdata/fn-render/exec-function-stderr/.expected/diff.patch @@ -1,8 +1,8 @@ diff --git a/Kptfile b/Kptfile -index 6f2fe11..34a53c9 100644 +index 6f2fe11..c0c66f5 100644 --- a/Kptfile +++ b/Kptfile -@@ -4,4 +4,9 @@ metadata: +@@ -4,4 +4,35 @@ metadata: name: app pipeline: mutators: @@ -13,6 +13,32 @@ index 6f2fe11..34a53c9 100644 + - type: Rendered + status: "True" + reason: RenderSuccess ++ renderStatus: ++ mutationSteps: ++ - exec: ./testdata/fn-render/exec-function-stderr/function.sh ++ stderr: | ++ Hello world 0! ++ Hello world 1! ++ Hello world 2! ++ Hello world 3! ++ Hello world 4! ++ Hello world 5! ++ Hello world 6! ++ Hello world 7! ++ Hello world 8! ++ Hello world 9! ++ Hello world 10! ++ Hello world 11! ++ Hello world 12! ++ Hello world 13! ++ Hello world 14! ++ Hello world 15! ++ Hello world 16! ++ Hello world 17! ++ Hello world 18! ++ Hello world 19! ++ Hello world 20! ++ exitCode: 0 diff --git a/resources.yaml b/resources.yaml index 0f69886..ff4bde7 100644 --- a/resources.yaml diff --git a/e2e/testdata/fn-render/exec-function-with-args/.expected/diff.patch b/e2e/testdata/fn-render/exec-function-with-args/.expected/diff.patch index d0bea1c78f..04bdc6d2ec 100644 --- a/e2e/testdata/fn-render/exec-function-with-args/.expected/diff.patch +++ b/e2e/testdata/fn-render/exec-function-with-args/.expected/diff.patch @@ -1,8 +1,8 @@ diff --git a/Kptfile b/Kptfile -index 0d98dbb..0dde5ad 100644 +index 0d98dbb..2f7e1c4 100644 --- a/Kptfile +++ b/Kptfile -@@ -4,4 +4,9 @@ metadata: +@@ -4,4 +4,13 @@ metadata: name: app pipeline: mutators: @@ -13,6 +13,10 @@ index 0d98dbb..0dde5ad 100644 + - type: Rendered + status: "True" + reason: RenderSuccess ++ renderStatus: ++ mutationSteps: ++ - exec: sed -e 's/foo/bar/' ++ exitCode: 0 diff --git a/resources.yaml b/resources.yaml index 0f69886..ff4bde7 100644 --- a/resources.yaml diff --git a/e2e/testdata/fn-render/exec-without-permissions/.expected/diff.patch b/e2e/testdata/fn-render/exec-without-permissions/.expected/diff.patch index 842b64bff6..dba0f67c50 100644 --- a/e2e/testdata/fn-render/exec-without-permissions/.expected/diff.patch +++ b/e2e/testdata/fn-render/exec-without-permissions/.expected/diff.patch @@ -1,8 +1,8 @@ diff --git a/Kptfile b/Kptfile -index 0d98dbb..aba9d69 100644 +index 0d98dbb..a70d5e2 100644 --- a/Kptfile +++ b/Kptfile -@@ -4,4 +4,12 @@ metadata: +@@ -4,4 +4,18 @@ metadata: name: app pipeline: mutators: @@ -16,3 +16,9 @@ index 0d98dbb..aba9d69 100644 + message: |- + pkg.render: pkg .: + pipeline.run: must run with `--allow-exec` option to allow running function binaries ++ renderStatus: ++ mutationSteps: ++ - exec: sed -e 's/foo/bar/' ++ executionError: must run with `--allow-exec` option to allow running function binaries ++ exitCode: 1 ++ errorSummary: 'sed -e ''s/foo/bar/'': must run with `--allow-exec` option to allow running function binaries' diff --git a/e2e/testdata/fn-render/fn-failure-output-no-truncate/.expected/diff.patch b/e2e/testdata/fn-render/fn-failure-output-no-truncate/.expected/diff.patch index 9240aa57d5..3f1808152a 100644 --- a/e2e/testdata/fn-render/fn-failure-output-no-truncate/.expected/diff.patch +++ b/e2e/testdata/fn-render/fn-failure-output-no-truncate/.expected/diff.patch @@ -1,8 +1,8 @@ diff --git a/Kptfile b/Kptfile -index 0586af9..30e8359 100644 +index 0586af9..ff80297 100644 --- a/Kptfile +++ b/Kptfile -@@ -7,3 +7,11 @@ pipeline: +@@ -7,3 +7,59 @@ pipeline: - image: ghcr.io/kptdev/krm-functions-catalog/kubeconform:latest configMap: strict: "true" @@ -14,3 +14,51 @@ index 0586af9..30e8359 100644 + message: |- + pkg.render: pkg .: + pipeline.run: already handled error ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/kubeconform:latest ++ stderr: 'failed to evaluate function: error: function failure' ++ exitCode: 1 ++ results: ++ - message: missing properties 'selector', 'template' ++ severity: error ++ resourceRef: ++ apiVersion: apps/v1 ++ kind: Deployment ++ name: nginx-deployment ++ field: ++ path: spec ++ file: ++ path: resources.yaml ++ - message: got string, want null or integer ++ severity: error ++ resourceRef: ++ apiVersion: apps/v1 ++ kind: Deployment ++ name: nginx-deployment ++ field: ++ path: spec.replicas ++ file: ++ path: resources.yaml ++ errorResults: ++ - message: missing properties 'selector', 'template' ++ severity: error ++ resourceRef: ++ apiVersion: apps/v1 ++ kind: Deployment ++ name: nginx-deployment ++ field: ++ path: spec ++ file: ++ path: resources.yaml ++ - message: got string, want null or integer ++ severity: error ++ resourceRef: ++ apiVersion: apps/v1 ++ kind: Deployment ++ name: nginx-deployment ++ field: ++ path: spec.replicas ++ file: ++ path: resources.yaml ++ errorSummary: 'ghcr.io/kptdev/krm-functions-catalog/kubeconform:latest: exit code 1' diff --git a/e2e/testdata/fn-render/fn-failure/.expected/diff.patch b/e2e/testdata/fn-render/fn-failure/.expected/diff.patch index f75cbdd706..a4b942a5b5 100644 --- a/e2e/testdata/fn-render/fn-failure/.expected/diff.patch +++ b/e2e/testdata/fn-render/fn-failure/.expected/diff.patch @@ -1,8 +1,8 @@ diff --git a/Kptfile b/Kptfile -index 3447ba3..2802b20 100644 +index 3447ba3..9127985 100644 --- a/Kptfile +++ b/Kptfile -@@ -4,12 +4,19 @@ metadata: +@@ -4,12 +4,31 @@ metadata: name: app pipeline: mutators: @@ -31,3 +31,15 @@ index 3447ba3..2802b20 100644 + message: |- + pkg.render: pkg .: + pipeline.run: already handled error ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest ++ stderr: 'failed to evaluate function: error: function failure' ++ exitCode: 1 ++ results: ++ - message: 'httpbin-gen:3:73: got newline, want primary expression' ++ severity: error ++ errorResults: ++ - message: 'httpbin-gen:3:73: got newline, want primary expression' ++ severity: error ++ errorSummary: 'ghcr.io/kptdev/krm-functions-catalog/starlark:latest: exit code 1' diff --git a/e2e/testdata/fn-render/fn-success-with-stderr/.expected/diff.patch b/e2e/testdata/fn-render/fn-success-with-stderr/.expected/diff.patch index 75677018d7..2c13164fa5 100644 --- a/e2e/testdata/fn-render/fn-success-with-stderr/.expected/diff.patch +++ b/e2e/testdata/fn-render/fn-success-with-stderr/.expected/diff.patch @@ -1,8 +1,8 @@ diff --git a/Kptfile b/Kptfile -index f591880..b8c4faf 100644 +index f591880..1a3d92d 100644 --- a/Kptfile +++ b/Kptfile -@@ -6,3 +6,8 @@ pipeline: +@@ -6,3 +6,13 @@ pipeline: mutators: - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest configPath: starlark.yaml @@ -11,3 +11,8 @@ index f591880..b8c4faf 100644 + - type: Rendered + status: "True" + reason: RenderSuccess ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest ++ stderr: function succeeded, reporting it on stderr ++ exitCode: 0 diff --git a/e2e/testdata/fn-render/fnconfig-ancestorfn-not-mutate-subpkg-config/.expected/diff.patch b/e2e/testdata/fn-render/fnconfig-ancestorfn-not-mutate-subpkg-config/.expected/diff.patch index bbae8e2da7..6d24d30dcf 100644 --- a/e2e/testdata/fn-render/fnconfig-ancestorfn-not-mutate-subpkg-config/.expected/diff.patch +++ b/e2e/testdata/fn-render/fnconfig-ancestorfn-not-mutate-subpkg-config/.expected/diff.patch @@ -1,8 +1,8 @@ diff --git a/Kptfile b/Kptfile -index dbab15c..18405ed 100644 +index dbab15c..3eab648 100644 --- a/Kptfile +++ b/Kptfile -@@ -2,8 +2,14 @@ apiVersion: kpt.dev/v1 +@@ -2,8 +2,20 @@ apiVersion: kpt.dev/v1 kind: Kptfile metadata: name: app-with-db @@ -17,6 +17,12 @@ index dbab15c..18405ed 100644 + - type: Rendered + status: "True" + reason: RenderSuccess ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 ++ exitCode: 0 diff --git a/db/Kptfile b/db/Kptfile index 093e789..dfe7f20 100644 --- a/db/Kptfile diff --git a/e2e/testdata/fn-render/fnconfig-in-subdir/.expected/diff.patch b/e2e/testdata/fn-render/fnconfig-in-subdir/.expected/diff.patch index 148387c37b..55da6d2f41 100644 --- a/e2e/testdata/fn-render/fnconfig-in-subdir/.expected/diff.patch +++ b/e2e/testdata/fn-render/fnconfig-in-subdir/.expected/diff.patch @@ -1,8 +1,8 @@ diff --git a/Kptfile b/Kptfile -index 0bfdbb0..2ad56e8 100644 +index 0bfdbb0..f4fdf26 100644 --- a/Kptfile +++ b/Kptfile -@@ -2,7 +2,14 @@ apiVersion: kpt.dev/v1 +@@ -2,7 +2,18 @@ apiVersion: kpt.dev/v1 kind: Kptfile metadata: name: app-with-db @@ -17,6 +17,10 @@ index 0bfdbb0..2ad56e8 100644 + - type: Rendered + status: "True" + reason: RenderSuccess ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 ++ exitCode: 0 diff --git a/db/labelconfig.yaml b/db/labelconfig.yaml index 22d2de2..19e0746 100644 --- a/db/labelconfig.yaml diff --git a/e2e/testdata/fn-render/fnconfig-pkgfn-refers-subdir/.expected/diff.patch b/e2e/testdata/fn-render/fnconfig-pkgfn-refers-subdir/.expected/diff.patch index 5d24d222ce..d6a1725cb7 100644 --- a/e2e/testdata/fn-render/fnconfig-pkgfn-refers-subdir/.expected/diff.patch +++ b/e2e/testdata/fn-render/fnconfig-pkgfn-refers-subdir/.expected/diff.patch @@ -1,8 +1,8 @@ diff --git a/Kptfile b/Kptfile -index c2cf3ba..9f17a64 100644 +index c2cf3ba..d0bbc91 100644 --- a/Kptfile +++ b/Kptfile -@@ -2,7 +2,14 @@ apiVersion: kpt.dev/v1 +@@ -2,7 +2,18 @@ apiVersion: kpt.dev/v1 kind: Kptfile metadata: name: app-with-db @@ -17,6 +17,10 @@ index c2cf3ba..9f17a64 100644 + - type: Rendered + status: "True" + reason: RenderSuccess ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 ++ exitCode: 0 diff --git a/confs/labelconfig.yaml b/confs/labelconfig.yaml index 22d2de2..19e0746 100644 --- a/confs/labelconfig.yaml diff --git a/e2e/testdata/fn-render/fnconfig-updated-in-render/.expected/diff.patch b/e2e/testdata/fn-render/fnconfig-updated-in-render/.expected/diff.patch index 1533d4fe10..d67f7198e0 100644 --- a/e2e/testdata/fn-render/fnconfig-updated-in-render/.expected/diff.patch +++ b/e2e/testdata/fn-render/fnconfig-updated-in-render/.expected/diff.patch @@ -1,5 +1,5 @@ diff --git a/Kptfile b/Kptfile -index 950565f..77b2382 100644 +index 950565f..d9be19c 100644 --- a/Kptfile +++ b/Kptfile @@ -3,7 +3,7 @@ kind: Kptfile @@ -11,7 +11,7 @@ index 950565f..77b2382 100644 annotations: config.kubernetes.io/local-config: "true" info: -@@ -16,3 +16,8 @@ pipeline: +@@ -16,3 +16,19 @@ pipeline: configPath: update-labels.yaml - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 configPath: label-input.yaml @@ -20,6 +20,17 @@ index 950565f..77b2382 100644 + - type: Rendered + status: "True" + reason: RenderSuccess ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.4.1 ++ exitCode: 0 ++ results: ++ - message: namespace "example" updated to "frontend", 2 value(s) changed ++ severity: info ++ - image: ghcr.io/kptdev/krm-functions-catalog/apply-replacements:latest ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 ++ exitCode: 0 diff --git a/app.yaml b/app.yaml index 3361e5b..33f2627 100644 --- a/app.yaml diff --git a/e2e/testdata/fn-render/fnconfig/.expected/diff.patch b/e2e/testdata/fn-render/fnconfig/.expected/diff.patch index 8e0b5d238e..84130da1fc 100644 --- a/e2e/testdata/fn-render/fnconfig/.expected/diff.patch +++ b/e2e/testdata/fn-render/fnconfig/.expected/diff.patch @@ -1,5 +1,5 @@ diff --git a/Kptfile b/Kptfile -index 043dcac..05a7f5c 100644 +index 043dcac..58ddc42 100644 --- a/Kptfile +++ b/Kptfile @@ -2,6 +2,9 @@ apiVersion: kpt.dev/v1 @@ -12,7 +12,7 @@ index 043dcac..05a7f5c 100644 pipeline: mutators: - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 -@@ -9,3 +12,8 @@ pipeline: +@@ -9,3 +12,18 @@ pipeline: namespace: staging - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 configPath: labelconfig.yaml @@ -21,6 +21,16 @@ index 043dcac..05a7f5c 100644 + - type: Rendered + status: "True" + reason: RenderSuccess ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 ++ exitCode: 0 diff --git a/db/Kptfile b/db/Kptfile index 264dd2e..8dd7c37 100644 --- a/db/Kptfile diff --git a/e2e/testdata/fn-render/fnresult-fn-failure/.expected/diff.patch b/e2e/testdata/fn-render/fnresult-fn-failure/.expected/diff.patch index 9240aa57d5..3f1808152a 100644 --- a/e2e/testdata/fn-render/fnresult-fn-failure/.expected/diff.patch +++ b/e2e/testdata/fn-render/fnresult-fn-failure/.expected/diff.patch @@ -1,8 +1,8 @@ diff --git a/Kptfile b/Kptfile -index 0586af9..30e8359 100644 +index 0586af9..ff80297 100644 --- a/Kptfile +++ b/Kptfile -@@ -7,3 +7,11 @@ pipeline: +@@ -7,3 +7,59 @@ pipeline: - image: ghcr.io/kptdev/krm-functions-catalog/kubeconform:latest configMap: strict: "true" @@ -14,3 +14,51 @@ index 0586af9..30e8359 100644 + message: |- + pkg.render: pkg .: + pipeline.run: already handled error ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/kubeconform:latest ++ stderr: 'failed to evaluate function: error: function failure' ++ exitCode: 1 ++ results: ++ - message: missing properties 'selector', 'template' ++ severity: error ++ resourceRef: ++ apiVersion: apps/v1 ++ kind: Deployment ++ name: nginx-deployment ++ field: ++ path: spec ++ file: ++ path: resources.yaml ++ - message: got string, want null or integer ++ severity: error ++ resourceRef: ++ apiVersion: apps/v1 ++ kind: Deployment ++ name: nginx-deployment ++ field: ++ path: spec.replicas ++ file: ++ path: resources.yaml ++ errorResults: ++ - message: missing properties 'selector', 'template' ++ severity: error ++ resourceRef: ++ apiVersion: apps/v1 ++ kind: Deployment ++ name: nginx-deployment ++ field: ++ path: spec ++ file: ++ path: resources.yaml ++ - message: got string, want null or integer ++ severity: error ++ resourceRef: ++ apiVersion: apps/v1 ++ kind: Deployment ++ name: nginx-deployment ++ field: ++ path: spec.replicas ++ file: ++ path: resources.yaml ++ errorSummary: 'ghcr.io/kptdev/krm-functions-catalog/kubeconform:latest: exit code 1' diff --git a/e2e/testdata/fn-render/fnresult-fn-success/.expected/diff.patch b/e2e/testdata/fn-render/fnresult-fn-success/.expected/diff.patch index 50314605f5..1b9752610b 100644 --- a/e2e/testdata/fn-render/fnresult-fn-success/.expected/diff.patch +++ b/e2e/testdata/fn-render/fnresult-fn-success/.expected/diff.patch @@ -1,8 +1,8 @@ diff --git a/Kptfile b/Kptfile -index 3c63ab9..787b279 100644 +index 3c63ab9..775911c 100644 --- a/Kptfile +++ b/Kptfile -@@ -6,3 +6,8 @@ pipeline: +@@ -6,3 +6,18 @@ pipeline: mutators: - image: ghcr.io/kptdev/krm-functions-catalog/search-replace:latest configPath: search-replace-conf.yaml @@ -11,6 +11,16 @@ index 3c63ab9..787b279 100644 + - type: Rendered + status: "True" + reason: RenderSuccess ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/search-replace:latest ++ exitCode: 0 ++ results: ++ - message: Mutated field value to "4" ++ field: ++ path: spec.replicas ++ file: ++ path: resources.yaml diff --git a/resources.yaml b/resources.yaml index f2eec52..114819d 100644 --- a/resources.yaml diff --git a/e2e/testdata/fn-render/fnresult-fn-success/.expected/results.yaml b/e2e/testdata/fn-render/fnresult-fn-success/.expected/results.yaml old mode 100755 new mode 100644 diff --git a/e2e/testdata/fn-render/format-on-success/.expected/diff.patch b/e2e/testdata/fn-render/format-on-success/.expected/diff.patch index d29f851dc9..998b5cf90b 100644 --- a/e2e/testdata/fn-render/format-on-success/.expected/diff.patch +++ b/e2e/testdata/fn-render/format-on-success/.expected/diff.patch @@ -1,8 +1,8 @@ diff --git a/Kptfile b/Kptfile -index dbab15c..18405ed 100644 +index dbab15c..3ab935c 100644 --- a/Kptfile +++ b/Kptfile -@@ -2,8 +2,14 @@ apiVersion: kpt.dev/v1 +@@ -2,8 +2,20 @@ apiVersion: kpt.dev/v1 kind: Kptfile metadata: name: app-with-db @@ -17,6 +17,12 @@ index dbab15c..18405ed 100644 + - type: Rendered + status: "True" + reason: RenderSuccess ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 ++ exitCode: 0 diff --git a/db/Kptfile b/db/Kptfile index 92bb0fc..31aafaa 100644 --- a/db/Kptfile diff --git a/e2e/testdata/fn-render/generator-absolute-path/.expected/diff.patch b/e2e/testdata/fn-render/generator-absolute-path/.expected/diff.patch index c777a2aefb..451e75f312 100644 --- a/e2e/testdata/fn-render/generator-absolute-path/.expected/diff.patch +++ b/e2e/testdata/fn-render/generator-absolute-path/.expected/diff.patch @@ -1,8 +1,8 @@ diff --git a/Kptfile b/Kptfile -index 714d078..7878d56 100644 +index 714d078..84b97ca 100644 --- a/Kptfile +++ b/Kptfile -@@ -6,3 +6,8 @@ pipeline: +@@ -6,3 +6,12 @@ pipeline: mutators: - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest configPath: starlark-httpbin.yaml @@ -11,6 +11,10 @@ index 714d078..7878d56 100644 + - type: Rendered + status: "True" + reason: RenderSuccess ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest ++ exitCode: 0 diff --git a/another/file/out.yaml b/another/file/out.yaml new file mode 100644 index 0000000..f36c98e diff --git a/e2e/testdata/fn-render/generator/.expected/diff.patch b/e2e/testdata/fn-render/generator/.expected/diff.patch index e94718da17..93843baaf1 100644 --- a/e2e/testdata/fn-render/generator/.expected/diff.patch +++ b/e2e/testdata/fn-render/generator/.expected/diff.patch @@ -1,5 +1,5 @@ diff --git a/Kptfile b/Kptfile -index 8050168..9fc6d67 100644 +index 8050168..a201e2b 100644 --- a/Kptfile +++ b/Kptfile @@ -2,6 +2,9 @@ apiVersion: kpt.dev/v1 @@ -12,7 +12,7 @@ index 8050168..9fc6d67 100644 pipeline: mutators: - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 -@@ -10,3 +13,8 @@ pipeline: +@@ -10,3 +13,20 @@ pipeline: - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 configMap: tier: db @@ -21,6 +21,18 @@ index 8050168..9fc6d67 100644 + - type: Rendered + status: "True" + reason: RenderSuccess ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 ++ exitCode: 0 diff --git a/db/Kptfile b/db/Kptfile index 3091f75..b290407 100644 --- a/db/Kptfile diff --git a/e2e/testdata/fn-render/image-pull-policy-never/.expected/config.yaml b/e2e/testdata/fn-render/image-pull-policy-never/.expected/config.yaml index 7c5b5cc8d5..2168736477 100644 --- a/e2e/testdata/fn-render/image-pull-policy-never/.expected/config.yaml +++ b/e2e/testdata/fn-render/image-pull-policy-never/.expected/config.yaml @@ -17,3 +17,4 @@ exitCode: 1 # The output in stderr is different depending on the runtime. # "No such image" is from docker and "image not known" is from podman. stdErrRegEx: No such image|image not known +diffStripRegEx: "\\+\\s+stderr:|docker: Error response from daemon|Run 'docker run|Error:.*image not known|^\\+$" diff --git a/e2e/testdata/fn-render/image-pull-policy-never/.expected/diff.patch b/e2e/testdata/fn-render/image-pull-policy-never/.expected/diff.patch index 4399c3b1e4..3333503b50 100644 --- a/e2e/testdata/fn-render/image-pull-policy-never/.expected/diff.patch +++ b/e2e/testdata/fn-render/image-pull-policy-never/.expected/diff.patch @@ -1,8 +1,8 @@ diff --git a/Kptfile b/Kptfile -index 5b7fc74..e4e96f6 100644 +index 5b7fc74..b2383d6 100644 --- a/Kptfile +++ b/Kptfile -@@ -5,3 +5,11 @@ metadata: +@@ -5,3 +5,20 @@ metadata: pipeline: mutators: - image: ghcr.io/kptdev/krm-functions-catalog/not-exist:latest @@ -14,3 +14,12 @@ index 5b7fc74..e4e96f6 100644 + message: |- + pkg.render: pkg .: + pipeline.run: already handled error ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/not-exist:latest ++ stderr: |- ++ docker: Error response from daemon: No such image: ghcr.io/kptdev/krm-functions-catalog/not-exist:latest ++ ++ Run 'docker run --help' for more information ++ exitCode: 125 ++ errorSummary: 'ghcr.io/kptdev/krm-functions-catalog/not-exist:latest: exit code 125' diff --git a/e2e/testdata/fn-render/krm-check-exclude-kustomize/.expected/diff.patch b/e2e/testdata/fn-render/krm-check-exclude-kustomize/.expected/diff.patch index 12bd34c287..1176e6104b 100644 --- a/e2e/testdata/fn-render/krm-check-exclude-kustomize/.expected/diff.patch +++ b/e2e/testdata/fn-render/krm-check-exclude-kustomize/.expected/diff.patch @@ -1,8 +1,8 @@ diff --git a/Kptfile b/Kptfile -index 2985a1a..7d38821 100644 +index 2985a1a..1cc880e 100644 --- a/Kptfile +++ b/Kptfile -@@ -2,8 +2,15 @@ apiVersion: kpt.dev/v1 +@@ -2,8 +2,19 @@ apiVersion: kpt.dev/v1 kind: Kptfile metadata: name: app @@ -18,6 +18,10 @@ index 2985a1a..7d38821 100644 + - type: Rendered + status: "True" + reason: RenderSuccess ++ renderStatus: ++ mutationSteps: ++ - image: set-labels:v0.1.5 ++ exitCode: 0 diff --git a/kustomization.yaml b/kustomization.yaml index f3f0207..6c517af 100644 --- a/kustomization.yaml diff --git a/e2e/testdata/fn-render/kubeval-failure/.expected/diff.patch b/e2e/testdata/fn-render/kubeval-failure/.expected/diff.patch index 3e2365803f..10b83ce259 100644 --- a/e2e/testdata/fn-render/kubeval-failure/.expected/diff.patch +++ b/e2e/testdata/fn-render/kubeval-failure/.expected/diff.patch @@ -1,8 +1,8 @@ diff --git a/Kptfile b/Kptfile -index 2c6e965..170b12f 100644 +index 2c6e965..481dc83 100644 --- a/Kptfile +++ b/Kptfile -@@ -7,3 +7,11 @@ pipeline: +@@ -7,3 +7,59 @@ pipeline: - image: ghcr.io/kptdev/krm-functions-catalog/kubeconform:latest configMap: strict: "true" @@ -14,3 +14,51 @@ index 2c6e965..170b12f 100644 + message: |- + pkg.render: pkg .: + pipeline.run: already handled error ++ renderStatus: ++ validationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/kubeconform:latest ++ stderr: 'failed to evaluate function: error: function failure' ++ exitCode: 1 ++ results: ++ - message: missing properties 'selector', 'template' ++ severity: error ++ resourceRef: ++ apiVersion: apps/v1 ++ kind: Deployment ++ name: nginx-deployment ++ field: ++ path: spec ++ file: ++ path: resources.yaml ++ - message: got string, want null or integer ++ severity: error ++ resourceRef: ++ apiVersion: apps/v1 ++ kind: Deployment ++ name: nginx-deployment ++ field: ++ path: spec.replicas ++ file: ++ path: resources.yaml ++ errorResults: ++ - message: missing properties 'selector', 'template' ++ severity: error ++ resourceRef: ++ apiVersion: apps/v1 ++ kind: Deployment ++ name: nginx-deployment ++ field: ++ path: spec ++ file: ++ path: resources.yaml ++ - message: got string, want null or integer ++ severity: error ++ resourceRef: ++ apiVersion: apps/v1 ++ kind: Deployment ++ name: nginx-deployment ++ field: ++ path: spec.replicas ++ file: ++ path: resources.yaml ++ errorSummary: 'ghcr.io/kptdev/krm-functions-catalog/kubeconform:latest: exit code 1' diff --git a/e2e/testdata/fn-render/missing-fn-image/.expected/config.yaml b/e2e/testdata/fn-render/missing-fn-image/.expected/config.yaml index faaa67e0e4..9eb3c116bf 100644 --- a/e2e/testdata/fn-render/missing-fn-image/.expected/config.yaml +++ b/e2e/testdata/fn-render/missing-fn-image/.expected/config.yaml @@ -14,3 +14,4 @@ exitCode: 1 StdErrRegEx: "(docker: Error response from daemon: Head.*denied|Error.*initializing source docker)" +diffStripRegEx: "\\+\\s+stderr:|docker: Error response from daemon|Run 'docker run|Error:.*initializing source|^\\+\\s+denied$|^\\+$" diff --git a/e2e/testdata/fn-render/missing-fn-image/.expected/diff.patch b/e2e/testdata/fn-render/missing-fn-image/.expected/diff.patch index 389f40dbd1..b34b260136 100644 --- a/e2e/testdata/fn-render/missing-fn-image/.expected/diff.patch +++ b/e2e/testdata/fn-render/missing-fn-image/.expected/diff.patch @@ -1,8 +1,8 @@ diff --git a/Kptfile b/Kptfile -index 11012de..c9efd96 100644 +index 11012de..9fadb6e 100644 --- a/Kptfile +++ b/Kptfile -@@ -7,6 +7,14 @@ pipeline: +@@ -7,6 +7,26 @@ pipeline: - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 configMap: namespace: staging @@ -18,3 +18,15 @@ index 11012de..c9efd96 100644 + message: |- + pkg.render: pkg .: + pipeline.run: already handled error ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/dne ++ stderr: |- ++ docker: Error response from daemon: error from registry: denied ++ denied ++ ++ Run 'docker run --help' for more information ++ exitCode: 125 ++ errorSummary: 'ghcr.io/kptdev/krm-functions-catalog/dne: exit code 125' diff --git a/e2e/testdata/fn-render/modify-legacy-path-annotation/.expected/diff.patch b/e2e/testdata/fn-render/modify-legacy-path-annotation/.expected/diff.patch index 621f0f4535..47f2a43559 100644 --- a/e2e/testdata/fn-render/modify-legacy-path-annotation/.expected/diff.patch +++ b/e2e/testdata/fn-render/modify-legacy-path-annotation/.expected/diff.patch @@ -1,8 +1,8 @@ diff --git a/Kptfile b/Kptfile -index 5d377d4..784c77a 100644 +index 5d377d4..4c721ab 100644 --- a/Kptfile +++ b/Kptfile -@@ -4,5 +4,10 @@ metadata: +@@ -4,5 +4,14 @@ metadata: name: app pipeline: mutators: @@ -15,6 +15,10 @@ index 5d377d4..784c77a 100644 + - type: Rendered + status: "True" + reason: RenderSuccess ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest ++ exitCode: 0 diff --git a/deployment.yaml b/newfilename.yaml similarity index 100% rename from deployment.yaml diff --git a/e2e/testdata/fn-render/modify-path-annotation/.expected/diff.patch b/e2e/testdata/fn-render/modify-path-annotation/.expected/diff.patch index 1fe2ccb993..8c70da6113 100644 --- a/e2e/testdata/fn-render/modify-path-annotation/.expected/diff.patch +++ b/e2e/testdata/fn-render/modify-path-annotation/.expected/diff.patch @@ -1,8 +1,8 @@ diff --git a/Kptfile b/Kptfile -index 5d377d4..784c77a 100644 +index 5d377d4..4c721ab 100644 --- a/Kptfile +++ b/Kptfile -@@ -4,5 +4,10 @@ metadata: +@@ -4,5 +4,14 @@ metadata: name: app pipeline: mutators: @@ -15,6 +15,10 @@ index 5d377d4..784c77a 100644 + - type: Rendered + status: "True" + reason: RenderSuccess ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest ++ exitCode: 0 diff --git a/deployment.yaml b/newfilename.yaml similarity index 100% rename from deployment.yaml diff --git a/e2e/testdata/fn-render/mutate-legacy-path-index/.expected/diff.patch b/e2e/testdata/fn-render/mutate-legacy-path-index/.expected/diff.patch index d902763451..1edd0d8e8c 100644 --- a/e2e/testdata/fn-render/mutate-legacy-path-index/.expected/diff.patch +++ b/e2e/testdata/fn-render/mutate-legacy-path-index/.expected/diff.patch @@ -1,8 +1,8 @@ diff --git a/Kptfile b/Kptfile -index 894ad57..6a36607 100644 +index 894ad57..2b9cbb7 100644 --- a/Kptfile +++ b/Kptfile -@@ -6,3 +6,8 @@ pipeline: +@@ -6,3 +6,12 @@ pipeline: mutators: - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest configPath: starlark-mutate-path-index.yaml @@ -11,6 +11,10 @@ index 894ad57..6a36607 100644 + - type: Rendered + status: "True" + reason: RenderSuccess ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest ++ exitCode: 0 diff --git a/x.yaml b/y.yaml similarity index 100% rename from x.yaml diff --git a/e2e/testdata/fn-render/mutate-path-index/.expected/diff.patch b/e2e/testdata/fn-render/mutate-path-index/.expected/diff.patch index d902763451..1edd0d8e8c 100644 --- a/e2e/testdata/fn-render/mutate-path-index/.expected/diff.patch +++ b/e2e/testdata/fn-render/mutate-path-index/.expected/diff.patch @@ -1,8 +1,8 @@ diff --git a/Kptfile b/Kptfile -index 894ad57..6a36607 100644 +index 894ad57..2b9cbb7 100644 --- a/Kptfile +++ b/Kptfile -@@ -6,3 +6,8 @@ pipeline: +@@ -6,3 +6,12 @@ pipeline: mutators: - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest configPath: starlark-mutate-path-index.yaml @@ -11,6 +11,10 @@ index 894ad57..6a36607 100644 + - type: Rendered + status: "True" + reason: RenderSuccess ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest ++ exitCode: 0 diff --git a/x.yaml b/y.yaml similarity index 100% rename from x.yaml diff --git a/e2e/testdata/fn-render/no-fnconfig/.expected/diff.patch b/e2e/testdata/fn-render/no-fnconfig/.expected/diff.patch index ff7bd2cd38..e2651c15a5 100644 --- a/e2e/testdata/fn-render/no-fnconfig/.expected/diff.patch +++ b/e2e/testdata/fn-render/no-fnconfig/.expected/diff.patch @@ -1,8 +1,8 @@ diff --git a/Kptfile b/Kptfile -index f2d1249..8b6135d 100644 +index f2d1249..6772376 100644 --- a/Kptfile +++ b/Kptfile -@@ -8,3 +8,11 @@ pipeline: +@@ -8,3 +8,25 @@ pipeline: configMap: namespace: staging - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 @@ -14,3 +14,17 @@ index f2d1249..8b6135d 100644 + message: |- + pkg.render: pkg .: + pipeline.run: already handled error ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 ++ stderr: '[error] : failed to configure function: `functionConfig` must be either a `ConfigMap` or `SetLabels`' ++ exitCode: 1 ++ results: ++ - message: 'failed to configure function: `functionConfig` must be either a `ConfigMap` or `SetLabels`' ++ severity: error ++ errorResults: ++ - message: 'failed to configure function: `functionConfig` must be either a `ConfigMap` or `SetLabels`' ++ severity: error ++ errorSummary: 'ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5: exit code 1' diff --git a/e2e/testdata/fn-render/no-op/.expected/diff.patch b/e2e/testdata/fn-render/no-op/.expected/diff.patch index fe193773c3..a32f35e4c2 100644 --- a/e2e/testdata/fn-render/no-op/.expected/diff.patch +++ b/e2e/testdata/fn-render/no-op/.expected/diff.patch @@ -1,8 +1,8 @@ diff --git a/Kptfile b/Kptfile -index a7a2d0b..2b5abc5 100644 +index a7a2d0b..ed39ce3 100644 --- a/Kptfile +++ b/Kptfile -@@ -5,3 +5,8 @@ metadata: +@@ -5,3 +5,12 @@ metadata: pipeline: mutators: - image: ghcr.io/kptdev/krm-functions-catalog/no-op @@ -11,3 +11,7 @@ index a7a2d0b..2b5abc5 100644 + - type: Rendered + status: "True" + reason: RenderSuccess ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/no-op ++ exitCode: 0 diff --git a/e2e/testdata/fn-render/no-pipeline-in-subpackage/.expected/diff.patch b/e2e/testdata/fn-render/no-pipeline-in-subpackage/.expected/diff.patch index 00ca968e52..abdd0e61c8 100644 --- a/e2e/testdata/fn-render/no-pipeline-in-subpackage/.expected/diff.patch +++ b/e2e/testdata/fn-render/no-pipeline-in-subpackage/.expected/diff.patch @@ -1,5 +1,5 @@ diff --git a/Kptfile b/Kptfile -index 1307fb5..f645d75 100644 +index 1307fb5..fee64dc 100644 --- a/Kptfile +++ b/Kptfile @@ -2,6 +2,9 @@ apiVersion: kpt.dev/v1 @@ -12,7 +12,7 @@ index 1307fb5..f645d75 100644 pipeline: mutators: - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 -@@ -10,3 +13,8 @@ pipeline: +@@ -10,3 +13,14 @@ pipeline: - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 configMap: tier: backend @@ -21,6 +21,12 @@ index 1307fb5..f645d75 100644 + - type: Rendered + status: "True" + reason: RenderSuccess ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 ++ exitCode: 0 diff --git a/db/Kptfile b/db/Kptfile index 79b7a5a..15f086b 100644 --- a/db/Kptfile diff --git a/e2e/testdata/fn-render/no-resources/.expected/diff.patch b/e2e/testdata/fn-render/no-resources/.expected/diff.patch index 9ef07fea9a..89078f13a1 100644 --- a/e2e/testdata/fn-render/no-resources/.expected/diff.patch +++ b/e2e/testdata/fn-render/no-resources/.expected/diff.patch @@ -1,8 +1,8 @@ diff --git a/Kptfile b/Kptfile -index 714d078..7878d56 100644 +index 714d078..84b97ca 100644 --- a/Kptfile +++ b/Kptfile -@@ -6,3 +6,8 @@ pipeline: +@@ -6,3 +6,12 @@ pipeline: mutators: - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest configPath: starlark-httpbin.yaml @@ -11,6 +11,10 @@ index 714d078..7878d56 100644 + - type: Rendered + status: "True" + reason: RenderSuccess ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest ++ exitCode: 0 diff --git a/another/file/out.yaml b/another/file/out.yaml new file mode 100644 index 0000000..fe3c0c6 diff --git a/e2e/testdata/fn-render/non-krm-resource/.expected/diff.patch b/e2e/testdata/fn-render/non-krm-resource/.expected/diff.patch index 614f7e37a8..0bfaf1db32 100644 --- a/e2e/testdata/fn-render/non-krm-resource/.expected/diff.patch +++ b/e2e/testdata/fn-render/non-krm-resource/.expected/diff.patch @@ -1,8 +1,8 @@ diff --git a/Kptfile b/Kptfile -index 1307fb5..630017f 100644 +index 1307fb5..a5c31bf 100644 --- a/Kptfile +++ b/Kptfile -@@ -10,3 +10,11 @@ pipeline: +@@ -10,3 +10,17 @@ pipeline: - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 configMap: tier: backend @@ -14,3 +14,9 @@ index 1307fb5..630017f 100644 + message: |- + pkg.render: pkg .: + pipeline.run: input resource list must contain only KRM resources: non-krm.yaml: resource must have `apiVersion` ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 ++ executionError: 'input resource list must contain only KRM resources: non-krm.yaml: resource must have `apiVersion`' ++ exitCode: 1 ++ errorSummary: 'ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0: input resource list must contain only KRM resources: non-krm.yaml: resource must have `apiVersion`' diff --git a/e2e/testdata/fn-render/path-index-ancestor/.expected/diff.patch b/e2e/testdata/fn-render/path-index-ancestor/.expected/diff.patch index 9ef7c42449..813c9082f5 100644 --- a/e2e/testdata/fn-render/path-index-ancestor/.expected/diff.patch +++ b/e2e/testdata/fn-render/path-index-ancestor/.expected/diff.patch @@ -1,8 +1,8 @@ diff --git a/Kptfile b/Kptfile -index ac710dc..6762952 100644 +index ac710dc..7464619 100644 --- a/Kptfile +++ b/Kptfile -@@ -2,3 +2,11 @@ apiVersion: kpt.dev/v1 +@@ -2,3 +2,17 @@ apiVersion: kpt.dev/v1 kind: Kptfile metadata: name: app-with-generator @@ -14,3 +14,9 @@ index ac710dc..6762952 100644 + message: |- + pkg.render: pkg ./db: + pipeline.run: function must not modify resources outside of package: resource has path ../deployment_httpbin.yaml ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest ++ executionError: 'function must not modify resources outside of package: resource has path ../deployment_httpbin.yaml' ++ exitCode: 1 ++ errorSummary: 'ghcr.io/kptdev/krm-functions-catalog/starlark:latest: function must not modify resources outside of package: resource has path ../deployment_httpbin.yaml' diff --git a/e2e/testdata/fn-render/path-index-current/.expected/diff.patch b/e2e/testdata/fn-render/path-index-current/.expected/diff.patch index c06c7881cb..23c1ab2538 100644 --- a/e2e/testdata/fn-render/path-index-current/.expected/diff.patch +++ b/e2e/testdata/fn-render/path-index-current/.expected/diff.patch @@ -1,8 +1,8 @@ diff --git a/Kptfile b/Kptfile -index 0f5d7db..4525813 100644 +index 0f5d7db..3ac3611 100644 --- a/Kptfile +++ b/Kptfile -@@ -6,3 +6,8 @@ pipeline: +@@ -6,3 +6,12 @@ pipeline: mutators: - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest configPath: starlark-httpbin-gen.yaml @@ -11,6 +11,10 @@ index 0f5d7db..4525813 100644 + - type: Rendered + status: "True" + reason: RenderSuccess ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest ++ exitCode: 0 diff --git a/deployment_httpbin.yaml b/deployment_httpbin.yaml new file mode 100644 index 0000000..f36c98e diff --git a/e2e/testdata/fn-render/path-index-descendent/.expected/diff.patch b/e2e/testdata/fn-render/path-index-descendent/.expected/diff.patch index 201a8b079f..73b4916a12 100644 --- a/e2e/testdata/fn-render/path-index-descendent/.expected/diff.patch +++ b/e2e/testdata/fn-render/path-index-descendent/.expected/diff.patch @@ -1,8 +1,8 @@ diff --git a/Kptfile b/Kptfile -index 0f5d7db..4525813 100644 +index 0f5d7db..3ac3611 100644 --- a/Kptfile +++ b/Kptfile -@@ -6,3 +6,8 @@ pipeline: +@@ -6,3 +6,12 @@ pipeline: mutators: - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest configPath: starlark-httpbin-gen.yaml @@ -11,6 +11,10 @@ index 0f5d7db..4525813 100644 + - type: Rendered + status: "True" + reason: RenderSuccess ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest ++ exitCode: 0 diff --git a/db/deployment_httpbin.yaml b/db/deployment_httpbin.yaml new file mode 100644 index 0000000..f36c98e diff --git a/e2e/testdata/fn-render/path-index-duplicate/.expected/diff.patch b/e2e/testdata/fn-render/path-index-duplicate/.expected/diff.patch index dbe8b9918f..880be0a560 100644 --- a/e2e/testdata/fn-render/path-index-duplicate/.expected/diff.patch +++ b/e2e/testdata/fn-render/path-index-duplicate/.expected/diff.patch @@ -1,8 +1,8 @@ diff --git a/Kptfile b/Kptfile -index ef99dad..44bcb32 100644 +index ef99dad..2d02fa0 100644 --- a/Kptfile +++ b/Kptfile -@@ -6,3 +6,11 @@ pipeline: +@@ -6,3 +6,17 @@ pipeline: mutators: - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest configPath: starlark-gen-duplicate-path.yaml @@ -14,3 +14,9 @@ index ef99dad..44bcb32 100644 + message: |- + pkg.render: pkg .: + pipeline.run: resource at path "resources.yaml" and index "0" already exists ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest ++ executionError: resource at path "resources.yaml" and index "0" already exists ++ exitCode: 1 ++ errorSummary: 'ghcr.io/kptdev/krm-functions-catalog/starlark:latest: resource at path "resources.yaml" and index "0" already exists' diff --git a/e2e/testdata/fn-render/path-index-outofpackage/.expected/diff.patch b/e2e/testdata/fn-render/path-index-outofpackage/.expected/diff.patch index 7017de0ffd..9228cbd669 100644 --- a/e2e/testdata/fn-render/path-index-outofpackage/.expected/diff.patch +++ b/e2e/testdata/fn-render/path-index-outofpackage/.expected/diff.patch @@ -1,8 +1,8 @@ diff --git a/Kptfile b/Kptfile -index ac710dc..2d1632d 100644 +index ac710dc..79ba494 100644 --- a/Kptfile +++ b/Kptfile -@@ -2,3 +2,11 @@ apiVersion: kpt.dev/v1 +@@ -2,3 +2,17 @@ apiVersion: kpt.dev/v1 kind: Kptfile metadata: name: app-with-generator @@ -14,3 +14,9 @@ index ac710dc..2d1632d 100644 + message: |- + pkg.render: pkg ./db: + pipeline.run: function must not modify resources outside of package: resource has path ../notpkg/deployment_httpbin.yaml ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest ++ executionError: 'function must not modify resources outside of package: resource has path ../notpkg/deployment_httpbin.yaml' ++ exitCode: 1 ++ errorSummary: 'ghcr.io/kptdev/krm-functions-catalog/starlark:latest: function must not modify resources outside of package: resource has path ../notpkg/deployment_httpbin.yaml' diff --git a/e2e/testdata/fn-render/preserve-comments/.expected/diff.patch b/e2e/testdata/fn-render/preserve-comments/.expected/diff.patch index d9752bbacb..10a702f706 100644 --- a/e2e/testdata/fn-render/preserve-comments/.expected/diff.patch +++ b/e2e/testdata/fn-render/preserve-comments/.expected/diff.patch @@ -1,8 +1,8 @@ diff --git a/Kptfile b/Kptfile -index 828d292..2228d2c 100644 +index 828d292..7502f3c 100644 --- a/Kptfile +++ b/Kptfile -@@ -5,3 +5,8 @@ metadata: +@@ -5,3 +5,12 @@ metadata: pipeline: mutators: - image: ghcr.io/kptdev/krm-functions-catalog/drop-comments:v0.1 @@ -11,3 +11,7 @@ index 828d292..2228d2c 100644 + - type: Rendered + status: "True" + reason: RenderSuccess ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/drop-comments:v0.1 ++ exitCode: 0 diff --git a/e2e/testdata/fn-render/preserve-order-null-values/.expected/diff.patch b/e2e/testdata/fn-render/preserve-order-null-values/.expected/diff.patch index e0b6032aa8..7d2dc06add 100644 --- a/e2e/testdata/fn-render/preserve-order-null-values/.expected/diff.patch +++ b/e2e/testdata/fn-render/preserve-order-null-values/.expected/diff.patch @@ -1,5 +1,5 @@ diff --git a/Kptfile b/Kptfile -index 1307fb5..f645d75 100644 +index 1307fb5..fee64dc 100644 --- a/Kptfile +++ b/Kptfile @@ -2,6 +2,9 @@ apiVersion: kpt.dev/v1 @@ -12,7 +12,7 @@ index 1307fb5..f645d75 100644 pipeline: mutators: - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 -@@ -10,3 +13,8 @@ pipeline: +@@ -10,3 +13,14 @@ pipeline: - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 configMap: tier: backend @@ -21,6 +21,12 @@ index 1307fb5..f645d75 100644 + - type: Rendered + status: "True" + reason: RenderSuccess ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 ++ exitCode: 0 diff --git a/resources.yaml b/resources.yaml index f410b70..b58c04c 100644 --- a/resources.yaml diff --git a/e2e/testdata/fn-render/resource-deletion/.expected/diff.patch b/e2e/testdata/fn-render/resource-deletion/.expected/diff.patch index d161537ad5..04b6c91dd9 100644 --- a/e2e/testdata/fn-render/resource-deletion/.expected/diff.patch +++ b/e2e/testdata/fn-render/resource-deletion/.expected/diff.patch @@ -1,5 +1,5 @@ diff --git a/Kptfile b/Kptfile -index 364e274..9ad7200 100644 +index 364e274..f17e769 100644 --- a/Kptfile +++ b/Kptfile @@ -2,6 +2,9 @@ apiVersion: kpt.dev/v1 @@ -12,7 +12,7 @@ index 364e274..9ad7200 100644 pipeline: mutators: - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest -@@ -12,3 +15,8 @@ pipeline: +@@ -12,3 +15,16 @@ pipeline: - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 configMap: tier: backend @@ -21,6 +21,14 @@ index 364e274..9ad7200 100644 + - type: Rendered + status: "True" + reason: RenderSuccess ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 ++ exitCode: 0 diff --git a/deployment_httpbin.yaml b/deployment_httpbin.yaml deleted file mode 100644 index 49d4f6e..0000000 diff --git a/e2e/testdata/fn-render/resource-has-pkgname-prefix/.expected/diff.patch b/e2e/testdata/fn-render/resource-has-pkgname-prefix/.expected/diff.patch index 7d3014762d..0b6b2bfd84 100644 --- a/e2e/testdata/fn-render/resource-has-pkgname-prefix/.expected/diff.patch +++ b/e2e/testdata/fn-render/resource-has-pkgname-prefix/.expected/diff.patch @@ -1,8 +1,8 @@ diff --git a/Kptfile b/Kptfile -index 21d9773..94b2528 100644 +index 21d9773..da35b9b 100644 --- a/Kptfile +++ b/Kptfile -@@ -2,8 +2,15 @@ apiVersion: kpt.dev/v1 +@@ -2,8 +2,102 @@ apiVersion: kpt.dev/v1 kind: Kptfile metadata: name: wordpress @@ -18,6 +18,93 @@ index 21d9773..94b2528 100644 + - type: Rendered + status: "True" + reason: RenderSuccess ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-annotations:latest ++ exitCode: 0 ++ results: ++ - message: 'set annotations: {"foo":"bar"}' ++ field: ++ path: metadata.annotations ++ file: ++ path: Kptfile ++ - message: 'set annotations: {"foo":"bar"}' ++ field: ++ path: metadata.annotations ++ file: ++ path: mysql-deployment.yaml ++ - message: 'set annotations: {"foo":"bar"}' ++ field: ++ path: metadata.annotations ++ file: ++ path: mysql-deployment.yaml ++ index: 1 ++ - message: 'set annotations: {"foo":"bar"}' ++ field: ++ path: metadata.annotations ++ file: ++ path: mysql-deployment.yaml ++ index: 2 ++ - message: 'set annotations: {"foo":"bar"}' ++ field: ++ path: spec.template.metadata.annotations ++ file: ++ path: mysql-deployment.yaml ++ index: 2 ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-annotations:latest ++ exitCode: 0 ++ results: ++ - message: 'set annotations: {"abc":"def"}' ++ field: ++ path: metadata.annotations ++ file: ++ path: Kptfile ++ - message: 'set annotations: {"abc":"def"}' ++ field: ++ path: metadata.annotations ++ file: ++ path: mysql-deployment.yaml ++ - message: 'set annotations: {"abc":"def"}' ++ field: ++ path: metadata.annotations ++ file: ++ path: mysql-deployment.yaml ++ index: 1 ++ - message: 'set annotations: {"abc":"def"}' ++ field: ++ path: metadata.annotations ++ file: ++ path: mysql-deployment.yaml ++ index: 2 ++ - message: 'set annotations: {"abc":"def"}' ++ field: ++ path: spec.template.metadata.annotations ++ file: ++ path: mysql-deployment.yaml ++ index: 2 ++ - message: 'set annotations: {"abc":"def"}' ++ field: ++ path: metadata.annotations ++ file: ++ path: wordpress-deployment.yaml ++ - message: 'set annotations: {"abc":"def"}' ++ field: ++ path: metadata.annotations ++ file: ++ path: wordpress-deployment.yaml ++ index: 1 ++ - message: 'set annotations: {"abc":"def"}' ++ field: ++ path: metadata.annotations ++ file: ++ path: wordpress-deployment.yaml ++ index: 2 ++ - message: 'set annotations: {"abc":"def"}' ++ field: ++ path: spec.template.metadata.annotations ++ file: ++ path: wordpress-deployment.yaml ++ index: 2 diff --git a/mysql/Kptfile b/mysql/Kptfile index 3d51a77..965bc63 100644 --- a/mysql/Kptfile diff --git a/e2e/testdata/fn-render/save-on-render-failure/bfs-basicpipeline/.expected/config.yaml b/e2e/testdata/fn-render/save-on-render-failure/bfs-basicpipeline/.expected/config.yaml index 2eba311bad..f6237512ca 100644 --- a/e2e/testdata/fn-render/save-on-render-failure/bfs-basicpipeline/.expected/config.yaml +++ b/e2e/testdata/fn-render/save-on-render-failure/bfs-basicpipeline/.expected/config.yaml @@ -1,2 +1 @@ exitCode: 1 -StdErrRegEx: "(docker: Error response from daemon: Head.*denied|Error.*initializing source docker)" diff --git a/e2e/testdata/fn-render/save-on-render-failure/bfs-basicpipeline/.expected/diff.patch b/e2e/testdata/fn-render/save-on-render-failure/bfs-basicpipeline/.expected/diff.patch index e9382ce252..402f36c76f 100644 --- a/e2e/testdata/fn-render/save-on-render-failure/bfs-basicpipeline/.expected/diff.patch +++ b/e2e/testdata/fn-render/save-on-render-failure/bfs-basicpipeline/.expected/diff.patch @@ -1,8 +1,8 @@ diff --git a/Kptfile b/Kptfile -index ec2c042..50c2a18 100644 +index 8e0454e..f230a89 100644 --- a/Kptfile +++ b/Kptfile -@@ -1,18 +1,28 @@ +@@ -1,18 +1,43 @@ apiVersion: kpt.dev/v1 kind: Kptfile metadata: @@ -21,18 +21,17 @@ index ec2c042..50c2a18 100644 - - image: ghcr.io/kptdev/krm-functions-catalog/set-annotations:v0.1.4 - configMap: - app: myapp -- - image: invalid-image:v0.0.0 -- configMap: -- tier: backend +- - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest +- configPath: starlark-fn-failure.yaml +- + - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 + configMap: + namespace: staging + - image: ghcr.io/kptdev/krm-functions-catalog/set-annotations:v0.1.4 + configMap: + app: myapp -+ - image: invalid-image:v0.0.0 -+ configMap: -+ tier: backend ++ - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest ++ configPath: starlark-fn-failure.yaml +status: + conditions: + - type: Rendered @@ -41,6 +40,22 @@ index ec2c042..50c2a18 100644 + message: |- + pkg.render: pkg .: + pipeline.run: already handled error ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-annotations:v0.1.4 ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest ++ stderr: 'failed to evaluate function: error: function failure' ++ exitCode: 1 ++ results: ++ - message: 'fail: intentional failure for testing' ++ severity: error ++ errorResults: ++ - message: 'fail: intentional failure for testing' ++ severity: error ++ errorSummary: 'ghcr.io/kptdev/krm-functions-catalog/starlark:latest: exit code 1' diff --git a/resources.yaml b/resources.yaml index 0848ba0..7eece9b 100644 --- a/resources.yaml @@ -58,3 +73,17 @@ index 0848ba0..7eece9b 100644 + metadata: + annotations: + app: myapp +diff --git a/starlark-fn-failure.yaml b/starlark-fn-failure.yaml +index 55ceaae..d2841c7 100644 +--- a/starlark-fn-failure.yaml ++++ b/starlark-fn-failure.yaml +@@ -2,6 +2,9 @@ apiVersion: fn.kpt.dev/v1alpha1 + kind: StarlarkRun + metadata: + name: always-fail ++ annotations: ++ app: myapp ++ namespace: staging + source: | + def fail_fn(items): + fail("intentional failure for testing") diff --git a/e2e/testdata/fn-render/save-on-render-failure/bfs-basicpipeline/Kptfile b/e2e/testdata/fn-render/save-on-render-failure/bfs-basicpipeline/Kptfile index ec2c042dc7..8e0454e8d8 100644 --- a/e2e/testdata/fn-render/save-on-render-failure/bfs-basicpipeline/Kptfile +++ b/e2e/testdata/fn-render/save-on-render-failure/bfs-basicpipeline/Kptfile @@ -13,6 +13,6 @@ pipeline: - image: ghcr.io/kptdev/krm-functions-catalog/set-annotations:v0.1.4 configMap: app: myapp - - image: invalid-image:v0.0.0 - configMap: - tier: backend + - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest + configPath: starlark-fn-failure.yaml + diff --git a/e2e/testdata/fn-render/save-on-render-failure/bfs-basicpipeline/starlark-fn-failure.yaml b/e2e/testdata/fn-render/save-on-render-failure/bfs-basicpipeline/starlark-fn-failure.yaml new file mode 100644 index 0000000000..55ceaaebff --- /dev/null +++ b/e2e/testdata/fn-render/save-on-render-failure/bfs-basicpipeline/starlark-fn-failure.yaml @@ -0,0 +1,8 @@ +apiVersion: fn.kpt.dev/v1alpha1 +kind: StarlarkRun +metadata: + name: always-fail +source: | + def fail_fn(items): + fail("intentional failure for testing") + fail_fn(ctx.resource_list["items"]) diff --git a/e2e/testdata/fn-render/save-on-render-failure/bfs-deep-nested-middle-fails/.expected/config.yaml b/e2e/testdata/fn-render/save-on-render-failure/bfs-deep-nested-middle-fails/.expected/config.yaml index 2eba311bad..f6237512ca 100644 --- a/e2e/testdata/fn-render/save-on-render-failure/bfs-deep-nested-middle-fails/.expected/config.yaml +++ b/e2e/testdata/fn-render/save-on-render-failure/bfs-deep-nested-middle-fails/.expected/config.yaml @@ -1,2 +1 @@ exitCode: 1 -StdErrRegEx: "(docker: Error response from daemon: Head.*denied|Error.*initializing source docker)" diff --git a/e2e/testdata/fn-render/save-on-render-failure/bfs-deep-nested-middle-fails/.expected/diff.patch b/e2e/testdata/fn-render/save-on-render-failure/bfs-deep-nested-middle-fails/.expected/diff.patch index 0544ac3be1..fbcacec6b2 100644 --- a/e2e/testdata/fn-render/save-on-render-failure/bfs-deep-nested-middle-fails/.expected/diff.patch +++ b/e2e/testdata/fn-render/save-on-render-failure/bfs-deep-nested-middle-fails/.expected/diff.patch @@ -1,8 +1,8 @@ diff --git a/Kptfile b/Kptfile -index dbd6541..915dd4b 100644 +index dbd6541..ad87335 100644 --- a/Kptfile +++ b/Kptfile -@@ -1,14 +1,24 @@ +@@ -1,14 +1,41 @@ apiVersion: kpt.dev/v1 kind: Kptfile metadata: @@ -29,6 +29,23 @@ index dbd6541..915dd4b 100644 + message: |- + pkg.render: pkg .: + pipeline.run: pkg ./level1: already handled error ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 ++ exitCode: 0 ++ validationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest ++ stderr: 'failed to evaluate function: error: function failure' ++ exitCode: 1 ++ results: ++ - message: 'fail: intentional failure for testing' ++ severity: error ++ errorResults: ++ - message: 'fail: intentional failure for testing' ++ severity: error ++ errorSummary: 'ghcr.io/kptdev/krm-functions-catalog/starlark:latest: exit code 1' diff --git a/configmap.yaml b/configmap.yaml index 59bb817..19a7ead 100644 --- a/configmap.yaml @@ -42,7 +59,7 @@ index 59bb817..19a7ead 100644 data: level: root diff --git a/level1/Kptfile b/level1/Kptfile -index b5960dd..b42f153 100644 +index 2bc48be..ec5f5a7 100644 --- a/level1/Kptfile +++ b/level1/Kptfile @@ -2,6 +2,8 @@ apiVersion: kpt.dev/v1 @@ -96,3 +113,16 @@ index ab7d3fa..1eeeaed 100644 + level: level1 data: level: level2 +diff --git a/level1/starlark-fn-failure.yaml b/level1/starlark-fn-failure.yaml +index 55ceaae..34c320f 100644 +--- a/level1/starlark-fn-failure.yaml ++++ b/level1/starlark-fn-failure.yaml +@@ -2,6 +2,8 @@ apiVersion: fn.kpt.dev/v1alpha1 + kind: StarlarkRun + metadata: + name: always-fail ++ labels: ++ level: level1 + source: | + def fail_fn(items): + fail("intentional failure for testing") diff --git a/e2e/testdata/fn-render/save-on-render-failure/bfs-deep-nested-middle-fails/level1/Kptfile b/e2e/testdata/fn-render/save-on-render-failure/bfs-deep-nested-middle-fails/level1/Kptfile index b5960dd7a7..2bc48be98e 100644 --- a/e2e/testdata/fn-render/save-on-render-failure/bfs-deep-nested-middle-fails/level1/Kptfile +++ b/e2e/testdata/fn-render/save-on-render-failure/bfs-deep-nested-middle-fails/level1/Kptfile @@ -10,4 +10,5 @@ pipeline: configMap: level: level1 validators: - - image: ghcr.io/kptdev/krm-functions-catalog/invalid-image:v0.0.0 + - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest + configPath: starlark-fn-failure.yaml diff --git a/e2e/testdata/fn-render/save-on-render-failure/bfs-deep-nested-middle-fails/level1/starlark-fn-failure.yaml b/e2e/testdata/fn-render/save-on-render-failure/bfs-deep-nested-middle-fails/level1/starlark-fn-failure.yaml new file mode 100644 index 0000000000..55ceaaebff --- /dev/null +++ b/e2e/testdata/fn-render/save-on-render-failure/bfs-deep-nested-middle-fails/level1/starlark-fn-failure.yaml @@ -0,0 +1,8 @@ +apiVersion: fn.kpt.dev/v1alpha1 +kind: StarlarkRun +metadata: + name: always-fail +source: | + def fail_fn(items): + fail("intentional failure for testing") + fail_fn(ctx.resource_list["items"]) diff --git a/e2e/testdata/fn-render/save-on-render-failure/bfs-multiple-subpkgs-one-fails/.expected/config.yaml b/e2e/testdata/fn-render/save-on-render-failure/bfs-multiple-subpkgs-one-fails/.expected/config.yaml index 2eba311bad..f6237512ca 100644 --- a/e2e/testdata/fn-render/save-on-render-failure/bfs-multiple-subpkgs-one-fails/.expected/config.yaml +++ b/e2e/testdata/fn-render/save-on-render-failure/bfs-multiple-subpkgs-one-fails/.expected/config.yaml @@ -1,2 +1 @@ exitCode: 1 -StdErrRegEx: "(docker: Error response from daemon: Head.*denied|Error.*initializing source docker)" diff --git a/e2e/testdata/fn-render/save-on-render-failure/bfs-multiple-subpkgs-one-fails/.expected/diff.patch b/e2e/testdata/fn-render/save-on-render-failure/bfs-multiple-subpkgs-one-fails/.expected/diff.patch index 8ddd89fefa..425955484a 100644 --- a/e2e/testdata/fn-render/save-on-render-failure/bfs-multiple-subpkgs-one-fails/.expected/diff.patch +++ b/e2e/testdata/fn-render/save-on-render-failure/bfs-multiple-subpkgs-one-fails/.expected/diff.patch @@ -1,5 +1,5 @@ diff --git a/Kptfile b/Kptfile -index e9fad85..48186b1 100644 +index e9fad85..b0d2fb6 100644 --- a/Kptfile +++ b/Kptfile @@ -1,10 +1,12 @@ @@ -16,7 +16,7 @@ index e9fad85..48186b1 100644 info: description: BFS - Multiple subpackages, sub2 fails pipeline: -@@ -12,3 +14,11 @@ pipeline: +@@ -12,3 +14,30 @@ pipeline: - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 configMap: pkg: root @@ -28,6 +28,25 @@ index e9fad85..48186b1 100644 + message: |- + pkg.render: pkg .: + pipeline.run: pkg ./sub2: already handled error ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 ++ exitCode: 0 ++ validationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest ++ stderr: 'failed to evaluate function: error: function failure' ++ exitCode: 1 ++ results: ++ - message: 'fail: intentional failure for testing' ++ severity: error ++ errorResults: ++ - message: 'fail: intentional failure for testing' ++ severity: error ++ errorSummary: 'ghcr.io/kptdev/krm-functions-catalog/starlark:latest: exit code 1' diff --git a/service.yaml b/service.yaml index 9148b9b..2e551c8 100644 --- a/service.yaml @@ -76,7 +95,7 @@ index 2f649ba..c2245a9 100644 + labels: + pkg: sub1 diff --git a/sub2/Kptfile b/sub2/Kptfile -index 792277c..6412843 100644 +index 853d3f0..89cfa33 100644 --- a/sub2/Kptfile +++ b/sub2/Kptfile @@ -2,6 +2,8 @@ apiVersion: kpt.dev/v1 @@ -107,6 +126,19 @@ index 20375ea..7290360 100644 + metadata: + labels: + pkg: sub2 +diff --git a/sub2/starlark-fn-failure.yaml b/sub2/starlark-fn-failure.yaml +index 55ceaae..5b9cf38 100644 +--- a/sub2/starlark-fn-failure.yaml ++++ b/sub2/starlark-fn-failure.yaml +@@ -2,6 +2,8 @@ apiVersion: fn.kpt.dev/v1alpha1 + kind: StarlarkRun + metadata: + name: always-fail ++ labels: ++ pkg: sub2 + source: | + def fail_fn(items): + fail("intentional failure for testing") diff --git a/sub3/Kptfile b/sub3/Kptfile index ff35b98..958a351 100644 --- a/sub3/Kptfile diff --git a/e2e/testdata/fn-render/save-on-render-failure/bfs-multiple-subpkgs-one-fails/sub2/Kptfile b/e2e/testdata/fn-render/save-on-render-failure/bfs-multiple-subpkgs-one-fails/sub2/Kptfile index 792277c2b0..853d3f0df5 100644 --- a/e2e/testdata/fn-render/save-on-render-failure/bfs-multiple-subpkgs-one-fails/sub2/Kptfile +++ b/e2e/testdata/fn-render/save-on-render-failure/bfs-multiple-subpkgs-one-fails/sub2/Kptfile @@ -8,4 +8,5 @@ pipeline: configMap: pkg: sub2 validators: - - image: ghcr.io/kptdev/krm-functions-catalog/invalid-image:v0.0.0 + - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest + configPath: starlark-fn-failure.yaml diff --git a/e2e/testdata/fn-render/save-on-render-failure/bfs-multiple-subpkgs-one-fails/sub2/starlark-fn-failure.yaml b/e2e/testdata/fn-render/save-on-render-failure/bfs-multiple-subpkgs-one-fails/sub2/starlark-fn-failure.yaml new file mode 100644 index 0000000000..55ceaaebff --- /dev/null +++ b/e2e/testdata/fn-render/save-on-render-failure/bfs-multiple-subpkgs-one-fails/sub2/starlark-fn-failure.yaml @@ -0,0 +1,8 @@ +apiVersion: fn.kpt.dev/v1alpha1 +kind: StarlarkRun +metadata: + name: always-fail +source: | + def fail_fn(items): + fail("intentional failure for testing") + fail_fn(ctx.resource_list["items"]) diff --git a/e2e/testdata/fn-render/save-on-render-failure/bfs-parent-and-subpkg-both-fail/.expected/config.yaml b/e2e/testdata/fn-render/save-on-render-failure/bfs-parent-and-subpkg-both-fail/.expected/config.yaml index 2eba311bad..f6237512ca 100644 --- a/e2e/testdata/fn-render/save-on-render-failure/bfs-parent-and-subpkg-both-fail/.expected/config.yaml +++ b/e2e/testdata/fn-render/save-on-render-failure/bfs-parent-and-subpkg-both-fail/.expected/config.yaml @@ -1,2 +1 @@ exitCode: 1 -StdErrRegEx: "(docker: Error response from daemon: Head.*denied|Error.*initializing source docker)" diff --git a/e2e/testdata/fn-render/save-on-render-failure/bfs-parent-and-subpkg-both-fail/.expected/diff.patch b/e2e/testdata/fn-render/save-on-render-failure/bfs-parent-and-subpkg-both-fail/.expected/diff.patch index e5e2e83e81..3512029e33 100644 --- a/e2e/testdata/fn-render/save-on-render-failure/bfs-parent-and-subpkg-both-fail/.expected/diff.patch +++ b/e2e/testdata/fn-render/save-on-render-failure/bfs-parent-and-subpkg-both-fail/.expected/diff.patch @@ -1,14 +1,12 @@ diff --git a/Kptfile b/Kptfile -index cbe756f..8ce300c 100644 +index 867a54b..6ccc3b8 100644 --- a/Kptfile +++ b/Kptfile -@@ -1,10 +1,12 @@ +@@ -1,10 +1,10 @@ apiVersion: kpt.dev/v1 kind: Kptfile metadata: + name: bfs-parent-and-subpkg-both-fail -+ labels: -+ pkg: root annotations: kpt.dev/bfs-rendering: "true" kpt.dev/save-on-render-failure: "true" @@ -16,10 +14,10 @@ index cbe756f..8ce300c 100644 info: description: BFS - Both parent and subpackage fail pipeline: -@@ -14,3 +16,11 @@ pipeline: - pkg: root +@@ -15,3 +15,23 @@ pipeline: validators: - - image: ghcr.io/kptdev/krm-functions-catalog/invalid-image:v0.0.0 + - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest + configPath: starlark-fn-failure.yaml +status: + conditions: + - type: Rendered @@ -28,43 +26,15 @@ index cbe756f..8ce300c 100644 + message: |- + pkg.render: pkg .: + pipeline.run: already handled error -diff --git a/configmap.yaml b/configmap.yaml -index 8594873..a591ceb 100644 ---- a/configmap.yaml -+++ b/configmap.yaml -@@ -2,5 +2,7 @@ apiVersion: v1 - kind: ConfigMap - metadata: - name: root-config -+ labels: -+ pkg: root - data: - pkg: root -diff --git a/subpkg/Kptfile b/subpkg/Kptfile -index a332cf5..2a3f05c 100644 ---- a/subpkg/Kptfile -+++ b/subpkg/Kptfile -@@ -2,6 +2,8 @@ apiVersion: kpt.dev/v1 - kind: Kptfile - metadata: - name: subpkg -+ labels: -+ pkg: root - info: - description: Subpackage that also fails - pipeline: -diff --git a/subpkg/service.yaml b/subpkg/service.yaml -index 276bf9e..d6424da 100644 ---- a/subpkg/service.yaml -+++ b/subpkg/service.yaml -@@ -2,6 +2,10 @@ apiVersion: v1 - kind: Service - metadata: - name: sub-service -+ labels: -+ pkg: root - spec: - ports: - - port: 80 -+ selector: -+ pkg: root ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 ++ stderr: '[error] : failed to run function: may not add resource with an already registered id: fn.kpt.dev_v1alpha1_StarlarkRun|~X|always-fail' ++ exitCode: 1 ++ results: ++ - message: 'failed to run function: may not add resource with an already registered id: fn.kpt.dev_v1alpha1_StarlarkRun|~X|always-fail' ++ severity: error ++ errorResults: ++ - message: 'failed to run function: may not add resource with an already registered id: fn.kpt.dev_v1alpha1_StarlarkRun|~X|always-fail' ++ severity: error ++ errorSummary: 'ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5: exit code 1' diff --git a/e2e/testdata/fn-render/save-on-render-failure/bfs-parent-and-subpkg-both-fail/Kptfile b/e2e/testdata/fn-render/save-on-render-failure/bfs-parent-and-subpkg-both-fail/Kptfile index cbe756f987..867a54b0af 100644 --- a/e2e/testdata/fn-render/save-on-render-failure/bfs-parent-and-subpkg-both-fail/Kptfile +++ b/e2e/testdata/fn-render/save-on-render-failure/bfs-parent-and-subpkg-both-fail/Kptfile @@ -13,4 +13,5 @@ pipeline: configMap: pkg: root validators: - - image: ghcr.io/kptdev/krm-functions-catalog/invalid-image:v0.0.0 + - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest + configPath: starlark-fn-failure.yaml diff --git a/e2e/testdata/fn-render/save-on-render-failure/bfs-parent-and-subpkg-both-fail/starlark-fn-failure.yaml b/e2e/testdata/fn-render/save-on-render-failure/bfs-parent-and-subpkg-both-fail/starlark-fn-failure.yaml new file mode 100644 index 0000000000..55ceaaebff --- /dev/null +++ b/e2e/testdata/fn-render/save-on-render-failure/bfs-parent-and-subpkg-both-fail/starlark-fn-failure.yaml @@ -0,0 +1,8 @@ +apiVersion: fn.kpt.dev/v1alpha1 +kind: StarlarkRun +metadata: + name: always-fail +source: | + def fail_fn(items): + fail("intentional failure for testing") + fail_fn(ctx.resource_list["items"]) diff --git a/e2e/testdata/fn-render/save-on-render-failure/bfs-parent-and-subpkg-both-fail/subpkg/Kptfile b/e2e/testdata/fn-render/save-on-render-failure/bfs-parent-and-subpkg-both-fail/subpkg/Kptfile index a332cf57ab..492902c112 100644 --- a/e2e/testdata/fn-render/save-on-render-failure/bfs-parent-and-subpkg-both-fail/subpkg/Kptfile +++ b/e2e/testdata/fn-render/save-on-render-failure/bfs-parent-and-subpkg-both-fail/subpkg/Kptfile @@ -10,4 +10,5 @@ pipeline: configMap: pkg: subpkg validators: - - image: ghcr.io/kptdev/krm-functions-catalog/invalid-image:v0.0.0 + - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest + configPath: starlark-fn-failure.yaml diff --git a/e2e/testdata/fn-render/save-on-render-failure/bfs-parent-and-subpkg-both-fail/subpkg/starlark-fn-failure.yaml b/e2e/testdata/fn-render/save-on-render-failure/bfs-parent-and-subpkg-both-fail/subpkg/starlark-fn-failure.yaml new file mode 100644 index 0000000000..55ceaaebff --- /dev/null +++ b/e2e/testdata/fn-render/save-on-render-failure/bfs-parent-and-subpkg-both-fail/subpkg/starlark-fn-failure.yaml @@ -0,0 +1,8 @@ +apiVersion: fn.kpt.dev/v1alpha1 +kind: StarlarkRun +metadata: + name: always-fail +source: | + def fail_fn(items): + fail("intentional failure for testing") + fail_fn(ctx.resource_list["items"]) diff --git a/e2e/testdata/fn-render/save-on-render-failure/bfs-parent-mutator-fails/.expected/config.yaml b/e2e/testdata/fn-render/save-on-render-failure/bfs-parent-mutator-fails/.expected/config.yaml index 2eba311bad..f6237512ca 100644 --- a/e2e/testdata/fn-render/save-on-render-failure/bfs-parent-mutator-fails/.expected/config.yaml +++ b/e2e/testdata/fn-render/save-on-render-failure/bfs-parent-mutator-fails/.expected/config.yaml @@ -1,2 +1 @@ exitCode: 1 -StdErrRegEx: "(docker: Error response from daemon: Head.*denied|Error.*initializing source docker)" diff --git a/e2e/testdata/fn-render/save-on-render-failure/bfs-parent-mutator-fails/.expected/diff.patch b/e2e/testdata/fn-render/save-on-render-failure/bfs-parent-mutator-fails/.expected/diff.patch index f7cc0a511a..54fb5dc5f4 100644 --- a/e2e/testdata/fn-render/save-on-render-failure/bfs-parent-mutator-fails/.expected/diff.patch +++ b/e2e/testdata/fn-render/save-on-render-failure/bfs-parent-mutator-fails/.expected/diff.patch @@ -1,8 +1,8 @@ diff --git a/Kptfile b/Kptfile -index c80b904..d0bc053 100644 +index 2c67980..0e92246 100644 --- a/Kptfile +++ b/Kptfile -@@ -1,15 +1,25 @@ +@@ -1,16 +1,40 @@ apiVersion: kpt.dev/v1 kind: Kptfile metadata: @@ -21,7 +21,8 @@ index c80b904..d0bc053 100644 configMap: - test: "parent-mutator-fail" + test: parent-mutator-fail - - image: ghcr.io/kptdev/krm-functions-catalog/invalid-image:v0.0.0 + - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest + configPath: starlark-fn-failure.yaml +status: + conditions: + - type: Rendered @@ -30,6 +31,20 @@ index c80b904..d0bc053 100644 + message: |- + pkg.render: pkg .: + pipeline.run: already handled error ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest ++ stderr: 'failed to evaluate function: error: function failure' ++ exitCode: 1 ++ results: ++ - message: 'fail: intentional failure for testing' ++ severity: error ++ errorResults: ++ - message: 'fail: intentional failure for testing' ++ severity: error ++ errorSummary: 'ghcr.io/kptdev/krm-functions-catalog/starlark:latest: exit code 1' diff --git a/configmap.yaml b/configmap.yaml index 20a54f6..a46a12b 100644 --- a/configmap.yaml @@ -42,6 +57,19 @@ index 20a54f6..a46a12b 100644 + test: parent-mutator-fail data: key: value +diff --git a/starlark-fn-failure.yaml b/starlark-fn-failure.yaml +index 55ceaae..f589633 100644 +--- a/starlark-fn-failure.yaml ++++ b/starlark-fn-failure.yaml +@@ -2,6 +2,8 @@ apiVersion: fn.kpt.dev/v1alpha1 + kind: StarlarkRun + metadata: + name: always-fail ++ labels: ++ test: parent-mutator-fail + source: | + def fail_fn(items): + fail("intentional failure for testing") diff --git a/subpkg/Kptfile b/subpkg/Kptfile index e940ae8..e6e678c 100644 --- a/subpkg/Kptfile diff --git a/e2e/testdata/fn-render/save-on-render-failure/bfs-parent-mutator-fails/Kptfile b/e2e/testdata/fn-render/save-on-render-failure/bfs-parent-mutator-fails/Kptfile index c80b904236..2c679804e2 100644 --- a/e2e/testdata/fn-render/save-on-render-failure/bfs-parent-mutator-fails/Kptfile +++ b/e2e/testdata/fn-render/save-on-render-failure/bfs-parent-mutator-fails/Kptfile @@ -12,4 +12,5 @@ pipeline: - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 configMap: test: "parent-mutator-fail" - - image: ghcr.io/kptdev/krm-functions-catalog/invalid-image:v0.0.0 + - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest + configPath: starlark-fn-failure.yaml diff --git a/e2e/testdata/fn-render/save-on-render-failure/bfs-parent-mutator-fails/starlark-fn-failure.yaml b/e2e/testdata/fn-render/save-on-render-failure/bfs-parent-mutator-fails/starlark-fn-failure.yaml new file mode 100644 index 0000000000..55ceaaebff --- /dev/null +++ b/e2e/testdata/fn-render/save-on-render-failure/bfs-parent-mutator-fails/starlark-fn-failure.yaml @@ -0,0 +1,8 @@ +apiVersion: fn.kpt.dev/v1alpha1 +kind: StarlarkRun +metadata: + name: always-fail +source: | + def fail_fn(items): + fail("intentional failure for testing") + fail_fn(ctx.resource_list["items"]) diff --git a/e2e/testdata/fn-render/save-on-render-failure/bfs-parent-validator-fails/.expected/config.yaml b/e2e/testdata/fn-render/save-on-render-failure/bfs-parent-validator-fails/.expected/config.yaml index 2eba311bad..f6237512ca 100644 --- a/e2e/testdata/fn-render/save-on-render-failure/bfs-parent-validator-fails/.expected/config.yaml +++ b/e2e/testdata/fn-render/save-on-render-failure/bfs-parent-validator-fails/.expected/config.yaml @@ -1,2 +1 @@ exitCode: 1 -StdErrRegEx: "(docker: Error response from daemon: Head.*denied|Error.*initializing source docker)" diff --git a/e2e/testdata/fn-render/save-on-render-failure/bfs-parent-validator-fails/.expected/diff.patch b/e2e/testdata/fn-render/save-on-render-failure/bfs-parent-validator-fails/.expected/diff.patch index 77a376f85e..eeb2047bf0 100644 --- a/e2e/testdata/fn-render/save-on-render-failure/bfs-parent-validator-fails/.expected/diff.patch +++ b/e2e/testdata/fn-render/save-on-render-failure/bfs-parent-validator-fails/.expected/diff.patch @@ -1,8 +1,8 @@ diff --git a/Kptfile b/Kptfile -index 491b12e..28e400c 100644 +index 17ef3d8..93810be 100644 --- a/Kptfile +++ b/Kptfile -@@ -1,16 +1,26 @@ +@@ -1,17 +1,42 @@ apiVersion: kpt.dev/v1 kind: Kptfile metadata: @@ -22,7 +22,8 @@ index 491b12e..28e400c 100644 - test: "parent-fail" + test: parent-fail validators: - - image: ghcr.io/kptdev/krm-functions-catalog/invalid-image:v0.0.0 + - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest + configPath: starlark-fn-failure.yaml +status: + conditions: + - type: Rendered @@ -31,6 +32,21 @@ index 491b12e..28e400c 100644 + message: |- + pkg.render: pkg .: + pipeline.run: already handled error ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 ++ exitCode: 0 ++ validationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest ++ stderr: 'failed to evaluate function: error: function failure' ++ exitCode: 1 ++ results: ++ - message: 'fail: intentional failure for testing' ++ severity: error ++ errorResults: ++ - message: 'fail: intentional failure for testing' ++ severity: error ++ errorSummary: 'ghcr.io/kptdev/krm-functions-catalog/starlark:latest: exit code 1' diff --git a/configmap.yaml b/configmap.yaml index 20a54f6..ad595de 100644 --- a/configmap.yaml @@ -43,6 +59,19 @@ index 20a54f6..ad595de 100644 + test: parent-fail data: key: value +diff --git a/starlark-fn-failure.yaml b/starlark-fn-failure.yaml +index 55ceaae..eb4b975 100644 +--- a/starlark-fn-failure.yaml ++++ b/starlark-fn-failure.yaml +@@ -2,6 +2,8 @@ apiVersion: fn.kpt.dev/v1alpha1 + kind: StarlarkRun + metadata: + name: always-fail ++ labels: ++ test: parent-fail + source: | + def fail_fn(items): + fail("intentional failure for testing") diff --git a/subpkg/Kptfile b/subpkg/Kptfile index e940ae8..88a8d4e 100644 --- a/subpkg/Kptfile diff --git a/e2e/testdata/fn-render/save-on-render-failure/bfs-parent-validator-fails/Kptfile b/e2e/testdata/fn-render/save-on-render-failure/bfs-parent-validator-fails/Kptfile index 491b12e732..17ef3d8c51 100644 --- a/e2e/testdata/fn-render/save-on-render-failure/bfs-parent-validator-fails/Kptfile +++ b/e2e/testdata/fn-render/save-on-render-failure/bfs-parent-validator-fails/Kptfile @@ -13,4 +13,5 @@ pipeline: configMap: test: "parent-fail" validators: - - image: ghcr.io/kptdev/krm-functions-catalog/invalid-image:v0.0.0 + - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest + configPath: starlark-fn-failure.yaml diff --git a/e2e/testdata/fn-render/save-on-render-failure/bfs-parent-validator-fails/starlark-fn-failure.yaml b/e2e/testdata/fn-render/save-on-render-failure/bfs-parent-validator-fails/starlark-fn-failure.yaml new file mode 100644 index 0000000000..55ceaaebff --- /dev/null +++ b/e2e/testdata/fn-render/save-on-render-failure/bfs-parent-validator-fails/starlark-fn-failure.yaml @@ -0,0 +1,8 @@ +apiVersion: fn.kpt.dev/v1alpha1 +kind: StarlarkRun +metadata: + name: always-fail +source: | + def fail_fn(items): + fail("intentional failure for testing") + fail_fn(ctx.resource_list["items"]) diff --git a/e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-mutator-fails/.expected/config.yaml b/e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-mutator-fails/.expected/config.yaml index 2eba311bad..f6237512ca 100644 --- a/e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-mutator-fails/.expected/config.yaml +++ b/e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-mutator-fails/.expected/config.yaml @@ -1,2 +1 @@ exitCode: 1 -StdErrRegEx: "(docker: Error response from daemon: Head.*denied|Error.*initializing source docker)" diff --git a/e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-mutator-fails/.expected/diff.patch b/e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-mutator-fails/.expected/diff.patch index b4d487a414..4d85263c73 100644 --- a/e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-mutator-fails/.expected/diff.patch +++ b/e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-mutator-fails/.expected/diff.patch @@ -1,8 +1,8 @@ diff --git a/Kptfile b/Kptfile -index 84b93a6..4ae9f17 100644 +index 84b93a6..f9f5122 100644 --- a/Kptfile +++ b/Kptfile -@@ -1,14 +1,24 @@ +@@ -1,14 +1,40 @@ apiVersion: kpt.dev/v1 kind: Kptfile metadata: @@ -29,6 +29,22 @@ index 84b93a6..4ae9f17 100644 + message: |- + pkg.render: pkg .: + pipeline.run: pkg ./subpkg: already handled error ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest ++ stderr: 'failed to evaluate function: error: function failure' ++ exitCode: 1 ++ results: ++ - message: 'fail: intentional failure for testing' ++ severity: error ++ errorResults: ++ - message: 'fail: intentional failure for testing' ++ severity: error ++ errorSummary: 'ghcr.io/kptdev/krm-functions-catalog/starlark:latest: exit code 1' diff --git a/deployment.yaml b/deployment.yaml index cc866f6..6ed4201 100644 --- a/deployment.yaml @@ -49,7 +65,7 @@ index cc866f6..6ed4201 100644 + labels: + test: mutator-fail diff --git a/subpkg/Kptfile b/subpkg/Kptfile -index ec4ce38..82fcf74 100644 +index 7b4318a..5b35311 100644 --- a/subpkg/Kptfile +++ b/subpkg/Kptfile @@ -2,6 +2,9 @@ apiVersion: kpt.dev/v1 @@ -82,3 +98,17 @@ index 302322e..546fe5c 100644 + metadata: + labels: + test: mutator-fail +diff --git a/subpkg/starlark-fn-failure.yaml b/subpkg/starlark-fn-failure.yaml +index 55ceaae..026f2e5 100644 +--- a/subpkg/starlark-fn-failure.yaml ++++ b/subpkg/starlark-fn-failure.yaml +@@ -2,6 +2,9 @@ apiVersion: fn.kpt.dev/v1alpha1 + kind: StarlarkRun + metadata: + name: always-fail ++ labels: ++ test: mutator-fail ++ namespace: subpkg-ns + source: | + def fail_fn(items): + fail("intentional failure for testing") diff --git a/e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-mutator-fails/subpkg/Kptfile b/e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-mutator-fails/subpkg/Kptfile index ec4ce38547..7b4318a971 100644 --- a/e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-mutator-fails/subpkg/Kptfile +++ b/e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-mutator-fails/subpkg/Kptfile @@ -9,4 +9,5 @@ pipeline: - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 configMap: namespace: subpkg-ns - - image: ghcr.io/kptdev/krm-functions-catalog/invalid-image:v0.0.0 + - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest + configPath: starlark-fn-failure.yaml diff --git a/e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-mutator-fails/subpkg/starlark-fn-failure.yaml b/e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-mutator-fails/subpkg/starlark-fn-failure.yaml new file mode 100644 index 0000000000..55ceaaebff --- /dev/null +++ b/e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-mutator-fails/subpkg/starlark-fn-failure.yaml @@ -0,0 +1,8 @@ +apiVersion: fn.kpt.dev/v1alpha1 +kind: StarlarkRun +metadata: + name: always-fail +source: | + def fail_fn(items): + fail("intentional failure for testing") + fail_fn(ctx.resource_list["items"]) diff --git a/e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-validator-fails/.expected/config.yaml b/e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-validator-fails/.expected/config.yaml index 2eba311bad..f6237512ca 100644 --- a/e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-validator-fails/.expected/config.yaml +++ b/e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-validator-fails/.expected/config.yaml @@ -1,2 +1 @@ exitCode: 1 -StdErrRegEx: "(docker: Error response from daemon: Head.*denied|Error.*initializing source docker)" diff --git a/e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-validator-fails/.expected/diff.patch b/e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-validator-fails/.expected/diff.patch index 18a748ab0c..798c6c5f7a 100644 --- a/e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-validator-fails/.expected/diff.patch +++ b/e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-validator-fails/.expected/diff.patch @@ -1,8 +1,8 @@ diff --git a/Kptfile b/Kptfile -index 86dbe13..f0c67c4 100644 +index 86dbe13..755cbd3 100644 --- a/Kptfile +++ b/Kptfile -@@ -1,15 +1,26 @@ +@@ -1,15 +1,43 @@ apiVersion: kpt.dev/v1 kind: Kptfile metadata: @@ -32,6 +32,23 @@ index 86dbe13..f0c67c4 100644 + message: |- + pkg.render: pkg .: + pipeline.run: pkg ./subpkg: already handled error ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 ++ exitCode: 0 ++ validationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest ++ stderr: 'failed to evaluate function: error: function failure' ++ exitCode: 1 ++ results: ++ - message: 'fail: intentional failure for testing' ++ severity: error ++ errorResults: ++ - message: 'fail: intentional failure for testing' ++ severity: error ++ errorSummary: 'ghcr.io/kptdev/krm-functions-catalog/starlark:latest: exit code 1' diff --git a/deployment.yaml b/deployment.yaml index 7123634..4db6211 100644 --- a/deployment.yaml @@ -55,7 +72,7 @@ index 7123634..4db6211 100644 + level: root + test: subpkg-fail diff --git a/subpkg/Kptfile b/subpkg/Kptfile -index f147d84..15fd450 100644 +index 271c9a5..445ddf4 100644 --- a/subpkg/Kptfile +++ b/subpkg/Kptfile @@ -2,6 +2,10 @@ apiVersion: kpt.dev/v1 @@ -92,3 +109,18 @@ index 302322e..dfe3056 100644 + labels: + level: root + test: subpkg-fail +diff --git a/subpkg/starlark-fn-failure.yaml b/subpkg/starlark-fn-failure.yaml +index 55ceaae..4d01f35 100644 +--- a/subpkg/starlark-fn-failure.yaml ++++ b/subpkg/starlark-fn-failure.yaml +@@ -2,6 +2,10 @@ apiVersion: fn.kpt.dev/v1alpha1 + kind: StarlarkRun + metadata: + name: always-fail ++ labels: ++ level: root ++ test: subpkg-fail ++ namespace: subpkg-ns + source: | + def fail_fn(items): + fail("intentional failure for testing") diff --git a/e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-validator-fails/subpkg/Kptfile b/e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-validator-fails/subpkg/Kptfile index f147d84027..271c9a592c 100644 --- a/e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-validator-fails/subpkg/Kptfile +++ b/e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-validator-fails/subpkg/Kptfile @@ -10,4 +10,5 @@ pipeline: configMap: namespace: subpkg-ns validators: - - image: ghcr.io/kptdev/krm-functions-catalog/invalid-image:v0.0.0 + - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest + configPath: starlark-fn-failure.yaml diff --git a/e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-validator-fails/subpkg/starlark-fn-failure.yaml b/e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-validator-fails/subpkg/starlark-fn-failure.yaml new file mode 100644 index 0000000000..55ceaaebff --- /dev/null +++ b/e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-validator-fails/subpkg/starlark-fn-failure.yaml @@ -0,0 +1,8 @@ +apiVersion: fn.kpt.dev/v1alpha1 +kind: StarlarkRun +metadata: + name: always-fail +source: | + def fail_fn(items): + fail("intentional failure for testing") + fail_fn(ctx.resource_list["items"]) diff --git a/e2e/testdata/fn-render/save-on-render-failure/dfs-basicpipeline/.expected/config.yaml b/e2e/testdata/fn-render/save-on-render-failure/dfs-basicpipeline/.expected/config.yaml index 2eba311bad..f6237512ca 100644 --- a/e2e/testdata/fn-render/save-on-render-failure/dfs-basicpipeline/.expected/config.yaml +++ b/e2e/testdata/fn-render/save-on-render-failure/dfs-basicpipeline/.expected/config.yaml @@ -1,2 +1 @@ exitCode: 1 -StdErrRegEx: "(docker: Error response from daemon: Head.*denied|Error.*initializing source docker)" diff --git a/e2e/testdata/fn-render/save-on-render-failure/dfs-basicpipeline/.expected/diff.patch b/e2e/testdata/fn-render/save-on-render-failure/dfs-basicpipeline/.expected/diff.patch index 3234bb19c8..a493730499 100644 --- a/e2e/testdata/fn-render/save-on-render-failure/dfs-basicpipeline/.expected/diff.patch +++ b/e2e/testdata/fn-render/save-on-render-failure/dfs-basicpipeline/.expected/diff.patch @@ -1,8 +1,8 @@ diff --git a/Kptfile b/Kptfile -index c6fc0c5..620b80e 100644 +index ed88ddf..a1d57f0 100644 --- a/Kptfile +++ b/Kptfile -@@ -1,17 +1,27 @@ +@@ -1,16 +1,42 @@ apiVersion: kpt.dev/v1 kind: Kptfile metadata: @@ -20,18 +20,16 @@ index c6fc0c5..620b80e 100644 - - image: ghcr.io/kptdev/krm-functions-catalog/set-annotations:v0.1.4 - configMap: - app: myapp -- - image: invalid-image:v0.0.0 -- configMap: -- tier: backend +- - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest +- configPath: starlark-fn-failure.yaml + - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 + configMap: + namespace: staging + - image: ghcr.io/kptdev/krm-functions-catalog/set-annotations:v0.1.4 + configMap: + app: myapp -+ - image: invalid-image:v0.0.0 -+ configMap: -+ tier: backend ++ - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest ++ configPath: starlark-fn-failure.yaml +status: + conditions: + - type: Rendered @@ -40,6 +38,22 @@ index c6fc0c5..620b80e 100644 + message: |- + pkg.render: pkg .: + pipeline.run: already handled error ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-annotations:v0.1.4 ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest ++ stderr: 'failed to evaluate function: error: function failure' ++ exitCode: 1 ++ results: ++ - message: 'fail: intentional failure for testing' ++ severity: error ++ errorResults: ++ - message: 'fail: intentional failure for testing' ++ severity: error ++ errorSummary: 'ghcr.io/kptdev/krm-functions-catalog/starlark:latest: exit code 1' diff --git a/resources.yaml b/resources.yaml index 0848ba0..7eece9b 100644 --- a/resources.yaml @@ -57,3 +71,17 @@ index 0848ba0..7eece9b 100644 + metadata: + annotations: + app: myapp +diff --git a/starlark-fn-failure.yaml b/starlark-fn-failure.yaml +index 55ceaae..d2841c7 100644 +--- a/starlark-fn-failure.yaml ++++ b/starlark-fn-failure.yaml +@@ -2,6 +2,9 @@ apiVersion: fn.kpt.dev/v1alpha1 + kind: StarlarkRun + metadata: + name: always-fail ++ annotations: ++ app: myapp ++ namespace: staging + source: | + def fail_fn(items): + fail("intentional failure for testing") diff --git a/e2e/testdata/fn-render/save-on-render-failure/dfs-basicpipeline/Kptfile b/e2e/testdata/fn-render/save-on-render-failure/dfs-basicpipeline/Kptfile index c6fc0c546a..ed88ddfc6e 100644 --- a/e2e/testdata/fn-render/save-on-render-failure/dfs-basicpipeline/Kptfile +++ b/e2e/testdata/fn-render/save-on-render-failure/dfs-basicpipeline/Kptfile @@ -12,6 +12,5 @@ pipeline: - image: ghcr.io/kptdev/krm-functions-catalog/set-annotations:v0.1.4 configMap: app: myapp - - image: invalid-image:v0.0.0 - configMap: - tier: backend + - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest + configPath: starlark-fn-failure.yaml diff --git a/e2e/testdata/fn-render/save-on-render-failure/dfs-basicpipeline/starlark-fn-failure.yaml b/e2e/testdata/fn-render/save-on-render-failure/dfs-basicpipeline/starlark-fn-failure.yaml new file mode 100644 index 0000000000..55ceaaebff --- /dev/null +++ b/e2e/testdata/fn-render/save-on-render-failure/dfs-basicpipeline/starlark-fn-failure.yaml @@ -0,0 +1,8 @@ +apiVersion: fn.kpt.dev/v1alpha1 +kind: StarlarkRun +metadata: + name: always-fail +source: | + def fail_fn(items): + fail("intentional failure for testing") + fail_fn(ctx.resource_list["items"]) diff --git a/e2e/testdata/fn-render/save-on-render-failure/dfs-deep-nested-middle-fails/.expected/config.yaml b/e2e/testdata/fn-render/save-on-render-failure/dfs-deep-nested-middle-fails/.expected/config.yaml index 2eba311bad..f6237512ca 100644 --- a/e2e/testdata/fn-render/save-on-render-failure/dfs-deep-nested-middle-fails/.expected/config.yaml +++ b/e2e/testdata/fn-render/save-on-render-failure/dfs-deep-nested-middle-fails/.expected/config.yaml @@ -1,2 +1 @@ exitCode: 1 -StdErrRegEx: "(docker: Error response from daemon: Head.*denied|Error.*initializing source docker)" diff --git a/e2e/testdata/fn-render/save-on-render-failure/dfs-deep-nested-middle-fails/.expected/diff.patch b/e2e/testdata/fn-render/save-on-render-failure/dfs-deep-nested-middle-fails/.expected/diff.patch index 14f98d3f02..ef9119f97b 100644 --- a/e2e/testdata/fn-render/save-on-render-failure/dfs-deep-nested-middle-fails/.expected/diff.patch +++ b/e2e/testdata/fn-render/save-on-render-failure/dfs-deep-nested-middle-fails/.expected/diff.patch @@ -1,8 +1,8 @@ diff --git a/Kptfile b/Kptfile -index 4047d27..e7ca740 100644 +index 4047d27..02908a2 100644 --- a/Kptfile +++ b/Kptfile -@@ -1,13 +1,21 @@ +@@ -1,13 +1,38 @@ apiVersion: kpt.dev/v1 kind: Kptfile metadata: @@ -26,8 +26,25 @@ index 4047d27..e7ca740 100644 + message: |- + pkg.render: pkg ./level1: + pipeline.run: already handled error ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 ++ exitCode: 0 ++ validationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest ++ stderr: 'failed to evaluate function: error: function failure' ++ exitCode: 1 ++ results: ++ - message: 'fail: intentional failure for testing' ++ severity: error ++ errorResults: ++ - message: 'fail: intentional failure for testing' ++ severity: error ++ errorSummary: 'ghcr.io/kptdev/krm-functions-catalog/starlark:latest: exit code 1' diff --git a/level1/Kptfile b/level1/Kptfile -index b5960dd..b42f153 100644 +index 2bc48be..ec5f5a7 100644 --- a/level1/Kptfile +++ b/level1/Kptfile @@ -2,6 +2,8 @@ apiVersion: kpt.dev/v1 @@ -81,3 +98,16 @@ index ab7d3fa..1eeeaed 100644 + level: level1 data: level: level2 +diff --git a/level1/starlark-fn-failure.yaml b/level1/starlark-fn-failure.yaml +index 55ceaae..34c320f 100644 +--- a/level1/starlark-fn-failure.yaml ++++ b/level1/starlark-fn-failure.yaml +@@ -2,6 +2,8 @@ apiVersion: fn.kpt.dev/v1alpha1 + kind: StarlarkRun + metadata: + name: always-fail ++ labels: ++ level: level1 + source: | + def fail_fn(items): + fail("intentional failure for testing") diff --git a/e2e/testdata/fn-render/save-on-render-failure/dfs-deep-nested-middle-fails/level1/Kptfile b/e2e/testdata/fn-render/save-on-render-failure/dfs-deep-nested-middle-fails/level1/Kptfile index b5960dd7a7..2bc48be98e 100644 --- a/e2e/testdata/fn-render/save-on-render-failure/dfs-deep-nested-middle-fails/level1/Kptfile +++ b/e2e/testdata/fn-render/save-on-render-failure/dfs-deep-nested-middle-fails/level1/Kptfile @@ -10,4 +10,5 @@ pipeline: configMap: level: level1 validators: - - image: ghcr.io/kptdev/krm-functions-catalog/invalid-image:v0.0.0 + - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest + configPath: starlark-fn-failure.yaml diff --git a/e2e/testdata/fn-render/save-on-render-failure/dfs-deep-nested-middle-fails/level1/starlark-fn-failure.yaml b/e2e/testdata/fn-render/save-on-render-failure/dfs-deep-nested-middle-fails/level1/starlark-fn-failure.yaml new file mode 100644 index 0000000000..55ceaaebff --- /dev/null +++ b/e2e/testdata/fn-render/save-on-render-failure/dfs-deep-nested-middle-fails/level1/starlark-fn-failure.yaml @@ -0,0 +1,8 @@ +apiVersion: fn.kpt.dev/v1alpha1 +kind: StarlarkRun +metadata: + name: always-fail +source: | + def fail_fn(items): + fail("intentional failure for testing") + fail_fn(ctx.resource_list["items"]) diff --git a/e2e/testdata/fn-render/save-on-render-failure/dfs-multiple-subpkgs-one-fails/.expected/config.yaml b/e2e/testdata/fn-render/save-on-render-failure/dfs-multiple-subpkgs-one-fails/.expected/config.yaml index 2eba311bad..f6237512ca 100644 --- a/e2e/testdata/fn-render/save-on-render-failure/dfs-multiple-subpkgs-one-fails/.expected/config.yaml +++ b/e2e/testdata/fn-render/save-on-render-failure/dfs-multiple-subpkgs-one-fails/.expected/config.yaml @@ -1,2 +1 @@ exitCode: 1 -StdErrRegEx: "(docker: Error response from daemon: Head.*denied|Error.*initializing source docker)" diff --git a/e2e/testdata/fn-render/save-on-render-failure/dfs-multiple-subpkgs-one-fails/.expected/diff.patch b/e2e/testdata/fn-render/save-on-render-failure/dfs-multiple-subpkgs-one-fails/.expected/diff.patch index 582f70fc72..7512f2967d 100644 --- a/e2e/testdata/fn-render/save-on-render-failure/dfs-multiple-subpkgs-one-fails/.expected/diff.patch +++ b/e2e/testdata/fn-render/save-on-render-failure/dfs-multiple-subpkgs-one-fails/.expected/diff.patch @@ -1,5 +1,5 @@ diff --git a/Kptfile b/Kptfile -index c47c90d..1b7e920 100644 +index c47c90d..0ad6086 100644 --- a/Kptfile +++ b/Kptfile @@ -1,9 +1,9 @@ @@ -13,7 +13,7 @@ index c47c90d..1b7e920 100644 info: description: DFS - Multiple subpackages, sub2 fails pipeline: -@@ -11,3 +11,11 @@ pipeline: +@@ -11,3 +11,28 @@ pipeline: - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 configMap: pkg: root @@ -25,6 +25,23 @@ index c47c90d..1b7e920 100644 + message: |- + pkg.render: pkg ./sub2: + pipeline.run: already handled error ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 ++ exitCode: 0 ++ validationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest ++ stderr: 'failed to evaluate function: error: function failure' ++ exitCode: 1 ++ results: ++ - message: 'fail: intentional failure for testing' ++ severity: error ++ errorResults: ++ - message: 'fail: intentional failure for testing' ++ severity: error ++ errorSummary: 'ghcr.io/kptdev/krm-functions-catalog/starlark:latest: exit code 1' diff --git a/sub1/Kptfile b/sub1/Kptfile index 2d62077..0f03268 100644 --- a/sub1/Kptfile @@ -58,7 +75,7 @@ index 2f649ba..c2245a9 100644 + labels: + pkg: sub1 diff --git a/sub2/Kptfile b/sub2/Kptfile -index 792277c..6412843 100644 +index 853d3f0..89cfa33 100644 --- a/sub2/Kptfile +++ b/sub2/Kptfile @@ -2,6 +2,8 @@ apiVersion: kpt.dev/v1 @@ -89,3 +106,16 @@ index 20375ea..7290360 100644 + metadata: + labels: + pkg: sub2 +diff --git a/sub2/starlark-fn-failure.yaml b/sub2/starlark-fn-failure.yaml +index 55ceaae..5b9cf38 100644 +--- a/sub2/starlark-fn-failure.yaml ++++ b/sub2/starlark-fn-failure.yaml +@@ -2,6 +2,8 @@ apiVersion: fn.kpt.dev/v1alpha1 + kind: StarlarkRun + metadata: + name: always-fail ++ labels: ++ pkg: sub2 + source: | + def fail_fn(items): + fail("intentional failure for testing") diff --git a/e2e/testdata/fn-render/save-on-render-failure/dfs-multiple-subpkgs-one-fails/sub2/Kptfile b/e2e/testdata/fn-render/save-on-render-failure/dfs-multiple-subpkgs-one-fails/sub2/Kptfile index 792277c2b0..853d3f0df5 100644 --- a/e2e/testdata/fn-render/save-on-render-failure/dfs-multiple-subpkgs-one-fails/sub2/Kptfile +++ b/e2e/testdata/fn-render/save-on-render-failure/dfs-multiple-subpkgs-one-fails/sub2/Kptfile @@ -8,4 +8,5 @@ pipeline: configMap: pkg: sub2 validators: - - image: ghcr.io/kptdev/krm-functions-catalog/invalid-image:v0.0.0 + - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest + configPath: starlark-fn-failure.yaml diff --git a/e2e/testdata/fn-render/save-on-render-failure/dfs-multiple-subpkgs-one-fails/sub2/starlark-fn-failure.yaml b/e2e/testdata/fn-render/save-on-render-failure/dfs-multiple-subpkgs-one-fails/sub2/starlark-fn-failure.yaml new file mode 100644 index 0000000000..55ceaaebff --- /dev/null +++ b/e2e/testdata/fn-render/save-on-render-failure/dfs-multiple-subpkgs-one-fails/sub2/starlark-fn-failure.yaml @@ -0,0 +1,8 @@ +apiVersion: fn.kpt.dev/v1alpha1 +kind: StarlarkRun +metadata: + name: always-fail +source: | + def fail_fn(items): + fail("intentional failure for testing") + fail_fn(ctx.resource_list["items"]) diff --git a/e2e/testdata/fn-render/save-on-render-failure/dfs-parent-and-subpkg-both-fail/.expected/config.yaml b/e2e/testdata/fn-render/save-on-render-failure/dfs-parent-and-subpkg-both-fail/.expected/config.yaml index 2eba311bad..f6237512ca 100644 --- a/e2e/testdata/fn-render/save-on-render-failure/dfs-parent-and-subpkg-both-fail/.expected/config.yaml +++ b/e2e/testdata/fn-render/save-on-render-failure/dfs-parent-and-subpkg-both-fail/.expected/config.yaml @@ -1,2 +1 @@ exitCode: 1 -StdErrRegEx: "(docker: Error response from daemon: Head.*denied|Error.*initializing source docker)" diff --git a/e2e/testdata/fn-render/save-on-render-failure/dfs-parent-and-subpkg-both-fail/.expected/diff.patch b/e2e/testdata/fn-render/save-on-render-failure/dfs-parent-and-subpkg-both-fail/.expected/diff.patch index f0105bbf0f..16042c11a8 100644 --- a/e2e/testdata/fn-render/save-on-render-failure/dfs-parent-and-subpkg-both-fail/.expected/diff.patch +++ b/e2e/testdata/fn-render/save-on-render-failure/dfs-parent-and-subpkg-both-fail/.expected/diff.patch @@ -1,5 +1,5 @@ diff --git a/Kptfile b/Kptfile -index e4d630d..c8d5efb 100644 +index 2e71448..1a82d1e 100644 --- a/Kptfile +++ b/Kptfile @@ -1,9 +1,9 @@ @@ -13,10 +13,10 @@ index e4d630d..c8d5efb 100644 info: description: DFS - Both parent and subpackage fail pipeline: -@@ -13,3 +13,11 @@ pipeline: - pkg: root +@@ -14,3 +14,26 @@ pipeline: validators: - - image: ghcr.io/kptdev/krm-functions-catalog/invalid-image:v0.0.0 + - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest + configPath: starlark-fn-failure.yaml +status: + conditions: + - type: Rendered @@ -25,8 +25,23 @@ index e4d630d..c8d5efb 100644 + message: |- + pkg.render: pkg ./subpkg: + pipeline.run: already handled error ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 ++ exitCode: 0 ++ validationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest ++ stderr: 'failed to evaluate function: error: function failure' ++ exitCode: 1 ++ results: ++ - message: 'fail: intentional failure for testing' ++ severity: error ++ errorResults: ++ - message: 'fail: intentional failure for testing' ++ severity: error ++ errorSummary: 'ghcr.io/kptdev/krm-functions-catalog/starlark:latest: exit code 1' diff --git a/subpkg/Kptfile b/subpkg/Kptfile -index a332cf5..cb45834 100644 +index 492902c..3cb271d 100644 --- a/subpkg/Kptfile +++ b/subpkg/Kptfile @@ -2,6 +2,8 @@ apiVersion: kpt.dev/v1 @@ -53,3 +68,16 @@ index 276bf9e..7b26a8d 100644 - port: 80 + selector: + pkg: subpkg +diff --git a/subpkg/starlark-fn-failure.yaml b/subpkg/starlark-fn-failure.yaml +index 55ceaae..1a57ad9 100644 +--- a/subpkg/starlark-fn-failure.yaml ++++ b/subpkg/starlark-fn-failure.yaml +@@ -2,6 +2,8 @@ apiVersion: fn.kpt.dev/v1alpha1 + kind: StarlarkRun + metadata: + name: always-fail ++ labels: ++ pkg: subpkg + source: | + def fail_fn(items): + fail("intentional failure for testing") diff --git a/e2e/testdata/fn-render/save-on-render-failure/dfs-parent-and-subpkg-both-fail/Kptfile b/e2e/testdata/fn-render/save-on-render-failure/dfs-parent-and-subpkg-both-fail/Kptfile index e4d630ddc7..2e71448f59 100644 --- a/e2e/testdata/fn-render/save-on-render-failure/dfs-parent-and-subpkg-both-fail/Kptfile +++ b/e2e/testdata/fn-render/save-on-render-failure/dfs-parent-and-subpkg-both-fail/Kptfile @@ -12,4 +12,5 @@ pipeline: configMap: pkg: root validators: - - image: ghcr.io/kptdev/krm-functions-catalog/invalid-image:v0.0.0 + - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest + configPath: starlark-fn-failure.yaml diff --git a/e2e/testdata/fn-render/save-on-render-failure/dfs-parent-and-subpkg-both-fail/starlark-fn-failure.yaml b/e2e/testdata/fn-render/save-on-render-failure/dfs-parent-and-subpkg-both-fail/starlark-fn-failure.yaml new file mode 100644 index 0000000000..55ceaaebff --- /dev/null +++ b/e2e/testdata/fn-render/save-on-render-failure/dfs-parent-and-subpkg-both-fail/starlark-fn-failure.yaml @@ -0,0 +1,8 @@ +apiVersion: fn.kpt.dev/v1alpha1 +kind: StarlarkRun +metadata: + name: always-fail +source: | + def fail_fn(items): + fail("intentional failure for testing") + fail_fn(ctx.resource_list["items"]) diff --git a/e2e/testdata/fn-render/save-on-render-failure/dfs-parent-and-subpkg-both-fail/subpkg/Kptfile b/e2e/testdata/fn-render/save-on-render-failure/dfs-parent-and-subpkg-both-fail/subpkg/Kptfile index a332cf57ab..492902c112 100644 --- a/e2e/testdata/fn-render/save-on-render-failure/dfs-parent-and-subpkg-both-fail/subpkg/Kptfile +++ b/e2e/testdata/fn-render/save-on-render-failure/dfs-parent-and-subpkg-both-fail/subpkg/Kptfile @@ -10,4 +10,5 @@ pipeline: configMap: pkg: subpkg validators: - - image: ghcr.io/kptdev/krm-functions-catalog/invalid-image:v0.0.0 + - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest + configPath: starlark-fn-failure.yaml diff --git a/e2e/testdata/fn-render/save-on-render-failure/dfs-parent-and-subpkg-both-fail/subpkg/starlark-fn-failure.yaml b/e2e/testdata/fn-render/save-on-render-failure/dfs-parent-and-subpkg-both-fail/subpkg/starlark-fn-failure.yaml new file mode 100644 index 0000000000..55ceaaebff --- /dev/null +++ b/e2e/testdata/fn-render/save-on-render-failure/dfs-parent-and-subpkg-both-fail/subpkg/starlark-fn-failure.yaml @@ -0,0 +1,8 @@ +apiVersion: fn.kpt.dev/v1alpha1 +kind: StarlarkRun +metadata: + name: always-fail +source: | + def fail_fn(items): + fail("intentional failure for testing") + fail_fn(ctx.resource_list["items"]) diff --git a/e2e/testdata/fn-render/save-on-render-failure/dfs-parent-mutator-fails/.expected/config.yaml b/e2e/testdata/fn-render/save-on-render-failure/dfs-parent-mutator-fails/.expected/config.yaml index 2eba311bad..f6237512ca 100644 --- a/e2e/testdata/fn-render/save-on-render-failure/dfs-parent-mutator-fails/.expected/config.yaml +++ b/e2e/testdata/fn-render/save-on-render-failure/dfs-parent-mutator-fails/.expected/config.yaml @@ -1,2 +1 @@ exitCode: 1 -StdErrRegEx: "(docker: Error response from daemon: Head.*denied|Error.*initializing source docker)" diff --git a/e2e/testdata/fn-render/save-on-render-failure/dfs-parent-mutator-fails/.expected/diff.patch b/e2e/testdata/fn-render/save-on-render-failure/dfs-parent-mutator-fails/.expected/diff.patch index eecfacca1c..1e8f8a9ac8 100644 --- a/e2e/testdata/fn-render/save-on-render-failure/dfs-parent-mutator-fails/.expected/diff.patch +++ b/e2e/testdata/fn-render/save-on-render-failure/dfs-parent-mutator-fails/.expected/diff.patch @@ -1,8 +1,8 @@ diff --git a/Kptfile b/Kptfile -index c134b37..a48d9bb 100644 +index 207a7ca..c351a54 100644 --- a/Kptfile +++ b/Kptfile -@@ -1,14 +1,24 @@ +@@ -1,15 +1,41 @@ apiVersion: kpt.dev/v1 kind: Kptfile metadata: @@ -20,7 +20,8 @@ index c134b37..a48d9bb 100644 configMap: - test: "parent-mutator-fail" + test: parent-mutator-fail - - image: ghcr.io/kptdev/krm-functions-catalog/invalid-image:v0.0.0 + - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest + configPath: starlark-fn-failure.yaml +status: + conditions: + - type: Rendered @@ -29,6 +30,22 @@ index c134b37..a48d9bb 100644 + message: |- + pkg.render: pkg .: + pipeline.run: already handled error ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest ++ stderr: 'failed to evaluate function: error: function failure' ++ exitCode: 1 ++ results: ++ - message: 'fail: intentional failure for testing' ++ severity: error ++ errorResults: ++ - message: 'fail: intentional failure for testing' ++ severity: error ++ errorSummary: 'ghcr.io/kptdev/krm-functions-catalog/starlark:latest: exit code 1' diff --git a/configmap.yaml b/configmap.yaml index 20a54f6..a46a12b 100644 --- a/configmap.yaml @@ -41,6 +58,19 @@ index 20a54f6..a46a12b 100644 + test: parent-mutator-fail data: key: value +diff --git a/starlark-fn-failure.yaml b/starlark-fn-failure.yaml +index 55ceaae..f589633 100644 +--- a/starlark-fn-failure.yaml ++++ b/starlark-fn-failure.yaml +@@ -2,6 +2,8 @@ apiVersion: fn.kpt.dev/v1alpha1 + kind: StarlarkRun + metadata: + name: always-fail ++ labels: ++ test: parent-mutator-fail + source: | + def fail_fn(items): + fail("intentional failure for testing") diff --git a/subpkg/Kptfile b/subpkg/Kptfile index e940ae8..9b73f07 100644 --- a/subpkg/Kptfile diff --git a/e2e/testdata/fn-render/save-on-render-failure/dfs-parent-mutator-fails/Kptfile b/e2e/testdata/fn-render/save-on-render-failure/dfs-parent-mutator-fails/Kptfile index c134b37717..207a7ca14e 100644 --- a/e2e/testdata/fn-render/save-on-render-failure/dfs-parent-mutator-fails/Kptfile +++ b/e2e/testdata/fn-render/save-on-render-failure/dfs-parent-mutator-fails/Kptfile @@ -11,4 +11,5 @@ pipeline: - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 configMap: test: "parent-mutator-fail" - - image: ghcr.io/kptdev/krm-functions-catalog/invalid-image:v0.0.0 + - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest + configPath: starlark-fn-failure.yaml diff --git a/e2e/testdata/fn-render/save-on-render-failure/dfs-parent-mutator-fails/starlark-fn-failure.yaml b/e2e/testdata/fn-render/save-on-render-failure/dfs-parent-mutator-fails/starlark-fn-failure.yaml new file mode 100644 index 0000000000..55ceaaebff --- /dev/null +++ b/e2e/testdata/fn-render/save-on-render-failure/dfs-parent-mutator-fails/starlark-fn-failure.yaml @@ -0,0 +1,8 @@ +apiVersion: fn.kpt.dev/v1alpha1 +kind: StarlarkRun +metadata: + name: always-fail +source: | + def fail_fn(items): + fail("intentional failure for testing") + fail_fn(ctx.resource_list["items"]) diff --git a/e2e/testdata/fn-render/save-on-render-failure/dfs-parent-validator-fails/.expected/config.yaml b/e2e/testdata/fn-render/save-on-render-failure/dfs-parent-validator-fails/.expected/config.yaml index 2eba311bad..f6237512ca 100644 --- a/e2e/testdata/fn-render/save-on-render-failure/dfs-parent-validator-fails/.expected/config.yaml +++ b/e2e/testdata/fn-render/save-on-render-failure/dfs-parent-validator-fails/.expected/config.yaml @@ -1,2 +1 @@ exitCode: 1 -StdErrRegEx: "(docker: Error response from daemon: Head.*denied|Error.*initializing source docker)" diff --git a/e2e/testdata/fn-render/save-on-render-failure/dfs-parent-validator-fails/.expected/diff.patch b/e2e/testdata/fn-render/save-on-render-failure/dfs-parent-validator-fails/.expected/diff.patch index 0d65d79302..5a2ace3204 100644 --- a/e2e/testdata/fn-render/save-on-render-failure/dfs-parent-validator-fails/.expected/diff.patch +++ b/e2e/testdata/fn-render/save-on-render-failure/dfs-parent-validator-fails/.expected/diff.patch @@ -1,8 +1,8 @@ diff --git a/Kptfile b/Kptfile -index 94a7a73..8965faa 100644 +index b402aed..04ef8db 100644 --- a/Kptfile +++ b/Kptfile -@@ -1,15 +1,25 @@ +@@ -1,16 +1,43 @@ apiVersion: kpt.dev/v1 kind: Kptfile metadata: @@ -21,7 +21,8 @@ index 94a7a73..8965faa 100644 - test: "parent-fail" + test: parent-fail validators: - - image: ghcr.io/kptdev/krm-functions-catalog/invalid-image:v0.0.0 + - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest + configPath: starlark-fn-failure.yaml +status: + conditions: + - type: Rendered @@ -30,6 +31,23 @@ index 94a7a73..8965faa 100644 + message: |- + pkg.render: pkg .: + pipeline.run: already handled error ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 ++ exitCode: 0 ++ validationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest ++ stderr: 'failed to evaluate function: error: function failure' ++ exitCode: 1 ++ results: ++ - message: 'fail: intentional failure for testing' ++ severity: error ++ errorResults: ++ - message: 'fail: intentional failure for testing' ++ severity: error ++ errorSummary: 'ghcr.io/kptdev/krm-functions-catalog/starlark:latest: exit code 1' diff --git a/configmap.yaml b/configmap.yaml index 20a54f6..ad595de 100644 --- a/configmap.yaml @@ -42,6 +60,19 @@ index 20a54f6..ad595de 100644 + test: parent-fail data: key: value +diff --git a/starlark-fn-failure.yaml b/starlark-fn-failure.yaml +index 55ceaae..eb4b975 100644 +--- a/starlark-fn-failure.yaml ++++ b/starlark-fn-failure.yaml +@@ -2,6 +2,8 @@ apiVersion: fn.kpt.dev/v1alpha1 + kind: StarlarkRun + metadata: + name: always-fail ++ labels: ++ test: parent-fail + source: | + def fail_fn(items): + fail("intentional failure for testing") diff --git a/subpkg/Kptfile b/subpkg/Kptfile index e940ae8..a2fe9c5 100644 --- a/subpkg/Kptfile diff --git a/e2e/testdata/fn-render/save-on-render-failure/dfs-parent-validator-fails/Kptfile b/e2e/testdata/fn-render/save-on-render-failure/dfs-parent-validator-fails/Kptfile index 94a7a73ca7..b402aedaab 100644 --- a/e2e/testdata/fn-render/save-on-render-failure/dfs-parent-validator-fails/Kptfile +++ b/e2e/testdata/fn-render/save-on-render-failure/dfs-parent-validator-fails/Kptfile @@ -12,4 +12,5 @@ pipeline: configMap: test: "parent-fail" validators: - - image: ghcr.io/kptdev/krm-functions-catalog/invalid-image:v0.0.0 + - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest + configPath: starlark-fn-failure.yaml diff --git a/e2e/testdata/fn-render/save-on-render-failure/dfs-parent-validator-fails/starlark-fn-failure.yaml b/e2e/testdata/fn-render/save-on-render-failure/dfs-parent-validator-fails/starlark-fn-failure.yaml new file mode 100644 index 0000000000..55ceaaebff --- /dev/null +++ b/e2e/testdata/fn-render/save-on-render-failure/dfs-parent-validator-fails/starlark-fn-failure.yaml @@ -0,0 +1,8 @@ +apiVersion: fn.kpt.dev/v1alpha1 +kind: StarlarkRun +metadata: + name: always-fail +source: | + def fail_fn(items): + fail("intentional failure for testing") + fail_fn(ctx.resource_list["items"]) diff --git a/e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-mutator-fails/.expected/config.yaml b/e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-mutator-fails/.expected/config.yaml index 2eba311bad..f6237512ca 100644 --- a/e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-mutator-fails/.expected/config.yaml +++ b/e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-mutator-fails/.expected/config.yaml @@ -1,2 +1 @@ exitCode: 1 -StdErrRegEx: "(docker: Error response from daemon: Head.*denied|Error.*initializing source docker)" diff --git a/e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-mutator-fails/.expected/diff.patch b/e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-mutator-fails/.expected/diff.patch index 514a0dde24..97fe2e0b95 100644 --- a/e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-mutator-fails/.expected/diff.patch +++ b/e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-mutator-fails/.expected/diff.patch @@ -1,8 +1,8 @@ diff --git a/Kptfile b/Kptfile -index 80aa788..0fca116 100644 +index 80aa788..77f5c7b 100644 --- a/Kptfile +++ b/Kptfile -@@ -1,13 +1,21 @@ +@@ -1,13 +1,35 @@ apiVersion: kpt.dev/v1 kind: Kptfile metadata: @@ -26,8 +26,22 @@ index 80aa788..0fca116 100644 + message: |- + pkg.render: pkg ./subpkg: + pipeline.run: already handled error ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest ++ stderr: 'failed to evaluate function: error: function failure' ++ exitCode: 1 ++ results: ++ - message: 'fail: intentional failure for testing' ++ severity: error ++ errorResults: ++ - message: 'fail: intentional failure for testing' ++ severity: error ++ errorSummary: 'ghcr.io/kptdev/krm-functions-catalog/starlark:latest: exit code 1' diff --git a/subpkg/Kptfile b/subpkg/Kptfile -index ec4ce38..d7ac408 100644 +index 7b4318a..2c39656 100644 --- a/subpkg/Kptfile +++ b/subpkg/Kptfile @@ -2,6 +2,7 @@ apiVersion: kpt.dev/v1 @@ -49,3 +63,15 @@ index 302322e..98ff830 100644 + namespace: subpkg-ns spec: replicas: 2 +diff --git a/subpkg/starlark-fn-failure.yaml b/subpkg/starlark-fn-failure.yaml +index 55ceaae..3a4003f 100644 +--- a/subpkg/starlark-fn-failure.yaml ++++ b/subpkg/starlark-fn-failure.yaml +@@ -2,6 +2,7 @@ apiVersion: fn.kpt.dev/v1alpha1 + kind: StarlarkRun + metadata: + name: always-fail ++ namespace: subpkg-ns + source: | + def fail_fn(items): + fail("intentional failure for testing") diff --git a/e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-mutator-fails/subpkg/Kptfile b/e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-mutator-fails/subpkg/Kptfile index ec4ce38547..7b4318a971 100644 --- a/e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-mutator-fails/subpkg/Kptfile +++ b/e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-mutator-fails/subpkg/Kptfile @@ -9,4 +9,5 @@ pipeline: - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 configMap: namespace: subpkg-ns - - image: ghcr.io/kptdev/krm-functions-catalog/invalid-image:v0.0.0 + - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest + configPath: starlark-fn-failure.yaml diff --git a/e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-mutator-fails/subpkg/starlark-fn-failure.yaml b/e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-mutator-fails/subpkg/starlark-fn-failure.yaml new file mode 100644 index 0000000000..55ceaaebff --- /dev/null +++ b/e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-mutator-fails/subpkg/starlark-fn-failure.yaml @@ -0,0 +1,8 @@ +apiVersion: fn.kpt.dev/v1alpha1 +kind: StarlarkRun +metadata: + name: always-fail +source: | + def fail_fn(items): + fail("intentional failure for testing") + fail_fn(ctx.resource_list["items"]) diff --git a/e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-validator-fails/.expected/config.yaml b/e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-validator-fails/.expected/config.yaml index 2eba311bad..f6237512ca 100644 --- a/e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-validator-fails/.expected/config.yaml +++ b/e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-validator-fails/.expected/config.yaml @@ -1,2 +1 @@ exitCode: 1 -StdErrRegEx: "(docker: Error response from daemon: Head.*denied|Error.*initializing source docker)" diff --git a/e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-validator-fails/.expected/diff.patch b/e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-validator-fails/.expected/diff.patch index 4dbe465e7d..480b643eef 100644 --- a/e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-validator-fails/.expected/diff.patch +++ b/e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-validator-fails/.expected/diff.patch @@ -1,8 +1,8 @@ diff --git a/Kptfile b/Kptfile -index 7c3b09a..6bc279b 100644 +index 7c3b09a..2b496da 100644 --- a/Kptfile +++ b/Kptfile -@@ -1,14 +1,22 @@ +@@ -1,14 +1,37 @@ apiVersion: kpt.dev/v1 kind: Kptfile metadata: @@ -28,8 +28,23 @@ index 7c3b09a..6bc279b 100644 + message: |- + pkg.render: pkg ./subpkg: + pipeline.run: already handled error ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 ++ exitCode: 0 ++ validationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest ++ stderr: 'failed to evaluate function: error: function failure' ++ exitCode: 1 ++ results: ++ - message: 'fail: intentional failure for testing' ++ severity: error ++ errorResults: ++ - message: 'fail: intentional failure for testing' ++ severity: error ++ errorSummary: 'ghcr.io/kptdev/krm-functions-catalog/starlark:latest: exit code 1' diff --git a/subpkg/Kptfile b/subpkg/Kptfile -index f147d84..b3c532e 100644 +index 271c9a5..cbd2fa4 100644 --- a/subpkg/Kptfile +++ b/subpkg/Kptfile @@ -2,6 +2,7 @@ apiVersion: kpt.dev/v1 @@ -51,3 +66,15 @@ index 302322e..98ff830 100644 + namespace: subpkg-ns spec: replicas: 2 +diff --git a/subpkg/starlark-fn-failure.yaml b/subpkg/starlark-fn-failure.yaml +index 55ceaae..3a4003f 100644 +--- a/subpkg/starlark-fn-failure.yaml ++++ b/subpkg/starlark-fn-failure.yaml +@@ -2,6 +2,7 @@ apiVersion: fn.kpt.dev/v1alpha1 + kind: StarlarkRun + metadata: + name: always-fail ++ namespace: subpkg-ns + source: | + def fail_fn(items): + fail("intentional failure for testing") diff --git a/e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-validator-fails/subpkg/Kptfile b/e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-validator-fails/subpkg/Kptfile index f147d84027..271c9a592c 100644 --- a/e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-validator-fails/subpkg/Kptfile +++ b/e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-validator-fails/subpkg/Kptfile @@ -10,4 +10,5 @@ pipeline: configMap: namespace: subpkg-ns validators: - - image: ghcr.io/kptdev/krm-functions-catalog/invalid-image:v0.0.0 + - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest + configPath: starlark-fn-failure.yaml diff --git a/e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-validator-fails/subpkg/starlark-fn-failure.yaml b/e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-validator-fails/subpkg/starlark-fn-failure.yaml new file mode 100644 index 0000000000..55ceaaebff --- /dev/null +++ b/e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-validator-fails/subpkg/starlark-fn-failure.yaml @@ -0,0 +1,8 @@ +apiVersion: fn.kpt.dev/v1alpha1 +kind: StarlarkRun +metadata: + name: always-fail +source: | + def fail_fn(items): + fail("intentional failure for testing") + fail_fn(ctx.resource_list["items"]) diff --git a/e2e/testdata/fn-render/save-on-render-failure/no-save-on-render-failure/.expected/config.yaml b/e2e/testdata/fn-render/save-on-render-failure/no-save-on-render-failure/.expected/config.yaml index 66f4b9726b..320d1ac52c 100644 --- a/e2e/testdata/fn-render/save-on-render-failure/no-save-on-render-failure/.expected/config.yaml +++ b/e2e/testdata/fn-render/save-on-render-failure/no-save-on-render-failure/.expected/config.yaml @@ -1,3 +1,2 @@ exitCode: 1 allowNetwork: true -StdErrRegEx: "(docker: Error response from daemon: Head.*denied|Error.*initializing source docker)" diff --git a/e2e/testdata/fn-render/save-on-render-failure/no-save-on-render-failure/.expected/diff.patch b/e2e/testdata/fn-render/save-on-render-failure/no-save-on-render-failure/.expected/diff.patch index 187669d407..1bc17362b6 100644 --- a/e2e/testdata/fn-render/save-on-render-failure/no-save-on-render-failure/.expected/diff.patch +++ b/e2e/testdata/fn-render/save-on-render-failure/no-save-on-render-failure/.expected/diff.patch @@ -1,8 +1,8 @@ diff --git a/Kptfile b/Kptfile -index 6e26cd3..fb2aa71 100644 +index 8a2f9e1..49b7fb6 100644 --- a/Kptfile +++ b/Kptfile -@@ -4,12 +4,20 @@ metadata: +@@ -4,11 +4,35 @@ metadata: name: no-save-on-render-failure pipeline: mutators: @@ -12,18 +12,16 @@ index 6e26cd3..fb2aa71 100644 - - image: ghcr.io/kptdev/krm-functions-catalog/set-annotations:v0.1.4 - configMap: - app: myapp -- - image: invalid-image:v0.0.0 -- configMap: -- tier: backend +- - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest +- configPath: starlark-fn-failure.yaml + - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 + configMap: + namespace: staging + - image: ghcr.io/kptdev/krm-functions-catalog/set-annotations:v0.1.4 + configMap: + app: myapp -+ - image: invalid-image:v0.0.0 -+ configMap: -+ tier: backend ++ - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest ++ configPath: starlark-fn-failure.yaml +status: + conditions: + - type: Rendered @@ -32,3 +30,19 @@ index 6e26cd3..fb2aa71 100644 + message: |- + pkg.render: pkg .: + pipeline.run: already handled error ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-annotations:v0.1.4 ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest ++ stderr: 'failed to evaluate function: error: function failure' ++ exitCode: 1 ++ results: ++ - message: 'fail: intentional failure for testing' ++ severity: error ++ errorResults: ++ - message: 'fail: intentional failure for testing' ++ severity: error ++ errorSummary: 'ghcr.io/kptdev/krm-functions-catalog/starlark:latest: exit code 1' diff --git a/e2e/testdata/fn-render/save-on-render-failure/no-save-on-render-failure/Kptfile b/e2e/testdata/fn-render/save-on-render-failure/no-save-on-render-failure/Kptfile index 6e26cd3f3e..8a2f9e1430 100644 --- a/e2e/testdata/fn-render/save-on-render-failure/no-save-on-render-failure/Kptfile +++ b/e2e/testdata/fn-render/save-on-render-failure/no-save-on-render-failure/Kptfile @@ -10,6 +10,5 @@ pipeline: - image: ghcr.io/kptdev/krm-functions-catalog/set-annotations:v0.1.4 configMap: app: myapp - - image: invalid-image:v0.0.0 - configMap: - tier: backend + - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest + configPath: starlark-fn-failure.yaml diff --git a/e2e/testdata/fn-render/save-on-render-failure/no-save-on-render-failure/starlark-fn-failure.yaml b/e2e/testdata/fn-render/save-on-render-failure/no-save-on-render-failure/starlark-fn-failure.yaml new file mode 100644 index 0000000000..55ceaaebff --- /dev/null +++ b/e2e/testdata/fn-render/save-on-render-failure/no-save-on-render-failure/starlark-fn-failure.yaml @@ -0,0 +1,8 @@ +apiVersion: fn.kpt.dev/v1alpha1 +kind: StarlarkRun +metadata: + name: always-fail +source: | + def fail_fn(items): + fail("intentional failure for testing") + fail_fn(ctx.resource_list["items"]) diff --git a/e2e/testdata/fn-render/selectors/basicpipeline/.expected/diff.patch b/e2e/testdata/fn-render/selectors/basicpipeline/.expected/diff.patch index 8187cff1d0..ef1154af5a 100644 --- a/e2e/testdata/fn-render/selectors/basicpipeline/.expected/diff.patch +++ b/e2e/testdata/fn-render/selectors/basicpipeline/.expected/diff.patch @@ -1,8 +1,8 @@ diff --git a/Kptfile b/Kptfile -index abc7b97..0b78750 100644 +index abc7b97..251ecc4 100644 --- a/Kptfile +++ b/Kptfile -@@ -2,14 +2,21 @@ apiVersion: kpt.dev/v1 +@@ -2,14 +2,27 @@ apiVersion: kpt.dev/v1 kind: Kptfile metadata: name: app @@ -26,6 +26,12 @@ index abc7b97..0b78750 100644 + - type: Rendered + status: "True" + reason: RenderSuccess ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 ++ exitCode: 0 diff --git a/resources.yaml b/resources.yaml index f2eec52..6b5d443 100644 --- a/resources.yaml diff --git a/e2e/testdata/fn-render/selectors/exclude/.expected/diff.patch b/e2e/testdata/fn-render/selectors/exclude/.expected/diff.patch index c092089266..320d1e7658 100644 --- a/e2e/testdata/fn-render/selectors/exclude/.expected/diff.patch +++ b/e2e/testdata/fn-render/selectors/exclude/.expected/diff.patch @@ -1,8 +1,8 @@ diff --git a/Kptfile b/Kptfile -index 266b33a..92e4a02 100644 +index 266b33a..4be3f73 100644 --- a/Kptfile +++ b/Kptfile -@@ -8,10 +8,15 @@ pipeline: +@@ -8,10 +8,21 @@ pipeline: configMap: namespace: staging selectors: @@ -20,6 +20,12 @@ index 266b33a..92e4a02 100644 + - type: Rendered + status: "True" + reason: RenderSuccess ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 ++ exitCode: 0 diff --git a/resources.yaml b/resources.yaml index f2eec52..6b5d443 100644 --- a/resources.yaml diff --git a/e2e/testdata/fn-render/selectors/generator/.expected/diff.patch b/e2e/testdata/fn-render/selectors/generator/.expected/diff.patch index 9722438cf4..79d26c77b0 100644 --- a/e2e/testdata/fn-render/selectors/generator/.expected/diff.patch +++ b/e2e/testdata/fn-render/selectors/generator/.expected/diff.patch @@ -1,8 +1,8 @@ diff --git a/Kptfile b/Kptfile -index eb2f084..cb608a0 100644 +index eb2f084..10441e5 100644 --- a/Kptfile +++ b/Kptfile -@@ -14,3 +14,8 @@ pipeline: +@@ -14,3 +14,20 @@ pipeline: tier: db selectors: - name: httpbin @@ -11,6 +11,18 @@ index eb2f084..cb608a0 100644 + - type: Rendered + status: "True" + reason: RenderSuccess ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 ++ exitCode: 0 diff --git a/db/deployment_httpbin.yaml b/db/deployment_httpbin.yaml new file mode 100644 index 0000000..ffdf484 diff --git a/e2e/testdata/fn-render/selectors/selectors-with-exclude/.expected/diff.patch b/e2e/testdata/fn-render/selectors/selectors-with-exclude/.expected/diff.patch index ea9cd478bc..d10b112118 100644 --- a/e2e/testdata/fn-render/selectors/selectors-with-exclude/.expected/diff.patch +++ b/e2e/testdata/fn-render/selectors/selectors-with-exclude/.expected/diff.patch @@ -1,5 +1,5 @@ diff --git a/Kptfile b/Kptfile -index c16cdca..8941f26 100644 +index c16cdca..1fd5efb 100644 --- a/Kptfile +++ b/Kptfile @@ -2,6 +2,8 @@ apiVersion: kpt.dev/v1 @@ -11,7 +11,7 @@ index c16cdca..8941f26 100644 pipeline: mutators: - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 -@@ -15,3 +17,8 @@ pipeline: +@@ -15,3 +17,14 @@ pipeline: - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 configMap: tier: backend @@ -20,6 +20,12 @@ index c16cdca..8941f26 100644 + - type: Rendered + status: "True" + reason: RenderSuccess ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 ++ exitCode: 0 diff --git a/resources.yaml b/resources.yaml index d3ed04c..f66e542 100644 --- a/resources.yaml diff --git a/e2e/testdata/fn-render/short-image-path/.expected/diff.patch b/e2e/testdata/fn-render/short-image-path/.expected/diff.patch index 2312d6f22c..60e4a2c463 100644 --- a/e2e/testdata/fn-render/short-image-path/.expected/diff.patch +++ b/e2e/testdata/fn-render/short-image-path/.expected/diff.patch @@ -1,5 +1,5 @@ diff --git a/Kptfile b/Kptfile -index d4e5935..95f5ba8 100644 +index d4e5935..0759cb0 100644 --- a/Kptfile +++ b/Kptfile @@ -2,6 +2,9 @@ apiVersion: kpt.dev/v1 @@ -12,7 +12,7 @@ index d4e5935..95f5ba8 100644 pipeline: mutators: - image: set-namespace:v0.2.0 -@@ -10,3 +13,8 @@ pipeline: +@@ -10,3 +13,14 @@ pipeline: - image: set-labels:v0.1.5 configMap: tier: backend @@ -21,6 +21,12 @@ index d4e5935..95f5ba8 100644 + - type: Rendered + status: "True" + reason: RenderSuccess ++ renderStatus: ++ mutationSteps: ++ - image: set-namespace:v0.2.0 ++ exitCode: 0 ++ - image: set-labels:v0.1.5 ++ exitCode: 0 diff --git a/resources.yaml b/resources.yaml index f2eec52..84cfb26 100644 --- a/resources.yaml diff --git a/e2e/testdata/fn-render/structured-results-from-muiltiple-fns/.expected/diff.patch b/e2e/testdata/fn-render/structured-results-from-muiltiple-fns/.expected/diff.patch index 06c08a0a2c..ca32e656b4 100644 --- a/e2e/testdata/fn-render/structured-results-from-muiltiple-fns/.expected/diff.patch +++ b/e2e/testdata/fn-render/structured-results-from-muiltiple-fns/.expected/diff.patch @@ -1,8 +1,8 @@ diff --git a/Kptfile b/Kptfile -index 91828a8..aea2cb9 100644 +index 91828a8..7d7d072 100644 --- a/Kptfile +++ b/Kptfile -@@ -9,3 +9,11 @@ pipeline: +@@ -9,3 +9,86 @@ pipeline: configMap: ignore_missing_schemas: "true" strict: "true" @@ -14,3 +14,78 @@ index 91828a8..aea2cb9 100644 + message: |- + pkg.render: pkg .: + pipeline.run: already handled error ++ renderStatus: ++ validationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/gatekeeper:latest ++ exitCode: 0 ++ results: ++ - message: |- ++ The following banned keys are being used in the ConfigMap: {"private_key"} ++ violatedConstraint: no-secrets-in-configmap ++ severity: warning ++ resourceRef: ++ apiVersion: v1 ++ kind: ConfigMap ++ name: some-secret ++ namespace: default ++ file: ++ path: resources.yaml ++ index: 4 ++ - message: |- ++ The following banned keys are being used in the ConfigMap: {"less_sensitive_key"} ++ violatedConstraint: no-sensitive-data-in-configmap ++ severity: info ++ resourceRef: ++ apiVersion: v1 ++ kind: ConfigMap ++ name: some-secret ++ namespace: default ++ file: ++ path: resources.yaml ++ index: 4 ++ - image: ghcr.io/kptdev/krm-functions-catalog/kubeconform:latest ++ stderr: 'failed to evaluate function: error: function failure' ++ exitCode: 1 ++ results: ++ - message: missing properties 'selector', 'template' ++ severity: error ++ resourceRef: ++ apiVersion: apps/v1 ++ kind: Deployment ++ name: nginx-deployment ++ field: ++ path: spec ++ file: ++ path: resources.yaml ++ - message: got string, want null or integer ++ severity: error ++ resourceRef: ++ apiVersion: apps/v1 ++ kind: Deployment ++ name: nginx-deployment ++ field: ++ path: spec.replicas ++ file: ++ path: resources.yaml ++ errorResults: ++ - message: missing properties 'selector', 'template' ++ severity: error ++ resourceRef: ++ apiVersion: apps/v1 ++ kind: Deployment ++ name: nginx-deployment ++ field: ++ path: spec ++ file: ++ path: resources.yaml ++ - message: got string, want null or integer ++ severity: error ++ resourceRef: ++ apiVersion: apps/v1 ++ kind: Deployment ++ name: nginx-deployment ++ field: ++ path: spec.replicas ++ file: ++ path: resources.yaml ++ errorSummary: 'ghcr.io/kptdev/krm-functions-catalog/kubeconform:latest: exit code 1' diff --git a/e2e/testdata/fn-render/subpkg-fn-failure/.expected/diff.patch b/e2e/testdata/fn-render/subpkg-fn-failure/.expected/diff.patch index bd7106dd95..2a0ae26098 100644 --- a/e2e/testdata/fn-render/subpkg-fn-failure/.expected/diff.patch +++ b/e2e/testdata/fn-render/subpkg-fn-failure/.expected/diff.patch @@ -1,8 +1,8 @@ diff --git a/Kptfile b/Kptfile -index 364e274..4316cf6 100644 +index 364e274..4e01e27 100644 --- a/Kptfile +++ b/Kptfile -@@ -12,3 +12,11 @@ pipeline: +@@ -12,3 +12,23 @@ pipeline: - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 configMap: tier: backend @@ -14,3 +14,15 @@ index 364e274..4316cf6 100644 + message: |- + pkg.render: pkg ./db: + pipeline.run: already handled error ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest ++ stderr: 'failed to evaluate function: error: function failure' ++ exitCode: 1 ++ results: ++ - message: 'statefulset-filter:4:42: got newline, want primary expression' ++ severity: error ++ errorResults: ++ - message: 'statefulset-filter:4:42: got newline, want primary expression' ++ severity: error ++ errorSummary: 'ghcr.io/kptdev/krm-functions-catalog/starlark:latest: exit code 1' diff --git a/e2e/testdata/fn-render/subpkg-has-samename-subdir/.expected/diff.patch b/e2e/testdata/fn-render/subpkg-has-samename-subdir/.expected/diff.patch index cb038df6d8..031c210bcd 100644 --- a/e2e/testdata/fn-render/subpkg-has-samename-subdir/.expected/diff.patch +++ b/e2e/testdata/fn-render/subpkg-has-samename-subdir/.expected/diff.patch @@ -1,8 +1,8 @@ diff --git a/Kptfile b/Kptfile -index 701e0a1..3107d07 100644 +index 701e0a1..63952e8 100644 --- a/Kptfile +++ b/Kptfile -@@ -4,3 +4,8 @@ metadata: +@@ -4,3 +4,12 @@ metadata: name: root-pkg info: description: sample description @@ -11,6 +11,10 @@ index 701e0a1..3107d07 100644 + - type: Rendered + status: "True" + reason: RenderSuccess ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 ++ exitCode: 0 diff --git a/pkg-a/Kptfile b/pkg-a/Kptfile index 088bc03..c42f368 100644 --- a/pkg-a/Kptfile diff --git a/e2e/testdata/fn-render/subpkg-resource-deletion/.expected/diff.patch b/e2e/testdata/fn-render/subpkg-resource-deletion/.expected/diff.patch index ace86b1bd8..aef01a905e 100644 --- a/e2e/testdata/fn-render/subpkg-resource-deletion/.expected/diff.patch +++ b/e2e/testdata/fn-render/subpkg-resource-deletion/.expected/diff.patch @@ -1,5 +1,5 @@ diff --git a/Kptfile b/Kptfile -index 364e274..9ad7200 100644 +index 364e274..79d669a 100644 --- a/Kptfile +++ b/Kptfile @@ -2,6 +2,9 @@ apiVersion: kpt.dev/v1 @@ -12,7 +12,7 @@ index 364e274..9ad7200 100644 pipeline: mutators: - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest -@@ -12,3 +15,8 @@ pipeline: +@@ -12,3 +15,22 @@ pipeline: - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 configMap: tier: backend @@ -21,6 +21,20 @@ index 364e274..9ad7200 100644 + - type: Rendered + status: "True" + reason: RenderSuccess ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 ++ exitCode: 0 diff --git a/db/Kptfile b/db/Kptfile index 6c7674c..11fe9cc 100644 --- a/db/Kptfile diff --git a/e2e/testdata/fn-render/subpkgs-with-krmignore/.expected/diff.patch b/e2e/testdata/fn-render/subpkgs-with-krmignore/.expected/diff.patch index 63ae894e45..fa040eaaab 100644 --- a/e2e/testdata/fn-render/subpkgs-with-krmignore/.expected/diff.patch +++ b/e2e/testdata/fn-render/subpkgs-with-krmignore/.expected/diff.patch @@ -1,5 +1,5 @@ diff --git a/Kptfile b/Kptfile -index 82686a8..a4b2da6 100644 +index 82686a8..7570107 100644 --- a/Kptfile +++ b/Kptfile @@ -2,6 +2,9 @@ apiVersion: kpt.dev/v1 @@ -12,7 +12,7 @@ index 82686a8..a4b2da6 100644 pipeline: mutators: - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 -@@ -10,3 +13,8 @@ pipeline: +@@ -10,3 +13,18 @@ pipeline: - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 configMap: tier: db @@ -21,6 +21,16 @@ index 82686a8..a4b2da6 100644 + - type: Rendered + status: "True" + reason: RenderSuccess ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 ++ exitCode: 0 diff --git a/db/Kptfile b/db/Kptfile index 264dd2e..8dd7c37 100644 --- a/db/Kptfile diff --git a/e2e/testdata/fn-render/subpkgs/.expected/diff.patch b/e2e/testdata/fn-render/subpkgs/.expected/diff.patch index 63ae894e45..fa040eaaab 100644 --- a/e2e/testdata/fn-render/subpkgs/.expected/diff.patch +++ b/e2e/testdata/fn-render/subpkgs/.expected/diff.patch @@ -1,5 +1,5 @@ diff --git a/Kptfile b/Kptfile -index 82686a8..a4b2da6 100644 +index 82686a8..7570107 100644 --- a/Kptfile +++ b/Kptfile @@ -2,6 +2,9 @@ apiVersion: kpt.dev/v1 @@ -12,7 +12,7 @@ index 82686a8..a4b2da6 100644 pipeline: mutators: - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 -@@ -10,3 +13,8 @@ pipeline: +@@ -10,3 +13,18 @@ pipeline: - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 configMap: tier: db @@ -21,6 +21,16 @@ index 82686a8..a4b2da6 100644 + - type: Rendered + status: "True" + reason: RenderSuccess ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 ++ exitCode: 0 diff --git a/db/Kptfile b/db/Kptfile index 264dd2e..8dd7c37 100644 --- a/db/Kptfile diff --git a/e2e/testdata/fn-render/success-stdout/.expected/diff.patch b/e2e/testdata/fn-render/success-stdout/.expected/diff.patch index 16337308e3..114ed718fa 100644 --- a/e2e/testdata/fn-render/success-stdout/.expected/diff.patch +++ b/e2e/testdata/fn-render/success-stdout/.expected/diff.patch @@ -1,5 +1,5 @@ diff --git a/Kptfile b/Kptfile -index 1307fb5..f645d75 100644 +index 1307fb5..fee64dc 100644 --- a/Kptfile +++ b/Kptfile @@ -2,6 +2,9 @@ apiVersion: kpt.dev/v1 @@ -12,7 +12,7 @@ index 1307fb5..f645d75 100644 pipeline: mutators: - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 -@@ -10,3 +13,8 @@ pipeline: +@@ -10,3 +13,14 @@ pipeline: - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 configMap: tier: backend @@ -21,6 +21,12 @@ index 1307fb5..f645d75 100644 + - type: Rendered + status: "True" + reason: RenderSuccess ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0 ++ exitCode: 0 ++ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5 ++ exitCode: 0 diff --git a/resources.yaml b/resources.yaml index f2eec52..84cfb26 100644 --- a/resources.yaml diff --git a/e2e/testdata/fn-render/validate-generated-resource/.expected/diff.patch b/e2e/testdata/fn-render/validate-generated-resource/.expected/diff.patch index 5499661a18..8632a3fdd2 100644 --- a/e2e/testdata/fn-render/validate-generated-resource/.expected/diff.patch +++ b/e2e/testdata/fn-render/validate-generated-resource/.expected/diff.patch @@ -1,8 +1,8 @@ diff --git a/Kptfile b/Kptfile -index b2432a4..0362808 100644 +index b2432a4..aab20f0 100644 --- a/Kptfile +++ b/Kptfile -@@ -9,3 +9,8 @@ pipeline: +@@ -9,3 +9,15 @@ pipeline: validators: - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest configPath: starlark-httpbin-val.yaml @@ -11,6 +11,13 @@ index b2432a4..0362808 100644 + - type: Rendered + status: "True" + reason: RenderSuccess ++ renderStatus: ++ mutationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest ++ exitCode: 0 ++ validationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest ++ exitCode: 0 diff --git a/deployment_httpbin.yaml b/deployment_httpbin.yaml new file mode 100644 index 0000000..f36c98e diff --git a/e2e/testdata/fn-render/validate-resource-failure/.expected/diff.patch b/e2e/testdata/fn-render/validate-resource-failure/.expected/diff.patch index b063c5efd4..bb159929e9 100644 --- a/e2e/testdata/fn-render/validate-resource-failure/.expected/diff.patch +++ b/e2e/testdata/fn-render/validate-resource-failure/.expected/diff.patch @@ -1,8 +1,8 @@ diff --git a/Kptfile b/Kptfile -index 8c3173a..c241762 100644 +index 8c3173a..526d266 100644 --- a/Kptfile +++ b/Kptfile -@@ -4,5 +4,13 @@ metadata: +@@ -4,5 +4,25 @@ metadata: name: db pipeline: validators: @@ -17,3 +17,15 @@ index 8c3173a..c241762 100644 + message: |- + pkg.render: pkg .: + pipeline.run: already handled error ++ renderStatus: ++ validationSteps: ++ - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest ++ stderr: 'failed to evaluate function: error: function failure' ++ exitCode: 1 ++ results: ++ - message: 'fail: could not find httpbin deployment' ++ severity: error ++ errorResults: ++ - message: 'fail: could not find httpbin deployment' ++ severity: error ++ errorSummary: 'ghcr.io/kptdev/krm-functions-catalog/starlark:latest: exit code 1' diff --git a/internal/util/render/executor.go b/internal/util/render/executor.go index eb83469e25..a2dc08661f 100644 --- a/internal/util/render/executor.go +++ b/internal/util/render/executor.go @@ -37,6 +37,7 @@ import ( "github.com/kptdev/kpt/pkg/printer" "k8s.io/klog/v2" "sigs.k8s.io/kustomize/kyaml/filesys" + "sigs.k8s.io/kustomize/kyaml/fn/framework" "sigs.k8s.io/kustomize/kyaml/kio" "sigs.k8s.io/kustomize/kyaml/kio/kioutil" "sigs.k8s.io/kustomize/kyaml/sets" @@ -121,10 +122,16 @@ func (e *Renderer) Execute(ctx context.Context) (*fnresult.ResultList, error) { // adjust the relative paths of the resources. err = adjustRelPath(hctx) if err != nil { + if e.Output == nil { + updateRenderStatus(hctx, err) + } return nil, err } if err = trackOutputFiles(hctx); err != nil { + if e.Output == nil { + updateRenderStatus(hctx, err) + } return nil, err } @@ -157,6 +164,7 @@ func (e *Renderer) Execute(ctx context.Context) (*fnresult.ResultList, error) { if hydErr == nil { if err = pruneResources(e.FileSystem, hctx); err != nil { + updateRenderStatus(hctx, err) return nil, err } } @@ -206,7 +214,7 @@ func (e *Renderer) printPipelineExecutionSummary(pr printer.Printer, hctx hydrat } } -// updateRenderStatus writes a Rendered status condition to the root Kptfile. +// updateRenderStatus writes a Rendered status condition and RenderStatus to the root Kptfile. // On success, the root package gets a True condition. // On failure, the root package gets a False condition with the error message. func updateRenderStatus(hctx *hydrationContext, hydErr error) { @@ -223,11 +231,52 @@ func updateRenderStatus(hctx *hydrationContext, hydErr error) { reason = kptfilev1.ReasonRenderFailed message = strings.ReplaceAll(hydErr.Error(), rootPath, ".") } - setRenderCondition(hctx.fileSystem, rootPath, kptfilev1.NewRenderedCondition(conditionStatus, reason, message)) + renderStatus := buildRenderStatus(hctx, hydErr) + setRenderStatus(hctx.fileSystem, rootPath, kptfilev1.NewRenderedCondition(conditionStatus, reason, message), renderStatus) +} + +// buildRenderStatus constructs a RenderStatus from the tracked pipeline step results. +func buildRenderStatus(hctx *hydrationContext, hydErr error) *kptfilev1.RenderStatus { + if len(hctx.mutationSteps) == 0 && len(hctx.validationSteps) == 0 { + return nil + } + rs := &kptfilev1.RenderStatus{ + MutationSteps: hctx.mutationSteps, + ValidationSteps: hctx.validationSteps, + } + if hydErr != nil { + var errLines []string + for _, s := range hctx.mutationSteps { + if s.ExecutionError != "" { + errLines = append(errLines, fmt.Sprintf("%s: %s", stepName(s), s.ExecutionError)) + } else if s.ExitCode != 0 { + errLines = append(errLines, fmt.Sprintf("%s: exit code %d", stepName(s), s.ExitCode)) + } + } + for _, s := range hctx.validationSteps { + if s.ExecutionError != "" { + errLines = append(errLines, fmt.Sprintf("%s: %s", stepName(s), s.ExecutionError)) + } else if s.ExitCode != 0 { + errLines = append(errLines, fmt.Sprintf("%s: exit code %d", stepName(s), s.ExitCode)) + } + } + rs.ErrorSummary = strings.Join(errLines, "\n") + } + return rs } -// setRenderCondition reads the Kptfile at pkgPath, sets the Rendered condition, and writes it back. -func setRenderCondition(fs filesys.FileSystem, pkgPath string, condition kptfilev1.Condition) { +func stepName(s kptfilev1.PipelineStepResult) string { + if s.Name != "" { + return s.Name + } + if s.Image != "" { + return s.Image + } + return s.ExecPath +} + +// setRenderStatus reads the Kptfile at pkgPath, sets the Rendered condition and RenderStatus, and writes it back. +func setRenderStatus(fs filesys.FileSystem, pkgPath string, condition kptfilev1.Condition, renderStatus *kptfilev1.RenderStatus) { fsOrDisk := filesys.FileSystemOrOnDisk{FileSystem: fs} kf, err := kptfileutil.ReadKptfile(fsOrDisk, pkgPath) if err != nil { @@ -242,8 +291,9 @@ func setRenderCondition(fs filesys.FileSystem, pkgPath string, condition kptfile return c.Type == kptfilev1.ConditionTypeRendered }) kf.Status.Conditions = append(kf.Status.Conditions, condition) + kf.Status.RenderStatus = renderStatus if err := kptfileutil.WriteKptfileToFS(fs, pkgPath, kf); err != nil { - klog.V(3).Infof("failed to write render status condition to Kptfile at %s: %v", pkgPath, err) + klog.V(3).Infof("failed to write render status to Kptfile at %s: %v", pkgPath, err) } } @@ -289,6 +339,10 @@ type hydrationContext struct { // should be saved when rendering fails. Read from the root Kptfile annotation. saveOnRenderFailure bool + // mutationSteps and validationSteps track per-function results for RenderStatus. + mutationSteps []kptfilev1.PipelineStepResult + validationSteps []kptfilev1.PipelineStepResult + runnerOptions runneroptions.RunnerOptions fileSystem filesys.FileSystem @@ -696,12 +750,16 @@ func (pn *pkgNode) runMutators(ctx context.Context, hctx *hydrationContext, inpu return input, nil } - mutators, err := fnChain(ctx, hctx, pn.pkg.UniquePath, pl.Mutators) + mutators, failIdx, err := fnChain(ctx, hctx, pn.pkg.UniquePath, pl.Mutators) if err != nil { + // Capture execution error (e.g. missing exec, image resolution failure) + hctx.mutationSteps = append(hctx.mutationSteps, preExecFailureStep(pl.Mutators[failIdx], err)) return nil, err } for i, mutator := range mutators { + prevLen := len(hctx.fnResults.Items) + if pl.Mutators[i].ConfigPath != "" { // functionConfigs are included in the function inputs during `render` // and as a result, they can be mutated during the `render`. @@ -751,9 +809,11 @@ func (pn *pkgNode) runMutators(ctx context.Context, hctx *hydrationContext, inpu err = mutation.Execute() if err != nil { clearAnnotationsOnMutFailure(input) + hctx.mutationSteps = append(hctx.mutationSteps, captureStepResult(pl.Mutators[i], hctx.fnResults, prevLen, err)) return input, err } hctx.executedFunctionCnt++ + hctx.mutationSteps = append(hctx.mutationSteps, captureStepResult(pl.Mutators[i], hctx.fnResults, prevLen, nil)) if len(selectors) > 0 || len(exclusions) > 0 { // merge the output resources with input resources @@ -786,6 +846,7 @@ func (pn *pkgNode) runValidators(ctx context.Context, hctx *hydrationContext, in for i := range pl.Validators { function := pl.Validators[i] + prevLen := len(hctx.fnResults.Items) // validators are run on a copy of mutated resources to ensure // resources are not mutated. selectedResources, err := fnruntime.SelectInput(input, function.Selectors, function.Exclusions, &fnruntime.SelectionContext{RootPackagePath: hctx.root.pkg.UniquePath}) @@ -798,6 +859,7 @@ func (pn *pkgNode) runValidators(ctx context.Context, hctx *hydrationContext, in displayResourceCount = true } if function.Exec != "" && !hctx.runnerOptions.AllowExec { + hctx.validationSteps = append(hctx.validationSteps, preExecFailureStep(function, errAllowedExecNotSpecified)) return errAllowedExecNotSpecified } opts := hctx.runnerOptions @@ -805,12 +867,15 @@ func (pn *pkgNode) runValidators(ctx context.Context, hctx *hydrationContext, in opts.DisplayResourceCount = displayResourceCount validator, err = fnruntime.NewRunner(ctx, hctx.fileSystem, &function, pn.pkg.UniquePath, hctx.fnResults, opts, hctx.runtime) if err != nil { + hctx.validationSteps = append(hctx.validationSteps, preExecFailureStep(function, err)) return err } if _, err = validator.Filter(cloneResources(selectedResources)); err != nil { + hctx.validationSteps = append(hctx.validationSteps, captureStepResult(function, hctx.fnResults, prevLen, err)) return err } hctx.executedFunctionCnt++ + hctx.validationSteps = append(hctx.validationSteps, captureStepResult(function, hctx.fnResults, prevLen, nil)) } return nil } @@ -912,7 +977,7 @@ func pathRelToRoot(rootPkgPath, subPkgPath, resourcePath string) (relativePath s } // fnChain returns a slice of function runners given a list of functions defined in pipeline. -func fnChain(ctx context.Context, hctx *hydrationContext, pkgPath types.UniquePath, fns []kptfilev1.Function) ([]*fnruntime.FunctionRunner, error) { +func fnChain(ctx context.Context, hctx *hydrationContext, pkgPath types.UniquePath, fns []kptfilev1.Function) ([]*fnruntime.FunctionRunner, int, error) { var runners []*fnruntime.FunctionRunner for i := range fns { var err error @@ -923,18 +988,18 @@ func fnChain(ctx context.Context, hctx *hydrationContext, pkgPath types.UniquePa displayResourceCount = true } if function.Exec != "" && !hctx.runnerOptions.AllowExec { - return nil, errAllowedExecNotSpecified + return nil, i, errAllowedExecNotSpecified } opts := hctx.runnerOptions opts.SetPkgPathAnnotation = true opts.DisplayResourceCount = displayResourceCount runner, err = fnruntime.NewRunner(ctx, hctx.fileSystem, &function, pkgPath, hctx.fnResults, opts, hctx.runtime) if err != nil { - return nil, err + return nil, i, err } runners = append(runners, runner) } - return runners, nil + return runners, -1, nil } // trackInputFiles records file paths of input resources in the hydration context. @@ -980,3 +1045,82 @@ func pruneResources(fsys filesys.FileSystem, hctx *hydrationContext) error { } return nil } + +// captureStepResult builds a PipelineStepResult from the fnresult.Result items +// appended since prevLen. +func captureStepResult(fn kptfilev1.Function, fnResults *fnresult.ResultList, prevLen int, execErr error) kptfilev1.PipelineStepResult { + step := kptfilev1.PipelineStepResult{ + Name: fn.Name, + Image: fn.Image, + ExecPath: fn.Exec, + } + if prevLen < len(fnResults.Items) { + last := fnResults.Items[len(fnResults.Items)-1] + step.Stderr = last.Stderr + step.ExitCode = last.ExitCode + step.Results = frameworkResultsToItems(last.Results) + for _, ri := range step.Results { + if ri.Severity == string(framework.Error) { + step.ErrorResults = append(step.ErrorResults, ri) + } + } + } else if execErr != nil { + step.ExitCode = 1 + step.ExecutionError = execErr.Error() + } + return step +} + +// preExecFailureStep creates a PipelineStepResult for errors that occur before +// the function is executed (e.g. image pull failure, missing exec permission). +// ExitCode is set to 1 to indicate failure; the executionError field provides +// the specific reason the function could not be started. +func preExecFailureStep(fn kptfilev1.Function, err error) kptfilev1.PipelineStepResult { + return kptfilev1.PipelineStepResult{ + Name: fn.Name, + Image: fn.Image, + ExecPath: fn.Exec, + ExitCode: 1, + ExecutionError: err.Error(), + } +} + +// frameworkResultsToItems converts framework.Results to []ResultItem. +func frameworkResultsToItems(results framework.Results) []kptfilev1.ResultItem { + if len(results) == 0 { + return nil + } + items := make([]kptfilev1.ResultItem, len(results)) + for i, r := range results { + items[i] = kptfilev1.ResultItem{ + Message: r.Message, + Severity: string(r.Severity), + } + if r.ResourceRef != nil { + items[i].ResourceRef = &kptfilev1.ResourceRef{ + APIVersion: r.ResourceRef.APIVersion, + Kind: r.ResourceRef.Kind, + Name: r.ResourceRef.Name, + Namespace: r.ResourceRef.Namespace, + } + } + if r.Field != nil { + items[i].Field = &kptfilev1.FieldRef{ + Path: r.Field.Path, + } + if r.Field.CurrentValue != nil { + items[i].Field.CurrentValue = fmt.Sprintf("%v", r.Field.CurrentValue) + } + if r.Field.ProposedValue != nil { + items[i].Field.ProposedValue = fmt.Sprintf("%v", r.Field.ProposedValue) + } + } + if r.File != nil { + items[i].File = &kptfilev1.FileRef{ + Path: r.File.Path, + Index: r.File.Index, + } + } + } + return items +} diff --git a/internal/util/render/executor_test.go b/internal/util/render/executor_test.go index e09b33bc50..9f4280a794 100644 --- a/internal/util/render/executor_test.go +++ b/internal/util/render/executor_test.go @@ -25,12 +25,15 @@ import ( "github.com/kptdev/kpt/internal/fnruntime" "github.com/kptdev/kpt/internal/pkg" "github.com/kptdev/kpt/internal/types" + fnresult "github.com/kptdev/kpt/pkg/api/fnresult/v1" kptfilev1 "github.com/kptdev/kpt/pkg/api/kptfile/v1" "github.com/kptdev/kpt/pkg/kptfile/kptfileutil" "github.com/kptdev/kpt/pkg/printer" "github.com/stretchr/testify/assert" "sigs.k8s.io/kustomize/kyaml/filesys" + "sigs.k8s.io/kustomize/kyaml/fn/framework" "sigs.k8s.io/kustomize/kyaml/kio" + "sigs.k8s.io/kustomize/kyaml/yaml" ) const rootString = "/root" @@ -730,6 +733,304 @@ metadata: assert.True(t, subKf.Status == nil || len(subKf.Status.Conditions) == 0) } +func TestBuildRenderStatus_NoSteps(t *testing.T) { + hctx := &hydrationContext{} + rs := buildRenderStatus(hctx, nil) + assert.Nil(t, rs) +} + +func TestBuildRenderStatus_SuccessWithMutationSteps(t *testing.T) { + hctx := &hydrationContext{ + mutationSteps: []kptfilev1.PipelineStepResult{ + {Image: "set-namespace:v1", ExitCode: 0}, + {Image: "set-annotations:v1", ExitCode: 0}, + }, + } + rs := buildRenderStatus(hctx, nil) + assert.NotNil(t, rs) + assert.Len(t, rs.MutationSteps, 2) + assert.Empty(t, rs.ValidationSteps) + assert.Empty(t, rs.ErrorSummary) +} + +func TestBuildRenderStatus_FailureWithErrorSummary(t *testing.T) { + hctx := &hydrationContext{ + mutationSteps: []kptfilev1.PipelineStepResult{ + {Image: "set-namespace:v1", ExitCode: 0}, + {Image: "bad-image:v1", ExitCode: 1}, + }, + validationSteps: []kptfilev1.PipelineStepResult{ + {Image: "gatekeeper:latest", ExecutionError: "image not found"}, + }, + } + rs := buildRenderStatus(hctx, fmt.Errorf("pipeline failed")) + assert.NotNil(t, rs) + assert.Contains(t, rs.ErrorSummary, "bad-image:v1: exit code 1") + assert.Contains(t, rs.ErrorSummary, "gatekeeper:latest: image not found") +} + +func TestBuildRenderStatus_UsesNameForErrorSummary(t *testing.T) { + hctx := &hydrationContext{ + mutationSteps: []kptfilev1.PipelineStepResult{ + {Name: "my-step", Image: "img:v1", ExitCode: 1}, + }, + } + rs := buildRenderStatus(hctx, fmt.Errorf("fail")) + assert.Equal(t, "my-step: exit code 1", rs.ErrorSummary) +} + +func TestBuildRenderStatus_UsesExecPathForErrorSummary(t *testing.T) { + hctx := &hydrationContext{ + mutationSteps: []kptfilev1.PipelineStepResult{ + {ExecPath: "/usr/bin/my-fn", ExecutionError: "not found"}, + }, + } + rs := buildRenderStatus(hctx, fmt.Errorf("fail")) + assert.Equal(t, "/usr/bin/my-fn: not found", rs.ErrorSummary) +} + +func TestCaptureStepResult_FromFnResults(t *testing.T) { + fnResults := fnresult.NewResultList() + fnResults.Items = append(fnResults.Items, fnresult.Result{ + Image: "gatekeeper:latest", + ExitCode: 1, + Stderr: "validation failed", + Results: framework.Results{ + {Message: "banned key found", Severity: framework.Error, + ResourceRef: &yaml.ResourceIdentifier{ + TypeMeta: yaml.TypeMeta{APIVersion: "v1", Kind: "ConfigMap"}, + NameMeta: yaml.NameMeta{Name: "my-cm", Namespace: "default"}, + }, + File: &framework.File{Path: "resources.yaml", Index: 2}, + }, + {Message: "missing label", Severity: framework.Warning}, + }, + }) + + fn := kptfilev1.Function{Name: "validate", Image: "gatekeeper:latest"} + step := captureStepResult(fn, fnResults, 0, nil) + + assert.Equal(t, "validate", step.Name) + assert.Equal(t, "gatekeeper:latest", step.Image) + assert.Equal(t, 1, step.ExitCode) + assert.Equal(t, "validation failed", step.Stderr) + assert.Len(t, step.Results, 2) + + // First result — error with full resource ref and file + assert.Equal(t, "banned key found", step.Results[0].Message) + assert.Equal(t, "error", step.Results[0].Severity) + assert.Equal(t, "v1", step.Results[0].ResourceRef.APIVersion) + assert.Equal(t, "ConfigMap", step.Results[0].ResourceRef.Kind) + assert.Equal(t, "my-cm", step.Results[0].ResourceRef.Name) + assert.Equal(t, "default", step.Results[0].ResourceRef.Namespace) + assert.Equal(t, "resources.yaml", step.Results[0].File.Path) + assert.Equal(t, 2, step.Results[0].File.Index) + + // Second result — warning, no resource ref + assert.Equal(t, "missing label", step.Results[1].Message) + assert.Equal(t, "warning", step.Results[1].Severity) + assert.Nil(t, step.Results[1].ResourceRef) + + // ErrorResults should only contain the error-severity item + assert.Len(t, step.ErrorResults, 1) + assert.Equal(t, "banned key found", step.ErrorResults[0].Message) +} + +func TestCaptureStepResult_NoNewItems(t *testing.T) { + fnResults := fnresult.NewResultList() + fn := kptfilev1.Function{Image: "set-namespace:v1"} + step := captureStepResult(fn, fnResults, 0, fmt.Errorf("output resource list must contain only KRM resources")) + + assert.Equal(t, "set-namespace:v1", step.Image) + assert.Equal(t, 1, step.ExitCode) + assert.Equal(t, "output resource list must contain only KRM resources", step.ExecutionError) + assert.Nil(t, step.Results) + assert.Nil(t, step.ErrorResults) +} + +func TestPreExecFailureStep(t *testing.T) { + fn := kptfilev1.Function{Name: "my-fn", Image: "bad-image:v1", Exec: ""} + step := preExecFailureStep(fn, fmt.Errorf("pull access denied")) + + assert.Equal(t, "my-fn", step.Name) + assert.Equal(t, "bad-image:v1", step.Image) + assert.Equal(t, "pull access denied", step.ExecutionError) + assert.Equal(t, 1, step.ExitCode) + assert.Nil(t, step.Results) +} + +func TestPreExecFailureStep_EmptyFn(t *testing.T) { + step := preExecFailureStep(kptfilev1.Function{}, fmt.Errorf("no functions")) + assert.Empty(t, step.Name) + assert.Empty(t, step.Image) + assert.Empty(t, step.ExecPath) + assert.Equal(t, "no functions", step.ExecutionError) +} + +func TestFrameworkResultsToItems_Nil(t *testing.T) { + items := frameworkResultsToItems(nil) + assert.Nil(t, items) +} + +func TestFrameworkResultsToItems_WithFieldRef(t *testing.T) { + results := framework.Results{ + { + Message: "wrong value", + Severity: framework.Error, + Field: &framework.Field{ + Path: ".spec.replicas", + CurrentValue: "invalid", + ProposedValue: 3, + }, + }, + } + items := frameworkResultsToItems(results) + assert.Len(t, items, 1) + assert.Equal(t, ".spec.replicas", items[0].Field.Path) + assert.Equal(t, "invalid", items[0].Field.CurrentValue) + assert.Equal(t, "3", items[0].Field.ProposedValue) +} + +func TestFrameworkResultsToItems_NilFieldValues(t *testing.T) { + results := framework.Results{ + { + Message: "field info", + Severity: framework.Info, + Field: &framework.Field{ + Path: ".spec.replicas", + }, + }, + } + items := frameworkResultsToItems(results) + assert.Len(t, items, 1) + assert.Equal(t, ".spec.replicas", items[0].Field.Path) + assert.Empty(t, items[0].Field.CurrentValue) + assert.Empty(t, items[0].Field.ProposedValue) +} + +func TestUpdateRenderStatus_WritesRenderStatus(t *testing.T) { + mockFS := filesys.MakeFsInMemory() + rootPath := rootString + assert.NoError(t, mockFS.Mkdir(rootPath)) + assert.NoError(t, mockFS.WriteFile(filepath.Join(rootPath, "Kptfile"), []byte(` +apiVersion: kpt.dev/v1 +kind: Kptfile +metadata: + name: root-package +`))) + + rootPkg, err := pkg.New(mockFS, rootPath) + assert.NoError(t, err) + + hctx := &hydrationContext{ + root: &pkgNode{pkg: rootPkg}, + pkgs: map[types.UniquePath]*pkgNode{}, + fileSystem: mockFS, + mutationSteps: []kptfilev1.PipelineStepResult{ + {Image: "set-namespace:v1", ExitCode: 0}, + }, + validationSteps: []kptfilev1.PipelineStepResult{ + {Image: "gatekeeper:latest", ExitCode: 1, Stderr: "failed"}, + }, + } + + updateRenderStatus(hctx, fmt.Errorf("validation failed")) + + rootKf, err := kptfileutil.ReadKptfile(mockFS, rootPath) + assert.NoError(t, err) + assert.NotNil(t, rootKf.Status) + + // Condition should be set + assert.Len(t, rootKf.Status.Conditions, 1) + assert.Equal(t, kptfilev1.ConditionFalse, rootKf.Status.Conditions[0].Status) + + // RenderStatus should be populated + rs := rootKf.Status.RenderStatus + assert.NotNil(t, rs) + assert.Len(t, rs.MutationSteps, 1) + assert.Equal(t, "set-namespace:v1", rs.MutationSteps[0].Image) + assert.Len(t, rs.ValidationSteps, 1) + assert.Equal(t, "gatekeeper:latest", rs.ValidationSteps[0].Image) + assert.Contains(t, rs.ErrorSummary, "gatekeeper:latest: exit code 1") +} + +func TestUpdateRenderStatus_NilRenderStatusWhenNoSteps(t *testing.T) { + mockFS := filesys.MakeFsInMemory() + rootPath := rootString + assert.NoError(t, mockFS.Mkdir(rootPath)) + assert.NoError(t, mockFS.WriteFile(filepath.Join(rootPath, "Kptfile"), []byte(` +apiVersion: kpt.dev/v1 +kind: Kptfile +metadata: + name: root-package +`))) + + rootPkg, err := pkg.New(mockFS, rootPath) + assert.NoError(t, err) + + hctx := &hydrationContext{ + root: &pkgNode{pkg: rootPkg}, + pkgs: map[types.UniquePath]*pkgNode{}, + fileSystem: mockFS, + } + + updateRenderStatus(hctx, nil) + + rootKf, err := kptfileutil.ReadKptfile(mockFS, rootPath) + assert.NoError(t, err) + assert.NotNil(t, rootKf.Status) + assert.Nil(t, rootKf.Status.RenderStatus) +} + +func TestUpdateRenderStatus_ClearsPreviousRenderStatus(t *testing.T) { + mockFS := filesys.MakeFsInMemory() + rootPath := rootString + assert.NoError(t, mockFS.Mkdir(rootPath)) + assert.NoError(t, mockFS.WriteFile(filepath.Join(rootPath, "Kptfile"), []byte(` +apiVersion: kpt.dev/v1 +kind: Kptfile +metadata: + name: root-package +`))) + + rootPkg, err := pkg.New(mockFS, rootPath) + assert.NoError(t, err) + + // First render: failure with steps + hctx := &hydrationContext{ + root: &pkgNode{pkg: rootPkg}, + pkgs: map[types.UniquePath]*pkgNode{}, + fileSystem: mockFS, + mutationSteps: []kptfilev1.PipelineStepResult{ + {Image: "bad:v1", ExitCode: 1}, + }, + } + updateRenderStatus(hctx, fmt.Errorf("fail")) + + rootKf, err := kptfileutil.ReadKptfile(mockFS, rootPath) + assert.NoError(t, err) + assert.NotNil(t, rootKf.Status.RenderStatus) + + // Second render: success with no steps (empty pipeline) + hctx2 := &hydrationContext{ + root: &pkgNode{pkg: rootPkg}, + pkgs: map[types.UniquePath]*pkgNode{}, + fileSystem: mockFS, + } + updateRenderStatus(hctx2, nil) + + rootKf, err = kptfileutil.ReadKptfile(mockFS, rootPath) + assert.NoError(t, err) + assert.Nil(t, rootKf.Status.RenderStatus) +} + +func TestStepName(t *testing.T) { + assert.Equal(t, "my-step", stepName(kptfilev1.PipelineStepResult{Name: "my-step", Image: "img:v1"})) + assert.Equal(t, "img:v1", stepName(kptfilev1.PipelineStepResult{Image: "img:v1"})) + assert.Equal(t, "/usr/bin/fn", stepName(kptfilev1.PipelineStepResult{ExecPath: "/usr/bin/fn"})) + assert.Equal(t, "", stepName(kptfilev1.PipelineStepResult{})) +} + func TestPkgNode_ClearAnnotationsOnMutFailure(t *testing.T) { tests := []struct { name string diff --git a/pkg/api/kptfile/v1/types.go b/pkg/api/kptfile/v1/types.go index 7d160ed61e..3fff13720c 100644 --- a/pkg/api/kptfile/v1/types.go +++ b/pkg/api/kptfile/v1/types.go @@ -410,7 +410,59 @@ func (i Inventory) IsValid() bool { } type Status struct { - Conditions []Condition `yaml:"conditions,omitempty" json:"conditions,omitempty"` + Conditions []Condition `yaml:"conditions,omitempty" json:"conditions,omitempty"` + RenderStatus *RenderStatus `yaml:"renderStatus,omitempty" json:"renderStatus,omitempty"` +} + +// RenderStatus represents the result of performing render operation +// on a package's resources. +type RenderStatus struct { + MutationSteps []PipelineStepResult `yaml:"mutationSteps,omitempty" json:"mutationSteps,omitempty"` + ValidationSteps []PipelineStepResult `yaml:"validationSteps,omitempty" json:"validationSteps,omitempty"` + ErrorSummary string `yaml:"errorSummary,omitempty" json:"errorSummary,omitempty"` +} + +// PipelineStepResult contains the structured result from an individual function +// call in the pipeline. +type PipelineStepResult struct { + Name string `yaml:"name,omitempty" json:"name,omitempty"` + Image string `yaml:"image,omitempty" json:"image,omitempty"` + ExecPath string `yaml:"exec,omitempty" json:"exec,omitempty"` + ExecutionError string `yaml:"executionError,omitempty" json:"executionError,omitempty"` + Stderr string `yaml:"stderr,omitempty" json:"stderr,omitempty"` + ExitCode int `yaml:"exitCode" json:"exitCode"` + Results []ResultItem `yaml:"results,omitempty" json:"results,omitempty"` + ErrorResults []ResultItem `yaml:"errorResults,omitempty" json:"errorResults,omitempty"` +} + +// ResultItem mirrors framework.Result with only the fields needed for Kptfile status. +type ResultItem struct { + Message string `yaml:"message,omitempty" json:"message,omitempty"` + Severity string `yaml:"severity,omitempty" json:"severity,omitempty"` + ResourceRef *ResourceRef `yaml:"resourceRef,omitempty" json:"resourceRef,omitempty"` + Field *FieldRef `yaml:"field,omitempty" json:"field,omitempty"` + File *FileRef `yaml:"file,omitempty" json:"file,omitempty"` +} + +// ResourceRef identifies a resource. +type ResourceRef struct { + APIVersion string `yaml:"apiVersion,omitempty" json:"apiVersion,omitempty"` + Kind string `yaml:"kind,omitempty" json:"kind,omitempty"` + Name string `yaml:"name,omitempty" json:"name,omitempty"` + Namespace string `yaml:"namespace,omitempty" json:"namespace,omitempty"` +} + +// FieldRef references a field in a resource. +type FieldRef struct { + Path string `yaml:"path,omitempty" json:"path,omitempty"` + CurrentValue string `yaml:"currentValue,omitempty" json:"currentValue,omitempty"` + ProposedValue string `yaml:"proposedValue,omitempty" json:"proposedValue,omitempty"` +} + +// FileRef references a file containing a resource. +type FileRef struct { + Path string `yaml:"path,omitempty" json:"path,omitempty"` + Index int `yaml:"index,omitempty" json:"index,omitempty"` } type Condition struct { diff --git a/pkg/test/runner/config.go b/pkg/test/runner/config.go index 3c073bc425..7a4c9b57ca 100644 --- a/pkg/test/runner/config.go +++ b/pkg/test/runner/config.go @@ -58,6 +58,11 @@ type TestCaseConfig struct { // ActualStripLines is a list of lines that should be ignored on the actual function output ActualStripLines []string `json:"actualStripLines,omitempty" yaml:"actualStripLines,omitempty"` + // DiffStripRegEx is a regular expression. Lines matching this pattern are + // removed from both actual and expected diffs before comparison, making + // tests resilient to environment-specific output such as docker daemon errors + DiffStripRegEx string `json:"diffStripRegEx,omitempty" yaml:"diffStripRegEx,omitempty"` + // StdErr is the expected standard error output and should be checked // when a nonzero exit code is expected. Default: "" StdErr string `json:"stdErr,omitempty" yaml:"stdErr,omitempty"` diff --git a/pkg/test/runner/runner.go b/pkg/test/runner/runner.go index 6bbb82b76d..6468d12c93 100644 --- a/pkg/test/runner/runner.go +++ b/pkg/test/runner/runner.go @@ -478,8 +478,19 @@ func (r *Runner) compareResult(exitErr error, stdout string, inStderr string, tm if err != nil { return fmt.Errorf("failed to read actual diff: %w", err) } - if actualDiff != expected.Diff { - diffOfDiff, err := diffStrings(actualDiff, expected.Diff) + expectedDiff := expected.Diff + if r.testCase.Config.DiffStripRegEx != "" { + actualDiff, err = normalizeDiff(actualDiff, r.testCase.Config.DiffStripRegEx) + if err != nil { + return err + } + expectedDiff, err = normalizeDiff(expectedDiff, r.testCase.Config.DiffStripRegEx) + if err != nil { + return err + } + } + if actualDiff != expectedDiff { + diffOfDiff, err := diffStrings(actualDiff, expectedDiff) if err != nil { return fmt.Errorf("error when run diff of diff: %w: %s", err, diffOfDiff) } @@ -635,3 +646,25 @@ func (r *Runner) stripLines(string2Strip string, linesToStrip []string) string { return strippedString } + +// normalizeDiff removes lines matching stripRegEx and normalizes index/hunk +// headers in the diff string so that environment-specific output does not +// cause comparison failures. +func normalizeDiff(diff, stripRegEx string) (string, error) { + re, err := regexp.Compile(stripRegEx) + if err != nil { + return "", fmt.Errorf("unable to compile DiffStripRegEx %q: %w", stripRegEx, err) + } + indexRE := regexp.MustCompile(`^index [0-9a-f]+\.\.[0-9a-f]+`) + hunkRE := regexp.MustCompile(`^@@ -\d+,\d+ \+\d+,\d+ @@`) + var out []string + for _, line := range strings.Split(diff, "\n") { + if re.MatchString(line) { + continue + } + line = indexRE.ReplaceAllString(line, "index NORMALIZED") + line = hunkRE.ReplaceAllString(line, "@@ NORMALIZED @@") + out = append(out, line) + } + return strings.Join(out, "\n"), nil +}