From 68ac67cdddb20495ea32ed4a5b51f1a8c5621cfd Mon Sep 17 00:00:00 2001 From: Ariel Yahav Date: Fri, 14 Aug 2026 13:47:23 +0100 Subject: [PATCH 1/2] feat(formance): rename the Enterprise Edition tag and reject unknown tags MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `tags.EntrepriseEdition` carries a French spelling of "Enterprise". It is the switch that selects Enterprise Edition, so it is the most visible string in the chart: it appears in every install command in our own documentation. Two changes. Rename, without breaking anyone. `tags.EnterpriseEdition` is now the supported key. `tags.EntrepriseEdition` still works, is documented as deprecated, and prints a warning on install; it is slated for removal in the next major. Both names are listed on the `regions` and `cloudprem` dependencies, which is enough for Helm's tag resolution: a dependency is enabled when any of its tags is true, and disabled only when a tag is present and none is true, so either key turns EE on and the default of both to false still yields Community Edition. Reject unknown tags. Helm silently ignores tags it does not know, and values.schema.json does not set `additionalProperties: false`, so `--set tags.EnterprizeEdition=true` was accepted and dropped — an Enterprise install coming up quietly as Community, with a licence configured and no error. `formance.validateTags` now fails on any key under `tags` that is not one of the three valid ones, naming the offending key. The schema would have been the more natural home for that check, but the generator (helm-values-schema-json v1.9.2) has no per-key `additionalProperties` annotation, and its `-noAdditionalProperties` flag applies to every object in every chart — far too broad. A template guard is also able to say which key is wrong and what to use instead, which a schema violation cannot. Templates no longer read either tag directly: `formance.enterpriseEnabled` is the single reader, used by `validateEE`, `formance.edition`, NOTES.txt and the four test hooks. Verified that `helm template` output is byte-identical to main, modulo the chart version label, both for a default Community install and for an Enterprise install driven by the old key; and that the new key produces the same output as the old one. The Chart.lock churn is the usual in-range dependency refresh that `just pc` produces (postgresql 18.8.0 -> 18.8.8 and friends), as in #399. Note for the docs: `deploy/self-hosted/installation/operator-setup.mdx` in formancehq/docs pins the old key in four install commands. It should move to `tags.EnterpriseEdition` once this chart version ships — not before, or the documented command stops selecting EE. Scope-risk: medium — no existing configuration changes behaviour, but an install that sets a misspelled tag now fails where it previously ran as CE. That is the intent. --- README.md | 2 +- charts/formance/Chart.lock | 4 +-- charts/formance/Chart.yaml | 4 ++- charts/formance/README.md | 7 ++-- charts/formance/templates/NOTES.txt | 12 +++++-- charts/formance/templates/_helpers.tpl | 34 +++++++++++++++++-- charts/formance/templates/tests/console.yaml | 2 +- .../formance/templates/tests/membership.yaml | 2 +- charts/formance/templates/tests/portal.yaml | 2 +- charts/formance/templates/tests/stargate.yaml | 2 +- charts/formance/values.schema.json | 3 ++ charts/formance/values.yaml | 6 +++- 12 files changed, 63 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 57649cc3..e735be35 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ | [Cloudprem](./charts/cloudprem/README.md) | 4.11.0 | latest | Formance control-plane | [![Artifact HUB](https://img.shields.io/endpoint?url=https://artifacthub.io/badge/repository/cloudprem)](https://artifacthub.io/packages/search?repo=cloudprem) | | [Console-V3](./charts/console-v3/README.md) | 3.8.0 | v2.7.0 | Formance Console | [![Artifact HUB](https://img.shields.io/endpoint?url=https://artifacthub.io/badge/repository/console-v3)](https://artifacthub.io/packages/search?repo=console-v3) | | [Core](./charts/core/README.md) | 1.6.0 | latest | Formance Core Library | [![Artifact HUB](https://img.shields.io/endpoint?url=https://artifacthub.io/badge/repository/core)](https://artifacthub.io/packages/search?repo=core) | -| [Formance](./charts/formance/README.md) | 1.19.0 | latest | Formance Platform - Unified Helm Chart | [![Artifact HUB](https://img.shields.io/endpoint?url=https://artifacthub.io/badge/repository/formance)](https://artifacthub.io/packages/search?repo=formance) | +| [Formance](./charts/formance/README.md) | 1.20.0 | latest | Formance Platform - Unified Helm Chart | [![Artifact HUB](https://img.shields.io/endpoint?url=https://artifacthub.io/badge/repository/formance)](https://artifacthub.io/packages/search?repo=formance) | | [Membership](./charts/membership/README.md) | 3.6.3 | v2.5.0 | Formance EE Membership API. Manage stacks, organizations, regions, invitations, users, roles, and permissions. | [![Artifact HUB](https://img.shields.io/endpoint?url=https://artifacthub.io/badge/repository/membership)](https://artifacthub.io/packages/search?repo=membership) | | [Portal](./charts/portal/README.md) | 3.8.0 | v2.7.0 | Formance Portal | [![Artifact HUB](https://img.shields.io/endpoint?url=https://artifacthub.io/badge/repository/portal)](https://artifacthub.io/packages/search?repo=portal) | | [Regions](./charts/regions/README.md) | 3.15.2 | latest | Formance Private Regions Helm Chart | [![Artifact HUB](https://img.shields.io/endpoint?url=https://artifacthub.io/badge/repository/regions)](https://artifacthub.io/packages/search?repo=regions) | diff --git a/charts/formance/Chart.lock b/charts/formance/Chart.lock index 032212b5..b3fccc3b 100644 --- a/charts/formance/Chart.lock +++ b/charts/formance/Chart.lock @@ -8,5 +8,5 @@ dependencies: - name: cloudprem repository: file://../cloudprem version: 4.11.0 -digest: sha256:337cf5697e2a374a1c65164cb194f0e9e4d0cf2839b9f79ffef20bede5512616 -generated: "2026-08-14T10:20:14.043633+02:00" +digest: sha256:ec6de0cd779f9fb0328d5a8e60c333cc99bee25604503ee1bddcd62f0308ddb7 +generated: "2026-08-14T13:50:52.69606+01:00" diff --git a/charts/formance/Chart.yaml b/charts/formance/Chart.yaml index 707fc980..441da974 100644 --- a/charts/formance/Chart.yaml +++ b/charts/formance/Chart.yaml @@ -10,7 +10,7 @@ maintainers: icon: "https://avatars.githubusercontent.com/u/84325077?s=200&v=4" type: application -version: 1.19.0 +version: 1.20.0 appVersion: "latest" # The "-0" suffix is required for GKE compatibility. GKE versions contain # build metadata like "v1.33.5-gke.2392000" which semver treats as pre-release. @@ -27,6 +27,7 @@ dependencies: version: 3.X repository: "file://../regions" tags: + - EnterpriseEdition - EntrepriseEdition - CommunityEdition import-values: @@ -38,4 +39,5 @@ dependencies: version: 4.X repository: "file://../cloudprem" tags: + - EnterpriseEdition - EntrepriseEdition diff --git a/charts/formance/README.md b/charts/formance/README.md index 559b05cb..03c4caa3 100644 --- a/charts/formance/README.md +++ b/charts/formance/README.md @@ -1,6 +1,6 @@ # formance -![Version: 1.19.0](https://img.shields.io/badge/Version-1.19.0-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: latest](https://img.shields.io/badge/AppVersion-latest-informational?style=flat-square) +![Version: 1.20.0](https://img.shields.io/badge/Version-1.20.0-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: latest](https://img.shields.io/badge/AppVersion-latest-informational?style=flat-square) Formance Platform - Unified Helm Chart @@ -181,13 +181,14 @@ Kubernetes: `>=1.14.0-0` | Key | Type | Default | Description | |-----|------|---------|-------------| -| tags | object | `{"CommunityEdition":true,"EntrepriseEdition":false}` | Tags | +| tags | object | `{"CommunityEdition":true,"EnterpriseEdition":false,"EntrepriseEdition":false}` | Tags | ### Edition | Key | Type | Default | Description | |-----|------|---------|-------------| -| tags.EntrepriseEdition | bool | `false` | Choose deployment edition - EE: Entreprise (requires Licence) - CE: Community | +| tags.EnterpriseEdition | bool | `false` | Choose deployment edition - EE: Enterprise (requires a Licence) - CE: Community | +| tags.EntrepriseEdition | bool | `false` | Deprecated misspelling of `tags.EnterpriseEdition`, still honoured. Will be removed in the next major. Prefer `tags.EnterpriseEdition`. | ### Migration configuration diff --git a/charts/formance/templates/NOTES.txt b/charts/formance/templates/NOTES.txt index 0ef8f5d2..3663788b 100644 --- a/charts/formance/templates/NOTES.txt +++ b/charts/formance/templates/NOTES.txt @@ -1,3 +1,4 @@ +{{- include "formance.validateTags" . -}} {{- include "formance.validateEE" . -}} ================================================================================ @@ -9,8 +10,13 @@ {{ include "formance.edition" . }} ================================================================================ - -{{- if .Values.tags.EntrepriseEdition }} +{{ if and .Values.tags.EntrepriseEdition (not .Values.tags.EnterpriseEdition) }} +WARNING: tags.EntrepriseEdition is deprecated (it is a misspelling). + Use tags.EnterpriseEdition instead. The old key still works for now + and will be removed in the next major version of this chart. +================================================================================ +{{ end }} +{{- if include "formance.enterpriseEnabled" . }} ================================================================================ CONTROL PLANE ================================================================================ @@ -103,7 +109,7 @@ Region: Private (self-hosted) List all stacks: kubectl get stacks -{{- if and .Values.regions.stacks (not .Values.tags.EntrepriseEdition) }} +{{- if and .Values.regions.stacks (not (include "formance.enterpriseEnabled" .)) }} Port-forward: {{- range $name, $config := .Values.regions.stacks }} diff --git a/charts/formance/templates/_helpers.tpl b/charts/formance/templates/_helpers.tpl index 7d6a47b9..ed4828a2 100644 --- a/charts/formance/templates/_helpers.tpl +++ b/charts/formance/templates/_helpers.tpl @@ -52,12 +52,42 @@ app.kubernetes.io/name: {{ include "formance.name" . }} app.kubernetes.io/instance: {{ .Release.Name }} {{- end }} +{{/* +Is Enterprise Edition selected? + +`tags.EnterpriseEdition` is the supported key. `tags.EntrepriseEdition` is the +original misspelling, still honoured so existing values files keep working; it +is deprecated and warned about in NOTES.txt. + +Returns a non-empty string when EE is on, so callers can use it directly in an +`if`. Keep this as the only place that reads either tag. +*/}} +{{- define "formance.enterpriseEnabled" -}} +{{- if or .Values.tags.EnterpriseEdition .Values.tags.EntrepriseEdition -}}true{{- end -}} +{{- end -}} + +{{/* +Reject unknown keys under `tags`. + +Helm resolves tags natively and silently ignores ones it does not know, so a +typo -- including the near-miss `EnterprizeEdition` -- would otherwise leave an +Enterprise install quietly running as Community. +*/}} +{{- define "formance.validateTags" -}} +{{- $known := list "EnterpriseEdition" "EntrepriseEdition" "CommunityEdition" -}} +{{- range $key, $_ := .Values.tags -}} + {{- if not (has $key $known) -}} + {{- fail (printf "\n\n==================== CONFIGURATION ERROR ====================\nUnknown tag: tags.%s\n\nHelm ignores tags it does not recognise, so this would have been\nsilently dropped -- leaving an Enterprise install running as Community.\n\nValid tags are:\n tags.EnterpriseEdition (Enterprise Edition, requires a licence)\n tags.CommunityEdition (Community Edition, the default)\n==============================================================\n" $key) -}} + {{- end -}} +{{- end -}} +{{- end -}} + {{/* Validate Enterprise Edition configuration. This template will fail if EE is enabled but licence is not properly configured. */}} {{- define "formance.validateEE" -}} -{{- if .Values.tags.EntrepriseEdition -}} +{{- if include "formance.enterpriseEnabled" . -}} {{- if and (not .Values.global.licence.token) (not .Values.global.licence.existingSecret) -}} {{- fail "\n\n==================== CONFIGURATION ERROR ====================\nEnterprise Edition enabled but no licence provided.\n\nPlease set one of:\n --set global.licence.token=\n --set global.licence.existingSecret=\n\nContact Formance to obtain a licence: https://formance.com\n==============================================================\n" -}} {{- end -}} @@ -71,7 +101,7 @@ This template will fail if EE is enabled but licence is not properly configured. Get edition name */}} {{- define "formance.edition" -}} -{{- if .Values.tags.EntrepriseEdition -}} +{{- if include "formance.enterpriseEnabled" . -}} Enterprise Edition {{- else -}} Community Edition diff --git a/charts/formance/templates/tests/console.yaml b/charts/formance/templates/tests/console.yaml index 1f8c326e..716c2a3a 100644 --- a/charts/formance/templates/tests/console.yaml +++ b/charts/formance/templates/tests/console.yaml @@ -1,4 +1,4 @@ -{{- if and .Values.tags.EntrepriseEdition .Values.global.platform.consoleV3.enabled }} +{{- if and (include "formance.enterpriseEnabled" .) .Values.global.platform.consoleV3.enabled }} apiVersion: v1 kind: ServiceAccount metadata: diff --git a/charts/formance/templates/tests/membership.yaml b/charts/formance/templates/tests/membership.yaml index e3977016..c358c7e2 100644 --- a/charts/formance/templates/tests/membership.yaml +++ b/charts/formance/templates/tests/membership.yaml @@ -1,4 +1,4 @@ -{{- if and .Values.tags.EntrepriseEdition (index .Values "global" "platform" "membership" "enabled" | default true) }} +{{- if and (include "formance.enterpriseEnabled" .) (index .Values "global" "platform" "membership" "enabled" | default true) }} apiVersion: v1 kind: ServiceAccount metadata: diff --git a/charts/formance/templates/tests/portal.yaml b/charts/formance/templates/tests/portal.yaml index 5a33673a..5d14627d 100644 --- a/charts/formance/templates/tests/portal.yaml +++ b/charts/formance/templates/tests/portal.yaml @@ -1,4 +1,4 @@ -{{- if and .Values.tags.EntrepriseEdition .Values.global.platform.portal.enabled }} +{{- if and (include "formance.enterpriseEnabled" .) .Values.global.platform.portal.enabled }} apiVersion: v1 kind: ServiceAccount metadata: diff --git a/charts/formance/templates/tests/stargate.yaml b/charts/formance/templates/tests/stargate.yaml index 1581650c..9fdce4fa 100644 --- a/charts/formance/templates/tests/stargate.yaml +++ b/charts/formance/templates/tests/stargate.yaml @@ -1,4 +1,4 @@ -{{- if and .Values.tags.EntrepriseEdition .Values.global.platform.stargate.enabled }} +{{- if and (include "formance.enterpriseEnabled" .) .Values.global.platform.stargate.enabled }} apiVersion: v1 kind: ServiceAccount metadata: diff --git a/charts/formance/values.schema.json b/charts/formance/values.schema.json index a68ed501..e0d0ffbc 100644 --- a/charts/formance/values.schema.json +++ b/charts/formance/values.schema.json @@ -512,6 +512,9 @@ "CommunityEdition": { "type": "boolean" }, + "EnterpriseEdition": { + "type": "boolean" + }, "EntrepriseEdition": { "type": "boolean" } diff --git a/charts/formance/values.yaml b/charts/formance/values.yaml index b430d9d5..901a1f20 100644 --- a/charts/formance/values.yaml +++ b/charts/formance/values.yaml @@ -10,9 +10,13 @@ # @section -- Tags tags: # -- Choose deployment edition - # - EE: Entreprise (requires Licence) + # - EE: Enterprise (requires a Licence) # - CE: Community # @section -- Edition + EnterpriseEdition: false + # -- Deprecated misspelling of `tags.EnterpriseEdition`, still honoured. + # Will be removed in the next major. Prefer `tags.EnterpriseEdition`. + # @section -- Edition EntrepriseEdition: false CommunityEdition: true From 4d29a388d9c0542308c5c7c4f92e3d945f509b5c Mon Sep 17 00:00:00 2001 From: Ariel Yahav Date: Fri, 14 Aug 2026 17:18:44 +0100 Subject: [PATCH 2/2] fix(formance): allow tags.Demo, and declare it MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Review on #414 caught a regression in the tag guard: NOTES.txt:166 renders a Demo Mode section from `.Values.tags.Demo`, so rejecting every key outside the three edition tags broke `--set tags.Demo=true`. It rendered on main and failed here. Added Demo to the accepted set. Also declared it. `tags.Demo` was read by a template but appeared in no values file, so it was absent from values.schema.json and from the generated README — a supported switch with no discoverable definition, which is how it came to be missed. It is not named by any dependency, so it plays no part in Helm's enable/disable resolution and declaring it changes nothing at render time. The error message listed "Valid tags" without `EntrepriseEdition`, which the guard does accept. It now names every accepted key and marks the deprecated one. Checked every `.Values.tags.*` reference across all nine charts: Demo and the two edition spellings are the only ones, and `formance` is the only chart that declares a `tags` block. Verified: tags.Demo renders again, an actual unknown tag still fails, and the Enterprise (both spellings, 70 objects) and Community (26 objects) renders are unchanged. --- charts/formance/README.md | 3 ++- charts/formance/templates/_helpers.tpl | 4 ++-- charts/formance/values.schema.json | 3 +++ charts/formance/values.yaml | 3 +++ 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/charts/formance/README.md b/charts/formance/README.md index 03c4caa3..f94b7f69 100644 --- a/charts/formance/README.md +++ b/charts/formance/README.md @@ -181,12 +181,13 @@ Kubernetes: `>=1.14.0-0` | Key | Type | Default | Description | |-----|------|---------|-------------| -| tags | object | `{"CommunityEdition":true,"EnterpriseEdition":false,"EntrepriseEdition":false}` | Tags | +| tags | object | `{"CommunityEdition":true,"Demo":false,"EnterpriseEdition":false,"EntrepriseEdition":false}` | Tags | ### Edition | Key | Type | Default | Description | |-----|------|---------|-------------| +| tags.Demo | bool | `false` | Enable demo mode, which adds sample configuration hints to the install notes | | tags.EnterpriseEdition | bool | `false` | Choose deployment edition - EE: Enterprise (requires a Licence) - CE: Community | | tags.EntrepriseEdition | bool | `false` | Deprecated misspelling of `tags.EnterpriseEdition`, still honoured. Will be removed in the next major. Prefer `tags.EnterpriseEdition`. | diff --git a/charts/formance/templates/_helpers.tpl b/charts/formance/templates/_helpers.tpl index ed4828a2..cdee20e5 100644 --- a/charts/formance/templates/_helpers.tpl +++ b/charts/formance/templates/_helpers.tpl @@ -74,10 +74,10 @@ typo -- including the near-miss `EnterprizeEdition` -- would otherwise leave an Enterprise install quietly running as Community. */}} {{- define "formance.validateTags" -}} -{{- $known := list "EnterpriseEdition" "EntrepriseEdition" "CommunityEdition" -}} +{{- $known := list "EnterpriseEdition" "EntrepriseEdition" "CommunityEdition" "Demo" -}} {{- range $key, $_ := .Values.tags -}} {{- if not (has $key $known) -}} - {{- fail (printf "\n\n==================== CONFIGURATION ERROR ====================\nUnknown tag: tags.%s\n\nHelm ignores tags it does not recognise, so this would have been\nsilently dropped -- leaving an Enterprise install running as Community.\n\nValid tags are:\n tags.EnterpriseEdition (Enterprise Edition, requires a licence)\n tags.CommunityEdition (Community Edition, the default)\n==============================================================\n" $key) -}} + {{- fail (printf "\n\n==================== CONFIGURATION ERROR ====================\nUnknown tag: tags.%s\n\nHelm ignores tags it does not recognise, so this would have been\nsilently dropped -- leaving an Enterprise install running as Community.\n\nValid tags are:\n tags.EnterpriseEdition (Enterprise Edition, requires a licence)\n tags.CommunityEdition (Community Edition, the default)\n tags.Demo (demo mode hints in the install notes)\n tags.EntrepriseEdition (deprecated spelling of tags.EnterpriseEdition)\n==============================================================\n" $key) -}} {{- end -}} {{- end -}} {{- end -}} diff --git a/charts/formance/values.schema.json b/charts/formance/values.schema.json index e0d0ffbc..31c0cf97 100644 --- a/charts/formance/values.schema.json +++ b/charts/formance/values.schema.json @@ -512,6 +512,9 @@ "CommunityEdition": { "type": "boolean" }, + "Demo": { + "type": "boolean" + }, "EnterpriseEdition": { "type": "boolean" }, diff --git a/charts/formance/values.yaml b/charts/formance/values.yaml index 901a1f20..74dbd1e0 100644 --- a/charts/formance/values.yaml +++ b/charts/formance/values.yaml @@ -19,6 +19,9 @@ tags: # @section -- Edition EntrepriseEdition: false CommunityEdition: true + # -- Enable demo mode, which adds sample configuration hints to the install notes + # @section -- Edition + Demo: false # ============================================================================= # GLOBAL CONFIGURATION