diff --git a/charts/rhdh/Chart.yaml b/charts/rhdh/Chart.yaml index 29620c62..b1c1ade8 100644 --- a/charts/rhdh/Chart.yaml +++ b/charts/rhdh/Chart.yaml @@ -1,7 +1,7 @@ apiVersion: v2 name: redhat-developer-hub type: application -version: 2.0.0 +version: 2.0.1 appVersion: 2.1.0 annotations: artifacthub.io/category: integration-delivery diff --git a/charts/rhdh/README.md b/charts/rhdh/README.md index d359da0d..0830c8b5 100644 --- a/charts/rhdh/README.md +++ b/charts/rhdh/README.md @@ -1,7 +1,7 @@ # RHDH Helm Chart for OpenShift and Kubernetes -![Version: 2.0.0](https://img.shields.io/badge/Version-2.0.0-informational?style=flat-square) +![Version: 2.0.1](https://img.shields.io/badge/Version-2.0.1-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) A Helm chart for deploying Red Hat Developer Hub, which is a Red Hat supported version of Backstage. @@ -36,7 +36,7 @@ For the **Generally Available** version of this chart, see: helm repo add bitnami https://charts.bitnami.com/bitnami helm repo add redhat-developer https://redhat-developer.github.io/rhdh-chart -helm install my-rhdh redhat-developer/redhat-developer-hub --version 2.0.0 +helm install my-rhdh redhat-developer/redhat-developer-hub --version 2.0.1 ``` ## Introduction @@ -159,9 +159,9 @@ The command removes all the Kubernetes components associated with the chart and ## Upgrading from the backstage chart (RHDH 1.y) -> **Note:** This section is a work in progress. A detailed migration guide will be provided before the GA release of RHDH 2.y. +If you are upgrading from the legacy `backstage` chart (used in RHDH 1.y), the new `redhat-developer-hub` chart is a clean break. The values structure has changed significantly — all `global.*` and `upstream.backstage.*` nesting has been flattened to root-level keys. You cannot pass your old values file directly to the new chart; you must migrate your values first, then `helm upgrade` the release in place. -If you are upgrading from the legacy `backstage` chart (used in RHDH 1.y), the new `redhat-developer-hub` chart is a clean break. The values structure has changed significantly — all `global.*` and `upstream.backstage.*` nesting has been flattened to root-level keys. A `helm upgrade` from the old chart to this one is **not** supported; you will need to perform a fresh install with migrated values. +See the [Migration guide](docs/migration-from-backstage-chart.md) for step-by-step instructions and a complete values mapping reference. ## Requirements @@ -271,7 +271,7 @@ Kubernetes: `>= 1.31.0-0` | intelligentAssistant.runtimeVolume.type | Volume type: "emptyDir" or "persistentVolumeClaim". | string | `"emptyDir"` | | livenessProbe | Liveness probe configuration. | object | `{"failureThreshold":3,"httpGet":{"path":"/.backstage/health/v1/liveness","port":"backend","scheme":"HTTP"},"periodSeconds":10,"successThreshold":1,"timeoutSeconds":4}` | | metrics | Prometheus metrics configuration. | object | `{"serviceMonitor":{"annotations":{},"enabled":false,"interval":"","labels":{},"path":"/metrics","port":"http-metrics"}}` | -| nameOverride | Override the chart name used in resource naming. | string | `""` | +| nameOverride | Override the chart name used in resource naming. | string | `"developer-hub"` | | nodeSelector | Node labels for pod assignment. | object | `{}` | | openshift | OpenShift-specific configuration. | object | `{"clusterRouterBase":"apps.example.com","route":{"annotations":{},"enabled":true,"host":"{{ .Values.host }}","path":"/","tls":{"caCertificate":"","certificate":"","destinationCACertificate":"","enabled":true,"insecureEdgeTerminationPolicy":"Redirect","key":"","termination":"edge"},"wildcardPolicy":"None"}}` | | openshift.clusterRouterBase | Cluster router base domain used to auto-generate the hostname. | string | `"apps.example.com"` | diff --git a/charts/rhdh/README.md.gotmpl b/charts/rhdh/README.md.gotmpl index 8f25764e..8cdc62dd 100644 --- a/charts/rhdh/README.md.gotmpl +++ b/charts/rhdh/README.md.gotmpl @@ -150,9 +150,9 @@ The command removes all the Kubernetes components associated with the chart and ## Upgrading from the backstage chart (RHDH 1.y) -> **Note:** This section is a work in progress. A detailed migration guide will be provided before the GA release of RHDH 2.y. +If you are upgrading from the legacy `backstage` chart (used in RHDH 1.y), the new `redhat-developer-hub` chart is a clean break. The values structure has changed significantly — all `global.*` and `upstream.backstage.*` nesting has been flattened to root-level keys. You cannot pass your old values file directly to the new chart; you must migrate your values first, then `helm upgrade` the release in place. -If you are upgrading from the legacy `backstage` chart (used in RHDH 1.y), the new `redhat-developer-hub` chart is a clean break. The values structure has changed significantly — all `global.*` and `upstream.backstage.*` nesting has been flattened to root-level keys. A `helm upgrade` from the old chart to this one is **not** supported; you will need to perform a fresh install with migrated values. +See the [Migration guide](docs/migration-from-backstage-chart.md) for step-by-step instructions and a complete values mapping reference. {{ template "chart.requirementsSection" . }} diff --git a/charts/rhdh/docs/migration-from-backstage-chart.md b/charts/rhdh/docs/migration-from-backstage-chart.md new file mode 100644 index 00000000..e45aaa35 --- /dev/null +++ b/charts/rhdh/docs/migration-from-backstage-chart.md @@ -0,0 +1,241 @@ +# Migration guide: `backstage` chart (RHDH 1.y) to `redhat-developer-hub` chart (RHDH 2.y) + +This `redhat-developer-hub` chart is a clean break from the 1.y `backstage` chart. +The old chart delegated most Kubernetes resource creation to an embedded upstream +[Backstage subchart](https://github.com/backstage/charts), so values lived under +`upstream.backstage.*` and `global.*`. The new chart owns all templates directly and +flattens configuration to root-level keys. + +> [!IMPORTANT] +> Because the values structure has changed, you cannot pass your old values file +> directly to the new chart. You must migrate your values first, then +> `helm upgrade` the release in place. Tooling (a migration script or AI skill) +> to automate the values conversion is planned in the near future. + +## Migration steps + +1. Locate your existing values file (typically stored in your Git repo or + locally). If you don't have it, you can export the user-supplied overrides + from a running release: + + ```bash + helm get values -o yaml > old-values.yaml + ``` + +2. Create a new values file using the mapping tables below to translate each + setting to its new path. + +3. Upgrade the existing release in place with the new chart and migrated values: + + ```bash + helm upgrade --install redhat-developer/redhat-developer-hub -f new-values.yaml + ``` + +4. Verify the deployment is healthy. + +## Key structural changes + +| Aspect | Old chart (`backstage`) | New chart (`redhat-developer-hub`) | +|--------|------------------------|------------------------------------| +| Chart name | `backstage` | `redhat-developer-hub` (but `nameOverride` defaults to `developer-hub`, so resource names and Route URLs are preserved) | +| Template ownership | Delegates to upstream Backstage subchart | Owns all templates directly | +| System volumes/mounts/env | User had to list them in full under `upstream.backstage.extraVolumes`, `extraVolumeMounts`, `extraEnvVars` | Hardcoded in templates; `extra*` keys only add user values | +| Init containers | User had to specify the full init container array | System init containers are managed; use `preInitContainers` / `extraInitContainers` to add custom ones | +| Database env vars | `POSTGRESQL_ADMIN_PASSWORD` injected manually via `upstream.backstage.extraEnvVars` | `POSTGRES_HOST`, `POSTGRES_PORT`, `POSTGRES_USER`, `POSTGRES_PASSWORD` auto-injected | +| Image digests | No dedicated field | Every image (`image`, `catalogIndex.image`, `intelligentAssistant.core.image`, etc.) has a `digest` field for pinning by digest | +| Global image registry | Not available | `global.imageRegistry` overrides the registry for all container images consistently — useful for disconnected / air-gapped environments | +| Lightspeed | `global.lightspeed.*` | Rebranded to `intelligentAssistant.*` | +| OpenShift Route | `route.*` | `openshift.route.*` | + +## Values mapping reference + +### Container image + +| Old path | New path | +|----------|----------| +| `upstream.backstage.image.registry` | `image.registry` | +| `upstream.backstage.image.repository` | `image.repository` | +| `upstream.backstage.image.tag` | `image.tag` | +| `upstream.backstage.image.pullPolicy` | `image.pullPolicy` | + +### Global parameters + +| Old path | New path | Notes | +|----------|----------|-------| +| `global.clusterRouterBase` | `openshift.clusterRouterBase` | | +| `global.host` | `host` | Promoted to root | +| `global.imagePullSecrets` | `global.imagePullSecrets` | Unchanged (used by bitnami subcharts) | + +### App config + +| Old path | New path | Notes | +|----------|----------|-------| +| `upstream.backstage.appConfig` | `appConfig` | Entire tree flattened to root | +| `upstream.backstage.appConfig.backend.database.connection.password` | `appConfig.backend.database.connection.password` | Env var changed from `POSTGRESQL_ADMIN_PASSWORD` to `POSTGRES_PASSWORD` | +| `upstream.backstage.appConfig.backend.database.connection.user` | `appConfig.backend.database.connection.user` | Env var changed from hardcoded `postgres` to `POSTGRES_USER` | + +### Authentication + +| Old path | New path | Notes | +|----------|----------|-------| +| `global.auth.backend.enabled` | `auth.backend.enabled` | | +| `global.auth.backend.existingSecret` | `auth.backend.existingSecretRef.name` | Now an object with `name` and `key` | +| _(none)_ | `auth.backend.existingSecretRef.key` | Defaults to `backend-secret` | +| `global.auth.backend.value` | `auth.backend.value` | | + +### Dynamic plugins + +| Old path | New path | Notes | +|----------|----------|-------| +| `global.dynamic.includes` | `dynamicPlugins.includes` | | +| `global.dynamic.plugins` | `dynamicPlugins.plugins` | | +| `upstream.backstage.extraVolumes` _(dynamic-plugins-root)_ | `dynamicPlugins.volume.*` | Declarative config replaces raw volume spec | +| `upstream.backstage.initContainers[0].resources` | `dynamicPlugins.initContainer.resources` | | +| `upstream.backstage.initContainers[0].securityContext` | `dynamicPlugins.initContainer.securityContext` | | +| `upstream.backstage.initContainers[0].env` | `dynamicPlugins.initContainer.extraEnv` | System env vars auto-injected | + +### Container command, args, and env + +| Old path | New path | Notes | +|----------|----------|-------| +| `upstream.backstage.command` | `commandOverride` | | +| `upstream.backstage.args` | `argsOverride` | System `--config` flags now auto-injected | +| `upstream.backstage.extraEnvVars` | `extraEnv` | System env vars auto-injected; only add custom ones | + +### Volumes and mounts + +| Old path | New path | Notes | +|----------|----------|-------| +| `upstream.backstage.extraVolumes` | `extraVolumes` | Only user additions; system volumes are hardcoded | +| `upstream.backstage.extraVolumeMounts` | `extraVolumeMounts` | Only user additions; system mounts are hardcoded | + +### Init containers and sidecars + +| Old path | New path | Notes | +|----------|----------|-------| +| `upstream.backstage.initContainers` | _(managed by chart)_ | System init containers no longer user-configurable | +| _(none)_ | `preInitContainers` | Runs **before** system init containers | +| _(none)_ | `extraInitContainers` | Runs **after** system init containers | +| _(none)_ | `extraContainers` | Additional sidecars | + +### Security contexts and resources + +| Old path | New path | +|----------|----------| +| `upstream.backstage.containerSecurityContext` | `containerSecurityContext` | +| `upstream.backstage.resources` | `resources` | + +### Probes + +| Old path | New path | +|----------|----------| +| `upstream.backstage.startupProbe` | `startupProbe` | +| `upstream.backstage.readinessProbe` | `readinessProbe` | +| `upstream.backstage.livenessProbe` | `livenessProbe` | + +### Service + +| Old path | New path | +|----------|----------| +| `upstream.service.extraPorts` | `service.extraPorts` | + +### OpenShift Route + +| Old path | New path | +|----------|----------| +| `route.enabled` | `openshift.route.enabled` | +| `route.annotations` | `openshift.route.annotations` | +| `route.host` | `openshift.route.host` | +| `route.path` | `openshift.route.path` | +| `route.wildcardPolicy` | `openshift.route.wildcardPolicy` | +| `route.tls.enabled` | `openshift.route.tls.enabled` | +| `route.tls.termination` | `openshift.route.tls.termination` | +| `route.tls.certificate` | `openshift.route.tls.certificate` | +| `route.tls.key` | `openshift.route.tls.key` | +| `route.tls.caCertificate` | `openshift.route.tls.caCertificate` | +| `route.tls.destinationCACertificate` | `openshift.route.tls.destinationCACertificate` | +| `route.tls.insecureEdgeTerminationPolicy` | `openshift.route.tls.insecureEdgeTerminationPolicy` | + +### Ingress + +| Old path | New path | Notes | +|----------|----------|-------| +| `upstream.ingress.enabled` | `ingress.enabled` | | +| `upstream.ingress.host` | `ingress.hosts[].host` | Now an array of host objects | + +### Catalog index + +| Old path | New path | +|----------|----------| +| `global.catalogIndex.image.registry` | `catalogIndex.image.registry` | +| `global.catalogIndex.image.repository` | `catalogIndex.image.repository` | +| `global.catalogIndex.image.tag` | `catalogIndex.image.tag` | +| `global.catalogIndex.extraImages` | `catalogIndex.extraImages` | + +### PostgreSQL (bitnami subchart) + +| Old path | New path | +|----------|----------| +| `upstream.postgresql.enabled` | `postgresql.enabled` | +| `upstream.postgresql.postgresqlDataDir` | `postgresql.postgresqlDataDir` | +| `upstream.postgresql.serviceBindings.enabled` | `postgresql.serviceBindings.enabled` | +| `upstream.postgresql.image.*` | `postgresql.image.*` | +| `upstream.postgresql.auth.*` | `postgresql.auth.*` | +| `upstream.postgresql.primary.*` | `postgresql.primary.*` | + +### Metrics / monitoring + +| Old path | New path | +|----------|----------| +| `upstream.metrics.serviceMonitor.enabled` | `metrics.serviceMonitor.enabled` | +| `upstream.metrics.serviceMonitor.path` | `metrics.serviceMonitor.path` | +| `upstream.metrics.serviceMonitor.port` | `metrics.serviceMonitor.port` | + +### Intelligent Assistant (formerly Lightspeed) + +| Old path | New path | Notes | +|----------|----------|-------| +| `global.lightspeed.enabled` | `intelligentAssistant.enabled` | Default changed from `false` to `true` | +| `global.lightspeed.plugins` | `intelligentAssistant.plugins` | Plugin format changed from OCI to `ref://` | +| `global.lightspeed.sidecar.image` | `intelligentAssistant.core.image.*` | Single string split into `registry`/`repository`/`tag` | +| `global.lightspeed.sidecar.resources` | `intelligentAssistant.core.resources` | | +| `global.lightspeed.sidecar.securityContext` | `intelligentAssistant.core.securityContext` | | +| `global.lightspeed.sidecar.command` | `intelligentAssistant.core.commandOverride` | | +| `global.lightspeed.sidecar.args` | `intelligentAssistant.core.argsOverride` | | +| `global.lightspeed.sidecar.env` | `intelligentAssistant.core.extraEnv` | | +| `global.lightspeed.initContainer.image` | `intelligentAssistant.ragInit.image.*` | Single string split into `registry`/`repository`/`tag` | +| `global.lightspeed.initContainer.resources` | `intelligentAssistant.ragInit.resources` | | +| `global.lightspeed.initContainer.securityContext` | `intelligentAssistant.ragInit.securityContext` | | +| `global.lightspeed.initContainer.command` | `intelligentAssistant.ragInit.commandOverride` | | +| `global.lightspeed.initContainer.args` | `intelligentAssistant.ragInit.argsOverride` | | +| `global.lightspeed.initContainer.env` | `intelligentAssistant.ragInit.extraEnv` | | +| `global.lightspeed.runtimeVolume.type` | `intelligentAssistant.runtimeVolume.type` | | +| `global.lightspeed.runtimeVolume.emptyDir` | `intelligentAssistant.runtimeVolume.emptyDir` | | +| `global.lightspeed.runtimeVolume.persistentVolumeClaim` | `intelligentAssistant.runtimeVolume.persistentVolumeClaim` | | +| `global.lightspeed.configMaps` | `intelligentAssistant.config.{stack,server,profile}.existingConfigMap` | Array replaced with structured per-file config | +| `global.lightspeed.secret.create` / `.name` | `intelligentAssistant.existingSecret` | Simplified to a secret name string | + +### Orchestrator + +| Old path | New path | Notes | +|----------|----------|-------| +| `orchestrator.enabled` | `orchestrator.enabled` | | +| `orchestrator.plugins` | `orchestrator.plugins` | | +| `orchestrator.sonataflowPlatform.externalDBsecretRef` | `orchestrator.sonataflowPlatform.externalDB.existingSecret` | Restructured | +| `orchestrator.sonataflowPlatform.externalDBName` | `orchestrator.sonataflowPlatform.externalDB.name` | | +| `orchestrator.sonataflowPlatform.externalDBHost` | `orchestrator.sonataflowPlatform.externalDB.host` | | +| `orchestrator.sonataflowPlatform.externalDBPort` | `orchestrator.sonataflowPlatform.externalDB.port` | | +| `orchestrator.sonataflowPlatform.initContainerImage` | `orchestrator.sonataflowPlatform.dbCreationJob.image.*` | Single string split into structured image fields | +| `orchestrator.sonataflowPlatform.createDBJobImage` | `orchestrator.sonataflowPlatform.dbCreationJob.image.*` | Merged with `initContainerImage` | +| `orchestrator.sonataflowPlatform.dataIndexImage` | `orchestrator.sonataflowPlatform.dataIndex.image.*` | Single string split into structured image fields | +| `orchestrator.sonataflowPlatform.jobServiceImage` | `orchestrator.sonataflowPlatform.jobService.image.*` | Single string split into structured image fields | + +### Test pod + +| Old path | New path | Notes | +|----------|----------|-------| +| `test.enabled` | `test.enabled` | | +| `test.image.registry` | `test.image.registry` | | +| `test.image.repository` | `test.image.repository` | | +| `test.image.tag` | `test.image.tag` | Default changed from `latest` to a pinned version | +| `test.injectTestNpmrcSecret` | _(removed)_ | No longer needed | diff --git a/charts/rhdh/values.schema.json b/charts/rhdh/values.schema.json index 82d38fc8..30d9911c 100644 --- a/charts/rhdh/values.schema.json +++ b/charts/rhdh/values.schema.json @@ -1650,7 +1650,7 @@ "type": "object" }, "nameOverride": { - "default": "", + "default": "developer-hub", "title": "Override the chart name used in resource naming.", "type": "string" }, diff --git a/charts/rhdh/values.yaml b/charts/rhdh/values.yaml index a62983eb..94687ed2 100644 --- a/charts/rhdh/values.yaml +++ b/charts/rhdh/values.yaml @@ -14,7 +14,7 @@ global: # ── Chart metadata overrides ──────────────────────────────── # -- Override the chart name used in resource naming. -nameOverride: "" +nameOverride: developer-hub # -- Override the full resource name. fullnameOverride: "" # -- Labels applied to ALL chart resources.