From e892b37565cdcf1a14260c9c5840ee7d8c64306b Mon Sep 17 00:00:00 2001 From: astro-stan <36302090+astro-stan@users.noreply.github.com> Date: Fri, 17 Oct 2025 23:05:25 +0100 Subject: [PATCH] feat(common): Add support for setting extra env to CNPG pods (#40673) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit **Description** This PR adds the ability to set extra environment variables to CNPG pods. I need this, as I need to set the `HTTP_PROXY`, `HTTPS_PROXY` and `NO_PROXY` envs to the CNPG pods, so that backup/restore goes through my Gluetun proxy. This PR only adds support for CNPG, as with Volsync, this can be done by setting environment variables on the Volsync controller itself (see [release notes](https://github.com/backube/volsync/blob/main/CHANGELOG.md#061) for more info). This PR, along with the other PRs I opened recently (#40000 , #40385, #40523 , #40668) should be the last piece of the puzzle needed for enabling backup/restore of clusters using a remote self-hosted S3 server. ⚒️ Fixes # **⚙️ Type of change** - [X] ⚙️ Feature/App addition - [ ] 🪛 Bugfix - [ ] ⚠️ Breaking change (fix or feature that would cause existing functionality to not work as expected) - [ ] 🔃 Refactor of current code - [ ] 📜 Documentation Changes **🧪 How Has This Been Tested?** What I have tested: - Rendered a chart with various combinations of CNPG envs set and looked ad produced output - Tested along with the other PRs (#40523, #40668) to verify backup up to my S3 server works though the Gluetun proxy **📃 Notes:** Note that these changes should not affect any work related towards the migration to the CNPG's new plugin-based barman. As per the [migration guide](https://cloudnative-pg.io/plugin-barman-cloud/docs/migration/), the required changes are primarily to export the keys under the `barmanObjectStore` to a new CRD called `ObjectStore`. The `env` and `envFrom` keys added in this PR are outside this dictionary; thus, they should not require any changes when adding support for the new plugin-based barman. --- - [CNPG CRD for env and envFrom](https://github.com/cloudnative-pg/cloudnative-pg/blob/main/config/crd/bases/postgresql.cnpg.io_clusters.yaml#L2161-L2368) **✔️ Checklist:** - [X] ⚖️ My code follows the style guidelines of this project - [X] 👀 I have performed a self-review of my own code - [X] #️⃣ I have commented my code, particularly in hard-to-understand areas - [ ] 📄 I have made changes to the documentation - [X] 🧪 I have added tests to this description that prove my fix is effective or that my feature works - [X] ⬆️ I increased versions for any altered app according to semantic versioning - [X] I made sure the title starts with `feat(chart-name):`, `fix(chart-name):`, `chore(chart-name):`, `docs(chart-name):` or `fix(docs):` **➕ App addition** If this PR is an app addition please make sure you have done the following. - [ ] 🖼️ I have added an icon in the Chart's root directory called `icon.png` --- _Please don't blindly check all the boxes. Read them and only check those that apply. Those checkboxes are there for the reviewer to see what is this all about and the status of this PR with a quick glance._ --------- Signed-off-by: Kjeld Schouten Co-authored-by: Kjeld Schouten Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../tests/cnpg/cluster_spec_test.yaml | 115 +++++ .../tests/container/envFixed_test .yaml | 4 +- .../tests/container/envFrom_test.yaml | 12 +- .../tests/container/envList_test.yaml | 2 +- .../tests/container/env_dupe_test.yaml | 18 +- .../common-test/tests/container/env_test.yaml | 22 +- charts/library/common/docs/cnpg/cluster.md | 296 +++++++++++ charts/library/common/docs/cnpg/cnpg.md | 463 ++++++++++++++++++ .../common/templates/class/cnpg/_cluster.tpl | 14 + .../templates/helpers/_envDupeCheck.tpl | 3 +- .../common/templates/lib/container/_env.tpl | 39 +- .../templates/lib/container/_envFrom.tpl | 15 +- .../templates/lib/container/_envList.tpl | 7 +- .../templates/lib/container/_fixedEnv.tpl | 9 +- .../common/templates/lib/pod/_container.tpl | 16 +- charts/library/common/values.yaml | 3 + 16 files changed, 975 insertions(+), 63 deletions(-) create mode 100644 charts/library/common/docs/cnpg/cluster.md create mode 100644 charts/library/common/docs/cnpg/cnpg.md diff --git a/charts/library/common-test/tests/cnpg/cluster_spec_test.yaml b/charts/library/common-test/tests/cnpg/cluster_spec_test.yaml index 60d05496c41..ccdf08f233e 100644 --- a/charts/library/common-test/tests/cnpg/cluster_spec_test.yaml +++ b/charts/library/common-test/tests/cnpg/cluster_spec_test.yaml @@ -701,3 +701,118 @@ tests: key: custom-queries - name: test-query3 key: test-key + + - it: should create the correct env with env key + set: + configmap: + configmap-name: + enabled: true + data: + key1: value1 + key2: value2 + secret: + secret-name: + enabled: true + data: + key1: value1 + key2: value2 + postgres16Image: + repository: ghcr.io/cloudnative-pg/postgresql + tag: "16.3" + pullPolicy: IfNotPresent + cnpg: + my-pg: + enabled: true + user: test-user + database: test-db + password: test-password + cluster: + env: + VAR1: some-value + VAR2: + configMapKeyRef: + name: configmap-name + key: key1 + VAR3: + secretKeyRef: + name: secret-name + key: key2 + asserts: + - documentIndex: *clusterDoc + isKind: + of: Cluster + - documentIndex: *clusterDoc + isAPIVersion: + of: postgresql.cnpg.io/v1 + - documentIndex: *clusterDoc + equal: + path: metadata.name + value: test-release-name-common-test-cnpg-my-pg + - documentIndex: *clusterDoc + isSubset: + path: spec + content: + env: + - name: VAR1 + value: some-value + - name: VAR2 + valueFrom: + configMapKeyRef: + key: key1 + name: test-release-name-common-test-configmap-name + - name: VAR3 + valueFrom: + secretKeyRef: + key: key2 + name: test-release-name-common-test-secret-name + + - it: should create the correct env with envFrom key + set: + configmap: + configmap-name: + enabled: true + data: + key1: value1 + key2: value2 + secret: + secret-name: + enabled: true + data: + key3: value3 + key4: value4 + postgres16Image: + repository: ghcr.io/cloudnative-pg/postgresql + tag: "16.3" + pullPolicy: IfNotPresent + cnpg: + my-pg: + enabled: true + user: test-user + database: test-db + password: test-password + cluster: + envFrom: + - configMapRef: + name: configmap-name + - secretRef: + name: secret-name + asserts: + - documentIndex: *clusterDoc + isKind: + of: Cluster + - documentIndex: *clusterDoc + isAPIVersion: + of: postgresql.cnpg.io/v1 + - documentIndex: *clusterDoc + equal: + path: metadata.name + value: test-release-name-common-test-cnpg-my-pg + - documentIndex: *clusterDoc + isSubset: + path: spec + content: + envFrom: + - configMapRef: + name: test-release-name-common-test-configmap-name + - secretRef: + name: test-release-name-common-test-secret-name diff --git a/charts/library/common-test/tests/container/envFixed_test .yaml b/charts/library/common-test/tests/container/envFixed_test .yaml index 8f2cf55cb29..943db4e07cf 100644 --- a/charts/library/common-test/tests/container/envFixed_test .yaml +++ b/charts/library/common-test/tests/container/envFixed_test .yaml @@ -554,7 +554,7 @@ tests: - compute asserts: - failedTemplate: - errorMessage: Container - Expected [fixedEnv.NVIDIA_CAPS] entry to be one of [all, compute, utility, graphics, video], but got [invalid] + errorMessage: Container - Expected [containers.container-name1.fixedEnv.NVIDIA_CAPS] entry to be one of [all, compute, utility, graphics, video], but got [invalid] - it: it should fail with NVIDIA_CAPS not having unique values set: @@ -577,4 +577,4 @@ tests: - compute asserts: - failedTemplate: - errorMessage: Container - Expected [fixedEnv.NVIDIA_CAPS] to have only unique values, but got [compute, compute] + errorMessage: Container - Expected [containers.container-name1.fixedEnv.NVIDIA_CAPS] to have only unique values, but got [compute, compute] diff --git a/charts/library/common-test/tests/container/envFrom_test.yaml b/charts/library/common-test/tests/container/envFrom_test.yaml index eeb6f4bd4f9..b173e457279 100644 --- a/charts/library/common-test/tests/container/envFrom_test.yaml +++ b/charts/library/common-test/tests/container/envFrom_test.yaml @@ -134,7 +134,7 @@ tests: name: invalid-name asserts: - failedTemplate: - errorMessage: Container - Expected [envFrom] entry to have one of [configMapRef, secretRef] + errorMessage: Container - Expected [envFrom] entry in [containers.container-name1] to have one of [configMapRef, secretRef] - it: it should fail with both refs in the same entry set: @@ -158,7 +158,7 @@ tests: name: secret-name asserts: - failedTemplate: - errorMessage: Container - Expected [envFrom] entry to have only one of [configMapRef, secretRef], but got both + errorMessage: Container - Expected [envFrom] entry in [containers.container-name1] to have only one of [configMapRef, secretRef], but got both - it: it should fail with empty name in configMapRef set: @@ -180,7 +180,7 @@ tests: name: "" asserts: - failedTemplate: - errorMessage: Container - Expected non-empty [envFrom.configMapRef.name] + errorMessage: Container - Expected non-empty [containers.container-name1.envFrom.configMapRef.name] - it: it should fail with empty name in secretRef set: @@ -202,7 +202,7 @@ tests: name: "" asserts: - failedTemplate: - errorMessage: Container - Expected non-empty [envFrom.secretRef.name] + errorMessage: Container - Expected non-empty [containers.container-name1.envFrom.secretRef.name] - it: it should fail without defined configmap set: @@ -230,7 +230,7 @@ tests: name: configmap-other-name asserts: - failedTemplate: - errorMessage: Container - Expected ConfigMap [configmap-other-name] defined in [envFrom] to exist + errorMessage: Container - Expected ConfigMap [configmap-other-name] defined in [containers.container-name1.envFrom] to exist - it: it should fail without defined secret set: @@ -258,7 +258,7 @@ tests: name: secret-other-name asserts: - failedTemplate: - errorMessage: Container - Expected Secret [secret-other-name] defined in [envFrom] to exist + errorMessage: Container - Expected Secret [secret-other-name] defined in [containers.container-name1.envFrom] to exist - it: it should fail empty expandObjectName set: diff --git a/charts/library/common-test/tests/container/envList_test.yaml b/charts/library/common-test/tests/container/envList_test.yaml index 4ff971856af..b8453499a6b 100644 --- a/charts/library/common-test/tests/container/envList_test.yaml +++ b/charts/library/common-test/tests/container/envList_test.yaml @@ -117,4 +117,4 @@ tests: value: some_value asserts: - failedTemplate: - errorMessage: Container - Expected non-empty [envList.name] + errorMessage: Container - Expected non-empty [containers.container-name1.envList.name] diff --git a/charts/library/common-test/tests/container/env_dupe_test.yaml b/charts/library/common-test/tests/container/env_dupe_test.yaml index 5e88433bffb..0c974e7a9bb 100644 --- a/charts/library/common-test/tests/container/env_dupe_test.yaml +++ b/charts/library/common-test/tests/container/env_dupe_test.yaml @@ -37,7 +37,7 @@ tests: value: 123 asserts: - failedTemplate: - errorMessage: Container - Environment Variable [VAR1] in [envList] tried to override the Environment Variable that is already defined in [env] + errorMessage: Container - Environment Variable [VAR1] in [containers.container-name1.envList] tried to override the Environment Variable that is already defined in [containers.container-name1.env] - it: should fail with dupe env in env and envFrom configmap set: @@ -66,7 +66,7 @@ tests: name: configmap-name asserts: - failedTemplate: - errorMessage: Container - Environment Variable [VAR1] in [env] tried to override the Environment Variable that is already defined in [ConfigMap - configmap-name] + errorMessage: Container - Environment Variable [VAR1] in [containers.container-name1.env] tried to override the Environment Variable that is already defined in [ConfigMap - configmap-name] - it: should fail with dupe env in env and envFrom secret set: @@ -95,7 +95,7 @@ tests: name: secret-name asserts: - failedTemplate: - errorMessage: Container - Environment Variable [VAR1] in [env] tried to override the Environment Variable that is already defined in [Secret - secret-name] + errorMessage: Container - Environment Variable [VAR1] in [containers.container-name1.env] tried to override the Environment Variable that is already defined in [Secret - secret-name] - it: should fail with dupe env in envList and envFrom secret set: @@ -125,7 +125,7 @@ tests: name: secret-name asserts: - failedTemplate: - errorMessage: Container - Environment Variable [VAR1] in [envList] tried to override the Environment Variable that is already defined in [Secret - secret-name] + errorMessage: Container - Environment Variable [VAR1] in [containers.container-name1.envList] tried to override the Environment Variable that is already defined in [Secret - secret-name] - it: should fail with dupe env in envList and envFrom configmap set: @@ -155,7 +155,7 @@ tests: name: configmap-name asserts: - failedTemplate: - errorMessage: Container - Environment Variable [VAR1] in [envList] tried to override the Environment Variable that is already defined in [ConfigMap - configmap-name] + errorMessage: Container - Environment Variable [VAR1] in [containers.container-name1.envList] tried to override the Environment Variable that is already defined in [ConfigMap - configmap-name] - it: should fail with dupe env in fixedEnv and env set: @@ -176,7 +176,7 @@ tests: TZ: some_value asserts: - failedTemplate: - errorMessage: Container - Environment Variable [TZ] in [env] tried to override the Environment Variable that is already defined in [fixedEnv] + errorMessage: Container - Environment Variable [TZ] in [containers.container-name1.env] tried to override the Environment Variable that is already defined in [containers.container-name1.fixedEnv] - it: should fail with dupe env in fixedEnv and envList set: @@ -198,7 +198,7 @@ tests: value: some_value asserts: - failedTemplate: - errorMessage: Container - Environment Variable [TZ] in [envList] tried to override the Environment Variable that is already defined in [fixedEnv] + errorMessage: Container - Environment Variable [TZ] in [containers.container-name1.envList] tried to override the Environment Variable that is already defined in [containers.container-name1.fixedEnv] - it: should fail with dupe env in fixedEnv and envFrom configmap set: @@ -225,7 +225,7 @@ tests: name: configmap-name asserts: - failedTemplate: - errorMessage: Container - Environment Variable [TZ] in [fixedEnv] tried to override the Environment Variable that is already defined in [ConfigMap - configmap-name] + errorMessage: Container - Environment Variable [TZ] in [containers.container-name1.fixedEnv] tried to override the Environment Variable that is already defined in [ConfigMap - configmap-name] - it: should fail with dupe env in fixedEnv and envFrom secret set: @@ -252,4 +252,4 @@ tests: name: secret-name asserts: - failedTemplate: - errorMessage: Container - Environment Variable [TZ] in [fixedEnv] tried to override the Environment Variable that is already defined in [Secret - secret-name] + errorMessage: Container - Environment Variable [TZ] in [containers.container-name1.fixedEnv] tried to override the Environment Variable that is already defined in [Secret - secret-name] diff --git a/charts/library/common-test/tests/container/env_test.yaml b/charts/library/common-test/tests/container/env_test.yaml index 477605d9dce..dce345c426d 100644 --- a/charts/library/common-test/tests/container/env_test.yaml +++ b/charts/library/common-test/tests/container/env_test.yaml @@ -194,7 +194,7 @@ tests: invalidKeyRef: {} asserts: - failedTemplate: - errorMessage: Container - Expected [env] with a ref to have one of [configMapKeyRef, secretKeyRef, fieldRef], but got [invalidKeyRef] + errorMessage: Container - Expected [env] in [containers.container-name1] with a ref to have one of [configMapKeyRef, secretKeyRef, fieldRef], but got [invalidKeyRef] - it: it should fail with more than one ref set: @@ -217,7 +217,7 @@ tests: secretKeyRef: {} asserts: - failedTemplate: - errorMessage: Container - Expected [env] with a ref to have one of [configMapKeyRef, secretKeyRef, fieldRef], but got [configMapKeyRef, secretKeyRef] + errorMessage: Container - Expected [env] in [containers.container-name1] with a ref to have one of [configMapKeyRef, secretKeyRef, fieldRef], but got [configMapKeyRef, secretKeyRef] - it: it should fail with empty name in configMapKeyRef set: @@ -241,7 +241,7 @@ tests: key: key asserts: - failedTemplate: - errorMessage: Container - Expected non-empty [env.configMapKeyRef.name] + errorMessage: Container - Expected non-empty [containers.container-name1.env.configMapKeyRef.name] - it: it should fail with empty key in configMapKeyRef set: @@ -265,7 +265,7 @@ tests: key: "" asserts: - failedTemplate: - errorMessage: Container - Expected non-empty [env.configMapKeyRef.key] + errorMessage: Container - Expected non-empty [containers.container-name1.env.configMapKeyRef.key] - it: it should fail with empty name in secretKeyRef set: @@ -289,7 +289,7 @@ tests: key: key asserts: - failedTemplate: - errorMessage: Container - Expected non-empty [env.secretKeyRef.name] + errorMessage: Container - Expected non-empty [containers.container-name1.env.secretKeyRef.name] - it: it should fail with empty key in secretKeyRef set: @@ -313,7 +313,7 @@ tests: key: "" asserts: - failedTemplate: - errorMessage: Container - Expected non-empty [env.secretKeyRef.key] + errorMessage: Container - Expected non-empty [containers.container-name1.env.secretKeyRef.key] - it: it should fail with referenced secret not defined set: @@ -337,7 +337,7 @@ tests: key: somekey asserts: - failedTemplate: - errorMessage: Container - Expected in [env] the referenced Secret [secret-name] to be defined + errorMessage: Container - Expected in [containers.container-name1.env] the referenced Secret [secret-name] to be defined - it: it should fail with referenced configmap not defined set: @@ -361,7 +361,7 @@ tests: key: somekey asserts: - failedTemplate: - errorMessage: Container - Expected in [env] the referenced Configmap [configmap-name] to be defined + errorMessage: Container - Expected in [containers.container-name1.env] the referenced Configmap [configmap-name] to be defined - it: it should fail with referenced key in configmap not defined set: @@ -391,7 +391,7 @@ tests: key: somekey asserts: - failedTemplate: - errorMessage: Container - Expected in [env] the referenced key [somekey] in Configmap [configmap-name] to be defined + errorMessage: Container - Expected in [containers.container-name1.env] the referenced key [somekey] in Configmap [configmap-name] to be defined - it: it should fail with referenced key in secret not defined set: @@ -421,7 +421,7 @@ tests: key: somekey asserts: - failedTemplate: - errorMessage: Container - Expected in [env] the referenced key [somekey] in Secret [secret-name] to be defined + errorMessage: Container - Expected in [containers.container-name1.env] the referenced key [somekey] in Secret [secret-name] to be defined - it: it should fail with empty fieldPath in fieldRef set: @@ -444,7 +444,7 @@ tests: fieldPath: "" asserts: - failedTemplate: - errorMessage: Container - Expected non-empty [env.fieldRef.fieldPath] + errorMessage: Container - Expected non-empty [containers.container-name1.env.fieldRef.fieldPath] - it: it should fail empty expandObjectName set: diff --git a/charts/library/common/docs/cnpg/cluster.md b/charts/library/common/docs/cnpg/cluster.md new file mode 100644 index 00000000000..8ef02130e57 --- /dev/null +++ b/charts/library/common/docs/cnpg/cluster.md @@ -0,0 +1,296 @@ +--- +title: CNPG Cluster +--- + +:::note + +- Examples under each key are only to be used as a placement guide +- See the [Full Examples](/truecharts-common/cnpg/cluster#full-examples) section for complete examples. +- This page is targeted primarily at chart developers. If you are looking for + how to configure a CNPG backup/restore, visit the + [dedicated guide page](/truecharts/guides/backup%20%26%20restore/cnpg-backup-restore) + +::: + +## Appears in + +- `.Values.cnpg.$name.cluster` + +:::tip + +- Replace references to `$name` with the actual name you want to use. + +::: + +--- + +## `labels` + +Additional labels for CNPG cluster + +| | | +| ---------- | --------------------------- | +| Key | `cnpg.$name.cluster.labels` | +| Type | `map` | +| Required | ❌ | +| Helm `tpl` | ✅ (On value only) | +| Default | `{}` | + +Example + +```yaml +cnpg: + cnpg-name: + cluster: + labels: + key: value +``` + +--- + +## `annotations` + +Additional annotations for CNPG cluster + +| | | +| ---------- | -------------------------------- | +| Key | `cnpg.$name.cluster.annotations` | +| Type | `map` | +| Required | ❌ | +| Helm `tpl` | ✅ (On value only) | +| Default | `{}` | + +Example + +```yaml +cnpg: + cnpg-name: + cluster: + annotations: + key: value +``` + +--- + +## `env` + +Define additional environment variables for the cluster's pods + +:::tip + +See container env options in the [container env](/truecharts-common/container/env) section. + +::: + +| | | +| ---------- | ------------------------ | +| Key | `cnpg.$name.cluster.env` | +| Type | `map` | +| Required | ❌ | +| Helm `tpl` | ❌ | +| Default | `{}` | + +Example + +```yaml +cnpg: + cnpg-name: + cluster: + env: + key: value +``` + +--- + +## `envFrom` + +Define additional environment variables for the cluster's pods + +:::tip + +See container envFrom options in the [container envFrom](/truecharts-common/container/envFrom) section. + +::: + +| | | +| ---------- | ------------------------ | +| Key | `cnpg.$name.cluster.envFrom` | +| Type | `map` | +| Required | ❌ | +| Helm `tpl` | ❌ | +| Default | `[]` | + +Example + +```yaml +cnpg: + cnpg-name: + cluster: + envFrom: + - secretRef: + name: secret-name + expandObjectName: false + - configMapRef: + name: configmap-name + expandObjectName: true +``` + +--- + +## `instances` + +Number of instances + +| | | +| ---------- | ------------------------------ | +| Key | `cnpg.$name.cluster.instances` | +| Type | `int` | +| Required | ❌ | +| Helm `tpl` | ❌ | +| Default | `2` | + +Example + +```yaml +cnpg: + cnpg-name: + cluster: + instances: 2 +``` + +--- + +## `singleNode` + +Whether this is a single-node cluster. + +Setting this to `true` would allow PVCs to be kept on instance restart. + +:::note + +If you are a chart developer, changing the default value is not recommended, +as users are expected to change this themselves **if** they are running your +chart on a single-node cluster. + +::: + +| | | +| ---------- | ------------------------------- | +| Key | `cnpg.$name.cluster.singleNode` | +| Type | `bool` | +| Required | ❌ | +| Helm `tpl` | ❌ | +| Default | `false` | + +Example + +```yaml +cnpg: + cnpg-name: + cluster: + singleNode: true +``` + +--- + +## `logLevel` + +The cluster log level. Available values: + +- `error` +- `warning` +- `info` +- `debug` +- `trace` + +:::note + +If you are a chart developer, changing the default value is not recommended, +as users are expected to change this themselves if they are running into +issues with CNPG. + +::: + +| | | +| ---------- | ----------------------------- | +| Key | `cnpg.$name.cluster.logLevel` | +| Type | `enum` | +| Required | ❌ | +| Helm `tpl` | ❌ | +| Default | `info` | + +Example + +```yaml +cnpg: + cnpg-name: + cluster: + logLevel: info +``` + +--- + +## `primaryUpdateMethod` + +TODO + +--- + +## `primaryUpdateStrategy` + +TODO + +--- + +## `certificates` + +TODO + +--- + +## `postgresql` + +TODO + +--- + +## `initdb` + +TODO + +--- + +## Full Examples + +```yaml +cnpg: + $name: + cluster: + labels: + label1: label1 + label2: label2 + annotations: + annotation1: annotation1 + annotation2: annotation2 + env: + key: value + envList: + - name: key + value: value + envFrom: + - secretRef: + name: my-secret + expandObjectName: true + - configMapRef: + name: my-configmap + expandObjectName: false + instances: 2 + singleNode: false + logLevel: info + primaryUpdateMethod: # TODO + primaryUpdateStrategy: # TODO + certificates: # TODO + postgresql: # TODO + initdb: # TODO + primaryUpdateStrategy: # TODO +``` diff --git a/charts/library/common/docs/cnpg/cnpg.md b/charts/library/common/docs/cnpg/cnpg.md new file mode 100644 index 00000000000..fc0167f50bc --- /dev/null +++ b/charts/library/common/docs/cnpg/cnpg.md @@ -0,0 +1,463 @@ +--- +title: CNPG +--- + +:::note + +- Examples under each key are only to be used as a placement guide +- See the [Full Examples](/truecharts-common/cnpg/cnpg#full-examples) section for complete examples. +- This page is targeted primarily at chart developers. If you are looking for + how to configure a CNPG backup/restore, visit the + [dedicated guide page](/truecharts/guides/backup%20%26%20restore/cnpg-backup-restore) + +::: + +## Appears in + +- `.Values.cnpg` + +## Naming scheme + +- Primary: `$FullName-cnpg-$ResourceName` (release-name-chart-name-cnpg-main) +- Non-Primary: `$FullName-$RBACName-cnpg-$ResourceName` (release-name-chart-name-RBACName-cnpg-main) + +:::tip + +- Replace references to `$name` with the actual name you want to use. + +::: + +--- + +## `cnpg` + +Define a CNPG cluster + +| | | +| ---------- | --------------------------------------- | +| Key | `cnpg` | +| Type | `map` | +| Required | ❌ | +| Helm `tpl` | ❌ | +| Default | `{cnpg: {main: {enabled: false, ...}}}` | + +Example + +```yaml +cnpg: + main: + enabled: true + ... +``` + +--- + +### `$name` + +Define the cluster name. + +:::tip + +There is predefined cluster called `main`, which is configured with sensible +defaults (see common chart's `values.yaml`). It is **disabled** by default and +must be [enabled](/truecharts-common/cnpg/cnpg#enabled) if needed. + +::: + +| | | +| ---------- | ------------------------------- | +| Key | `cnpg.$name` | +| Type | `map` | +| Required | ✅ | +| Helm `tpl` | ❌ | +| Default | `{}` | + +Example + +```yaml +cnpg: + cnpg-name: {} +``` + +--- + +#### `enabled` + +Enables or Disables the cluster + +| | | +| ---------- | --------------------------- | +| Key | `cnpg.$name.enabled` | +| Type | `bool` | +| Required | ✅ | +| Helm `tpl` | ✅ | +| Default | `false` | + +Example + +```yaml +cnpg: + cnpg-name: + enabled: true +``` + +--- + +#### `primary` + +Sets the cluster as primary + +| | | +| ---------- | -------------------- | +| Key | `cnpg.$name.primary` | +| Type | `bool` | +| Required | ❌ | +| Helm `tpl` | ❌ | +| Default | `false` | + +Example + +```yaml +cnpg: + cnpg-name: + primary: true +``` + +--- + +#### `hibernate` + +Puts the cluster in hibernation mode + +| | | +| ---------- | ---------------------- | +| Key | `cnpg.$name.hibernate` | +| Type | `bool` | +| Required | ❌ | +| Helm `tpl` | ❌ | +| Default | `false` | + +Example + +```yaml +cnpg: + cnpg-name: + hibernate: true +``` + +--- + +#### `labels` + +Additional labels for all CNPG objects + +| | | +| ---------- | -------------------- | +| Key | `cnpg.$name.labels` | +| Type | `map` | +| Required | ❌ | +| Helm `tpl` | ✅ (On value only) | +| Default | `{}` | + +Example + +```yaml +cnpg: + cnpg-name: + labels: + key: value +``` + +--- + +#### `annotations` + +Additional annotations for all CNPG objects + +| | | +| ---------- | ------------------------ | +| Key | `cnpg.$name.annotations` | +| Type | `map` | +| Required | ❌ | +| Helm `tpl` | ✅ (On value only) | +| Default | `{}` | + +Example + +```yaml +cnpg: + cnpg-name: + annotations: + key: value +``` + +--- + +#### `type` + +Type of the CNPG database. Available types: + +- `postgres` +- `postgis` +- `timescaledb` +- `vectors` + +| | | +| ---------- | ----------------- | +| Key | `cnpg.$name.type` | +| Type | `enum` | +| Required | ❌ | +| Helm `tpl` | ❌ | +| Default | `postgres` | + +Example + +```yaml +cnpg: + cnpg-name: + type: postgres +``` + +--- + +#### `pgVersion` + +Version of Postgresql to use. Available types: + +- `15` +- `16` + +:::note + +Changing this value affects the cluster naming scheme + +::: + +| | | +| ---------- | ---------------------- | +| Key | `cnpg.$name.pgVersion` | +| Type | `enum` | +| Required | ✅ | +| Helm `tpl` | ❌ | +| Default | `nil` | + +Example + +```yaml +cnpg: + cnpg-name: + pgVersion: 16 +``` + +--- + +#### `mode` + +Cluster mode of operation. Available modes: + +- `standalone` (default mode, creates new or updates an existing CNPG cluster) +- `recovery` (same as standalone but creates a cluster from a backup, object store or via pg_basebackup) + +:::note + +If you are a chart developer, changing the default value is not recommended, +as users are expected to change this themselves **if** they want to configure +a CNPG restore. + +::: + +| | | +| ---------- | ------------------ | +| Key | `cnpg.$name.mode` | +| Type | `enum` | +| Required | ❌ | +| Helm `tpl` | ❌ | +| Default | `standalone` | + +Example + +```yaml +cnpg: + cnpg-name: + mode: standalone +``` + +--- + +#### `database` + +Define the database name + +| | | +| ---------- | ------------------------- | +| Key | `cnpg.$name.database` | +| Type | `string` | +| Required | ✅ | +| Helm `tpl` | ❌ | +| Default | `""` | + +Example + +```yaml +cnpg: + cnpg-name: + database: app +``` + +--- + +#### `user` + +Define the database user + +| | | +| ---------- | ------------------------- | +| Key | `cnpg.$name.user` | +| Type | `string` | +| Required | ✅ | +| Helm `tpl` | ❌ | +| Default | `""` | + +Example + +```yaml +cnpg: + cnpg-name: + user: app +``` + +--- + +#### `password` + +Define the database password + +:::tip + +Chart users are strongly encouraged to override this setting with their own +secure password **during initial install** + +::: + +| | | +| ---------- | ------------------------- | +| Key | `cnpg.$name.password` | +| Type | `string` | +| Required | ✅ | +| Helm `tpl` | ❌ | +| Default | `""` | + +Example + +```yaml +cnpg: + cnpg-name: + password: supersecret +``` + +--- + +#### `cluster` + +Database cluster configuration + +See more details in [CNPG Cluster](/truecharts-common/cnpg/cluster) + +| | | +| ---------- | ------------------------ | +| Key | `cnpg.$name.cluster` | +| Type | `string` | +| Required | ✅ | +| Helm `tpl` | ❌ | +| Default | `{}` | + +Example + +```yaml +cnpg: + cnpg-name: + cluster: {} +``` + +--- + +--- + +#### `monitoring` + +TODO + +--- + +#### `recovery` + +:::note + +See the dedicated [CNPG backup/restore guide](/truecharts/guides/backup%20%26%20restore/cnpg-backup-restore) + +::: + +TODO + +--- + +#### `backups` + +:::note + +See the dedicated [CNPG backup/restore guide](/truecharts/guides/backup%20%26%20restore/cnpg-backup-restore) + +::: + +TODO + +--- + +#### `pooler` + +TODO + +--- + +## Full Examples + +```yaml +cnpg: + main: + enabled: true + primary: true + hibernate: false + type: postgres + pgVersion: 16 + mode: standalone + database: "app" + user: "app" + password: "PLACEHOLDERPASSWORD" + cluster: {} + monitoring: {} + recovery: {} + backups: {} + pooler: {} + + my-cluster-1: + enabled: true + primary: false + hibernate: false + labels: + label1: label1 + label2: label2 + annotations: + annotation1: annotation1 + annotation2: annotation2 + type: postgres + pgVersion: 16 + mode: standalone + database: "my-app" + user: "my-user" + password: "supersecret" + cluster: {} + monitoring: {} + recovery: {} + backups: {} + pooler: {} +``` diff --git a/charts/library/common/templates/class/cnpg/_cluster.tpl b/charts/library/common/templates/class/cnpg/_cluster.tpl index e6ebfea5476..ff6a06b7a13 100644 --- a/charts/library/common/templates/class/cnpg/_cluster.tpl +++ b/charts/library/common/templates/class/cnpg/_cluster.tpl @@ -196,6 +196,20 @@ spec: primaryUpdateMethod: {{ $primaryUpdateMethod }} logLevel: {{ $logLevel }} instances: {{ $instances }} + {{- /* Create a dict for storing env's so it can be checked for dupes */ -}} + {{- $_ := set $objectData.cluster "envDupe" dict -}} + {{- with (include "tc.v1.common.lib.container.envFrom" (dict + "rootCtx" $rootCtx "objectData" $objectData.cluster "caller" "CNPG Cluster" + "name" $objectData.shortName "key" "cluster") | trim) }} + envFrom: + {{- . | nindent 4 }} + {{- end }} + {{- with (include "tc.v1.common.lib.container.env" (dict + "rootCtx" $rootCtx "objectData" $objectData.cluster "caller" "CNPG Cluster" + "name" $objectData.shortName "key" "cluster") | trim) }} + env: + {{- . | nindent 4 }} + {{- end }} {{- if or $objectData.cluster.postgresql $preloadLibraries }} postgresql: {{- with $objectData.cluster.postgresql }} diff --git a/charts/library/common/templates/helpers/_envDupeCheck.tpl b/charts/library/common/templates/helpers/_envDupeCheck.tpl index da27c96738c..4e691ba48cc 100644 --- a/charts/library/common/templates/helpers/_envDupeCheck.tpl +++ b/charts/library/common/templates/helpers/_envDupeCheck.tpl @@ -7,6 +7,7 @@ objectData: The object data to be used to render the container. {{- define "tc.v1.common.helper.container.envDupeCheck" -}} {{- $rootCtx := .rootCtx -}} {{- $objectData := .objectData -}} + {{- $caller := .caller -}} {{- $source := .source -}} {{- $type := .type -}} @@ -15,7 +16,7 @@ objectData: The object data to be used to render the container. {{- $dupeEnv := (get $objectData.envDupe $key) -}} {{- if $dupeEnv -}} - {{- fail (printf "Container - Environment Variable [%s] in [%s] tried to override the Environment Variable that is already defined in [%s]" $key $source $dupeEnv.source) -}} + {{- fail (printf "%s - Environment Variable [%s] in [%s] tried to override the Environment Variable that is already defined in [%s]" $caller $key $source $dupeEnv.source) -}} {{- end -}} {{- $_ := set $objectData.envDupe $key (dict "source" $source) -}} diff --git a/charts/library/common/templates/lib/container/_env.tpl b/charts/library/common/templates/lib/container/_env.tpl index 01233a5c0cb..fd3a24eb101 100644 --- a/charts/library/common/templates/lib/container/_env.tpl +++ b/charts/library/common/templates/lib/container/_env.tpl @@ -7,9 +7,12 @@ objectData: The object data to be used to render the container. {{- define "tc.v1.common.lib.container.env" -}} {{- $rootCtx := .rootCtx -}} {{- $objectData := .objectData -}} + {{- $key := .key -}} + {{- $name := (.name | toString) -}} + {{- $caller := .caller -}} {{- range $k, $v := $objectData.env -}} - {{- include "tc.v1.common.helper.container.envDupeCheck" (dict "rootCtx" $rootCtx "objectData" $objectData "source" "env" "key" $k) }} + {{- include "tc.v1.common.helper.container.envDupeCheck" (dict "rootCtx" $rootCtx "objectData" $objectData "source" (printf "%s.%s.env" $key $name) "key" $k "caller" $caller) }} - name: {{ $k | quote }} {{- if not (kindIs "map" $v) -}} {{- $value := "" -}} @@ -24,40 +27,40 @@ objectData: The object data to be used to render the container. valueFrom: {{- $refs := (list "configMapKeyRef" "secretKeyRef" "fieldRef") -}} {{- if or (ne (len ($v | keys)) 1) (not (mustHas ($v | keys | first) $refs)) -}} - {{- fail (printf "Container - Expected [env] with a ref to have one of [%s], but got [%s]" (join ", " $refs) (join ", " ($v | keys | sortAlpha))) -}} + {{- fail (printf "%s - Expected [env] in [%s.%s] with a ref to have one of [%s], but got [%s]" $caller $key $name (join ", " $refs) (join ", " ($v | keys | sortAlpha))) -}} {{- end -}} - {{- $name := "" -}} + {{- $refName := "" -}} - {{- range $key := (list "configMapKeyRef" "secretKeyRef") -}} - {{- if hasKey $v $key }} - {{ $key }}: - {{- $obj := get $v $key -}} + {{- range $ref := (list "configMapKeyRef" "secretKeyRef") -}} + {{- if hasKey $v $ref }} + {{ $ref }}: + {{- $obj := get $v $ref -}} {{- if not $obj.name -}} - {{- fail (printf "Container - Expected non-empty [env.%s.name]" $key) -}} + {{- fail (printf "%s - Expected non-empty [%s.%s.env.%s.name]" $caller $key $name $ref) -}} {{- end -}} {{- if not $obj.key -}} - {{- fail (printf "Container - Expected non-empty [env.%s.key]" $key) -}} + {{- fail (printf "%s - Expected non-empty [%s.%s.env.%s.key]" $caller $key $name $ref) -}} {{- end }} key: {{ $obj.key | quote }} - {{- $name = tpl $obj.name $rootCtx -}} + {{- $refName = tpl $obj.name $rootCtx -}} {{- $expandName := (include "tc.v1.common.lib.util.expandName" (dict "rootCtx" $rootCtx "objectData" $obj - "name" $k "caller" "Container" + "name" $k "caller" $caller "key" "env")) -}} {{- if eq $expandName "true" -}} - {{- $item := ($key | trimSuffix "KeyRef" | lower) -}} + {{- $item := ($ref | trimSuffix "KeyRef" | lower) -}} {{- $data := (get $rootCtx.Values $item) -}} - {{- $data = (get $data $name) -}} + {{- $data = (get $data $refName) -}} {{- if not $data -}} - {{- fail (printf "Container - Expected in [env] the referenced %s [%s] to be defined" ($item | camelcase | title) $name) -}} + {{- fail (printf "%s - Expected in [%s.%s.env] the referenced %s [%s] to be defined" $caller $key $name ($item | camelcase | title) $refName) -}} {{- end -}} {{- $found := false -}} @@ -68,19 +71,19 @@ objectData: The object data to be used to render the container. {{- end -}} {{- if not $found -}} - {{- fail (printf "Container - Expected in [env] the referenced key [%s] in %s [%s] to be defined" $obj.key ($item | camelcase | title) $name) -}} + {{- fail (printf "%s - Expected in [%s.%s.env] the referenced key [%s] in %s [%s] to be defined" $caller $key $name $obj.key ($item | camelcase | title) $refName) -}} {{- end -}} - {{- $name = (printf "%s-%s" (include "tc.v1.common.lib.chart.names.fullname" $rootCtx) $name) -}} + {{- $refName = (printf "%s-%s" (include "tc.v1.common.lib.chart.names.fullname" $rootCtx) $refName) -}} {{- end }} - name: {{ $name | quote }} + name: {{ $refName | quote }} {{- end -}} {{- end -}} {{- if hasKey $v "fieldRef" }} fieldRef: {{- if not $v.fieldRef.fieldPath -}} - {{- fail "Container - Expected non-empty [env.fieldRef.fieldPath]" -}} + {{- fail (printf "%s - Expected non-empty [%s.%s.env.fieldRef.fieldPath]" $caller $key $name) -}} {{- end }} fieldPath: {{ $v.fieldRef.fieldPath | quote }} {{- if $v.fieldRef.apiVersion }} diff --git a/charts/library/common/templates/lib/container/_envFrom.tpl b/charts/library/common/templates/lib/container/_envFrom.tpl index 213e0fd44b6..0ca8365455a 100644 --- a/charts/library/common/templates/lib/container/_envFrom.tpl +++ b/charts/library/common/templates/lib/container/_envFrom.tpl @@ -7,28 +7,31 @@ objectData: The object data to be used to render the container. {{- define "tc.v1.common.lib.container.envFrom" -}} {{- $rootCtx := .rootCtx -}} {{- $objectData := .objectData -}} + {{- $key := .key -}} + {{- $name := (.name | toString) -}} + {{- $caller := .caller -}} {{- $refs := (list "configMapRef" "secretRef") -}} {{- range $envFrom := $objectData.envFrom -}} {{- if and (not $envFrom.secretRef) (not $envFrom.configMapRef) -}} - {{- fail (printf "Container - Expected [envFrom] entry to have one of [%s]" (join ", " $refs)) -}} + {{- fail (printf "%s - Expected [envFrom] entry in [%s.%s] to have one of [%s]" $caller $key $name (join ", " $refs)) -}} {{- end -}} {{- if and $envFrom.secretRef $envFrom.configMapRef -}} - {{- fail (printf "Container - Expected [envFrom] entry to have only one of [%s], but got both" (join ", " $refs)) -}} + {{- fail (printf "%s - Expected [envFrom] entry in [%s.%s] to have only one of [%s], but got both" $caller $key $name (join ", " $refs)) -}} {{- end -}} {{- range $ref := $refs -}} {{- with (get $envFrom $ref) -}} {{- if not .name -}} - {{- fail (printf "Container - Expected non-empty [envFrom.%s.name]" $ref) -}} + {{- fail (printf "%s - Expected non-empty [%s.%s.envFrom.%s.name]" $caller $key $name $ref) -}} {{- end -}} {{- $objectName := tpl .name $rootCtx -}} {{- $expandName := (include "tc.v1.common.lib.util.expandName" (dict "rootCtx" $rootCtx "objectData" . - "name" $ref "caller" "Container" + "name" $ref "caller" $caller "key" "envFrom")) -}} {{- if eq $expandName "true" -}} @@ -43,10 +46,10 @@ objectData: The object data to be used to render the container. {{- end -}} {{- if not $object -}} - {{- fail (printf "Container - Expected %s [%s] defined in [envFrom] to exist" $source $objectName) -}} + {{- fail (printf "%s - Expected %s [%s] defined in [%s.%s.envFrom] to exist" $caller $source $objectName $key $name) -}} {{- end -}} {{- range $k, $v := $object.data -}} - {{- include "tc.v1.common.helper.container.envDupeCheck" (dict "rootCtx" $rootCtx "objectData" $objectData "source" (printf "%s - %s" $source $objectName) "key" $k) -}} + {{- include "tc.v1.common.helper.container.envDupeCheck" (dict "rootCtx" $rootCtx "objectData" $objectData "source" (printf "%s - %s" $source $objectName) "key" $k "caller" $caller) -}} {{- end -}} {{- $objectName = (printf "%s-%s" (include "tc.v1.common.lib.chart.names.fullname" $rootCtx) $objectName) -}} diff --git a/charts/library/common/templates/lib/container/_envList.tpl b/charts/library/common/templates/lib/container/_envList.tpl index df491a4ca21..dd4f948e650 100644 --- a/charts/library/common/templates/lib/container/_envList.tpl +++ b/charts/library/common/templates/lib/container/_envList.tpl @@ -7,12 +7,15 @@ objectData: The object data to be used to render the container. {{- define "tc.v1.common.lib.container.envList" -}} {{- $rootCtx := .rootCtx -}} {{- $objectData := .objectData -}} + {{- $key := .key -}} + {{- $name := (.name | toString) -}} + {{- $caller := .caller -}} {{- range $env := $objectData.envList -}} {{- if not $env.name -}} - {{- fail "Container - Expected non-empty [envList.name]" -}} + {{- fail (printf "%s - Expected non-empty [%s.%s.envList.name]" $caller $key $name) -}} {{- end -}} {{/* Empty value is valid */}} - {{- include "tc.v1.common.helper.container.envDupeCheck" (dict "rootCtx" $rootCtx "objectData" $objectData "source" "envList" "key" $env.name) -}} + {{- include "tc.v1.common.helper.container.envDupeCheck" (dict "rootCtx" $rootCtx "objectData" $objectData "source" (printf "%s.%s.envList" $key $name) "key" $env.name "caller" $caller) -}} {{- $value := $env.value -}} {{- if kindIs "string" $env.value -}} {{- $value = tpl $env.value $rootCtx -}} diff --git a/charts/library/common/templates/lib/container/_fixedEnv.tpl b/charts/library/common/templates/lib/container/_fixedEnv.tpl index a25887e5ade..9e372423c8d 100644 --- a/charts/library/common/templates/lib/container/_fixedEnv.tpl +++ b/charts/library/common/templates/lib/container/_fixedEnv.tpl @@ -7,6 +7,9 @@ objectData: The object data to be used to render the container. {{- define "tc.v1.common.lib.container.fixedEnv" -}} {{- $rootCtx := .rootCtx -}} {{- $objectData := .objectData -}} + {{- $key := .key -}} + {{- $name := (.name | toString) -}} + {{- $caller := .caller -}} {{/* Avoid nil pointers */}} {{- if not (hasKey $objectData "fixedEnv") -}} @@ -20,13 +23,13 @@ objectData: The object data to be used to render the container. {{- end -}} {{- if not (deepEqual $nvidiaCaps (mustUniq $nvidiaCaps)) -}} - {{- fail (printf "Container - Expected [fixedEnv.NVIDIA_CAPS] to have only unique values, but got [%s]" (join ", " $nvidiaCaps)) -}} + {{- fail (printf "%s - Expected [%s.%s.fixedEnv.NVIDIA_CAPS] to have only unique values, but got [%s]" $caller $key $name (join ", " $nvidiaCaps)) -}} {{- end -}} {{- $caps := (list "all" "compute" "utility" "graphics" "video") -}} {{- range $cap := $nvidiaCaps -}} {{- if not (mustHas $cap $caps) -}} - {{- fail (printf "Container - Expected [fixedEnv.NVIDIA_CAPS] entry to be one of [%s], but got [%s]" (join ", " $caps) $cap) -}} + {{- fail (printf "%s - Expected [%s.%s.fixedEnv.NVIDIA_CAPS] entry to be one of [%s], but got [%s]" $caller $key $name (join ", " $caps) $cap) -}} {{- end -}} {{- end -}} @@ -90,7 +93,7 @@ objectData: The object data to be used to render the container. {{- end -}} {{- range $env := $fixed -}} - {{- include "tc.v1.common.helper.container.envDupeCheck" (dict "rootCtx" $rootCtx "objectData" $objectData "source" "fixedEnv" "key" $env.k) }} + {{- include "tc.v1.common.helper.container.envDupeCheck" (dict "rootCtx" $rootCtx "objectData" $objectData "source" (printf "%s.%s.fixedEnv" $key $name) "key" $env.k "caller" $caller) }} - name: {{ $env.k | quote }} value: {{ (include "tc.v1.common.helper.makeIntOrNoop" $env.v) | quote }} {{- end -}} diff --git a/charts/library/common/templates/lib/pod/_container.tpl b/charts/library/common/templates/lib/pod/_container.tpl index 90f51fa01db..fdc6cd93939 100644 --- a/charts/library/common/templates/lib/pod/_container.tpl +++ b/charts/library/common/templates/lib/pod/_container.tpl @@ -50,13 +50,21 @@ objectData: The object data to be used to render the Pod. {{- include "tc.v1.common.lib.container.securityContext" (dict "rootCtx" $rootCtx "objectData" $objectData) | trim | nindent 4 }} {{- /* Create a dict for storing env's so it can be checked for dupes */ -}} {{- $_ := set $objectData "envDupe" dict -}} - {{- with (include "tc.v1.common.lib.container.envFrom" (dict "rootCtx" $rootCtx "objectData" $objectData) | trim) }} + {{- with (include "tc.v1.common.lib.container.envFrom" (dict + "rootCtx" $rootCtx "objectData" $objectData "caller" "Container" + "name" $objectData.shortName "key" "containers") | trim) }} envFrom: {{- . | nindent 4 }} {{- end }} env: - {{- include "tc.v1.common.lib.container.fixedEnv" (dict "rootCtx" $rootCtx "objectData" $objectData) | trim | nindent 4 -}} - {{- include "tc.v1.common.lib.container.env" (dict "rootCtx" $rootCtx "objectData" $objectData) | trim | nindent 4 -}} - {{- include "tc.v1.common.lib.container.envList" (dict "rootCtx" $rootCtx "objectData" $objectData) | trim | nindent 4 -}} + {{- include "tc.v1.common.lib.container.fixedEnv" (dict + "rootCtx" $rootCtx "objectData" $objectData "caller" "Container" + "name" $objectData.shortName "key" "containers") | trim | nindent 4 -}} + {{- include "tc.v1.common.lib.container.env" (dict + "rootCtx" $rootCtx "objectData" $objectData "caller" "Container" + "name" $objectData.shortName "key" "containers") | trim | nindent 4 -}} + {{- include "tc.v1.common.lib.container.envList" (dict + "rootCtx" $rootCtx "objectData" $objectData "caller" "Container" + "name" $objectData.shortName "key" "containers") | trim | nindent 4 -}} {{- $_ := unset $objectData "envDupe" -}} {{- end -}} diff --git a/charts/library/common/values.yaml b/charts/library/common/values.yaml index 3bada8fdcfb..826d42e9504 100644 --- a/charts/library/common/values.yaml +++ b/charts/library/common/values.yaml @@ -1173,6 +1173,9 @@ cnpg: # Additional Labels and annotations for cnpg cluster labels: {} annotations: {} + # Additional environment variables to set on all pods created in the cluster + env: {} + envFrom: {} # Number of instances instances: 2