Skip to content

chore: replace disabled with enabled in DP configs - #453

Merged
openshift-merge-bot[bot] merged 6 commits into
redhat-developer:mainfrom
hopehadfield:replace-disabled
Jul 6, 2026
Merged

openshift-merge-bot[bot] merged 6 commits into
redhat-developer:mainfrom
hopehadfield:replace-disabled

Conversation

@hopehadfield

Copy link
Copy Markdown
Member

Description of the change

Replaces all instances of disabled field with enabled as a follow-up to redhat-developer/rhdh-plugins#3554

Which issue(s) does this PR fix or relate to

How to test changes / Special notes to the reviewer

Checklist

  • For each Chart updated, version bumped in the corresponding Chart.yaml according to Semantic Versioning.
  • For each Chart updated, variables are documented in the values.yaml and added to the corresponding README.md. The pre-commit utility can be used to generate the necessary content. Run pre-commit run --all-files to run the hooks and then push any resulting changes. The pre-commit Workflow will enforce this and warn you if needed.
  • JSON Schema template updated and re-generated the raw schema via the pre-commit hook.
  • Tests pass using the Chart Testing tool and the ct lint command.
  • If you updated the orchestrator-infra chart, make sure the versions of the Knative CRDs are aligned with the versions of the CRDs installed by the OpenShift Serverless operators declared in the values.yaml file. See Installing Knative Eventing and Knative Serving CRDs for more details.

@hopehadfield
hopehadfield requested a review from a team as a code owner June 25, 2026 18:48
@openshift-ci
openshift-ci Bot requested review from gazarenkov and rm3l June 25, 2026 18:48
@hopehadfield
hopehadfield marked this pull request as draft June 25, 2026 18:48
@rhdh-qodo-merge

rhdh-qodo-merge Bot commented Jun 25, 2026 •

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (0) 📘 Rule violations (0) 📎 Requirement gaps (0) 📜 Skill insights (0)

Context used
✅ Tickets: RHIDP-14726

Grey Divider


Remediation recommended

1. README flag mismatch ✓ Resolved 🐞 Bug ⚙ Maintainability
Description
charts/backstage/README.md now documents plugin entries using an enabled flag, but a later example
block still uses disabled: false, creating contradictory instructions that can lead users to
configure the wrong key.
Code

charts/backstage/README.md[176]

