apiVersion: v2
name: bp-catalyst-platform
version: 1.1.14
appVersion: 1.1.6
description: |
  Catalyst Platform — the unified Catalyst control plane umbrella chart for Catalyst-Zero.
  Composes the catalyst-{ui,api}, console, admin, marketplace UI modules and the marketplace-api backend.
  Deployed via Flux on Catalyst-Zero (Contabo k3s) and on every franchised Sovereign provisioned by Catalyst-Zero.
  Per docs/PROVISIONING-PLAN.md — this is the canonical bp-catalyst-platform Helm chart.

  As of 1.1.9 this umbrella contains ONLY the Catalyst-Zero control-plane
  workloads (catalyst-ui, catalyst-api, ProvisioningState CRD, Sovereign
  HTTPRoute). Foundation Blueprints (cilium, cert-manager, flux,
  crossplane, sealed-secrets, spire, nats-jetstream, openbao, keycloak,
  gitea) are installed independently by the bootstrap-kit at slots
  01..10 (see clusters/_template/bootstrap-kit/). Each lands in its own
  namespace (flux-system, cert-manager, kube-system, etc.) under its own
  Flux HelmRelease — install order owned by Flux dependsOn rather than
  this umbrella's Helm dependency graph.

  Bumped to 1.1.1 in lockstep with bp-external-dns 1.1.0 to reflect the
  dependency removal. Bumped to 1.1.2 to pull in bp-flux:1.1.2 — the
  catastrophic-double-install fix (omantel.omani.works incident,
  2026-04-29). See docs/RUNBOOK-PROVISIONING.md §"bp-flux double-install".
  Bumped to 1.1.3 to drop three stray kustomize index files
  (templates/kustomization.yaml, templates/marketplace-api/kustomization.yaml,
  templates/sme-services/kustomization.yaml) that Helm was rendering as
  resources with empty metadata.name — Helm post-render rejected the
  install on otech.omani.works, 2026-04-30.
  Bumped to 1.1.4 to give the bp-keycloak/bp-gitea embedded postgresql
  subcharts distinct fullnameOverride values (keycloak-postgresql /
  gitea-postgresql). Both bitnami postgresql subcharts default to
  `<release>-postgresql`, so they collided as
  `catalyst-platform-postgresql.catalyst-system` and Helm post-render
  refused the second occurrence — install_failed on otech.omani.works,
  2026-04-30 (issue #252).
  Bumped to 1.1.5 to remove three legacy Traefik-era ingress template
  files (templates/ingress.yaml, templates/sme-services/ingress.yaml,
  templates/marketplace-api/ingress.yaml). They emitted
  `traefik.io/v1alpha1 Middleware` (strip-sovereign, strip-nova,
  root-to-nova) plus Ingress objects hardcoded to `console.openova.io` /
  `admin.openova.io` / `marketplace.openova.io` / `openova.io` with
  `ingressClassName: traefik`. Sovereigns use Cilium native gateway
  (per docs/ARCHITECTURE.md §11) — Traefik CRDs are not installed and
  never will be — and per-Sovereign Catalyst hostnames are
  `console.${SOVEREIGN_FQDN}` / `admin.${SOVEREIGN_FQDN}` etc., not the
  contabo-mkt openova.io domain. Helm install was failing on otech with
  `no matches for kind "Middleware" in version "traefik.io/v1alpha1"`.
  Per-Sovereign HTTPRoute resources for the Catalyst console/admin/
  marketplace will be authored separately (out of scope here) — issue
  #279, 2026-04-30.
  Bumped to 1.1.6 to delete the entire `templates/sme-services/`
  directory (admin/auth/billing/catalog/configmap/console/domain/
  gateway/marketplace/notification/provisioning/serviceaccounts/tenant
  — 13 manifests, ~36 resources). Every one of them was hardcoded to
  `namespace: sme` and to `sme.openova.io` URLs. The SME microservice
  mesh is a contabo-mkt-only product (the OpenOva.io marketplace) that
  was dragged into the Catalyst umbrella during Group C cutover; it
  has no role on franchised Sovereigns. Sovereigns don't run SME and
  don't have an `sme` namespace, so the Helm install was failing with
  `failed to create resource: namespaces "sme" not found` on
  otech.omani.works. Resolution: SME services are out of scope for the
  bp-catalyst-platform Blueprint — they will be re-homed in a
  contabo-mkt-only Kustomization (or a separate `bp-sme` Blueprint)
  if/when SME is re-deployed. Issue #281, 2026-04-30.
  Bumped to 1.1.9 to remove the 10 foundation-Blueprint subchart
  dependencies (bp-cilium, bp-cert-manager, bp-flux, bp-crossplane,
  bp-sealed-secrets, bp-spire, bp-nats-jetstream, bp-openbao,
  bp-keycloak, bp-gitea). When this umbrella reconciled with
  `targetNamespace: catalyst-system`, Helm rendered every subchart's
  `flux2` / `cilium` / etc. controllers into catalyst-system —
  duplicating the foundation stack the bootstrap-kit had already
  installed at slots 01..10 in their own canonical namespaces
  (flux-system, cert-manager, kube-system, ...). On Phase-8a-preflight
  otech16 (2026-05-02) this manifested as a duplicate source-controller
  in catalyst-system NS that other HRs (bp-cnpg, bp-spire,
  bp-crossplane-claims) intermittently routed to via service discovery,
  failing chart pulls with "i/o timeout" against
  `source-controller.catalyst-system.svc.cluster.local`. Resolution:
  the umbrella ships ONLY Catalyst-Zero control-plane workloads; the
  foundation layer is owned end-to-end by the bootstrap-kit. Issue
  #510, 2026-05-02.
  Bumped to 1.1.12 to add optional=true to the DYNADOT_API_KEY and
  DYNADOT_API_SECRET secretKeyRef entries in the catalyst-api Deployment.
  Sovereign clusters don't hold Dynadot credentials (their tenant DNS
  is served by the Sovereign's own PowerDNS instance); without
  optional=true Kubernetes refuses to start the pod when the
  dynadot-api-credentials Secret is absent, crashlooping catalyst-api
  on every new Sovereign. The fix mirrors the existing optional=true on
  DYNADOT_MANAGED_DOMAINS and DYNADOT_DOMAIN. Issue #547, 2026-05-02.
  Bumped to 1.1.13 to rename all imagePullSecrets references from
  ghcr-pull-secret to ghcr-pull (canonical name written by cloud-init at
  /var/lib/catalyst/ghcr-pull-secret.yaml). The wrong name was causing
  ImagePullBackOff on catalyst-api, catalyst-ui, marketplace-api and all
  11 SME service deployments. Paired with new bp-reflector (slot 05a)
  that auto-mirrors flux-system/ghcr-pull to every namespace via
  reflector.v1.k8s.emberstack.com annotations. Issue #543, 2026-05-02.
  Bumped to 1.1.14 to add global.imageRegistry value and template all
  Catalyst-authored image refs (catalyst-api, catalyst-ui, marketplace-api,
  console, and all 10 SME service deployments). Post-handover per-Sovereign
  overlays set global.imageRegistry to the local Harbor mirror. Issue #560.
type: application

# Opt-out from the blueprint-release hollow-chart guard (issue #181 / #510).
# This umbrella legitimately ships only Catalyst-authored workloads
# (catalyst-ui, catalyst-api, ProvisioningState CRD, Sovereign HTTPRoute);
# the foundation layer is installed independently by the bootstrap-kit
# and must NOT be re-rendered into catalyst-system as subcharts.
annotations:
  catalyst.openova.io/no-upstream: "true"

# No subchart dependencies — see 1.1.9 changelog above. The 10
# foundation Blueprints are installed by clusters/_template/bootstrap-kit/
# at their own slots, each as a top-level Flux HelmRelease in its own
# canonical namespace. This umbrella renders only the Catalyst-Zero
# control-plane workloads (catalyst-ui, catalyst-api, ProvisioningState
# CRD, Sovereign HTTPRoute) into targetNamespace: catalyst-system.
