Add --save-on-render-failure flag to fn render#4400
Conversation
✅ Deploy Preview for kptdocs ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
There was a problem hiding this comment.
Pull request overview
Implements the --save-on-render-failure feature for kpt fn render, enabling users to persist partially rendered resources when pipeline execution fails to improve debugging.
Changes:
- Added
--save-on-render-failureCLI flag and propagated it through runner options and test runner config. - Updated renderer/hydration flow to preserve partial resources and return partial outputs on failure.
- Added unit tests and extensive e2e fixtures/expected outputs for DFS/BFS failure scenarios.
Reviewed changes
Copilot reviewed 130 out of 131 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| pkg/test/runner/runner.go | Passes the new flag through the e2e runner when configured. |
| pkg/test/runner/config.go | Adds test-case config knob for saveOnRenderFailure. |
| pkg/lib/runneroptions/runneroptions.go | Introduces SaveOnRenderFailure runner option. |
| internal/util/render/executor.go | Saves partial resources on failures, returns partial output, clears internal annotations on mutator failure, prints execution summary. |
| internal/util/render/executor_test.go | Adds unit tests for summary printing and annotation cleanup. |
| commands/fn/render/cmdrender.go | Exposes the new CLI flag on kpt fn render. |
| e2e/testdata/fn-render/save-on-render-failure/no-save-on-render-failure/resources.yaml | Adds e2e fixture for non-saving behavior scenario. |
| e2e/testdata/fn-render/save-on-render-failure/no-save-on-render-failure/Kptfile | Adds e2e pipeline fixture for non-saving behavior scenario. |
| e2e/testdata/fn-render/save-on-render-failure/no-save-on-render-failure/.krmignore | Ignores golden output directory in e2e scenario. |
| e2e/testdata/fn-render/save-on-render-failure/no-save-on-render-failure/.expected/config.yaml | Adds expected stderr/exit code for non-saving behavior scenario. |
| e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-validator-fails/subpkg/deployment.yaml | Adds DFS e2e subpackage resource fixture. |
| e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-validator-fails/subpkg/Kptfile | Adds DFS e2e subpackage pipeline fixture (validator failure). |
| e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-validator-fails/deployment.yaml | Adds DFS e2e root resource fixture. |
| e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-validator-fails/Kptfile | Adds DFS e2e root pipeline fixture. |
| e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-validator-fails/.krmignore | Ignores golden output directory in DFS scenario. |
| e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-validator-fails/.expected/diff.patch | Adds expected diff output for DFS scenario. |
| e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-validator-fails/.expected/config.yaml | Adds expected stderr/exit code for DFS scenario. |
| e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-mutator-fails/subpkg/deployment.yaml | Adds DFS e2e subpackage resource fixture. |
| e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-mutator-fails/subpkg/Kptfile | Adds DFS e2e subpackage pipeline fixture (mutator failure). |
| e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-mutator-fails/deployment.yaml | Adds DFS e2e root resource fixture. |
| e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-mutator-fails/Kptfile | Adds DFS e2e root pipeline fixture. |
| e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-mutator-fails/.krmignore | Ignores golden output directory in DFS scenario. |
| e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-mutator-fails/.expected/diff.patch | Adds expected diff output for DFS scenario. |
| e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-mutator-fails/.expected/config.yaml | Adds expected stderr/exit code for DFS scenario. |
| e2e/testdata/fn-render/save-on-render-failure/dfs-parent-validator-fails/subpkg/service.yaml | Adds DFS e2e subpackage resource fixture. |
| e2e/testdata/fn-render/save-on-render-failure/dfs-parent-validator-fails/subpkg/Kptfile | Adds DFS e2e subpackage pipeline fixture. |
| e2e/testdata/fn-render/save-on-render-failure/dfs-parent-validator-fails/configmap.yaml | Adds DFS e2e root resource fixture. |
| e2e/testdata/fn-render/save-on-render-failure/dfs-parent-validator-fails/Kptfile | Adds DFS e2e root pipeline fixture (validator failure). |
| e2e/testdata/fn-render/save-on-render-failure/dfs-parent-validator-fails/.krmignore | Ignores golden output directory in DFS scenario. |
| e2e/testdata/fn-render/save-on-render-failure/dfs-parent-validator-fails/.expected/diff.patch | Adds expected diff output for DFS scenario. |
| e2e/testdata/fn-render/save-on-render-failure/dfs-parent-validator-fails/.expected/config.yaml | Adds expected stderr/exit code for DFS scenario. |
| e2e/testdata/fn-render/save-on-render-failure/dfs-parent-mutator-fails/subpkg/service.yaml | Adds DFS e2e subpackage resource fixture. |
| e2e/testdata/fn-render/save-on-render-failure/dfs-parent-mutator-fails/subpkg/Kptfile | Adds DFS e2e subpackage pipeline fixture. |
| e2e/testdata/fn-render/save-on-render-failure/dfs-parent-mutator-fails/configmap.yaml | Adds DFS e2e root resource fixture. |
| e2e/testdata/fn-render/save-on-render-failure/dfs-parent-mutator-fails/Kptfile | Adds DFS e2e root pipeline fixture (mutator failure). |
| e2e/testdata/fn-render/save-on-render-failure/dfs-parent-mutator-fails/.krmignore | Ignores golden output directory in DFS scenario. |
| e2e/testdata/fn-render/save-on-render-failure/dfs-parent-mutator-fails/.expected/diff.patch | Adds expected diff output for DFS scenario. |
| e2e/testdata/fn-render/save-on-render-failure/dfs-parent-mutator-fails/.expected/config.yaml | Adds expected stderr/exit code for DFS scenario. |
| e2e/testdata/fn-render/save-on-render-failure/dfs-parent-and-subpkg-both-fail/subpkg/service.yaml | Adds DFS e2e subpackage resource fixture. |
| e2e/testdata/fn-render/save-on-render-failure/dfs-parent-and-subpkg-both-fail/subpkg/Kptfile | Adds DFS e2e subpackage pipeline fixture (failure). |
| e2e/testdata/fn-render/save-on-render-failure/dfs-parent-and-subpkg-both-fail/configmap.yaml | Adds DFS e2e root resource fixture. |
| e2e/testdata/fn-render/save-on-render-failure/dfs-parent-and-subpkg-both-fail/Kptfile | Adds DFS e2e root pipeline fixture (failure). |
| e2e/testdata/fn-render/save-on-render-failure/dfs-parent-and-subpkg-both-fail/.krmignore | Ignores golden output directory in DFS scenario. |
| e2e/testdata/fn-render/save-on-render-failure/dfs-parent-and-subpkg-both-fail/.expected/diff.patch | Adds expected diff output for DFS scenario. |
| e2e/testdata/fn-render/save-on-render-failure/dfs-parent-and-subpkg-both-fail/.expected/config.yaml | Adds expected stderr/exit code for DFS scenario. |
| e2e/testdata/fn-render/save-on-render-failure/dfs-multiple-subpkgs-one-fails/sub3/deployment.yaml | Adds DFS e2e subpackage resource fixture. |
| e2e/testdata/fn-render/save-on-render-failure/dfs-multiple-subpkgs-one-fails/sub3/Kptfile | Adds DFS e2e subpackage pipeline fixture. |
| e2e/testdata/fn-render/save-on-render-failure/dfs-multiple-subpkgs-one-fails/sub2/deployment.yaml | Adds DFS e2e subpackage resource fixture. |
| e2e/testdata/fn-render/save-on-render-failure/dfs-multiple-subpkgs-one-fails/sub2/Kptfile | Adds DFS e2e subpackage pipeline fixture (failure). |
| e2e/testdata/fn-render/save-on-render-failure/dfs-multiple-subpkgs-one-fails/sub1/deployment.yaml | Adds DFS e2e subpackage resource fixture. |
| e2e/testdata/fn-render/save-on-render-failure/dfs-multiple-subpkgs-one-fails/sub1/Kptfile | Adds DFS e2e subpackage pipeline fixture. |
| e2e/testdata/fn-render/save-on-render-failure/dfs-multiple-subpkgs-one-fails/service.yaml | Adds DFS e2e root resource fixture. |
| e2e/testdata/fn-render/save-on-render-failure/dfs-multiple-subpkgs-one-fails/Kptfile | Adds DFS e2e root pipeline fixture. |
| e2e/testdata/fn-render/save-on-render-failure/dfs-multiple-subpkgs-one-fails/.krmignore | Ignores golden output directory in DFS scenario. |
| e2e/testdata/fn-render/save-on-render-failure/dfs-multiple-subpkgs-one-fails/.expected/diff.patch | Adds expected diff output for DFS scenario. |
| e2e/testdata/fn-render/save-on-render-failure/dfs-multiple-subpkgs-one-fails/.expected/config.yaml | Adds expected stderr/exit code for DFS scenario. |
| e2e/testdata/fn-render/save-on-render-failure/dfs-deep-nested-middle-fails/level1/level2/configmap.yaml | Adds DFS e2e nested resource fixture. |
| e2e/testdata/fn-render/save-on-render-failure/dfs-deep-nested-middle-fails/level1/level2/Kptfile | Adds DFS e2e nested pipeline fixture. |
| e2e/testdata/fn-render/save-on-render-failure/dfs-deep-nested-middle-fails/level1/configmap.yaml | Adds DFS e2e level1 resource fixture. |
| e2e/testdata/fn-render/save-on-render-failure/dfs-deep-nested-middle-fails/level1/Kptfile | Adds DFS e2e level1 pipeline fixture (failure). |
| e2e/testdata/fn-render/save-on-render-failure/dfs-deep-nested-middle-fails/configmap.yaml | Adds DFS e2e root resource fixture. |
| e2e/testdata/fn-render/save-on-render-failure/dfs-deep-nested-middle-fails/Kptfile | Adds DFS e2e root pipeline fixture. |
| e2e/testdata/fn-render/save-on-render-failure/dfs-deep-nested-middle-fails/.krmignore | Ignores golden output directory in DFS scenario. |
| e2e/testdata/fn-render/save-on-render-failure/dfs-deep-nested-middle-fails/.expected/diff.patch | Adds expected diff output for DFS scenario. |
| e2e/testdata/fn-render/save-on-render-failure/dfs-deep-nested-middle-fails/.expected/config.yaml | Adds expected stderr/exit code for DFS scenario. |
| e2e/testdata/fn-render/save-on-render-failure/dfs-basicpipeline/resources.yaml | Adds basic DFS fixture resources. |
| e2e/testdata/fn-render/save-on-render-failure/dfs-basicpipeline/Kptfile | Adds basic DFS fixture pipeline (failure). |
| e2e/testdata/fn-render/save-on-render-failure/dfs-basicpipeline/.krmignore | Ignores golden output directory in DFS basic scenario. |
| e2e/testdata/fn-render/save-on-render-failure/dfs-basicpipeline/.expected/diff.patch | Adds expected diff output for DFS basic scenario. |
| e2e/testdata/fn-render/save-on-render-failure/dfs-basicpipeline/.expected/config.yaml | Adds expected stderr/exit code for DFS basic scenario. |
| e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-validator-fails/subpkg/deployment.yaml | Adds BFS e2e subpackage resource fixture. |
| e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-validator-fails/subpkg/Kptfile | Adds BFS e2e subpackage pipeline fixture (failure). |
| e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-validator-fails/deployment.yaml | Adds BFS e2e root resource fixture. |
| e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-validator-fails/Kptfile | Adds BFS e2e root pipeline fixture (BFS rendering mode). |
| e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-validator-fails/.krmignore | Ignores golden output directory in BFS scenario. |
| e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-validator-fails/.expected/diff.patch | Adds expected diff output for BFS scenario. |
| e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-validator-fails/.expected/config.yaml | Adds expected stderr/exit code for BFS scenario. |
| e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-mutator-fails/subpkg/deployment.yaml | Adds BFS e2e subpackage resource fixture. |
| e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-mutator-fails/subpkg/Kptfile | Adds BFS e2e subpackage pipeline fixture (failure). |
| e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-mutator-fails/deployment.yaml | Adds BFS e2e root resource fixture. |
| e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-mutator-fails/Kptfile | Adds BFS e2e root pipeline fixture (BFS rendering mode). |
| e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-mutator-fails/.krmignore | Ignores golden output directory in BFS scenario. |
| e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-mutator-fails/.expected/diff.patch | Adds expected diff output for BFS scenario. |
| e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-mutator-fails/.expected/config.yaml | Adds expected stderr/exit code for BFS scenario. |
| e2e/testdata/fn-render/save-on-render-failure/bfs-parent-validator-fails/subpkg/service.yaml | Adds BFS e2e subpackage resource fixture. |
| e2e/testdata/fn-render/save-on-render-failure/bfs-parent-validator-fails/subpkg/Kptfile | Adds BFS e2e subpackage pipeline fixture. |
| e2e/testdata/fn-render/save-on-render-failure/bfs-parent-validator-fails/configmap.yaml | Adds BFS e2e root resource fixture. |
| e2e/testdata/fn-render/save-on-render-failure/bfs-parent-validator-fails/Kptfile | Adds BFS e2e root pipeline fixture (failure). |
| e2e/testdata/fn-render/save-on-render-failure/bfs-parent-validator-fails/.krmignore | Ignores golden output directory in BFS scenario. |
| e2e/testdata/fn-render/save-on-render-failure/bfs-parent-validator-fails/.expected/diff.patch | Adds expected diff output for BFS scenario. |
| e2e/testdata/fn-render/save-on-render-failure/bfs-parent-validator-fails/.expected/config.yaml | Adds expected stderr/exit code for BFS scenario. |
| e2e/testdata/fn-render/save-on-render-failure/bfs-parent-mutator-fails/subpkg/service.yaml | Adds BFS e2e subpackage resource fixture. |
| e2e/testdata/fn-render/save-on-render-failure/bfs-parent-mutator-fails/subpkg/Kptfile | Adds BFS e2e subpackage pipeline fixture. |
| e2e/testdata/fn-render/save-on-render-failure/bfs-parent-mutator-fails/configmap.yaml | Adds BFS e2e root resource fixture. |
| e2e/testdata/fn-render/save-on-render-failure/bfs-parent-mutator-fails/Kptfile | Adds BFS e2e root pipeline fixture (failure). |
| e2e/testdata/fn-render/save-on-render-failure/bfs-parent-mutator-fails/.krmignore | Ignores golden output directory in BFS scenario. |
| e2e/testdata/fn-render/save-on-render-failure/bfs-parent-mutator-fails/.expected/diff.patch | Adds expected diff output for BFS scenario. |
| e2e/testdata/fn-render/save-on-render-failure/bfs-parent-mutator-fails/.expected/config.yaml | Adds expected stderr/exit code for BFS scenario. |
| e2e/testdata/fn-render/save-on-render-failure/bfs-parent-and-subpkg-both-fail/subpkg/service.yaml | Adds BFS e2e subpackage resource fixture. |
| e2e/testdata/fn-render/save-on-render-failure/bfs-parent-and-subpkg-both-fail/subpkg/Kptfile | Adds BFS e2e subpackage pipeline fixture (failure). |
| e2e/testdata/fn-render/save-on-render-failure/bfs-parent-and-subpkg-both-fail/configmap.yaml | Adds BFS e2e root resource fixture. |
| e2e/testdata/fn-render/save-on-render-failure/bfs-parent-and-subpkg-both-fail/Kptfile | Adds BFS e2e root pipeline fixture (failure). |
| e2e/testdata/fn-render/save-on-render-failure/bfs-parent-and-subpkg-both-fail/.krmignore | Ignores golden output directory in BFS scenario. |
| e2e/testdata/fn-render/save-on-render-failure/bfs-parent-and-subpkg-both-fail/.expected/diff.patch | Adds expected diff output for BFS scenario. |
| e2e/testdata/fn-render/save-on-render-failure/bfs-parent-and-subpkg-both-fail/.expected/config.yaml | Adds expected stderr/exit code for BFS scenario. |
| e2e/testdata/fn-render/save-on-render-failure/bfs-multiple-subpkgs-one-fails/sub3/deployment.yaml | Adds BFS e2e subpackage resource fixture. |
| e2e/testdata/fn-render/save-on-render-failure/bfs-multiple-subpkgs-one-fails/sub3/Kptfile | Adds BFS e2e subpackage pipeline fixture. |
| e2e/testdata/fn-render/save-on-render-failure/bfs-multiple-subpkgs-one-fails/sub2/deployment.yaml | Adds BFS e2e subpackage resource fixture. |
| e2e/testdata/fn-render/save-on-render-failure/bfs-multiple-subpkgs-one-fails/sub2/Kptfile | Adds BFS e2e subpackage pipeline fixture (failure). |
| e2e/testdata/fn-render/save-on-render-failure/bfs-multiple-subpkgs-one-fails/sub1/deployment.yaml | Adds BFS e2e subpackage resource fixture. |
| e2e/testdata/fn-render/save-on-render-failure/bfs-multiple-subpkgs-one-fails/sub1/Kptfile | Adds BFS e2e subpackage pipeline fixture. |
| e2e/testdata/fn-render/save-on-render-failure/bfs-multiple-subpkgs-one-fails/service.yaml | Adds BFS e2e root resource fixture. |
| e2e/testdata/fn-render/save-on-render-failure/bfs-multiple-subpkgs-one-fails/Kptfile | Adds BFS e2e root pipeline fixture. |
| e2e/testdata/fn-render/save-on-render-failure/bfs-multiple-subpkgs-one-fails/.krmignore | Ignores golden output directory in BFS scenario. |
| e2e/testdata/fn-render/save-on-render-failure/bfs-multiple-subpkgs-one-fails/.expected/diff.patch | Adds expected diff output for BFS scenario. |
| e2e/testdata/fn-render/save-on-render-failure/bfs-multiple-subpkgs-one-fails/.expected/config.yaml | Adds expected stderr/exit code for BFS scenario. |
| e2e/testdata/fn-render/save-on-render-failure/bfs-deep-nested-middle-fails/level1/level2/configmap.yaml | Adds BFS e2e nested resource fixture. |
| e2e/testdata/fn-render/save-on-render-failure/bfs-deep-nested-middle-fails/level1/level2/Kptfile | Adds BFS e2e nested pipeline fixture. |
| e2e/testdata/fn-render/save-on-render-failure/bfs-deep-nested-middle-fails/level1/configmap.yaml | Adds BFS e2e level1 resource fixture. |
| e2e/testdata/fn-render/save-on-render-failure/bfs-deep-nested-middle-fails/level1/Kptfile | Adds BFS e2e level1 pipeline fixture (failure). |
| e2e/testdata/fn-render/save-on-render-failure/bfs-deep-nested-middle-fails/configmap.yaml | Adds BFS e2e root resource fixture. |
| e2e/testdata/fn-render/save-on-render-failure/bfs-deep-nested-middle-fails/Kptfile | Adds BFS e2e root pipeline fixture. |
| e2e/testdata/fn-render/save-on-render-failure/bfs-deep-nested-middle-fails/.krmignore | Ignores golden output directory in BFS scenario. |
| e2e/testdata/fn-render/save-on-render-failure/bfs-deep-nested-middle-fails/.expected/diff.patch | Adds expected diff output for BFS scenario. |
| e2e/testdata/fn-render/save-on-render-failure/bfs-deep-nested-middle-fails/.expected/config.yaml | Adds expected stderr/exit code for BFS scenario. |
| e2e/testdata/fn-render/save-on-render-failure/bfs-basicpipeline/resources.yaml | Adds basic BFS fixture resources. |
| e2e/testdata/fn-render/save-on-render-failure/bfs-basicpipeline/Kptfile | Adds basic BFS fixture pipeline (failure). |
| e2e/testdata/fn-render/save-on-render-failure/bfs-basicpipeline/.krmignore | Ignores golden output directory in BFS basic scenario. |
| e2e/testdata/fn-render/save-on-render-failure/bfs-basicpipeline/.expected/diff.patch | Adds expected diff output for BFS basic scenario. |
| e2e/testdata/fn-render/save-on-render-failure/bfs-basicpipeline/.expected/config.yaml | Adds expected stderr/exit code for BFS basic scenario. |
Comments suppressed due to low confidence (6)
internal/util/render/executor_test.go:1
clearAnnotationsOnMutFailureis implemented as a package-level function inexecutor.go, but the test calls it as a method onpkgNode, which will not compile. Update the test to callclearAnnotationsOnMutFailure(nodes)directly (and consider renaming the test to match the function name if it’s no longer apkgNodemethod)."
internal/util/render/executor.go:1- Hydration errors (
hydErr) are handled only afteradjustRelPath(hctx)runs, which can (a) mutate state after a failed hydration and (b) mask the original hydration failure ifadjustRelPathreturns an error. Restructure to short-circuit onhydErrbefore runningadjustRelPathwhen partial-saving is disabled; when partial-saving is enabled, treatadjustRelPathas best-effort and ensure the returned error remains the hydration error (e.g., log/attach the adjust error rather than replacinghydErr).
internal/util/render/executor.go:1 - Hydration errors (
hydErr) are handled only afteradjustRelPath(hctx)runs, which can (a) mutate state after a failed hydration and (b) mask the original hydration failure ifadjustRelPathreturns an error. Restructure to short-circuit onhydErrbefore runningadjustRelPathwhen partial-saving is disabled; when partial-saving is enabled, treatadjustRelPathas best-effort and ensure the returned error remains the hydration error (e.g., log/attach the adjust error rather than replacinghydErr).
internal/util/render/executor.go:1 - Because
hydErris only checked after the output branch, thee.Output != nilpath can write partially-rendered resources even when--save-on-render-failureis NOT enabled. If the flag is meant to be opt-in (per PR description), gate the output-writing logic the same way as the in-place writer: only write whenhydErr == nilORSaveOnRenderFailureis true.
internal/util/render/executor.go:1 - Because
hydErris only checked after the output branch, thee.Output != nilpath can write partially-rendered resources even when--save-on-render-failureis NOT enabled. If the flag is meant to be opt-in (per PR description), gate the output-writing logic the same way as the in-place writer: only write whenhydErr == nilORSaveOnRenderFailureis true.
internal/util/render/executor.go:1 - There is an extra space in the parameter list (
hydErr error). Please format to a single space to satisfy gofmt/style consistency.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Signed-off-by: aravind.est <aravindhan.a@est.tech>
41a0ce9 to
617c8c8
Compare
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 130 out of 131 changed files in this pull request and generated no new comments.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Full error message comparison doesn't suits this because each docker environment generates the error message in different format. Signed-off-by: aravind.est <aravindhan.a@est.tech>
6400107 to
2353446
Compare
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 130 out of 131 changed files in this pull request and generated 1 comment.
Comments suppressed due to low confidence (2)
internal/util/render/executor.go:508
- The
executePipelinesWithScopedVisibilityerror path only preserves/aggregates resources whenoutput != nil. IfrunPipelinefails before producing output (e.g., runner construction/validation error),--save-on-render-failurewill return early without rebuildinghctx.root.resources, so earlier successful package outputs may not be saved.
Consider aggregating the current allNodes state (and propagating as needed) whenever SaveOnRenderFailure is enabled, regardless of whether output is nil. Also, if output!=nil should be gofmt’d (output != nil).
internal/util/render/executor.go:346
- In the subpackage hydration error path, saving partial resources is gated on
transitiveResources != nil. If a failing subpackage returnsniloutput (e.g., it fails before producing any resources), the parent/root won't setcurr.resourceseven thoughinputmay already contain resources from previously hydrated siblings. This can cause partial output to be lost despite--save-on-render-failure.
Consider setting curr.resources whenever SaveOnRenderFailure is enabled (and appending transitiveResources only if non-nil), so already-collected resources are preserved.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
6bb41e8 to
33a2660
Compare
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 130 out of 131 changed files in this pull request and generated 3 comments.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
33a2660 to
735cd31
Compare
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 130 out of 131 changed files in this pull request and generated 2 comments.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
735cd31 to
164bc2f
Compare
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 130 out of 131 changed files in this pull request and generated 5 comments.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Signed-off-by: aravind.est <aravindhan.a@est.tech>
164bc2f to
3fdce3d
Compare
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 130 out of 131 changed files in this pull request and generated no new comments.
Comments suppressed due to low confidence (1)
internal/util/render/executor.go:119
- When
SaveOnRenderFailureis enabled and hydration fails, the code continues to executeadjustRelPath()andtrackOutputFiles()on the partial resources (lines 112-118). However, ifhctx.root.resourcesis empty or incomplete due to the hydration failure,adjustRelPath()could fail with errors like "path annotation missing" when iterating over resources that may not have proper annotations set.
Consider adding defensive checks to ensure hctx.root.resources is not empty before calling these functions, or handle their errors gracefully when SaveOnRenderFailure is enabled. For example:
if len(hctx.root.resources) > 0 {
err = adjustRelPath(hctx)
if err != nil {
if hydErr != nil {
// If hydration already failed, log the adjustment error but don't fail
pr.Printf("Warning: failed to adjust resource paths: %v\n", err)
} else {
return nil, err
}
}
if err = trackOutputFiles(hctx); err != nil {
if hydErr != nil {
pr.Printf("Warning: failed to track output files: %v\n", err)
} else {
return nil, err
}
}
}This ensures that when partial resources are being saved, additional errors in path adjustment don't mask the original hydration error.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
|
Documentation Updates 2 document(s) were updated by changes in this PR: _indexView Changes@@ -52,6 +52,9 @@
--allow-network:
Allow functions to access network during pipeline execution. Default: `false`. Note that this is applicable to container based functions only.
+
+--save-on-render-failure:
+ Save partially rendered resources when rendering fails. Default: `false`. When enabled, this flag preserves the state of resources at the point of failure, which is useful for debugging render failures and understanding what changes were applied before the error occurred.
--image-pull-policy:
If the image should be pulled before rendering the package(s). It can be set_indexView Changes@@ -126,6 +126,18 @@
If any of the functions in the pipeline fails for whatever reason, then the
entire pipeline is aborted and the local filesystem is left intact.
+
+### Debugging render failures
+
+When a render pipeline fails, you can use the `--save-on-render-failure` flag to save the partially rendered resources to disk. This is particularly useful for debugging function pipeline issues by inspecting what changes were made before the failure occurred.
+
+By default, this flag is disabled and partially rendered resources are not saved when render fails. To enable it:
+
+```shell
+kpt fn render wordpress --save-on-render-failure
+```
+
+With this flag enabled, if a function in the pipeline fails, kpt will save all resources that were successfully processed up to the point of failure. This allows you to examine the intermediate state and understand what transformations were applied before the error.
### Specifying `function`
|
This PR implements the kpt side of the feature to save partially rendered resources when pipeline execution fails, enabling better debugging of render failures.
Part of: kptdev/porch#768
Note
125 of the 131 changed files are E2E test data and test scenarios. The core implementation changes are in 6 files.
Changes
New CLI Flag:
--save-on-render-failure: Saves partially rendered resources when rendering fails (opt-in, default: disabled)Core Modifications:
hydrate()andhydrateBfsOrder()to preserve intermediate resources on failurerunPipeline()to return partial output instead of nil on errorclearAnnotationsOnMutFailure()to clean up internal annotations on mutation failureprintPipelineExecutionSummary()for contextual feedback (success/partial/failed)Testing:
Next Steps: