Convert agentic-platform into an app-of-apps meta-package (#36875)#91
Convert agentic-platform into an app-of-apps meta-package (#36875)#91teemow wants to merge 2 commits into
Conversation
dceccbe to
49f282e
Compare
Replace the bundled-subchart umbrella with a meta-package: instead of pinning each component to an exact version in Chart.yaml (Helm bundles subchart .tgz at package time, so every component release needed a bump PR + umbrella re-release), templates/components.yaml now renders one OCIRepository + HelmRelease per component (Flux) or one Application (Argo). The version constraint is a value (components.<name>.versionRange), so Flux re-resolves the range on every reconcile and a component release rolls forward with no PR to this chart. - Drop the Chart.yaml `dependencies:` block and Chart.lock. - Add `gitops` (engine: flux|argo) and `components` (source coords + version range / filterTags) to values.yaml. - Behaviour-preserving passthrough: per-component on/off and values stay on the existing keys (muster/agentgateway/valkey/kagent/klausGateway/mcps) and are forwarded to each rendered release, with umbrella `global` injected. - CRD-before-CR ordering preserved: agentic-platform-crds renders as a HelmRelease that consumers dependsOn (Flux) / sync-wave 0 (Argo). - Integration/glue layer (Gateway, AgentgatewayParameters, HTTPRoutes, NetworkPolicies, mcpServers) unchanged. - nil-safe musterServicePort helper (muster service tree now lives in the muster HelmRelease, not merged into umbrella values). - examples/customer-bom.yaml: pinned bill-of-materials (the customer track). - make verify-meta + CircleCI step assert the render in both engines + the BOM. POC for discussion at the honeybadger onsite. README body below the new "Meta-package release flow" section still describes the old bundled model and needs a follow-up pass if the approach is accepted. Co-authored-by: Cursor <cursoragent@cursor.com>
49f282e to
8b029e4
Compare
Reviewers couldn't see where each component's config (e.g. the top-level `valkey:` block) gets injected into its rendered HelmRelease — the mapping lived in hidden $valuesKey/$enabled/$dependsOn dicts inside templates/components.yaml. Make every `components.<name>` entry self-describing instead: - valuesFrom: top-level block whose contents pass through to the release values - enabledFrom: dotted path to the existing on/off toggle (omit to force-enable) - dependsOn: CRD-before-CR ordering templates/components.yaml is now a generic loop with no per-component knowledge. The top-level value blocks stay where they are, so override paths and values.schema.json are unchanged; the wiring is just visible now. No change to rendered output (verified: same 6 component value blocks + global injected). Co-authored-by: Cursor <cursoragent@cursor.com>
|
One blocker before this can go to a cluster: secrets land in HelmRelease specs.
Fix: for each component with secret keys, render a |
Implements giantswarm/giantswarm#36875. Supersedes #90 (which was a standalone sibling chart — not diffable against the umbrella, not meaningfully mergeable). This is the in-place change so the diff shows exactly how the umbrella becomes a meta-package.
What changes
The umbrella stopped being an umbrella. It no longer bundles components as pinned Helm subcharts (Helm bundles subchart
.tgzat package time, which is why every component release cost a bump PR + umbrella re-release + gitops bump). Instead,templates/components.yamlrenders one GitOps object per component:gitops.engine: flux(default) →OCIRepository(semver range) +HelmReleasegitops.engine: argo→ argoprojApplicationThe version is a value (
components.<name>.versionRange), not aChart.yamlpin. Flux re-resolves it every reconcile, so a component release rolls forward with no PR to this chart.Diff at a glance
Chart.yaml:dependencies:block removed (+Chart.lockdeleted).values.yaml: newgitops(engine switch) +components(source coords + version range;filterTagsfor the klaus-gateway-devstream).templates/components.yaml: the render loop._helpers.tpl:musterServicePortmade nil-safe (muster's service tree now lives in the muster HelmRelease, not merged into umbrella values).examples/customer-bom.yaml: pinned bill-of-materials.Makefile.custom.mk+.circleci/config.yml:make verify-meta.Behaviour preserved
muster:/agentgateway:/valkey:/kagent:/klausGateway:/agentic-platform-mcps:blocks and*.enabledtoggles still drive each component; their values are forwarded to the rendered release (HelmRelease.spec.values/ ArgovaluesObject), with umbrellaglobalinjected (subcharts used to inherit it automatically; HelmReleases do not).agentic-platform-crdsrenders as a HelmRelease that consumersdependsOn(Flux) / order after via sync-wave 0 (Argo).make verify-modes(the ingress-mode guards) still passes unchanged.Acceptance criteria (#36875)
examples/customer-bom.yaml).dependsOn/ sync-wave).gitops.engine: flux|argo).Test plan
make verify-meta— asserts both engines render, ranges are values, CRD ordering, and the BOM pins (CI step added; nohelm dependency buildneeded).make verify-modes— unchanged ingress guards still green.helm lintclean; renders verified for muster-direct, agentgateway-muster, all-enabled, kubernetes netpol flavor, argo engine, and the pinned BOM.Follow-ups (not in this POC)
dependsOn/sync-waves).Concept write-up:
architecture/agentic-platform-meta-package.md(klaus-lab).Made with Cursor