diff --git a/documentation/content/en/book/02-concepts/_index.md b/documentation/content/en/book/02-concepts/_index.md
index 2629f859d8..7d5e32c03b 100644
--- a/documentation/content/en/book/02-concepts/_index.md
+++ b/documentation/content/en/book/02-concepts/_index.md
@@ -98,6 +98,40 @@ the default depth-first post-order.
rendering fails, instead of reverting all changes. This is particularly useful for debugging render failures and is
essential for programmatic package rendering scenarios where preserving partial progress is valuable.
+### Status Conditions
+The Kptfile includes a `status.conditions` field that provides a declarative way to track the execution status of kpt
+operations. This makes package management operations observable and traceable.
+
+When `kpt fn render` executes, a `Rendered` status condition is automatically added to the root Kptfile to indicate
+whether the rendering operation succeeded or failed.
+This status is recorded only for in-place renders (the default behavior).
+It is not written for out-of-place modes such as stdout (`-o stdout`), unwrap (`-o unwrap`), or
+directory output (`-o
`).
+
+**On successful render:**
+```yaml
+status:
+ conditions:
+ - type: Rendered
+ status: "True"
+ reason: RenderSuccess
+```
+
+**On failed render:**
+```yaml
+status:
+ conditions:
+ - type: Rendered
+ status: "False"
+ reason: RenderFailed
+ message: |-
+ pkg.render: pkg .:
+ pipeline.run: must run with `--allow-exec` option to allow running function binaries
+```
+
+The status condition is recorded only in the root Kptfile, not in subpackages. The error message in failure cases
+provides details about what went wrong during the render operation.
+
Just as directories can be nested, a package can contain another package, called a _subpackage_.
Let's take a look at the wordpress package as an example:
diff --git a/documentation/content/en/book/03-packages/_index.md b/documentation/content/en/book/03-packages/_index.md
index 816fdd4f90..62432b8c4e 100644
--- a/documentation/content/en/book/03-packages/_index.md
+++ b/documentation/content/en/book/03-packages/_index.md
@@ -63,9 +63,14 @@ pipeline:
app: wordpress
validators:
- image: ghcr.io/kptdev/krm-functions-catalog/kubeconform:latest
+status:
+ conditions:
+ - type: Rendered
+ status: "True"
+ reason: RenderSuccess
```
-The `Kptfile` contains two sections to keep track of the upstream package:
+The `Kptfile` contains several sections to keep track of the package and its state:
1. The `upstream` section contains the user-specified Git reference to the upstream package. This contains three pieces
of information:
@@ -76,6 +81,10 @@ The `Kptfile` contains two sections to keep track of the upstream package:
or commit SHA.
2. The `upstreamLock` section records the upstream Git reference (exact Git SHA) that was fetched by kpt. This section
is managed by kpt and should not be changed manually.
+3. The `status` section records the operational state of the package. This is managed by kpt and tracks the execution
+ status of operations like `render`. The `status.conditions` field contains a list of condition objects, similar to
+ how Kubernetes tracks conditions on resources. For example, after running `kpt fn render`, a `Rendered` condition
+ is automatically recorded to indicate whether the last render succeeded or failed.
Now, let's look at the `Kptfile` for the `mysql` subpackage:
@@ -239,6 +248,14 @@ perform the following steps:
formatting of resources, even though a function (developed by different
people using different toolchains) may have modified the formatting in some
way.
+4. Records the render execution status in the root `Kptfile` as a `Rendered` condition
+ under `status.conditions`. On success, the condition has `status: "True"` and
+ `reason: RenderSuccess`. On failure, it has `status: "False"`, `reason: RenderFailed`,
+ and includes error details in the `message` field.
+
+Note that status conditions are only written for in-place renders (the default behavior).
+When using out-of-place output modes like `kpt fn render -o stdout` or `kpt fn render -o `,
+no status condition is written since the package is not being updated on disk.
[Chapter 4](../04-using-functions/) discusses different ways of running functions in detail.
diff --git a/documentation/content/en/book/04-using-functions/_index.md b/documentation/content/en/book/04-using-functions/_index.md
index b2ec711e7b..75ca80115f 100644
--- a/documentation/content/en/book/04-using-functions/_index.md
+++ b/documentation/content/en/book/04-using-functions/_index.md
@@ -124,6 +124,54 @@ The end result is that:
3. Resources in `mysql` and `wordpress` packages are validated against their
OpenAPI spec.
+
+### Render status tracking
+
+After each `kpt fn render` execution, kpt records the render status in the root package's `Kptfile`. This provides
+visibility into whether the most recent render succeeded or failed, which is helpful for debugging and
+tracking the state of your package.
+
+The render status is recorded as a `Rendered` condition in the `status.conditions` section of the root `Kptfile`:
+
+**On success:**
+
+```yaml
+apiVersion: kpt.dev/v1
+kind: Kptfile
+metadata:
+ name: wordpress
+pipeline:
+ mutators:
+ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:latest
+ configMap:
+ app: wordpress
+ validators:
+ - image: ghcr.io/kptdev/krm-functions-catalog/kubeconform:latest
+status:
+ conditions:
+ - type: Rendered
+ status: "True"
+ reason: RenderSuccess
+```
+
+**On failure:**
+
+```yaml
+status:
+ conditions:
+ - type: Rendered
+ status: "False"
+ reason: RenderFailed
+ message: |-
+ pkg.render: pkg .:
+ pipeline.run: must run with `--allow-exec` option to allow running function binaries
+```
+
+The render status is recorded only when performing in-place rendering (the default mode). It is not recorded when using
+out-of-place modes such as `--output stdout`, `--output unwrap`, or `--output `.
+
+You can inspect the render status by examining the root `Kptfile` to understand the result of the most recent render operation.
+
### Debugging render failures
When a render pipeline fails, you can configure the package to save partially rendered resources to disk.
diff --git a/documentation/content/en/reference/cli/fn/render/_index.md b/documentation/content/en/reference/cli/fn/render/_index.md
index 4cde120dab..e45930d290 100644
--- a/documentation/content/en/reference/cli/fn/render/_index.md
+++ b/documentation/content/en/reference/cli/fn/render/_index.md
@@ -95,6 +95,60 @@ KRM_FN_RUNTIME:
+### Render Status Conditions
+
+After every `kpt fn render` execution, a `Rendered` status condition is recorded in the root Kptfile's
+`status.conditions` field to track the render execution history. This helps users quickly identify whether
+the last render succeeded or failed.
+
+#### Behavior
+
+- **Success**: When rendering completes successfully, the Kptfile receives a condition with `type: Rendered`,
+`status: "True"`, and `reason: RenderSuccess`.
+- **Failure**: When rendering fails, the Kptfile receives a condition with `type: Rendered`, `status: "False"`,
+`reason: RenderFailed`, and a `message` field containing the error details.
+- **In-place render only**: The status condition is written only when rendering in-place (the default behavior).
+It is NOT written when using out-of-place modes: `-o stdout`, `-o unwrap`, or `-o `, since these modes
+do not modify the on-disk package.
+- **Always recorded**: The status is recorded regardless of the `kpt.dev/save-on-render-failure` annotation setting.
+- **Root Kptfile only**: The status condition is written only to the root Kptfile, not to subpackages.
+
+#### Success Example
+
+After a successful render, the root Kptfile will contain:
+
+```yaml
+apiVersion: kpt.dev/v1
+kind: Kptfile
+metadata:
+ name: my-package
+status:
+ conditions:
+ - type: Rendered
+ status: "True"
+ reason: RenderSuccess
+```
+
+#### Failure Example
+
+After a failed render, the root Kptfile will contain:
+
+```yaml
+apiVersion: kpt.dev/v1
+kind: Kptfile
+metadata:
+ name: my-package
+status:
+ conditions:
+ - type: Rendered
+ status: "False"
+ reason: RenderFailed
+ message: |-
+ pkg.render: pkg .:
+ pipeline.run: must run with `--allow-exec` option to allow running function binaries
+```
+
+
### Examples
diff --git a/e2e/testdata/fn-eval/save-fn/preserve-kptfile-comments/.expected/diff.patch b/e2e/testdata/fn-eval/save-fn/preserve-kptfile-comments/.expected/diff.patch
index 1815663355..b11dad7983 100644
--- a/e2e/testdata/fn-eval/save-fn/preserve-kptfile-comments/.expected/diff.patch
+++ b/e2e/testdata/fn-eval/save-fn/preserve-kptfile-comments/.expected/diff.patch
@@ -30,4 +30,4 @@ index eed43d6..81473ca 100644
name: custom
+ namespace: staging
spec:
- image: nginx:1.2.3
\ No newline at end of file
+ image: nginx:1.2.3
diff --git a/e2e/testdata/fn-eval/simple-function-with-tag/.expected/diff.patch b/e2e/testdata/fn-eval/simple-function-with-tag/.expected/diff.patch
index 5371dee2ab..f3518b8417 100644
--- a/e2e/testdata/fn-eval/simple-function-with-tag/.expected/diff.patch
+++ b/e2e/testdata/fn-eval/simple-function-with-tag/.expected/diff.patch
@@ -9,4 +9,4 @@ index 1f15150..5966859 100644
+ namespace: staging
spec:
replicas: 3
- ---
\ No newline at end of file
+ ---
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 f8121fb91e..34218ae522 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..6fa7b45 100644
+index 3c93e9e..fe0bc96 100644
--- a/Kptfile
+++ b/Kptfile
@@ -2,6 +2,9 @@ apiVersion: kpt.dev/v1
@@ -12,6 +12,15 @@ index 3c93e9e..6fa7b45 100644
pipeline:
mutators:
- image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest
+@@ -12,3 +15,8 @@ pipeline:
+ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5
+ configMap:
+ tier: backend
++status:
++ conditions:
++ - type: Rendered
++ status: "True"
++ reason: RenderSuccess
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 754306a2b7..fea4f539a1 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..85f42f5 100644
+index 2336da4..eae3be3 100644
--- a/Kptfile
+++ b/Kptfile
-@@ -2,6 +2,8 @@ apiVersion: kpt.dev/v1
+@@ -2,13 +2,20 @@ apiVersion: kpt.dev/v1
kind: Kptfile
metadata:
name: app
@@ -11,6 +11,20 @@ index 2336da4..85f42f5 100644
pipeline:
mutators:
- image: ghcr.io/kptdev/krm-functions-catalog/set-namespace
+- tag: "0.4.1 - 0.4.3"
+ configMap:
+ namespace: staging
++ tag: 0.4.1 - 0.4.3
+ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels
+- tag: "~0.2"
+ configMap:
+ tier: backend
++ tag: ~0.2
++status:
++ conditions:
++ - type: Rendered
++ status: "True"
++ reason: RenderSuccess
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 a21c38b30e..16337308e3 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..3a2c718 100644
+index 1307fb5..f645d75 100644
--- a/Kptfile
+++ b/Kptfile
@@ -2,6 +2,9 @@ apiVersion: kpt.dev/v1
@@ -12,6 +12,15 @@ index 1307fb5..3a2c718 100644
pipeline:
mutators:
- image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0
+@@ -10,3 +13,8 @@ pipeline:
+ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5
+ configMap:
+ tier: backend
++status:
++ conditions:
++ - type: Rendered
++ status: "True"
++ reason: RenderSuccess
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 373cc33df7..81df82069b 100644
--- a/e2e/testdata/fn-render/basicpipeline-wasm/.expected/diff.patch
+++ b/e2e/testdata/fn-render/basicpipeline-wasm/.expected/diff.patch
@@ -1,3 +1,25 @@
+diff --git a/Kptfile b/Kptfile
+index ffcf186..9c131fb 100644
+--- a/Kptfile
++++ b/Kptfile
+@@ -6,12 +6,14 @@ metadata:
+ tier: backend
+ pipeline:
+ mutators:
+- # The following 2 images are built from https://github.com/kptdev/krm-functions-catalog/pull/898.
+ - image: gcr.io/kpt-fn-demo/set-namespace:v0.5.0
+- # ghcr.io/kptdev/krm-functions-catalog/wasm/set-namespace:v0.5.0
+ configMap:
+ namespace: staging
+ - image: gcr.io/kpt-fn-demo/set-labels:v0.2.0
+- # ghcr.io/kptdev/krm-functions-catalog/wasm/set-labels:v0.2.0
+ configMap:
+ tier: backend
++status:
++ conditions:
++ - type: Rendered
++ status: "True"
++ reason: RenderSuccess
diff --git a/resources.yaml b/resources.yaml
index eed43d6..e76b00d 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 a21c38b30e..16337308e3 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..3a2c718 100644
+index 1307fb5..f645d75 100644
--- a/Kptfile
+++ b/Kptfile
@@ -2,6 +2,9 @@ apiVersion: kpt.dev/v1
@@ -12,6 +12,15 @@ index 1307fb5..3a2c718 100644
pipeline:
mutators:
- image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0
+@@ -10,3 +13,8 @@ pipeline:
+ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5
+ configMap:
+ tier: backend
++status:
++ conditions:
++ - type: Rendered
++ status: "True"
++ reason: RenderSuccess
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 a21c38b30e..16337308e3 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..3a2c718 100644
+index 1307fb5..f645d75 100644
--- a/Kptfile
+++ b/Kptfile
@@ -2,6 +2,9 @@ apiVersion: kpt.dev/v1
@@ -12,6 +12,15 @@ index 1307fb5..3a2c718 100644
pipeline:
mutators:
- image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0
+@@ -10,3 +13,8 @@ pipeline:
+ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5
+ configMap:
+ tier: backend
++status:
++ conditions:
++ - type: Rendered
++ status: "True"
++ reason: RenderSuccess
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 c35d542fb0..3174051755 100644
--- a/e2e/testdata/fn-render/exec-function-stderr/.expected/diff.patch
+++ b/e2e/testdata/fn-render/exec-function-stderr/.expected/diff.patch
@@ -1,3 +1,18 @@
+diff --git a/Kptfile b/Kptfile
+index 6f2fe11..34a53c9 100644
+--- a/Kptfile
++++ b/Kptfile
+@@ -4,4 +4,9 @@ metadata:
+ name: app
+ pipeline:
+ mutators:
+- - exec: "./testdata/fn-render/exec-function-stderr/function.sh"
++ - exec: ./testdata/fn-render/exec-function-stderr/function.sh
++status:
++ conditions:
++ - type: Rendered
++ status: "True"
++ reason: RenderSuccess
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 c58020a874..d0bea1c78f 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,13 +1,18 @@
diff --git a/Kptfile b/Kptfile
-index 0d98dbb..23bd061 100644
+index 0d98dbb..0dde5ad 100644
--- a/Kptfile
+++ b/Kptfile
-@@ -4,4 +4,4 @@ metadata:
+@@ -4,4 +4,9 @@ metadata:
name: app
pipeline:
mutators:
- - exec: "sed -e 's/foo/bar/'"
-+ - exec: "sed -e 's/bar/bar/'"
++ - exec: sed -e 's/bar/bar/'
++status:
++ conditions:
++ - type: Rendered
++ status: "True"
++ reason: RenderSuccess
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
new file mode 100644
index 0000000000..842b64bff6
--- /dev/null
+++ b/e2e/testdata/fn-render/exec-without-permissions/.expected/diff.patch
@@ -0,0 +1,18 @@
+diff --git a/Kptfile b/Kptfile
+index 0d98dbb..aba9d69 100644
+--- a/Kptfile
++++ b/Kptfile
+@@ -4,4 +4,12 @@ metadata:
+ name: app
+ pipeline:
+ mutators:
+- - exec: "sed -e 's/foo/bar/'"
++ - exec: sed -e 's/foo/bar/'
++status:
++ conditions:
++ - type: Rendered
++ status: "False"
++ reason: RenderFailed
++ message: |-
++ pkg.render: pkg .:
++ pipeline.run: 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
new file mode 100644
index 0000000000..9240aa57d5
--- /dev/null
+++ b/e2e/testdata/fn-render/fn-failure-output-no-truncate/.expected/diff.patch
@@ -0,0 +1,16 @@
+diff --git a/Kptfile b/Kptfile
+index 0586af9..30e8359 100644
+--- a/Kptfile
++++ b/Kptfile
+@@ -7,3 +7,11 @@ pipeline:
+ - image: ghcr.io/kptdev/krm-functions-catalog/kubeconform:latest
+ configMap:
+ strict: "true"
++status:
++ conditions:
++ - type: Rendered
++ status: "False"
++ reason: RenderFailed
++ message: |-
++ pkg.render: pkg .:
++ pipeline.run: already handled error
diff --git a/e2e/testdata/fn-render/fn-failure/.expected/diff.patch b/e2e/testdata/fn-render/fn-failure/.expected/diff.patch
new file mode 100644
index 0000000000..f75cbdd706
--- /dev/null
+++ b/e2e/testdata/fn-render/fn-failure/.expected/diff.patch
@@ -0,0 +1,33 @@
+diff --git a/Kptfile b/Kptfile
+index 3447ba3..2802b20 100644
+--- a/Kptfile
++++ b/Kptfile
+@@ -4,12 +4,19 @@ metadata:
+ name: app
+ pipeline:
+ mutators:
+-# invalid starlark input results in failure of first fn
+- - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest
+- configPath: starlark-failure-fn.yaml
+- - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0
+- configMap:
+- namespace: staging
+- - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5
+- configMap:
+- tier: backend
++ - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest
++ configPath: starlark-failure-fn.yaml
++ - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0
++ configMap:
++ namespace: staging
++ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5
++ configMap:
++ tier: backend
++status:
++ conditions:
++ - type: Rendered
++ status: "False"
++ reason: RenderFailed
++ message: |-
++ pkg.render: pkg .:
++ pipeline.run: already handled error
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
new file mode 100644
index 0000000000..75677018d7
--- /dev/null
+++ b/e2e/testdata/fn-render/fn-success-with-stderr/.expected/diff.patch
@@ -0,0 +1,13 @@
+diff --git a/Kptfile b/Kptfile
+index f591880..b8c4faf 100644
+--- a/Kptfile
++++ b/Kptfile
+@@ -6,3 +6,8 @@ pipeline:
+ mutators:
+ - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest
+ configPath: starlark.yaml
++status:
++ conditions:
++ - type: Rendered
++ status: "True"
++ reason: RenderSuccess
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 0201b51e87..bbae8e2da7 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..a37d10e 100644
+index dbab15c..18405ed 100644
--- a/Kptfile
+++ b/Kptfile
-@@ -2,6 +2,7 @@ apiVersion: kpt.dev/v1
+@@ -2,8 +2,14 @@ apiVersion: kpt.dev/v1
kind: Kptfile
metadata:
name: app-with-db
@@ -10,6 +10,13 @@ index dbab15c..a37d10e 100644
pipeline:
mutators:
- image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0
+ configMap:
+ namespace: staging
++status:
++ conditions:
++ - type: Rendered
++ status: "True"
++ reason: RenderSuccess
diff --git a/db/Kptfile b/db/Kptfile
index 093e789..dfe7f20 100644
--- a/db/Kptfile
diff --git a/e2e/testdata/fn-render/fnconfig-cannot-refer-subpkgs/.expected/diff.patch b/e2e/testdata/fn-render/fnconfig-cannot-refer-subpkgs/.expected/diff.patch
new file mode 100644
index 0000000000..e367388b3d
--- /dev/null
+++ b/e2e/testdata/fn-render/fnconfig-cannot-refer-subpkgs/.expected/diff.patch
@@ -0,0 +1,18 @@
+diff --git a/Kptfile b/Kptfile
+index 0bfdbb0..10e2d27 100644
+--- a/Kptfile
++++ b/Kptfile
+@@ -6,3 +6,13 @@ pipeline:
+ mutators:
+ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5
+ configPath: db/labelconfig.yaml
++status:
++ conditions:
++ - type: Rendered
++ status: "False"
++ reason: RenderFailed
++ message: |
++ pkg.render: pkg .: Kptfile is invalid:
++ Field: `pipeline.mutators[0].configPath`
++ Value: "db/labelconfig.yaml"
++ Reason: functionConfig must exist in the current package
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 e81f73f1cc..148387c37b 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..69acc11 100644
+index 0bfdbb0..2ad56e8 100644
--- a/Kptfile
+++ b/Kptfile
-@@ -2,6 +2,8 @@ apiVersion: kpt.dev/v1
+@@ -2,7 +2,14 @@ apiVersion: kpt.dev/v1
kind: Kptfile
metadata:
name: app-with-db
@@ -11,6 +11,12 @@ index 0bfdbb0..69acc11 100644
pipeline:
mutators:
- image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5
+ configPath: db/labelconfig.yaml
++status:
++ conditions:
++ - type: Rendered
++ status: "True"
++ reason: RenderSuccess
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 acfd29847a..5d24d222ce 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..81422f3 100644
+index c2cf3ba..9f17a64 100644
--- a/Kptfile
+++ b/Kptfile
-@@ -2,6 +2,8 @@ apiVersion: kpt.dev/v1
+@@ -2,7 +2,14 @@ apiVersion: kpt.dev/v1
kind: Kptfile
metadata:
name: app-with-db
@@ -11,6 +11,12 @@ index c2cf3ba..81422f3 100644
pipeline:
mutators:
- image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5
+ configPath: confs/labelconfig.yaml
++status:
++ conditions:
++ - type: Rendered
++ status: "True"
++ reason: RenderSuccess
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 e7c0130835..1533d4fe10 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..7bd678e 100644
+index 950565f..77b2382 100644
--- a/Kptfile
+++ b/Kptfile
@@ -3,7 +3,7 @@ kind: Kptfile
@@ -11,6 +11,15 @@ index 950565f..7bd678e 100644
annotations:
config.kubernetes.io/local-config: "true"
info:
+@@ -16,3 +16,8 @@ pipeline:
+ configPath: update-labels.yaml
+ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5
+ configPath: label-input.yaml
++status:
++ conditions:
++ - type: Rendered
++ status: "True"
++ reason: RenderSuccess
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 c5cb4870a0..8e0b5d238e 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..0ee2ac8 100644
+index 043dcac..05a7f5c 100644
--- a/Kptfile
+++ b/Kptfile
@@ -2,6 +2,9 @@ apiVersion: kpt.dev/v1
@@ -12,6 +12,15 @@ index 043dcac..0ee2ac8 100644
pipeline:
mutators:
- image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0
+@@ -9,3 +12,8 @@ pipeline:
+ namespace: staging
+ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5
+ configPath: labelconfig.yaml
++status:
++ conditions:
++ - type: Rendered
++ status: "True"
++ reason: RenderSuccess
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
new file mode 100644
index 0000000000..9240aa57d5
--- /dev/null
+++ b/e2e/testdata/fn-render/fnresult-fn-failure/.expected/diff.patch
@@ -0,0 +1,16 @@
+diff --git a/Kptfile b/Kptfile
+index 0586af9..30e8359 100644
+--- a/Kptfile
++++ b/Kptfile
+@@ -7,3 +7,11 @@ pipeline:
+ - image: ghcr.io/kptdev/krm-functions-catalog/kubeconform:latest
+ configMap:
+ strict: "true"
++status:
++ conditions:
++ - type: Rendered
++ status: "False"
++ reason: RenderFailed
++ message: |-
++ pkg.render: pkg .:
++ pipeline.run: already handled error
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 685cb16e8d..50314605f5 100644
--- a/e2e/testdata/fn-render/fnresult-fn-success/.expected/diff.patch
+++ b/e2e/testdata/fn-render/fnresult-fn-success/.expected/diff.patch
@@ -1,3 +1,16 @@
+diff --git a/Kptfile b/Kptfile
+index 3c63ab9..787b279 100644
+--- a/Kptfile
++++ b/Kptfile
+@@ -6,3 +6,8 @@ pipeline:
+ mutators:
+ - image: ghcr.io/kptdev/krm-functions-catalog/search-replace:latest
+ configPath: search-replace-conf.yaml
++status:
++ conditions:
++ - type: Rendered
++ status: "True"
++ reason: RenderSuccess
diff --git a/resources.yaml b/resources.yaml
index f2eec52..114819d 100644
--- a/resources.yaml
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 aedf8745b7..d29f851dc9 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..a37d10e 100644
+index dbab15c..18405ed 100644
--- a/Kptfile
+++ b/Kptfile
-@@ -2,6 +2,7 @@ apiVersion: kpt.dev/v1
+@@ -2,8 +2,14 @@ apiVersion: kpt.dev/v1
kind: Kptfile
metadata:
name: app-with-db
@@ -10,6 +10,13 @@ index dbab15c..a37d10e 100644
pipeline:
mutators:
- image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0
+ configMap:
+ namespace: staging
++status:
++ conditions:
++ - type: Rendered
++ status: "True"
++ reason: RenderSuccess
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 1c94a808e6..c777a2aefb 100644
--- a/e2e/testdata/fn-render/generator-absolute-path/.expected/diff.patch
+++ b/e2e/testdata/fn-render/generator-absolute-path/.expected/diff.patch
@@ -1,3 +1,16 @@
+diff --git a/Kptfile b/Kptfile
+index 714d078..7878d56 100644
+--- a/Kptfile
++++ b/Kptfile
+@@ -6,3 +6,8 @@ pipeline:
+ mutators:
+ - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest
+ configPath: starlark-httpbin.yaml
++status:
++ conditions:
++ - type: Rendered
++ status: "True"
++ reason: RenderSuccess
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 1151fe3a2d..e94718da17 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..cb7293f 100644
+index 8050168..9fc6d67 100644
--- a/Kptfile
+++ b/Kptfile
@@ -2,6 +2,9 @@ apiVersion: kpt.dev/v1
@@ -12,6 +12,15 @@ index 8050168..cb7293f 100644
pipeline:
mutators:
- image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0
+@@ -10,3 +13,8 @@ pipeline:
+ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5
+ configMap:
+ tier: db
++status:
++ conditions:
++ - type: Rendered
++ status: "True"
++ reason: RenderSuccess
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/diff.patch b/e2e/testdata/fn-render/image-pull-policy-never/.expected/diff.patch
new file mode 100644
index 0000000000..4399c3b1e4
--- /dev/null
+++ b/e2e/testdata/fn-render/image-pull-policy-never/.expected/diff.patch
@@ -0,0 +1,16 @@
+diff --git a/Kptfile b/Kptfile
+index 5b7fc74..e4e96f6 100644
+--- a/Kptfile
++++ b/Kptfile
+@@ -5,3 +5,11 @@ metadata:
+ pipeline:
+ mutators:
+ - image: ghcr.io/kptdev/krm-functions-catalog/not-exist:latest
++status:
++ conditions:
++ - type: Rendered
++ status: "False"
++ reason: RenderFailed
++ message: |-
++ pkg.render: pkg .:
++ pipeline.run: already handled error
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 d851cb49cd..12bd34c287 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..3dfdcf6 100644
+index 2985a1a..7d38821 100644
--- a/Kptfile
+++ b/Kptfile
-@@ -2,6 +2,8 @@ apiVersion: kpt.dev/v1
+@@ -2,8 +2,15 @@ apiVersion: kpt.dev/v1
kind: Kptfile
metadata:
name: app
@@ -11,6 +11,13 @@ index 2985a1a..3dfdcf6 100644
pipeline:
mutators:
- image: set-labels:v0.1.5
+ configMap:
+ tier: backend
++status:
++ conditions:
++ - type: Rendered
++ status: "True"
++ reason: RenderSuccess
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
new file mode 100644
index 0000000000..3e2365803f
--- /dev/null
+++ b/e2e/testdata/fn-render/kubeval-failure/.expected/diff.patch
@@ -0,0 +1,16 @@
+diff --git a/Kptfile b/Kptfile
+index 2c6e965..170b12f 100644
+--- a/Kptfile
++++ b/Kptfile
+@@ -7,3 +7,11 @@ pipeline:
+ - image: ghcr.io/kptdev/krm-functions-catalog/kubeconform:latest
+ configMap:
+ strict: "true"
++status:
++ conditions:
++ - type: Rendered
++ status: "False"
++ reason: RenderFailed
++ message: |-
++ pkg.render: pkg .:
++ pipeline.run: already handled error
diff --git a/e2e/testdata/fn-render/missing-fn-image/.expected/diff.patch b/e2e/testdata/fn-render/missing-fn-image/.expected/diff.patch
new file mode 100644
index 0000000000..389f40dbd1
--- /dev/null
+++ b/e2e/testdata/fn-render/missing-fn-image/.expected/diff.patch
@@ -0,0 +1,20 @@
+diff --git a/Kptfile b/Kptfile
+index 11012de..c9efd96 100644
+--- a/Kptfile
++++ b/Kptfile
+@@ -7,6 +7,14 @@ pipeline:
+ - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0
+ configMap:
+ namespace: staging
+- - image: ghcr.io/kptdev/krm-functions-catalog/dne # non-existing image
++ - image: ghcr.io/kptdev/krm-functions-catalog/dne
+ configMap:
+ tier: backend
++status:
++ conditions:
++ - type: Rendered
++ status: "False"
++ reason: RenderFailed
++ message: |-
++ pkg.render: pkg .:
++ pipeline.run: already handled error
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 6157962658..621f0f4535 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,4 +1,21 @@
+diff --git a/Kptfile b/Kptfile
+index 5d377d4..784c77a 100644
+--- a/Kptfile
++++ b/Kptfile
+@@ -4,5 +4,10 @@ metadata:
+ name: app
+ pipeline:
+ mutators:
+- - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest
+- configPath: starlark-fn.yaml
++ - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest
++ configPath: starlark-fn.yaml
++status:
++ conditions:
++ - type: Rendered
++ status: "True"
++ reason: RenderSuccess
diff --git a/deployment.yaml b/newfilename.yaml
similarity index 100%
rename from deployment.yaml
-rename to newfilename.yaml
\ No newline at end of file
+rename to newfilename.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 20ce9c627f..1fe2ccb993 100644
--- a/e2e/testdata/fn-render/modify-path-annotation/.expected/diff.patch
+++ b/e2e/testdata/fn-render/modify-path-annotation/.expected/diff.patch
@@ -1,3 +1,20 @@
+diff --git a/Kptfile b/Kptfile
+index 5d377d4..784c77a 100644
+--- a/Kptfile
++++ b/Kptfile
+@@ -4,5 +4,10 @@ metadata:
+ name: app
+ pipeline:
+ mutators:
+- - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest
+- configPath: starlark-fn.yaml
++ - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest
++ configPath: starlark-fn.yaml
++status:
++ conditions:
++ - type: Rendered
++ status: "True"
++ reason: RenderSuccess
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 2a7336fc06..d902763451 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,3 +1,16 @@
+diff --git a/Kptfile b/Kptfile
+index 894ad57..6a36607 100644
+--- a/Kptfile
++++ b/Kptfile
+@@ -6,3 +6,8 @@ pipeline:
+ mutators:
+ - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest
+ configPath: starlark-mutate-path-index.yaml
++status:
++ conditions:
++ - type: Rendered
++ status: "True"
++ reason: RenderSuccess
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 2a7336fc06..d902763451 100644
--- a/e2e/testdata/fn-render/mutate-path-index/.expected/diff.patch
+++ b/e2e/testdata/fn-render/mutate-path-index/.expected/diff.patch
@@ -1,3 +1,16 @@
+diff --git a/Kptfile b/Kptfile
+index 894ad57..6a36607 100644
+--- a/Kptfile
++++ b/Kptfile
+@@ -6,3 +6,8 @@ pipeline:
+ mutators:
+ - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest
+ configPath: starlark-mutate-path-index.yaml
++status:
++ conditions:
++ - type: Rendered
++ status: "True"
++ reason: RenderSuccess
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
new file mode 100644
index 0000000000..ff7bd2cd38
--- /dev/null
+++ b/e2e/testdata/fn-render/no-fnconfig/.expected/diff.patch
@@ -0,0 +1,16 @@
+diff --git a/Kptfile b/Kptfile
+index f2d1249..8b6135d 100644
+--- a/Kptfile
++++ b/Kptfile
+@@ -8,3 +8,11 @@ pipeline:
+ configMap:
+ namespace: staging
+ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5
++status:
++ conditions:
++ - type: Rendered
++ status: "False"
++ reason: RenderFailed
++ message: |-
++ pkg.render: pkg .:
++ pipeline.run: already handled error
diff --git a/e2e/testdata/fn-render/no-op/.expected/diff.patch b/e2e/testdata/fn-render/no-op/.expected/diff.patch
new file mode 100644
index 0000000000..fe193773c3
--- /dev/null
+++ b/e2e/testdata/fn-render/no-op/.expected/diff.patch
@@ -0,0 +1,13 @@
+diff --git a/Kptfile b/Kptfile
+index a7a2d0b..2b5abc5 100644
+--- a/Kptfile
++++ b/Kptfile
+@@ -5,3 +5,8 @@ metadata:
+ pipeline:
+ mutators:
+ - image: ghcr.io/kptdev/krm-functions-catalog/no-op
++status:
++ conditions:
++ - type: Rendered
++ status: "True"
++ reason: RenderSuccess
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 21b66e32b1..00ca968e52 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..3a2c718 100644
+index 1307fb5..f645d75 100644
--- a/Kptfile
+++ b/Kptfile
@@ -2,6 +2,9 @@ apiVersion: kpt.dev/v1
@@ -12,6 +12,15 @@ index 1307fb5..3a2c718 100644
pipeline:
mutators:
- image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0
+@@ -10,3 +13,8 @@ pipeline:
+ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5
+ configMap:
+ tier: backend
++status:
++ conditions:
++ - type: Rendered
++ status: "True"
++ reason: RenderSuccess
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 1bec9c43de..9ef07fea9a 100644
--- a/e2e/testdata/fn-render/no-resources/.expected/diff.patch
+++ b/e2e/testdata/fn-render/no-resources/.expected/diff.patch
@@ -1,3 +1,16 @@
+diff --git a/Kptfile b/Kptfile
+index 714d078..7878d56 100644
+--- a/Kptfile
++++ b/Kptfile
+@@ -6,3 +6,8 @@ pipeline:
+ mutators:
+ - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest
+ configPath: starlark-httpbin.yaml
++status:
++ conditions:
++ - type: Rendered
++ status: "True"
++ reason: RenderSuccess
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-no-pipeline/.expected/diff.patch b/e2e/testdata/fn-render/non-krm-resource-no-pipeline/.expected/diff.patch
new file mode 100644
index 0000000000..16b239070d
--- /dev/null
+++ b/e2e/testdata/fn-render/non-krm-resource-no-pipeline/.expected/diff.patch
@@ -0,0 +1,14 @@
+diff --git a/Kptfile b/Kptfile
+index d9e2f05..775d110 100644
+--- a/Kptfile
++++ b/Kptfile
+@@ -2,3 +2,9 @@ apiVersion: kpt.dev/v1
+ kind: Kptfile
+ metadata:
+ name: app
++status:
++ conditions:
++ - type: Rendered
++ status: "False"
++ reason: RenderFailed
++ message: 'pkg.render: pkg .: input resource list must contain only KRM resources: non-krm.yaml: resource must have `apiVersion`'
diff --git a/e2e/testdata/fn-render/non-krm-resource/.expected/diff.patch b/e2e/testdata/fn-render/non-krm-resource/.expected/diff.patch
new file mode 100644
index 0000000000..614f7e37a8
--- /dev/null
+++ b/e2e/testdata/fn-render/non-krm-resource/.expected/diff.patch
@@ -0,0 +1,16 @@
+diff --git a/Kptfile b/Kptfile
+index 1307fb5..630017f 100644
+--- a/Kptfile
++++ b/Kptfile
+@@ -10,3 +10,11 @@ pipeline:
+ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5
+ configMap:
+ tier: backend
++status:
++ conditions:
++ - type: Rendered
++ status: "False"
++ reason: RenderFailed
++ message: |-
++ pkg.render: pkg .:
++ pipeline.run: input resource list must contain only KRM resources: non-krm.yaml: resource must have `apiVersion`
diff --git a/e2e/testdata/fn-render/out-of-place-fnchain-stdout-results/.expected/diff.patch b/e2e/testdata/fn-render/out-of-place-fnchain-stdout-results/.expected/diff.patch
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/e2e/testdata/fn-render/out-of-place-fnchain-stdout/.expected/diff.patch b/e2e/testdata/fn-render/out-of-place-fnchain-stdout/.expected/diff.patch
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/e2e/testdata/fn-render/out-of-place-fnchain-unwrap/.expected/diff.patch b/e2e/testdata/fn-render/out-of-place-fnchain-unwrap/.expected/diff.patch
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/e2e/testdata/fn-render/out-of-place-stdout/.expected/diff.patch b/e2e/testdata/fn-render/out-of-place-stdout/.expected/diff.patch
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/e2e/testdata/fn-render/out-of-place-unwrap/.expected/diff.patch b/e2e/testdata/fn-render/out-of-place-unwrap/.expected/diff.patch
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/e2e/testdata/fn-render/path-index-ancestor/.expected/diff.patch b/e2e/testdata/fn-render/path-index-ancestor/.expected/diff.patch
new file mode 100644
index 0000000000..9ef7c42449
--- /dev/null
+++ b/e2e/testdata/fn-render/path-index-ancestor/.expected/diff.patch
@@ -0,0 +1,16 @@
+diff --git a/Kptfile b/Kptfile
+index ac710dc..6762952 100644
+--- a/Kptfile
++++ b/Kptfile
+@@ -2,3 +2,11 @@ apiVersion: kpt.dev/v1
+ kind: Kptfile
+ metadata:
+ name: app-with-generator
++status:
++ conditions:
++ - type: Rendered
++ status: "False"
++ reason: RenderFailed
++ message: |-
++ pkg.render: pkg ./db:
++ pipeline.run: 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 1ae748f1e4..c06c7881cb 100644
--- a/e2e/testdata/fn-render/path-index-current/.expected/diff.patch
+++ b/e2e/testdata/fn-render/path-index-current/.expected/diff.patch
@@ -1,3 +1,16 @@
+diff --git a/Kptfile b/Kptfile
+index 0f5d7db..4525813 100644
+--- a/Kptfile
++++ b/Kptfile
+@@ -6,3 +6,8 @@ pipeline:
+ mutators:
+ - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest
+ configPath: starlark-httpbin-gen.yaml
++status:
++ conditions:
++ - type: Rendered
++ status: "True"
++ reason: RenderSuccess
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 a8e328e54e..201a8b079f 100644
--- a/e2e/testdata/fn-render/path-index-descendent/.expected/diff.patch
+++ b/e2e/testdata/fn-render/path-index-descendent/.expected/diff.patch
@@ -1,3 +1,16 @@
+diff --git a/Kptfile b/Kptfile
+index 0f5d7db..4525813 100644
+--- a/Kptfile
++++ b/Kptfile
+@@ -6,3 +6,8 @@ pipeline:
+ mutators:
+ - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest
+ configPath: starlark-httpbin-gen.yaml
++status:
++ conditions:
++ - type: Rendered
++ status: "True"
++ reason: RenderSuccess
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
new file mode 100644
index 0000000000..dbe8b9918f
--- /dev/null
+++ b/e2e/testdata/fn-render/path-index-duplicate/.expected/diff.patch
@@ -0,0 +1,16 @@
+diff --git a/Kptfile b/Kptfile
+index ef99dad..44bcb32 100644
+--- a/Kptfile
++++ b/Kptfile
+@@ -6,3 +6,11 @@ pipeline:
+ mutators:
+ - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest
+ configPath: starlark-gen-duplicate-path.yaml
++status:
++ conditions:
++ - type: Rendered
++ status: "False"
++ reason: RenderFailed
++ message: |-
++ pkg.render: pkg .:
++ pipeline.run: 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
new file mode 100644
index 0000000000..7017de0ffd
--- /dev/null
+++ b/e2e/testdata/fn-render/path-index-outofpackage/.expected/diff.patch
@@ -0,0 +1,16 @@
+diff --git a/Kptfile b/Kptfile
+index ac710dc..2d1632d 100644
+--- a/Kptfile
++++ b/Kptfile
+@@ -2,3 +2,11 @@ apiVersion: kpt.dev/v1
+ kind: Kptfile
+ metadata:
+ name: app-with-generator
++status:
++ conditions:
++ - type: Rendered
++ status: "False"
++ reason: RenderFailed
++ message: |-
++ pkg.render: pkg ./db:
++ pipeline.run: 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
new file mode 100644
index 0000000000..d9752bbacb
--- /dev/null
+++ b/e2e/testdata/fn-render/preserve-comments/.expected/diff.patch
@@ -0,0 +1,13 @@
+diff --git a/Kptfile b/Kptfile
+index 828d292..2228d2c 100644
+--- a/Kptfile
++++ b/Kptfile
+@@ -5,3 +5,8 @@ metadata:
+ pipeline:
+ mutators:
+ - image: ghcr.io/kptdev/krm-functions-catalog/drop-comments:v0.1
++status:
++ conditions:
++ - type: Rendered
++ status: "True"
++ reason: RenderSuccess
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 0e758a50d7..e0b6032aa8 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..3a2c718 100644
+index 1307fb5..f645d75 100644
--- a/Kptfile
+++ b/Kptfile
@@ -2,6 +2,9 @@ apiVersion: kpt.dev/v1
@@ -12,6 +12,15 @@ index 1307fb5..3a2c718 100644
pipeline:
mutators:
- image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0
+@@ -10,3 +13,8 @@ pipeline:
+ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5
+ configMap:
+ tier: backend
++status:
++ conditions:
++ - type: Rendered
++ status: "True"
++ reason: RenderSuccess
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 61eda0ce31..d161537ad5 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..75cfedb 100644
+index 364e274..9ad7200 100644
--- a/Kptfile
+++ b/Kptfile
@@ -2,6 +2,9 @@ apiVersion: kpt.dev/v1
@@ -12,6 +12,15 @@ index 364e274..75cfedb 100644
pipeline:
mutators:
- image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest
+@@ -12,3 +15,8 @@ pipeline:
+ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5
+ configMap:
+ tier: backend
++status:
++ conditions:
++ - type: Rendered
++ status: "True"
++ reason: RenderSuccess
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 0149749d0f..7d3014762d 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..66b7fc9 100644
+index 21d9773..94b2528 100644
--- a/Kptfile
+++ b/Kptfile
-@@ -2,6 +2,8 @@ apiVersion: kpt.dev/v1
+@@ -2,8 +2,15 @@ apiVersion: kpt.dev/v1
kind: Kptfile
metadata:
name: wordpress
@@ -11,6 +11,13 @@ index 21d9773..66b7fc9 100644
pipeline:
mutators:
- image: ghcr.io/kptdev/krm-functions-catalog/set-annotations:latest
+ configMap:
+ abc: def
++status:
++ conditions:
++ - type: Rendered
++ status: "True"
++ reason: RenderSuccess
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/diff.patch b/e2e/testdata/fn-render/save-on-render-failure/bfs-basicpipeline/.expected/diff.patch
index b0b6b3e100..e9382ce252 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,17 +1,46 @@
diff --git a/Kptfile b/Kptfile
-index ec2c042..d795f4f 100644
+index ec2c042..50c2a18 100644
--- a/Kptfile
+++ b/Kptfile
-@@ -4,7 +4,9 @@ metadata:
+@@ -1,18 +1,28 @@
+ apiVersion: kpt.dev/v1
+ kind: Kptfile
+ metadata:
++ name: save-on-render-failure
++ namespace: staging
annotations:
++ app: myapp
kpt.dev/bfs-rendering: "true"
kpt.dev/save-on-render-failure: "true"
-+ app: myapp
- name: save-on-render-failure
-+ namespace: staging
+- name: save-on-render-failure
pipeline:
mutators:
- - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0
+- - 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/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
++status:
++ conditions:
++ - type: Rendered
++ status: "False"
++ reason: RenderFailed
++ message: |-
++ pkg.render: pkg .:
++ pipeline.run: already handled error
diff --git a/resources.yaml b/resources.yaml
index 0848ba0..7eece9b 100644
--- a/resources.yaml
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 3efb8adbb5..0544ac3be1 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,13 +1,18 @@
diff --git a/Kptfile b/Kptfile
-index dbd6541..bc4fd2d 100644
+index dbd6541..915dd4b 100644
--- a/Kptfile
+++ b/Kptfile
-@@ -5,10 +5,12 @@ metadata:
- kpt.dev/bfs-rendering: "true"
- kpt.dev/save-on-render-failure: "true"
- name: bfs-deep-nested-middle-fails
+@@ -1,14 +1,24 @@
+ apiVersion: kpt.dev/v1
+ kind: Kptfile
+ metadata:
++ name: bfs-deep-nested-middle-fails
+ labels:
+ level: root
+ annotations:
+ kpt.dev/bfs-rendering: "true"
+ kpt.dev/save-on-render-failure: "true"
+- name: bfs-deep-nested-middle-fails
info:
description: BFS - Deep nested, middle level fails
pipeline:
@@ -16,6 +21,14 @@ index dbd6541..bc4fd2d 100644
configMap:
- level: "root"
+ level: root
++status:
++ conditions:
++ - type: Rendered
++ status: "False"
++ reason: RenderFailed
++ message: |-
++ pkg.render: pkg .:
++ pipeline.run: pkg ./level1: already handled error
diff --git a/configmap.yaml b/configmap.yaml
index 59bb817..19a7ead 100644
--- a/configmap.yaml
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 8a582dcd77..8ddd89fefa 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,16 +1,33 @@
diff --git a/Kptfile b/Kptfile
-index e9fad85..1b08a62 100644
+index e9fad85..48186b1 100644
--- a/Kptfile
+++ b/Kptfile
-@@ -5,6 +5,8 @@ metadata:
- kpt.dev/bfs-rendering: "true"
- kpt.dev/save-on-render-failure: "true"
- name: bfs-multiple-subpkgs-one-fails
+@@ -1,10 +1,12 @@
+ apiVersion: kpt.dev/v1
+ kind: Kptfile
+ metadata:
++ name: bfs-multiple-subpkgs-one-fails
+ labels:
+ pkg: root
+ annotations:
+ kpt.dev/bfs-rendering: "true"
+ kpt.dev/save-on-render-failure: "true"
+- name: bfs-multiple-subpkgs-one-fails
info:
description: BFS - Multiple subpackages, sub2 fails
pipeline:
+@@ -12,3 +14,11 @@ pipeline:
+ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5
+ configMap:
+ pkg: root
++status:
++ conditions:
++ - type: Rendered
++ status: "False"
++ reason: RenderFailed
++ message: |-
++ pkg.render: pkg .:
++ pipeline.run: pkg ./sub2: already handled error
diff --git a/service.yaml b/service.yaml
index 9148b9b..2e551c8 100644
--- a/service.yaml
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 6154172d4a..e5e2e83e81 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,16 +1,33 @@
diff --git a/Kptfile b/Kptfile
-index cbe756f..a5fa6c0 100644
+index cbe756f..8ce300c 100644
--- a/Kptfile
+++ b/Kptfile
-@@ -5,6 +5,8 @@ metadata:
- kpt.dev/bfs-rendering: "true"
- kpt.dev/save-on-render-failure: "true"
- name: bfs-parent-and-subpkg-both-fail
+@@ -1,10 +1,12 @@
+ 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"
+- name: bfs-parent-and-subpkg-both-fail
info:
description: BFS - Both parent and subpackage fail
pipeline:
+@@ -14,3 +16,11 @@ pipeline:
+ pkg: root
+ validators:
+ - image: ghcr.io/kptdev/krm-functions-catalog/invalid-image:v0.0.0
++status:
++ conditions:
++ - type: Rendered
++ status: "False"
++ reason: RenderFailed
++ message: |-
++ pkg.render: pkg .:
++ pipeline.run: already handled error
diff --git a/configmap.yaml b/configmap.yaml
index 8594873..a591ceb 100644
--- a/configmap.yaml
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 d7619bd383..f7cc0a511a 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,13 +1,18 @@
diff --git a/Kptfile b/Kptfile
-index c80b904..6954e67 100644
+index c80b904..d0bc053 100644
--- a/Kptfile
+++ b/Kptfile
-@@ -5,11 +5,13 @@ metadata:
- kpt.dev/bfs-rendering: "true"
- kpt.dev/save-on-render-failure: "true"
- name: bfs-parent-mutator-fails
+@@ -1,15 +1,25 @@
+ apiVersion: kpt.dev/v1
+ kind: Kptfile
+ metadata:
++ name: bfs-parent-mutator-fails
+ labels:
+ test: parent-mutator-fail
+ annotations:
+ kpt.dev/bfs-rendering: "true"
+ kpt.dev/save-on-render-failure: "true"
+- name: bfs-parent-mutator-fails
info:
description: BFS - Parent mutator fails
pipeline:
@@ -17,6 +22,14 @@ index c80b904..6954e67 100644
- test: "parent-mutator-fail"
+ test: parent-mutator-fail
- image: ghcr.io/kptdev/krm-functions-catalog/invalid-image:v0.0.0
++status:
++ conditions:
++ - type: Rendered
++ status: "False"
++ reason: RenderFailed
++ message: |-
++ pkg.render: pkg .:
++ pipeline.run: already handled error
diff --git a/configmap.yaml b/configmap.yaml
index 20a54f6..a46a12b 100644
--- a/configmap.yaml
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 1d8bba0c89..77a376f85e 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,13 +1,18 @@
diff --git a/Kptfile b/Kptfile
-index 491b12e..8c66fe7 100644
+index 491b12e..28e400c 100644
--- a/Kptfile
+++ b/Kptfile
-@@ -5,12 +5,14 @@ metadata:
- kpt.dev/bfs-rendering: "true"
- kpt.dev/save-on-render-failure: "true"
- name: bfs-parent-validator-fails
+@@ -1,16 +1,26 @@
+ apiVersion: kpt.dev/v1
+ kind: Kptfile
+ metadata:
++ name: bfs-parent-validator-fails
+ labels:
+ test: parent-fail
+ annotations:
+ kpt.dev/bfs-rendering: "true"
+ kpt.dev/save-on-render-failure: "true"
+- name: bfs-parent-validator-fails
info:
description: BFS - Parent validator fails
pipeline:
@@ -18,6 +23,14 @@ index 491b12e..8c66fe7 100644
+ test: parent-fail
validators:
- image: ghcr.io/kptdev/krm-functions-catalog/invalid-image:v0.0.0
++status:
++ conditions:
++ - type: Rendered
++ status: "False"
++ reason: RenderFailed
++ message: |-
++ pkg.render: pkg .:
++ pipeline.run: already handled error
diff --git a/configmap.yaml b/configmap.yaml
index 20a54f6..ad595de 100644
--- a/configmap.yaml
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 5c771fd77f..b4d487a414 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,13 +1,18 @@
diff --git a/Kptfile b/Kptfile
-index 84b93a6..877725d 100644
+index 84b93a6..4ae9f17 100644
--- a/Kptfile
+++ b/Kptfile
-@@ -5,10 +5,12 @@ metadata:
- kpt.dev/bfs-rendering: "true"
- kpt.dev/save-on-render-failure: "true"
- name: bfs-subpkg-mutator-fails
+@@ -1,14 +1,24 @@
+ apiVersion: kpt.dev/v1
+ kind: Kptfile
+ metadata:
++ name: bfs-subpkg-mutator-fails
+ labels:
+ test: mutator-fail
+ annotations:
+ kpt.dev/bfs-rendering: "true"
+ kpt.dev/save-on-render-failure: "true"
+- name: bfs-subpkg-mutator-fails
info:
description: BFS - Subpackage mutator fails
pipeline:
@@ -16,6 +21,14 @@ index 84b93a6..877725d 100644
configMap:
- test: "mutator-fail"
+ test: mutator-fail
++status:
++ conditions:
++ - type: Rendered
++ status: "False"
++ reason: RenderFailed
++ message: |-
++ pkg.render: pkg .:
++ pipeline.run: pkg ./subpkg: already handled error
diff --git a/deployment.yaml b/deployment.yaml
index cc866f6..6ed4201 100644
--- a/deployment.yaml
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 c18f86ccf4..18a748ab0c 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,14 +1,19 @@
diff --git a/Kptfile b/Kptfile
-index 86dbe13..c5c38b8 100644
+index 86dbe13..f0c67c4 100644
--- a/Kptfile
+++ b/Kptfile
-@@ -5,11 +5,14 @@ metadata:
- kpt.dev/bfs-rendering: "true"
- kpt.dev/save-on-render-failure: "true"
- name: bfs-subpkg-validator-fails
+@@ -1,15 +1,26 @@
+ apiVersion: kpt.dev/v1
+ kind: Kptfile
+ metadata:
++ name: bfs-subpkg-validator-fails
+ labels:
+ level: root
+ test: subpkg-fail
+ annotations:
+ kpt.dev/bfs-rendering: "true"
+ kpt.dev/save-on-render-failure: "true"
+- name: bfs-subpkg-validator-fails
info:
description: BFS - Subpackage validator fails
pipeline:
@@ -17,8 +22,16 @@ index 86dbe13..c5c38b8 100644
configMap:
- test: "subpkg-fail"
- level: "root"
-+ test: subpkg-fail
+ level: root
++ test: subpkg-fail
++status:
++ conditions:
++ - type: Rendered
++ status: "False"
++ reason: RenderFailed
++ message: |-
++ pkg.render: pkg .:
++ pipeline.run: pkg ./subpkg: already handled error
diff --git a/deployment.yaml b/deployment.yaml
index 7123634..4db6211 100644
--- a/deployment.yaml
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 92754c2fd1..3234bb19c8 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,17 +1,45 @@
diff --git a/Kptfile b/Kptfile
-index c6fc0c5..1631bfb 100644
+index c6fc0c5..620b80e 100644
--- a/Kptfile
+++ b/Kptfile
-@@ -3,7 +3,9 @@ kind: Kptfile
+@@ -1,17 +1,27 @@
+ apiVersion: kpt.dev/v1
+ kind: Kptfile
metadata:
++ name: save-on-render-failure
++ namespace: staging
annotations:
- kpt.dev/save-on-render-failure: "true"
+ app: myapp
- name: save-on-render-failure
-+ namespace: staging
+ kpt.dev/save-on-render-failure: "true"
+- name: save-on-render-failure
pipeline:
mutators:
- - image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0
+- - 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/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
++status:
++ conditions:
++ - type: Rendered
++ status: "False"
++ reason: RenderFailed
++ message: |-
++ pkg.render: pkg .:
++ pipeline.run: already handled error
diff --git a/resources.yaml b/resources.yaml
index 0848ba0..7eece9b 100644
--- a/resources.yaml
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 a4012da01e..14f98d3f02 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,3 +1,31 @@
+diff --git a/Kptfile b/Kptfile
+index 4047d27..e7ca740 100644
+--- a/Kptfile
++++ b/Kptfile
+@@ -1,13 +1,21 @@
+ apiVersion: kpt.dev/v1
+ kind: Kptfile
+ metadata:
++ name: dfs-deep-nested-middle-fails
+ annotations:
+ kpt.dev/save-on-render-failure: "true"
+- name: dfs-deep-nested-middle-fails
+ info:
+ description: DFS - Deep nested, middle level fails
+ pipeline:
+ mutators:
+ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5
+ configMap:
+- level: "root"
++ level: root
++status:
++ conditions:
++ - type: Rendered
++ status: "False"
++ reason: RenderFailed
++ message: |-
++ pkg.render: pkg ./level1:
++ pipeline.run: already handled error
diff --git a/level1/Kptfile b/level1/Kptfile
index b5960dd..b42f153 100644
--- a/level1/Kptfile
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 70def2baa5..582f70fc72 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,3 +1,30 @@
+diff --git a/Kptfile b/Kptfile
+index c47c90d..1b7e920 100644
+--- a/Kptfile
++++ b/Kptfile
+@@ -1,9 +1,9 @@
+ apiVersion: kpt.dev/v1
+ kind: Kptfile
+ metadata:
++ name: dfs-multiple-subpkgs-one-fails
+ annotations:
+ kpt.dev/save-on-render-failure: "true"
+- name: dfs-multiple-subpkgs-one-fails
+ info:
+ description: DFS - Multiple subpackages, sub2 fails
+ pipeline:
+@@ -11,3 +11,11 @@ pipeline:
+ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5
+ configMap:
+ pkg: root
++status:
++ conditions:
++ - type: Rendered
++ status: "False"
++ reason: RenderFailed
++ message: |-
++ pkg.render: pkg ./sub2:
++ pipeline.run: already handled error
diff --git a/sub1/Kptfile b/sub1/Kptfile
index 2d62077..0f03268 100644
--- a/sub1/Kptfile
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 e2923d8d42..f0105bbf0f 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,3 +1,30 @@
+diff --git a/Kptfile b/Kptfile
+index e4d630d..c8d5efb 100644
+--- a/Kptfile
++++ b/Kptfile
+@@ -1,9 +1,9 @@
+ apiVersion: kpt.dev/v1
+ kind: Kptfile
+ metadata:
++ name: dfs-parent-and-subpkg-both-fail
+ annotations:
+ kpt.dev/save-on-render-failure: "true"
+- name: dfs-parent-and-subpkg-both-fail
+ info:
+ description: DFS - Both parent and subpackage fail
+ pipeline:
+@@ -13,3 +13,11 @@ pipeline:
+ pkg: root
+ validators:
+ - image: ghcr.io/kptdev/krm-functions-catalog/invalid-image:v0.0.0
++status:
++ conditions:
++ - type: Rendered
++ status: "False"
++ reason: RenderFailed
++ message: |-
++ pkg.render: pkg ./subpkg:
++ pipeline.run: already handled error
diff --git a/subpkg/Kptfile b/subpkg/Kptfile
index a332cf5..cb45834 100644
--- a/subpkg/Kptfile
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 0c15742529..eecfacca1c 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,13 +1,17 @@
diff --git a/Kptfile b/Kptfile
-index c134b37..32d759a 100644
+index c134b37..a48d9bb 100644
--- a/Kptfile
+++ b/Kptfile
-@@ -4,11 +4,13 @@ metadata:
- annotations:
- kpt.dev/save-on-render-failure: "true"
- name: dfs-parent-mutator-fails
+@@ -1,14 +1,24 @@
+ apiVersion: kpt.dev/v1
+ kind: Kptfile
+ metadata:
++ name: dfs-parent-mutator-fails
+ labels:
+ test: parent-mutator-fail
+ annotations:
+ kpt.dev/save-on-render-failure: "true"
+- name: dfs-parent-mutator-fails
info:
description: DFS - Parent mutator fails
pipeline:
@@ -17,6 +21,14 @@ index c134b37..32d759a 100644
- test: "parent-mutator-fail"
+ test: parent-mutator-fail
- image: ghcr.io/kptdev/krm-functions-catalog/invalid-image:v0.0.0
++status:
++ conditions:
++ - type: Rendered
++ status: "False"
++ reason: RenderFailed
++ message: |-
++ pkg.render: pkg .:
++ pipeline.run: already handled error
diff --git a/configmap.yaml b/configmap.yaml
index 20a54f6..a46a12b 100644
--- a/configmap.yaml
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 cfdb9a036b..0d65d79302 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,13 +1,17 @@
diff --git a/Kptfile b/Kptfile
-index 94a7a73..8581173 100644
+index 94a7a73..8965faa 100644
--- a/Kptfile
+++ b/Kptfile
-@@ -4,12 +4,14 @@ metadata:
- annotations:
- kpt.dev/save-on-render-failure: "true"
- name: dfs-parent-validator-fails
+@@ -1,15 +1,25 @@
+ apiVersion: kpt.dev/v1
+ kind: Kptfile
+ metadata:
++ name: dfs-parent-validator-fails
+ labels:
+ test: parent-fail
+ annotations:
+ kpt.dev/save-on-render-failure: "true"
+- name: dfs-parent-validator-fails
info:
description: DFS - Parent validator fails
pipeline:
@@ -18,6 +22,14 @@ index 94a7a73..8581173 100644
+ test: parent-fail
validators:
- image: ghcr.io/kptdev/krm-functions-catalog/invalid-image:v0.0.0
++status:
++ conditions:
++ - type: Rendered
++ status: "False"
++ reason: RenderFailed
++ message: |-
++ pkg.render: pkg .:
++ pipeline.run: already handled error
diff --git a/configmap.yaml b/configmap.yaml
index 20a54f6..ad595de 100644
--- a/configmap.yaml
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 24433c71d9..514a0dde24 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,3 +1,31 @@
+diff --git a/Kptfile b/Kptfile
+index 80aa788..0fca116 100644
+--- a/Kptfile
++++ b/Kptfile
+@@ -1,13 +1,21 @@
+ apiVersion: kpt.dev/v1
+ kind: Kptfile
+ metadata:
++ name: dfs-subpkg-mutator-fails
+ annotations:
+ kpt.dev/save-on-render-failure: "true"
+- name: dfs-subpkg-mutator-fails
+ info:
+ description: DFS - Subpackage mutator fails
+ pipeline:
+ mutators:
+ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5
+ configMap:
+- test: "mutator-fail"
++ test: mutator-fail
++status:
++ conditions:
++ - type: Rendered
++ status: "False"
++ reason: RenderFailed
++ message: |-
++ pkg.render: pkg ./subpkg:
++ pipeline.run: already handled error
diff --git a/subpkg/Kptfile b/subpkg/Kptfile
index ec4ce38..d7ac408 100644
--- a/subpkg/Kptfile
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 0fdd10dee3..4dbe465e7d 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,3 +1,33 @@
+diff --git a/Kptfile b/Kptfile
+index 7c3b09a..6bc279b 100644
+--- a/Kptfile
++++ b/Kptfile
+@@ -1,14 +1,22 @@
+ apiVersion: kpt.dev/v1
+ kind: Kptfile
+ metadata:
++ name: dfs-subpkg-validator-fails
+ annotations:
+ kpt.dev/save-on-render-failure: "true"
+- name: dfs-subpkg-validator-fails
+ info:
+ description: DFS - Subpackage validator fails
+ pipeline:
+ mutators:
+ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5
+ configMap:
+- test: "subpkg-fail"
+- level: "root"
++ level: root
++ test: subpkg-fail
++status:
++ conditions:
++ - type: Rendered
++ status: "False"
++ reason: RenderFailed
++ message: |-
++ pkg.render: pkg ./subpkg:
++ pipeline.run: already handled error
diff --git a/subpkg/Kptfile b/subpkg/Kptfile
index f147d84..b3c532e 100644
--- a/subpkg/Kptfile
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 e69de29bb2..187669d407 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
@@ -0,0 +1,34 @@
+diff --git a/Kptfile b/Kptfile
+index 6e26cd3..fb2aa71 100644
+--- a/Kptfile
++++ b/Kptfile
+@@ -4,12 +4,20 @@ metadata:
+ name: no-save-on-render-failure
+ pipeline:
+ mutators:
+- - 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/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
++status:
++ conditions:
++ - type: Rendered
++ status: "False"
++ reason: RenderFailed
++ message: |-
++ pkg.render: pkg .:
++ pipeline.run: already handled error
diff --git a/e2e/testdata/fn-render/selectors/basicpipeline/.expected/diff.patch b/e2e/testdata/fn-render/selectors/basicpipeline/.expected/diff.patch
index b29c072d71..8187cff1d0 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..1120263 100644
+index abc7b97..0b78750 100644
--- a/Kptfile
+++ b/Kptfile
-@@ -2,6 +2,8 @@ apiVersion: kpt.dev/v1
+@@ -2,14 +2,21 @@ apiVersion: kpt.dev/v1
kind: Kptfile
metadata:
name: app
@@ -11,6 +11,21 @@ index abc7b97..1120263 100644
pipeline:
mutators:
- image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0
+ configMap:
+ namespace: staging
+ selectors:
+- - name: nginx-deployment
+- kind: Deployment
++ - kind: Deployment
++ name: nginx-deployment
+ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5
+ configMap:
+ tier: backend
++status:
++ conditions:
++ - type: Rendered
++ status: "True"
++ reason: RenderSuccess
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 207f384e99..c092089266 100644
--- a/e2e/testdata/fn-render/selectors/exclude/.expected/diff.patch
+++ b/e2e/testdata/fn-render/selectors/exclude/.expected/diff.patch
@@ -1,3 +1,25 @@
+diff --git a/Kptfile b/Kptfile
+index 266b33a..92e4a02 100644
+--- a/Kptfile
++++ b/Kptfile
+@@ -8,10 +8,15 @@ pipeline:
+ configMap:
+ namespace: staging
+ selectors:
+- - name: nginx-deployment
+- kind: Deployment
++ - kind: Deployment
++ name: nginx-deployment
+ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5
+ configMap:
+ tier: backend
+ exclude:
+ - kind: Kptfile
++status:
++ conditions:
++ - type: Rendered
++ status: "True"
++ reason: RenderSuccess
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 dd1d2c47f0..9722438cf4 100644
--- a/e2e/testdata/fn-render/selectors/generator/.expected/diff.patch
+++ b/e2e/testdata/fn-render/selectors/generator/.expected/diff.patch
@@ -1,3 +1,16 @@
+diff --git a/Kptfile b/Kptfile
+index eb2f084..cb608a0 100644
+--- a/Kptfile
++++ b/Kptfile
+@@ -14,3 +14,8 @@ pipeline:
+ tier: db
+ selectors:
+ - name: httpbin
++status:
++ conditions:
++ - type: Rendered
++ status: "True"
++ reason: RenderSuccess
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 45e8d1aff3..ea9cd478bc 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..ef430cd 100644
+index c16cdca..8941f26 100644
--- a/Kptfile
+++ b/Kptfile
@@ -2,6 +2,8 @@ apiVersion: kpt.dev/v1
@@ -11,6 +11,15 @@ index c16cdca..ef430cd 100644
pipeline:
mutators:
- image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0
+@@ -15,3 +17,8 @@ pipeline:
+ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5
+ configMap:
+ tier: backend
++status:
++ conditions:
++ - type: Rendered
++ status: "True"
++ reason: RenderSuccess
diff --git a/resources.yaml b/resources.yaml
index d3ed04c..f66e542 100644
--- a/resources.yaml
@@ -39,4 +48,4 @@ index d3ed04c..f66e542 100644
foo: bar
+ tier: backend
spec:
- image: nginx:1.2.3
\ No newline at end of file
+ image: nginx:1.2.3
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 af84880849..2312d6f22c 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..06cb2ef 100644
+index d4e5935..95f5ba8 100644
--- a/Kptfile
+++ b/Kptfile
@@ -2,6 +2,9 @@ apiVersion: kpt.dev/v1
@@ -12,6 +12,15 @@ index d4e5935..06cb2ef 100644
pipeline:
mutators:
- image: set-namespace:v0.2.0
+@@ -10,3 +13,8 @@ pipeline:
+ - image: set-labels:v0.1.5
+ configMap:
+ tier: backend
++status:
++ conditions:
++ - type: Rendered
++ status: "True"
++ reason: RenderSuccess
diff --git a/resources.yaml b/resources.yaml
index f2eec52..84cfb26 100644
--- a/resources.yaml
diff --git a/e2e/testdata/fn-render/short-image-path/.expected/results.yaml b/e2e/testdata/fn-render/short-image-path/.expected/results.yaml
index bc3a869a98..1ea8a8f00b 100755
--- a/e2e/testdata/fn-render/short-image-path/.expected/results.yaml
+++ b/e2e/testdata/fn-render/short-image-path/.expected/results.yaml
@@ -8,4 +8,3 @@ items:
exitCode: 0
- image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5
exitCode: 0
-
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
new file mode 100644
index 0000000000..06c08a0a2c
--- /dev/null
+++ b/e2e/testdata/fn-render/structured-results-from-muiltiple-fns/.expected/diff.patch
@@ -0,0 +1,16 @@
+diff --git a/Kptfile b/Kptfile
+index 91828a8..aea2cb9 100644
+--- a/Kptfile
++++ b/Kptfile
+@@ -9,3 +9,11 @@ pipeline:
+ configMap:
+ ignore_missing_schemas: "true"
+ strict: "true"
++status:
++ conditions:
++ - type: Rendered
++ status: "False"
++ reason: RenderFailed
++ message: |-
++ pkg.render: pkg .:
++ pipeline.run: already handled error
diff --git a/e2e/testdata/fn-render/subpkg-fn-failure/.expected/diff.patch b/e2e/testdata/fn-render/subpkg-fn-failure/.expected/diff.patch
new file mode 100644
index 0000000000..bd7106dd95
--- /dev/null
+++ b/e2e/testdata/fn-render/subpkg-fn-failure/.expected/diff.patch
@@ -0,0 +1,16 @@
+diff --git a/Kptfile b/Kptfile
+index 364e274..4316cf6 100644
+--- a/Kptfile
++++ b/Kptfile
+@@ -12,3 +12,11 @@ pipeline:
+ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5
+ configMap:
+ tier: backend
++status:
++ conditions:
++ - type: Rendered
++ status: "False"
++ reason: RenderFailed
++ message: |-
++ pkg.render: pkg ./db:
++ pipeline.run: already handled error
diff --git a/e2e/testdata/fn-render/subpkg-has-invalid-kptfile/.expected/diff.patch b/e2e/testdata/fn-render/subpkg-has-invalid-kptfile/.expected/diff.patch
new file mode 100644
index 0000000000..c66b445d9e
--- /dev/null
+++ b/e2e/testdata/fn-render/subpkg-has-invalid-kptfile/.expected/diff.patch
@@ -0,0 +1,16 @@
+diff --git a/Kptfile b/Kptfile
+index 1307fb5..15413d2 100644
+--- a/Kptfile
++++ b/Kptfile
+@@ -10,3 +10,11 @@ pipeline:
+ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5
+ configMap:
+ tier: backend
++status:
++ conditions:
++ - type: Rendered
++ status: "False"
++ reason: RenderFailed
++ message: |-
++ pkg.render: pkg .:
++ pkg.Subpackages: pkg ./db: error reading Kptfile at "./db": yaml: line 10: mapping values are not allowed in this context
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 3ed1b478ec..cb038df6d8 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,3 +1,16 @@
+diff --git a/Kptfile b/Kptfile
+index 701e0a1..3107d07 100644
+--- a/Kptfile
++++ b/Kptfile
+@@ -4,3 +4,8 @@ metadata:
+ name: root-pkg
+ info:
+ description: sample description
++status:
++ conditions:
++ - type: Rendered
++ status: "True"
++ reason: RenderSuccess
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 a92d37160d..ace86b1bd8 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..75cfedb 100644
+index 364e274..9ad7200 100644
--- a/Kptfile
+++ b/Kptfile
@@ -2,6 +2,9 @@ apiVersion: kpt.dev/v1
@@ -12,6 +12,15 @@ index 364e274..75cfedb 100644
pipeline:
mutators:
- image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest
+@@ -12,3 +15,8 @@ pipeline:
+ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5
+ configMap:
+ tier: backend
++status:
++ conditions:
++ - type: Rendered
++ status: "True"
++ reason: RenderSuccess
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 efb950203b..63ae894e45 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..c24d77e 100644
+index 82686a8..a4b2da6 100644
--- a/Kptfile
+++ b/Kptfile
@@ -2,6 +2,9 @@ apiVersion: kpt.dev/v1
@@ -12,6 +12,15 @@ index 82686a8..c24d77e 100644
pipeline:
mutators:
- image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0
+@@ -10,3 +13,8 @@ pipeline:
+ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5
+ configMap:
+ tier: db
++status:
++ conditions:
++ - type: Rendered
++ status: "True"
++ reason: RenderSuccess
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 efb950203b..63ae894e45 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..c24d77e 100644
+index 82686a8..a4b2da6 100644
--- a/Kptfile
+++ b/Kptfile
@@ -2,6 +2,9 @@ apiVersion: kpt.dev/v1
@@ -12,6 +12,15 @@ index 82686a8..c24d77e 100644
pipeline:
mutators:
- image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0
+@@ -10,3 +13,8 @@ pipeline:
+ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5
+ configMap:
+ tier: db
++status:
++ conditions:
++ - type: Rendered
++ status: "True"
++ reason: RenderSuccess
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 a21c38b30e..16337308e3 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..3a2c718 100644
+index 1307fb5..f645d75 100644
--- a/Kptfile
+++ b/Kptfile
@@ -2,6 +2,9 @@ apiVersion: kpt.dev/v1
@@ -12,6 +12,15 @@ index 1307fb5..3a2c718 100644
pipeline:
mutators:
- image: ghcr.io/kptdev/krm-functions-catalog/set-namespace:v0.2.0
+@@ -10,3 +13,8 @@ pipeline:
+ - image: ghcr.io/kptdev/krm-functions-catalog/set-labels:v0.1.5
+ configMap:
+ tier: backend
++status:
++ conditions:
++ - type: Rendered
++ status: "True"
++ reason: RenderSuccess
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 1ae748f1e4..5499661a18 100644
--- a/e2e/testdata/fn-render/validate-generated-resource/.expected/diff.patch
+++ b/e2e/testdata/fn-render/validate-generated-resource/.expected/diff.patch
@@ -1,3 +1,16 @@
+diff --git a/Kptfile b/Kptfile
+index b2432a4..0362808 100644
+--- a/Kptfile
++++ b/Kptfile
+@@ -9,3 +9,8 @@ pipeline:
+ validators:
+ - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest
+ configPath: starlark-httpbin-val.yaml
++status:
++ conditions:
++ - type: Rendered
++ status: "True"
++ reason: RenderSuccess
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
new file mode 100644
index 0000000000..b063c5efd4
--- /dev/null
+++ b/e2e/testdata/fn-render/validate-resource-failure/.expected/diff.patch
@@ -0,0 +1,19 @@
+diff --git a/Kptfile b/Kptfile
+index 8c3173a..c241762 100644
+--- a/Kptfile
++++ b/Kptfile
+@@ -4,5 +4,13 @@ metadata:
+ name: db
+ pipeline:
+ validators:
+- - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest # validates httpbin deployment exists
++ - image: ghcr.io/kptdev/krm-functions-catalog/starlark:latest
+ configPath: starlark-httpbin-val.yaml
++status:
++ conditions:
++ - type: Rendered
++ status: "False"
++ reason: RenderFailed
++ message: |-
++ pkg.render: pkg .:
++ pipeline.run: already handled error
diff --git a/internal/util/render/executor.go b/internal/util/render/executor.go
index d74ccf4957..eb83469e25 100644
--- a/internal/util/render/executor.go
+++ b/internal/util/render/executor.go
@@ -20,6 +20,7 @@ import (
"io"
"os"
"path/filepath"
+ "slices"
"strings"
"github.com/kptdev/kpt/internal/fnruntime"
@@ -34,6 +35,7 @@ import (
"github.com/kptdev/kpt/pkg/lib/errors"
"github.com/kptdev/kpt/pkg/lib/runneroptions"
"github.com/kptdev/kpt/pkg/printer"
+ "k8s.io/klog/v2"
"sigs.k8s.io/kustomize/kyaml/filesys"
"sigs.k8s.io/kustomize/kyaml/kio"
"sigs.k8s.io/kustomize/kyaml/kio/kioutil"
@@ -109,6 +111,9 @@ func (e *Renderer) Execute(ctx context.Context) (*fnresult.ResultList, error) {
_, hydErr := hydrateFn(ctx, root, hctx)
if hydErr != nil && !hctx.saveOnRenderFailure {
+ if e.Output == nil {
+ updateRenderStatus(hctx, hydErr)
+ }
_ = e.saveFnResults(ctx, hctx.fnResults)
return hctx.fnResults, errors.E(op, root.pkg.UniquePath, hydErr)
}
@@ -173,11 +178,20 @@ func (e *Renderer) Execute(ctx context.Context) (*fnresult.ResultList, error) {
}
if hydErr != nil {
+ if e.Output == nil {
+ updateRenderStatus(hctx, hydErr)
+ }
_ = e.saveFnResults(ctx, hctx.fnResults) // Ignore save error to avoid masking hydration error
return hctx.fnResults, errors.E(op, root.pkg.UniquePath, hydErr)
}
- return hctx.fnResults, e.saveFnResults(ctx, hctx.fnResults)
+ saveErr := e.saveFnResults(ctx, hctx.fnResults)
+
+ if e.Output == nil {
+ updateRenderStatus(hctx, saveErr)
+ }
+
+ return hctx.fnResults, saveErr
}
func (e *Renderer) printPipelineExecutionSummary(pr printer.Printer, hctx hydrationContext, hydErr error) {
@@ -192,6 +206,47 @@ func (e *Renderer) printPipelineExecutionSummary(pr printer.Printer, hctx hydrat
}
}
+// updateRenderStatus writes a Rendered status condition 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) {
+ if hctx.fileSystem == nil {
+ return
+ }
+
+ rootPath := hctx.root.pkg.UniquePath.String()
+ conditionStatus := kptfilev1.ConditionTrue
+ reason := kptfilev1.ReasonRenderSuccess
+ message := ""
+ if hydErr != nil {
+ conditionStatus = kptfilev1.ConditionFalse
+ reason = kptfilev1.ReasonRenderFailed
+ message = strings.ReplaceAll(hydErr.Error(), rootPath, ".")
+ }
+ setRenderCondition(hctx.fileSystem, rootPath, kptfilev1.NewRenderedCondition(conditionStatus, reason, message))
+}
+
+// setRenderCondition reads the Kptfile at pkgPath, sets the Rendered condition, and writes it back.
+func setRenderCondition(fs filesys.FileSystem, pkgPath string, condition kptfilev1.Condition) {
+ fsOrDisk := filesys.FileSystemOrOnDisk{FileSystem: fs}
+ kf, err := kptfileutil.ReadKptfile(fsOrDisk, pkgPath)
+ if err != nil {
+ klog.V(3).Infof("failed to read Kptfile for render status update at %s: %v", pkgPath, err)
+ return
+ }
+ if kf.Status == nil {
+ kf.Status = &kptfilev1.Status{}
+ }
+ // Replace any existing Rendered condition
+ kf.Status.Conditions = slices.DeleteFunc(kf.Status.Conditions, func(c kptfilev1.Condition) bool {
+ return c.Type == kptfilev1.ConditionTypeRendered
+ })
+ kf.Status.Conditions = append(kf.Status.Conditions, condition)
+ 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)
+ }
+}
+
func (e *Renderer) saveFnResults(ctx context.Context, fnResults *fnresult.ResultList) error {
e.fnResultsList = fnResults
resultsFile, err := fnruntime.SaveResults(e.FileSystem, e.ResultsDirPath, fnResults)
diff --git a/internal/util/render/executor_test.go b/internal/util/render/executor_test.go
index 2c8e253f54..e09b33bc50 100644
--- a/internal/util/render/executor_test.go
+++ b/internal/util/render/executor_test.go
@@ -25,6 +25,8 @@ import (
"github.com/kptdev/kpt/internal/fnruntime"
"github.com/kptdev/kpt/internal/pkg"
"github.com/kptdev/kpt/internal/types"
+ 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"
@@ -32,6 +34,7 @@ import (
)
const rootString = "/root"
+const subPkgString = "/root/subpkg"
func TestPathRelToRoot(t *testing.T) {
tests := []struct {
@@ -249,7 +252,7 @@ func setupRendererTest(t *testing.T, renderBfs bool) (*Renderer, *bytes.Buffer,
err := mockFileSystem.Mkdir(rootPkgPath)
assert.NoError(t, err)
- subPkgPath := "/root/subpkg"
+ subPkgPath := subPkgString
err = mockFileSystem.Mkdir(subPkgPath)
assert.NoError(t, err)
@@ -410,7 +413,7 @@ func TestHydrateBfsOrder_ErrorCases(t *testing.T) {
err := mockFileSystem.Mkdir(rootPkgPath)
assert.NoError(t, err)
- subPkgPath := "/root/subpkg"
+ subPkgPath := subPkgString
err = mockFileSystem.Mkdir(subPkgPath)
assert.NoError(t, err)
@@ -572,6 +575,161 @@ func TestRenderer_PrintPipelineExecutionSummary(t *testing.T) {
}
}
+func TestUpdateRenderStatus_Success(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,
+ }
+ hctx.pkgs[rootPkg.UniquePath] = &pkgNode{pkg: rootPkg}
+
+ updateRenderStatus(hctx, nil)
+
+ rootKf, err := kptfileutil.ReadKptfile(mockFS, rootPath)
+ assert.NoError(t, err)
+ assert.NotNil(t, rootKf.Status)
+ assert.Len(t, rootKf.Status.Conditions, 1)
+ assert.Equal(t, kptfilev1.ConditionTypeRendered, rootKf.Status.Conditions[0].Type)
+ assert.Equal(t, kptfilev1.ConditionTrue, rootKf.Status.Conditions[0].Status)
+ assert.Equal(t, kptfilev1.ReasonRenderSuccess, rootKf.Status.Conditions[0].Reason)
+}
+
+func TestUpdateRenderStatus_Failure(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,
+ }
+ hctx.pkgs[rootPkg.UniquePath] = &pkgNode{pkg: rootPkg}
+
+ updateRenderStatus(hctx, fmt.Errorf("set-annotations failed: some error"))
+
+ rootKf, err := kptfileutil.ReadKptfile(mockFS, rootPath)
+ assert.NoError(t, err)
+ assert.NotNil(t, rootKf.Status)
+ assert.Len(t, rootKf.Status.Conditions, 1)
+ assert.Equal(t, kptfilev1.ConditionFalse, rootKf.Status.Conditions[0].Status)
+ assert.Equal(t, kptfilev1.ReasonRenderFailed, rootKf.Status.Conditions[0].Reason)
+ assert.Contains(t, rootKf.Status.Conditions[0].Message, "set-annotations failed")
+}
+
+func TestUpdateRenderStatus_ReplacesExistingCondition(t *testing.T) {
+ mockFS := filesys.MakeFsInMemory()
+ rootPath := rootString
+ assert.NoError(t, mockFS.Mkdir(rootPath))
+
+ // Kptfile with an existing Rendered condition from a previous run
+ assert.NoError(t, mockFS.WriteFile(filepath.Join(rootPath, "Kptfile"), []byte(`
+apiVersion: kpt.dev/v1
+kind: Kptfile
+metadata:
+ name: root-package
+status:
+ conditions:
+ - type: Rendered
+ status: "False"
+ reason: RenderFailed
+ message: "old error"
+`)))
+
+ rootPkg, err := pkg.New(mockFS, rootPath)
+ assert.NoError(t, err)
+
+ hctx := &hydrationContext{
+ root: &pkgNode{pkg: rootPkg},
+ pkgs: map[types.UniquePath]*pkgNode{},
+ fileSystem: mockFS,
+ }
+ hctx.pkgs[rootPkg.UniquePath] = &pkgNode{pkg: rootPkg}
+
+ updateRenderStatus(hctx, nil)
+
+ rootKf, err := kptfileutil.ReadKptfile(mockFS, rootPath)
+ assert.NoError(t, err)
+ assert.NotNil(t, rootKf.Status)
+ assert.Len(t, rootKf.Status.Conditions, 1)
+ assert.Equal(t, kptfilev1.ConditionTrue, rootKf.Status.Conditions[0].Status)
+ assert.Equal(t, kptfilev1.ReasonRenderSuccess, rootKf.Status.Conditions[0].Reason)
+ assert.Empty(t, rootKf.Status.Conditions[0].Message)
+}
+
+func TestUpdateRenderStatus_OnlyUpdatesRootKptfile(t *testing.T) {
+ mockFS := filesys.MakeFsInMemory()
+ rootPath := rootString
+ assert.NoError(t, mockFS.Mkdir(rootPath))
+
+ subPkgPath := subPkgString
+ assert.NoError(t, mockFS.Mkdir(subPkgPath))
+
+ assert.NoError(t, mockFS.WriteFile(filepath.Join(rootPath, "Kptfile"), []byte(`
+apiVersion: kpt.dev/v1
+kind: Kptfile
+metadata:
+ name: root-package
+`)))
+ assert.NoError(t, mockFS.WriteFile(filepath.Join(subPkgPath, "Kptfile"), []byte(`
+apiVersion: kpt.dev/v1
+kind: Kptfile
+metadata:
+ name: sub-package
+`)))
+
+ rootPkg, err := pkg.New(mockFS, rootPath)
+ assert.NoError(t, err)
+ subPkg, err := pkg.New(mockFS, subPkgPath)
+ assert.NoError(t, err)
+
+ hctx := &hydrationContext{
+ root: &pkgNode{pkg: rootPkg},
+ pkgs: map[types.UniquePath]*pkgNode{},
+ fileSystem: mockFS,
+ }
+ hctx.pkgs[rootPkg.UniquePath] = &pkgNode{pkg: rootPkg}
+ hctx.pkgs[subPkg.UniquePath] = &pkgNode{pkg: subPkg}
+
+ updateRenderStatus(hctx, nil)
+
+ // Root should have the condition
+ rootKf, err := kptfileutil.ReadKptfile(mockFS, rootPath)
+ assert.NoError(t, err)
+ assert.NotNil(t, rootKf.Status)
+ assert.Len(t, rootKf.Status.Conditions, 1)
+ assert.Equal(t, kptfilev1.ConditionTrue, rootKf.Status.Conditions[0].Status)
+
+ // Subpackage should NOT have any condition
+ subKf, err := kptfileutil.ReadKptfile(mockFS, subPkgPath)
+ assert.NoError(t, err)
+ assert.True(t, subKf.Status == nil || len(subKf.Status.Conditions) == 0)
+}
+
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 1baab8c203..7d160ed61e 100644
--- a/pkg/api/kptfile/v1/types.go
+++ b/pkg/api/kptfile/v1/types.go
@@ -431,6 +431,23 @@ const (
ConditionUnknown ConditionStatus = "Unknown"
)
+// Rendered condition type and reasons
+const (
+ ConditionTypeRendered = "Rendered"
+ ReasonRenderSuccess = "RenderSuccess"
+ ReasonRenderFailed = "RenderFailed"
+)
+
+// NewRenderedCondition creates a Rendered status condition.
+func NewRenderedCondition(status ConditionStatus, reason, message string) Condition {
+ return Condition{
+ Type: ConditionTypeRendered,
+ Status: status,
+ Reason: reason,
+ Message: message,
+ }
+}
+
// BFSRenderAnnotation is an annotation that can be used to indicate that a package
// should be hydrated from the root package to the subpackages in a Breadth-First Level Order manner.
// SaveOnRenderFailureAnnotation is an annotation that controls whether partially rendered
diff --git a/pkg/kptfile/kptfileutil/util.go b/pkg/kptfile/kptfileutil/util.go
index 01018a3ff4..2070142470 100644
--- a/pkg/kptfile/kptfileutil/util.go
+++ b/pkg/kptfile/kptfileutil/util.go
@@ -78,7 +78,7 @@ func (e *UnknownKptfileResourceError) Error() string {
func WriteFile(dir string, k any) error {
const op errors.Op = "kptfileutil.WriteFile"
- b, err := yaml.MarshalWithOptions(k, &yaml.EncoderOptions{SeqIndent: yaml.WideSequenceStyle})
+ b, err := marshalKptfile(k)
if err != nil {
return err
}
@@ -94,6 +94,25 @@ func WriteFile(dir string, k any) error {
return nil
}
+// WriteKptfileToFS writes a Kptfile to the given filesystem at the specified directory.
+func WriteKptfileToFS(fs filesys.FileSystem, dir string, k any) error {
+ const op errors.Op = "kptfileutil.WriteKptfileToFS"
+ b, err := marshalKptfile(k)
+ if err != nil {
+ return err
+ }
+ err = fs.WriteFile(filepath.Join(dir, kptfilev1.KptFileName), b)
+ if err != nil {
+ return errors.E(op, errors.IO, types.UniquePath(dir), err)
+ }
+ return nil
+}
+
+// marshalKptfile marshals a Kptfile struct to YAML bytes.
+func marshalKptfile(k any) ([]byte, error) {
+ return yaml.MarshalWithOptions(k, &yaml.EncoderOptions{SeqIndent: yaml.WideSequenceStyle})
+}
+
// ValidateInventory returns true and a nil error if the passed inventory
// is valid; otherwiste, false and the reason the inventory is not valid
// is returned. A valid inventory must have a non-empty namespace, name,