+| global.dynamic.plugins | List of dynamic plugins, possibly overriding the plugins listed in `includes` files. Every item defines the plugin `package` as a [NPM package spec](https://docs.npmjs.com/cli/v10/using-npm/package-spec), an optional `pluginConfig` with plugin-specific backstage configuration, and an optional `enabled` flag to enable/disable a plugin listed in `includes` files. It also includes an `integrity` field that is used to verify the plugin package [integrity](https://w3c.github.io/webappsec-subresource-integrity/#integrity-metadata-description). | list | `[]` |
Relevance

⭐⭐⭐ High

Team frequently accepts README/doc fixes (typos/wording/values-table edits) in backstage chart docs
(e.g., PRs #173, #178, #351).

PR-#173
PR-#178
PR-#351

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The README’s values table now states an optional enabled flag for global.dynamic.plugins, but
later in the same README an example still shows disabled: false, demonstrating inconsistent
documentation.

charts/backstage/README.md[164-212]
charts/backstage/README.md[400-418]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
`charts/backstage/README.md` partially migrated documentation to `enabled`, but it still contains an example using `disabled: false`. This leaves conflicting guidance for chart users.

### Issue Context
The values table entry for `global.dynamic.plugins` was updated to mention `enabled`, but the later "Enablement of Notifications Plugin" example block still shows `disabled`.

### Fix Focus Areas
- charts/backstage/README.md[176-176]
- charts/backstage/README.md[400-418]

### Suggested fix
- Update the remaining YAML example lines from `disabled: false` to the new `enabled` form (likely `enabled: true` in that example), and ensure any nearby prose aligns with the new key.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

Qodo Logo

@rhdh-qodo-merge

rhdh-qodo-merge Bot commented Jun 25, 2026 •

Copy link
Copy Markdown

PR Summary by Qodo

Helm: switch dynamic plugin flag from disabled to enabled
⚙️ Configuration changes 📝 Documentation 🕐 20-40 Minutes

Grey Divider

Description

• Rename dynamic plugin config field from disabled to enabled across Backstage chart values.
• Regenerate/update JSON schema and CI example values to match the new flag.
• Bump chart version and refresh README references for the updated configuration.
Diagram

graph TD
  U["Chart user"] --> H["Helm install/upgrade"] --> C["backstage chart"] --> V["values.yaml defaults"] --> T["Rendered manifests"]
  C --> S["values.schema.json"]
  C --> R["README.md"]
  C --> CI["ci/*-values.yaml"]
Loading
High-Level Assessment

The following are alternative approaches to this PR:

1. Dual-field compatibility (support both `disabled` and `enabled` temporarily)
  • ➕ Reduces breaking-change risk for existing chart consumers
  • ➕ Allows a deprecation window with clear migration messaging
  • ➖ Adds complexity to templates/schema/docs
  • ➖ Creates ambiguity if both fields are set
2. Introduce a chart-level migration note with explicit versioned breaking change
  • ➕ Keeps implementation simple while making the upgrade impact explicit
  • ➕ Sets expectations for downstream automation/config repos
  • ➖ Still requires consumers to update values immediately
  • ➖ Does not help tooling that relies on old schema keys

Recommendation: The PR’s approach (rename everywhere + bump chart version + update schema/docs/examples) is the right baseline to keep the values contract consistent. If there is any meaningful installed base using disabled, consider adding a short deprecation/upgrade note (or temporary dual-field support) to minimize upgrade friction; otherwise, proceed as-is to align with the post-#3554 configuration model.

Files changed (6) +21 / -21

Documentation (1) +5 / -5
README.mdRefresh README for 6.1.2 and 'enabled' plugin flag wording +5/-5

Refresh README for 6.1.2 and 'enabled' plugin flag wording

• Updates the displayed chart version and install example to 6.1.2. Adjusts documented plugin list semantics to refer to an 'enabled' flag instead of 'disabled', and updates embedded example JSON snippets accordingly.

charts/backstage/README.md

Other (5) +16 / -16
Chart.yamlBump chart patch version to 6.1.2 +1/-1

Bump chart patch version to 6.1.2

• Updates the Backstage chart version from 6.1.1 to 6.1.2 to publish the config contract change.

charts/backstage/Chart.yaml

with-orchestrator-and-dynamic-plugins-npmrc-values.yamlUpdate CI values to use 'enabled: true' for dynamic plugins +2/-2

Update CI values to use 'enabled: true' for dynamic plugins

• Replaces 'disabled: false' with 'enabled: true' for additional dynamic plugin entries in the orchestrator+dynamic-plugins CI scenario.

charts/backstage/ci/with-orchestrator-and-dynamic-plugins-npmrc-values.yaml

with-orchestrator-values.yamlUpdate CI values to use 'enabled: true' for dynamic plugins +2/-2

Update CI values to use 'enabled: true' for dynamic plugins

• Replaces 'disabled: false' with 'enabled: true' for additional dynamic plugin entries in the orchestrator CI scenario.

charts/backstage/ci/with-orchestrator-values.yaml

values.schema.jsonRegenerate schema defaults to use 'enabled' field +4/-4

Regenerate schema defaults to use 'enabled' field

• Updates schema-provided default plugin entries under Lightspeed to use 'enabled: true' rather than 'disabled: false', keeping the schema aligned with the chart’s values contract.

charts/backstage/values.schema.json

values.yamlRename plugin toggle field from 'disabled' to 'enabled' in defaults +7/-7

Rename plugin toggle field from 'disabled' to 'enabled' in defaults

• Updates comments and default plugin lists (Lightspeed and orchestrator) to use 'enabled: true' instead of 'disabled: false', matching the new expected configuration key.

charts/backstage/values.yaml

@rhdh-qodo-merge rhdh-qodo-merge Bot added documentation Improvements or additions to documentation enhancement New feature or request labels Jun 25, 2026
@hopehadfield
hopehadfield marked this pull request as ready for review June 25, 2026 20:20

@rm3l rm3l left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment thread charts/backstage/Chart.yaml Outdated
Signed-off-by: Hope Hadfield <hhadfiel@redhat.com>
Signed-off-by: Hope Hadfield <hhadfiel@redhat.com>
Signed-off-by: Hope Hadfield <hhadfiel@redhat.com>
Signed-off-by: Hope Hadfield <hhadfiel@redhat.com>
Signed-off-by: Hope Hadfield <hhadfiel@redhat.com>
@hopehadfield
hopehadfield requested a review from a team as a code owner July 6, 2026 15:30
Signed-off-by: Hope Hadfield <hhadfiel@redhat.com>
@sonarqubecloud

sonarqubecloud Bot commented Jul 6, 2026

Copy link
Copy Markdown

@openshift-ci openshift-ci Bot added the lgtm label Jul 6, 2026
@openshift-merge-bot
openshift-merge-bot Bot merged commit e81f938 into redhat-developer:main Jul 6, 2026
8 checks passed
rm3l added a commit to rm3l/rhdh-chart that referenced this pull request Jul 7, 2026
…[RHIDP-14726]

Align the rhdh chart with the backstage chart change from PR redhat-developer#453:
use `enabled: true` instead of `disabled: false` for dynamic plugin
entries in values, schema, CI files, and documentation.

Assisted-by: Claude
openshift-merge-bot Bot pushed a commit that referenced this pull request Aug 24, 2026
* feat: add standalone RHDH Helm chart without upstream subchart dependency

Helm cannot merge lists, so when users set extraVolumes/extraEnvVars on
the current chart, the entire default list is replaced — forcing them to
copy-paste all system defaults just to add one item. This is a Day 2
maintenance burden that grows with every release.

This new chart at charts/rhdh/ owns all Kubernetes templates directly
and uses an "add, don't replace" pattern: system-required volumes,
mounts, env vars, and init containers are hardcoded in the Deployment
template, while user-provided values are always appended. Users can now
add a volume without knowing or duplicating the system defaults.

The values layout is flattened to match helm-create conventions
(replicaCount, image, service at root level) — no more navigating
global.*/upstream.backstage.* nesting to set basic options.

Assisted-by: Claude

* deprecate backstage chart in favor of the new standalone rhdh chart

The new rhdh chart owns all Kubernetes templates directly and no
longer depends on the upstream Backstage subchart, so the weekly
sync workflow and its helper script are no longer needed.

Assisted-by: Claude

* run pre-commit hooks

* clarify that backstage chart fixes target supported release-1.y branches

Assisted-by: Claude

* update Chart.yaml with data from downstream chart

* add CI values files for the rhdh chart

Port test scenarios from charts/backstage/ci/ with key paths adjusted
for the flat values layout. The custom-dynamic-pvc-claim-spec scenario
is dropped because the new chart hardcodes the dynamic-plugins-root
volume (user volumes are appended, not replaced).

Assisted-by: Claude

* bump backstage chart version

* fix issues reported by SonarQube

* support bitnami global fields in the rhdh chart

Add global.imageRegistry, global.imagePullSecrets, and
global.defaultStorageClass so they flow through to both the postgresql
subchart and the rhdh chart's own templates. Image helpers now delegate
to bitnami common's common.images.image, and imagePullSecrets are
merged from both global and root-level sources. Lightspeed container
images converted from strings to structured registry/repository/tag
maps so global.imageRegistry applies uniformly to all containers.

Also pins the test pod image to curl/curl:8.9.1 instead of latest,
adds automountServiceAccountToken: false and ephemeral-storage
requests to the test pod (SonarCloud findings).

Assisted-by: Claude

* run pre-commit hooks

* upgrade bitnami postgresql dependency to 18.7.5

The previous version (12.10.0) was far behind. The new version
requires global.security.allowInsecureImages=true since we use a
Fedora-based PostgreSQL image instead of the bitnami one.

Assisted-by: Claude

* add digest field to all image blocks and document catalogIndex examples

Assisted-by: Claude

* fix(ci): skip ct upgrade test for new charts not yet on the target branch

chart-testing's --upgrade flag checks out the target branch and tries
to build dependencies for the chart there. For brand-new charts like
charts/rhdh/ that do not exist on main yet, this causes helm
dependency build to fail.

Make --upgrade conditional: when a specific chart is tested, check
whether its Chart.yaml exists on the target branch first. If not,
skip the upgrade test and only run a fresh install.

Also rename the backstageChartChanged output to orchestratorCrdsNeeded
and include charts/rhdh so that Knative and SonataFlow CRDs are
installed for both charts' orchestrator CI scenarios.

* fix(ci): set podSecurityContext for the rhdh chart on KinD

On vanilla K8s (KinD), there is no SCC to assign a common UID to all
containers in a pod. Set fsGroup so shared volumes (e.g. RAG data)
are group-writable across init containers and sidecars that may run
as different UIDs. Also disable the route, which is not available on
KinD.

* feat(rhdh): add default appConfig with base URLs, database, and auth

Without a default appConfig, no app-config ConfigMap is created and
the RHDH application lacks essential configuration (base URLs, CORS,
database connection, backend auth), causing it to fail to start.

Add a default appConfig matching the backstage chart, providing:
- app.baseUrl and backend.baseUrl from rhdh.hostname
- backend.cors.origin
- backend.database.connection (postgres user, password from env var)
- backend.auth.externalAccess (legacy service-to-service auth)

* run pre-commit hooks

* chore(rhdh): replace disabled with enabled in dynamic plugin configs [RHIDP-14726]

Align the rhdh chart with the backstage chart change from PR #453:
use `enabled: true` instead of `disabled: false` for dynamic plugin
entries in values, schema, CI files, and documentation.

Assisted-by: Claude

* run pre-commit hooks

* fix(rhdh): fix lightspeed RAG init permissions and bump lightspeed-stack to 0.5.2

Use --no-preserve=mode,ownership when copying RAG data so the sidecar
(UID 1001) can access files written by the init container (UID 65532).
Pre-create the notebooks subdirectory and chmod the copied data to
prevent PermissionError on vanilla Kubernetes.

Also bump lightspeed-stack sidecar from 0.5.1 to 0.5.2.

Refs:
- #460
- #461

Assisted-by: Claude

* fix(ci): drop runAsUser/runAsGroup overrides for rhdh chart on KinD

The RAG init container permission fix (--no-preserve=mode,ownership +
chmod) makes a shared UID unnecessary. Only fsGroup is needed, matching
the backstage chart CI setup.

Assisted-by: Claude

* refactor(rhdh): move CI-only overrides from values files to test action

Move route.enabled=false and postgresql.primary.persistence.enabled=false
from all 7 rhdh CI values files into the test-charts action as --set
flags. These are KinD environment workarounds, not chart-specific test
scenarios.

Assisted-by: Claude

* chore(rhdh): apply Helm best practices to values.yaml

- Quote all string values consistently (Helm best practice: YAML type
  coercion is counterintuitive; wildcardPolicy: None is especially
  dangerous as YAML 1.1 treats it as null)
- Add missing helm-docs comments for nodeSelector, tolerations, affinity
- Remove duplicate catalogIndex comment
- Remove dead networkPolicy configuration (no template references it)
- Rename externalDBsecretRef to externalDBSecretRef (camelCase fix)
- Regenerate values.schema.json and README.md

Assisted-by: Claude

* chore(rhdh): remove diagnosticMode from values and deployment template

kubectl debug (stable since K8s 1.25, chart requires 1.27+) is the
standard way to debug running pods without mutating the Deployment spec
or requiring a Helm upgrade cycle.

Assisted-by: Claude

* chore(rhdh): downgrade postgresql subchart to 16.2.5

Starting with 16.3.0, the bitnami common library rejects non-bitnami
images unless global.security.allowInsecureImages is set. Since this
chart ships a Fedora-based PostgreSQL image, that setting was required
and confusing for users. Pin to 16.2.5 (the last version without the
check) and remove the allowInsecureImages workaround entirely.

See bitnami/charts#30850

Assisted-by: Claude

* refactor(rhdh): rename securityContext to containerSecurityContext

The pod has multiple containers (main RHDH, lightspeed sidecar, init
containers), so the bare name securityContext is ambiguous. Rename to
containerSecurityContext to clarify it applies only to the main RHDH
container, matching the podSecurityContext / containerSecurityContext
naming convention from Kubernetes.

Assisted-by: Claude

* refactor(rhdh): reuse containerSecurityContext for install-dynamic-plugins

The init container had the same security context hardcoded. Use the
shared containerSecurityContext value so users can adjust it in one
place for both the main container and the init container.

Assisted-by: Claude

* feat(rhdh): make dynamic-plugins-root volume configurable

Expose dynamicPlugins.volume with a type selector (ephemeral, emptyDir,
pvc) and raw Kubernetes volume specs for each type. Users can now
customize the storage class, size, access mode, or switch to an emptyDir
or pre-existing PVC without forking the template.

Assisted-by: Claude

* refactor(rhdh): rename extra resource fields for clarity

Rename volumes → extraVolumes, volumeMounts → extraVolumeMounts,
containers → extraContainers, initContainers → extraInitContainers.
The "extra" prefix makes it explicit that these are appended to
system defaults, not replacing them.

Assisted-by: Claude

* refactor(rhdh): rename env to extraEnv for consistency

Follows the same naming convention as the other extra resource fields
(extraVolumes, extraVolumeMounts, extraContainers, extraInitContainers).

Assisted-by: Claude

* feat(rhdh): add extraArgs and make args a full override

args now fully overrides the container arguments, skipping the system
--config flags. extraArgs appends additional arguments after the system
--config flags for users who just need to pass extra options.

Assisted-by: Claude

* fix(rhdh): reorder --config args so extraAppConfig overrides appConfig

Backstage uses last-wins for --config ordering. Move the inline
appConfig before extraAppConfig so that external ConfigMaps can
override the chart's built-in configuration.

Assisted-by: Claude

* refactor(rhdh): rename args to argsOverride for clarity

The name argsOverride makes it explicit that setting this field
replaces the default system --config arguments entirely, steering
users toward extraArgs for the common append use case.

Assisted-by: Claude

* feat(rhdh): add envOverride for full env control

Same pattern as argsOverride/extraArgs: envOverride replaces all
system env vars (BACKEND_SECRET, DB credentials, etc.), while
extraEnv appends after them.

Assisted-by: Claude

* run pre-commit hooks

* refactor(rhdh): group OpenShift fields under openshift parent

Move clusterRouterBase and route under openshift.clusterRouterBase
and openshift.route respectively. This makes it clear which values
are OCP-specific and which are platform-agnostic.

Assisted-by: Claude

* refactor(rhdh): reorganize values.yaml by functional category

Group fields into labeled sections (Global, Image, App Config,
Dynamic Plugins, Deployment/Pod, Networking, OpenShift, Database,
Observability, Built-in Features, Testing) for easier navigation.
Reorder only — no functional change.

Assisted-by: Claude

* refactor(rhdh): centralize labels and remove hardcoded namespace

Move `app.kubernetes.io/component: backstage` into the
`rhdh.selectorLabels` helper instead of repeating it inline in
every template. Remove `namespace:` from all resource metadata —
Helm injects it at install time per best practice.

Also add standard labels to lightspeed, orchestrator, and test
templates that previously lacked them, and move orchestrator
templates into an `orchestrator/` subdirectory.

Assisted-by: Claude

* fix(rhdh): fix annotation ordering in route and add commonAnnotations support

Fix route.yaml annotation rendering order to match all other
templates: commonAnnotations first, then resource-specific
annotations (so resource-specific wins on key conflicts).

Add commonAnnotations support to templates that previously lacked
it: lightspeed configmaps/secret, orchestrator network-policies/
sonataflows, and test-connection/test-secret pods.

Assisted-by: Claude

* fix(rhdh): lowercase and truncate DB creation Job name

Replicate the fix from PR #466 (backstage chart) into the rhdh
chart. Chart versions with uppercase characters (e.g. CI builds)
produced Job names violating RFC 1123 subdomain rules.

Add rhdh.orchestrator.dbJobName helper that lowercases the name
and truncates to 63 chars while preserving the version suffix.

Ref: #466

Assisted-by: Claude

* chore(backstage): mark chart as deprecated and bump to 6.2.3

Assisted-by: Claude

* docs: update root README with all charts and their status

Assisted-by: Claude

* fix(rhdh): respect global.imageRegistry for catalog index images

Assisted-by: Claude

* refactor(rhdh): simplify lightspeed configuration

- Reduce helpers from 11 to 4 by inlining checksums, volume names, and
  file lookups at call sites
- Replace configMaps array with named config map (stack, server, profile)
  using existingConfigMap.name/key override pattern
- Rename initContainer/sidecar to ragInit/core; hardcode container names
- Hardcode ragVolume as emptyDir (always rebuilt by init container)
- Rename command/args to commandOverride/argsOverride with defaults
  baked into templates
- Rename env to extraEnv; add extraVolumeMounts to ragInit and core
- Add preInitContainers for running init containers before system ones
- Replace secret creation with existingSecretRef; move bundled secret
  to secret.example.yaml as reference template
- Add ConfigMap volume items for key validation at scheduling time

Assisted-by: Claude

* refactor(rhdh): restructure orchestrator configuration

- Group external DB fields under externalDB (secretRef, name, host, port)
- Group DB creation job fields under dbCreationJob (backoffLimit,
  ttlSecondsAfterFinished, activeDeadlineSeconds, image, initImage)
- Convert all image references to structured registry/repository/tag/digest
  maps, honoring global.imageRegistry via common.images.image
- DB job images default to postgresql subchart image via tpl expressions
- Add dataIndex.image and jobService.image as structured image overrides
- Add rhdh.orchestrator.image helper for tpl-aware image resolution
- Add rhdh.image.hasOverride helper for checking non-empty image maps

Assisted-by: Claude

* test(rhdh): add CI test for lightspeed with existing ConfigMaps and Secret

Add a ct values file that configures lightspeed with existingConfigMap
references and existingSecretRef, exercising the external-resource code
path. A Helm pre-install hook creates the required ConfigMaps (from
bundled files) and a dummy Secret in the release namespace.

Also fix the stale with-lightspeed-service-host CI values file which
still used the old sidecar.env field name instead of core.extraEnv.

Assisted-by: Claude

* fix(rhdh): pin catalog index image to 1.10.1

The `next` catalog index image is currently unstable. Pin to 1.10.1
until it stabilizes.

Assisted-by: Claude

* feat(rhdh): add missing upstream features from backstage/charts

- Add dual-stack service support (ipFamilyPolicy, ipFamilies) and
  NodePort configuration
- Guard clusterIP and externalTrafficPolicy to appropriate service types
- Switch user-extensible values (tolerations, affinity, nodeSelector,
  podAnnotations, podLabels, extraVolumes, extraVolumeMounts, strategy,
  topologySpreadConstraints, hostAliases) from toYaml to
  common.tplvalues.render so Go template expressions are evaluated
- Add HTTPRoute labels, per-rule timeouts and name fields
- Add ServiceAccount custom labels
- Support postgresql.architecture=replication in hostname helper

Assisted-by: Claude

* fix(rhdh): pin catalog index image to 1.10.2

The `next` catalog index image is currently unstable. Pin to 1.10.2
until it stabilizes.

Assisted-by: Claude

* fix(rhdh): bump lightspeed-core image from 0.5.2 to 0.5.3

Reflects the same bump from #475 on the main branch.

Assisted-by: Claude

* refactor(rhdh): improve configurability of auth, envFrom, and init container

- Replace auth.backend.existingSecret with auth.backend.existingSecretRef
  (name + key fields, key defaults to "backend-secret")
- Split envFrom into envFromOverride (full replace) and extraEnvFrom (append),
  both accepting raw Kubernetes envFrom entries with tplvalues.render support
- Make install-dynamic-plugins init container configurable: commandOverride,
  argsOverride, extraEnv, extraVolumeMounts, resources, and securityContext
  (falls back to containerSecurityContext when empty)

Assisted-by: Claude

* fix(rhdh): use POSTGRES_PASSWORD in default appConfig

The default appConfig referenced ${POSTGRESQL_ADMIN_PASSWORD} but the
deployment template injects POSTGRES_PASSWORD into the RHDH pod.
POSTGRESQL_ADMIN_PASSWORD only exists on the postgresql subchart pod.

Assisted-by: Claude

* refactor(rhdh): use tplvalues.render consistently for user-facing values

Replace toYaml with common.tplvalues.render for all user-facing values
so that Go template expressions embedded in values.yaml are evaluated
at render time. This enables patterns like:

  commonAnnotations:
    custom/sha: "{{ .Release.Name }}-{{ .Chart.Version }}"

Changes across 14 template files:
- _helpers.tpl: commonLabels in rhdh.labels
- deployment.yaml: podSecurityContext, containerSecurityContext,
  resources, 3 probes, init container securityContext, 3 volume specs
- commonAnnotations in all resource templates
- ingress.yaml: ingress.annotations
- servicemonitor.yaml: serviceMonitor.labels and .annotations
- httproute.yaml: parentRefs and hostnames

Kept toYaml for: deep-copy idiom (_helpers.tpl), internal helper output,
service.yaml CIDR/ipFamilies, httproute matches/filters/timeouts, tests.

Assisted-by: Claude

* fix(rhdh): correct lightspeed schema and add missing sub-field definitions

Change lightspeed type from ["boolean", "object"] to "object" and set
additionalProperties to false for stricter validation.

Add schema definitions for all lightspeed sub-fields:
- config: stack/server/profile with existingConfigMap {name, key}
- existingSecretRef: string for envFrom secret injection
- ragInit: image, imagePullPolicy, commandOverride, argsOverride,
  extraEnv, extraVolumeMounts, resources, securityContext
- core: same shape as ragInit

Assisted-by: Claude

* refactor(rhdh): rename command to commandOverride for main container

All sub-containers (dynamicPlugins.initContainer, lightspeed.core,
lightspeed.ragInit) already use commandOverride. Rename the main
container's field for API consistency.

Assisted-by: Claude

* refactor(rhdh): standardize secret reference naming

Convention: existingSecretRef: {name, key} for single-key references,
existingSecret: "name" for whole-secret injection via envFrom.

Renames:
- lightspeed.existingSecretRef → lightspeed.existingSecret
- orchestrator.sonataflowPlatform.externalDB.secretRef →
  orchestrator.sonataflowPlatform.externalDB.existingSecret

auth.backend.existingSecretRef is unchanged (correctly uses {name, key}
for single-key reference).

Assisted-by: Claude

* fix(rhdh): use rhdh.fullname for resource names to respect overrides

Replace .Release.Name with rhdh.fullname in resource names so that
nameOverride and fullnameOverride are respected consistently.

Changes:
- _helpers.tpl: rhdh.backend-secret-name, rhdh.lightspeed.configMapName,
  rhdh.orchestrator.dbJobName
- orchestrator/network-policies.yaml: all 4 NetworkPolicy names

PostgreSQL helpers intentionally kept using .Release.Name — the bitnami
subchart names its resources that way.

Assisted-by: Claude

* feat(rhdh): add extraArgs to sub-containers

Add extraArgs field to dynamicPlugins.initContainer, lightspeed.ragInit,
and lightspeed.core. extraArgs appends arguments after defaults when
argsOverride is not set; ignored when argsOverride provides full
replacement.

Assisted-by: Claude

* feat(rhdh): add external database support

Add externalDatabase section for connecting to an external PostgreSQL
instance when the built-in subchart is disabled (postgresql.enabled:
false).

New values:
  externalDatabase:
    host: ""
    port: 5432
    user: "postgres"
    existingSecretRef:
      name: ""
      key: "password"

When postgresql.enabled is false and externalDatabase.host is set,
the deployment injects POSTGRES_HOST, POSTGRES_PORT, POSTGRES_USER,
and POSTGRES_PASSWORD env vars from the external config. When neither
is set, no database env vars are injected (BYO via extraEnv).

Also updates rhdh.postgresql.host helper to return externalDatabase.host
when the built-in database is disabled.

Adds CI test values: with-external-db-values.yaml and
with-extra-app-config-values.yaml.

Assisted-by: Claude

* feat(rhdh): honor global.defaultStorageClass for dynamic plugins volume

Wire the Bitnami common.storage.class helper into the ephemeral volume
spec so that global.defaultStorageClass is applied automatically.

Add dynamicPlugins.volume.storageClassName for direct overrides. When
empty, the cluster default StorageClass is used. Set to "-" to
explicitly disable dynamic provisioning (renders storageClassName: "").

An empty string is never rendered as storageClassName — only non-empty
values or the explicit "-" opt-out produce the field, avoiding the
Kubernetes semantic difference between omitted and empty-string.

Assisted-by: Claude

* refactor(rhdh): flatten ephemeral volume config in values

Replace the nested ephemeral.volumeClaimTemplate.spec structure with
flat fields under dynamicPlugins.volume.ephemeral (storageClassName,
accessModes, resources). The deployment template builds the proper
Kubernetes ephemeral volume spec from these fields.

Move storageClassName into the ephemeral section since it only applies
to that volume type.

Assisted-by: Claude

* chore(backstage): bump version to 6.2.10

Reserve version headroom for potential updates to the legacy chart
before the rhdh chart is merged, making rebase conflicts explicit.

Assisted-by: Claude

* refactor(rhdh): use fixed namespace for CI tests and remove test injection flags

Use a fixed `ct-charts` namespace for all `ct install` runs so that
pre-created Kubernetes resources (Secrets, ConfigMaps) persist across
ci/ values file tests. This replaces the per-chart test injection flags
(`test.injectTestNpmrcSecret`, `test.injectTestLightspeedResources`)
with resource creation in the CI action, keeping the chart API clean.

Also sets up an external PostgreSQL instance for the `with-external-db`
CI test, deployed via the same Bitnami chart version and image declared
in the rhdh chart dependency.

Assisted-by: Claude

* chore(rhdh): remove redundant overrides from CI values files

Remove openshift.route.enabled and test.enabled from ci/ values files
since these are already set via --helm-extra-set-args in the CI action.

Assisted-by: Claude

* chore(rhdh): drop npmrc CI test and comment out its secret creation

The dynamic-plugins-npmrc volume is optional in the deployment, so no
dedicated ci/ values file is needed to exercise it. Comment out the
corresponding secret creation in the CI action for future reference.

Assisted-by: Claude

* fix(rhdh): remove inaccurate storageClassName comment

The Bitnami common.storage.class helper does not treat "-" as a special
value to disable dynamic provisioning.

Assisted-by: Claude

* feat(rhdh): expose dynamicPlugins.maxEntrySize and fix external DB CI setup

Add dynamicPlugins.maxEntrySize to values.yaml so users can configure
the MAX_ENTRY_SIZE env var for the install-dynamic-plugins init container.

Fix the external PostgreSQL CI setup to pass the Fedora/sclorg-specific
env var (POSTGRESQL_ADMIN_PASSWORD) and data directory, which the image
requires to start.

Assisted-by: Claude

* refactor(rhdh): consolidate CI values files and remove dbCreationJob.initImage

Reduce ci/ values files from 9 to 4 by merging related test scenarios:
- with-external-db now also tests orchestrator with external DB
- with-custom-configuration merges extraAppConfig, lightspeed existing
  config, lightspeed service host, and orchestrator
- Drop low-value files (custom test pod image, disabled test pod)

Remove dbCreationJob.initImage — the wait-for-db init container now
reuses dbCreationJob.image.

Assisted-by: Claude

* chore(rhdh): switch catalogIndex image tag to next

Assisted-by: Claude

* chore(rhdh): skip dynamic plugin downloads in CI values files

Skip plugin installation in CI to speed up test cycles. The chart
features under test (deployment, config, probes) don't depend on
actual plugins.

Assisted-by: Claude

* feat(rhdh): add wait-for-db init container to deployment

Prevents a race condition where Backstage starts before the bundled
PostgreSQL is ready, causing built-in plugins to fail with
ECONNREFUSED and the pod to get stuck (alive but not ready).

The init container reuses the chart's PostgreSQL image, runs after
the dynamic-plugins and lightspeed-rag-init init containers, and is
conditionally included only when a database is configured
(postgresql.enabled or externalDatabase.host).

Assisted-by: Claude

* fix(ci): increase PostgreSQL ephemeral-storage limit for rhdh tests

With persistence disabled in CI, PostgreSQL writes to an emptyDir
that counts against the 20Mi ephemeral-storage limit, causing the
pod to be evicted during initdb. Raise to 200Mi.

Assisted-by: Claude

* chore(ci): exclude deprecated backstage chart from ct install tests

Assisted-by: Claude

* chore(ci): remove deprecated backstage chart references from test action

Assisted-by: Claude

* feat(rhdh): default ingress host to top-level host value and enable ingress in CI

Assisted-by: Claude

* chore(ci): exclude backstage from test matrix and adapt image overrides for rhdh

Assisted-by: Claude

* chore(ci): skip plugin downloads in rhdh CI and add full-plugins nightly override

Empty the default, lightspeed and orchestrator plugin lists in rhdh CI
values files instead of disabling lightspeed, matching the pattern used
by the backstage chart. The nightly and PR test workflows now generate a
full-plugins values override for the rhdh chart so that nightly runs
exercise the real plugin lists and PR template sanity checks verify all
CI scenarios render cleanly with them.

Also remove all backstage-specific references from the test and nightly
workflows since the deprecated backstage chart is excluded from CI.

* chore(ci): per-branch chart discovery in nightly workflow

Read each branch's ct.yaml via git show to determine which charts to
test, producing a {branch, chart} matrix instead of a cross-product.
This lets each branch's own exclusion list control what gets tested —
backstage is included on release-1.* branches (where it is active) and
excluded on main and future release-2.* branches (where ct.yaml marks
it as deprecated).

* docs(ci): clarify extra_helm_args vs helm_extra_args input descriptions

Update input descriptions in the test-charts action and add inline
comments at the nightly workflow call site to clarify the difference:
extra_helm_args passes --set overrides via --helm-extra-set-args, while
helm_extra_args passes general helm flags via --helm-extra-args.

* chore: add rhdh chart lightspeed path to CODEOWNERS

* fix(ci): consolidate upgrade skip logic to avoid duplicate --upgrade flag

The two separate blocks that appended --upgrade to ct install args could
both fire, passing the flag twice. Merge them into a single block that
checks all skip conditions (new chart, unchanged version, major bump)
before deciding once.

* fix(rhdh): only render includes and plugins in dynamic-plugins ConfigMap

deepCopy of the entire dynamicPlugins object leaked unrelated fields
(initContainer, volume, maxEntrySize) into the ConfigMap. Build the
output dict from just the includes key instead.

* chore(ci): scan rhdh chart instead of deprecated backstage in Snyk and SonarCloud

Switch the Snyk workflow matrix from backstage to rhdh and add a
sonar-project.properties to exclude the deprecated backstage chart
from SonarCloud analysis, fixing the duplication alert on rhdh-profile.py.

* fix(ci): exclude deprecated backstage chart from SonarCloud duplication detection

sonar.exclusions only covers bug/vulnerability analysis. Add
sonar.cpd.exclusions to also exclude the backstage chart from the
Copy-Paste Detector, fixing the duplication alert on rhdh-profile.py.

* fix(ci): use .sonarcloud.properties for duplication exclusions

SonarCloud auto-analysis ignores sonar-project.properties and reads
.sonarcloud.properties instead. Move the exclusions there and add
sonar.cpd.exclusions to exclude the deprecated backstage chart from
duplication detection. Remove the unused sonar-project.properties.

* feat(rhdh): expose imagePullSecrets, pullPolicy and securityContext for test pod

Wire up global.imagePullSecrets via the rhdh.imagePullSecrets helper,
make imagePullPolicy configurable via test.image.pullPolicy, and allow
overriding the container securityContext via test.securityContext.

* chore: remove deprecated backstage helm-dependency-update pre-commit hook

* docs(rhdh): fix README to match current values structure

- Update orchestrator externalDB examples to use nested keys
  (externalDB.existingSecret/name/host/port) instead of flat keys
- Show proper dynamicPlugins.plugins YAML structure in notifications example
- Fix argsOverride/extraArgs descriptions not rendering in values table
- Update test pod section to mention pullPolicy and securityContext
- Fix typo: recieve -> receive

* docs(rhdh): clarify override fields, hostname derivation, and vanilla K8s example

- Document *Override fields (envOverride, commandOverride, etc.) as
  escape hatches from the "add, don't replace" pattern
- Replace inaccurate "automatic hostname discovery" note with actual
  hostname derivation logic
- Remove runAsUser/runAsGroup from vanilla Kubernetes example

* fix(ci): remove hardcoded --debug from ct-install helm-extra-args

The RUNNER_DEBUG gate in the test-charts action already adds --debug
to ct when needed; having it hardcoded in ct-install.yaml caused noisy
helm debug logs on every CI run.

* docs: update stale backstage chart references across docs and tooling

Replace deprecated backstage chart paths and values structure with rhdh
chart equivalents in docs, CONTRIBUTING.md, and orchestrator-software-templates.

* fix(rhdh): wire database host/port/user into default appConfig

The default appConfig.backend.database.connection now references
${POSTGRES_HOST}, ${POSTGRES_PORT}, and ${POSTGRES_USER} env vars
that the chart already injects. This eliminates the need for users
to duplicate externalDatabase connection info in appConfig overrides.

Simplify docs/external-db.md accordingly: remove the redundant
appConfig block, fix externalDatabase to use literal values instead
of env var references, and split secrets (password vs TLS env vars).

* fix: address review feedback on schema, validation, and docs

- Remove dead name/mountPath properties from runtimeVolume schema
  (hardcoded in deployment.yaml, silently ignored with additionalProperties: false)
- Fix stale catalogIndex.image.tag template default (1.10.2 -> next)
- Align template defaults for extraPorts and lightspeed.plugins with values.yaml
- Add required guard on externalDatabase.existingSecretRef.name to fail
  at template time instead of producing a confusing K8s API error
- Add docs/external-db.md reference in values.yaml externalDatabase comment

Co-authored-by: Tomas Kral <tomas.kral@gmail.com>
Assisted-by: Claude

---------

Co-authored-by: Tomas Kral <tomas.kral@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation enhancement New feature or request lgtm

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants