Skip to content

feat(console): add fleetsK8sToml.ts, the client-side write helper for fleets-k8s.toml (studio#104) - #110

Open
brettchien wants to merge 1 commit into
feat/k8s-onboarding-console-service-accountfrom
feat/k8s-onboarding-console-fleets-k8s-toml
Open

feat(console): add fleetsK8sToml.ts, the client-side write helper for fleets-k8s.toml (studio#104)#110
brettchien wants to merge 1 commit into
feat/k8s-onboarding-console-service-accountfrom
feat/k8s-onboarding-console-fleets-k8s-toml

Conversation

@brettchien

Copy link
Copy Markdown
Contributor

Summary

Sixth sub-item of #104, stacked on #109 (→ #108#107#106#105, merge in order). New console/src/fleetsK8sToml.ts — the client-side text-mutation helper for fleets-k8s.toml, mirroring fleetToml.ts (used for AWS's fleets.toml). Same rationale as the original: k8s_fleet_config_write (#107) has no partial/append primitive — it overwrites the whole file — so the client computes the new/edited TOML text and calls it with the full content.

  • findFleetBlock/appendMember are reused, not duplicated — both files share the exact same [fleet.<name>] table shape and members = [...] array, and neither function references any AWS-specific field (region/profile never appear in their logic). fleetsK8sToml.ts imports and re-exports appendMember from fleetToml.ts rather than copy-pasting it.
  • Exported quote() from fleetToml.ts (was a private one-line helper) so both modules share the one implementation instead of duplicating a JSON.stringify wrapper.
  • appendK8sFleetBlock is the only genuinely new function — creates a brand-new [fleet.<name>] block. Field shape differs from AWS's appendFleetBlock: context (optional) + namespace (required, always written) instead of region+profile; same expected_principal (optional) as AWS.

Not wired into deploy.ts yet

The k8s identity form still can't submit (#108 blocks it — deploy_provision has no k8s dispatch, and the architecture question posted to #104 is still unanswered). This PR is the write-path helper only, built ahead of its consumer — same pattern as #107's k8s_fleet_config_write tool, which also isn't called by anything yet. Once the deploy_provision question resolves, wiring deploy.ts's k8s submit path is: call deploy_provision (or whatever the resolved dispatch mechanism is) → on success, appendK8sFleetBlock/appendMember (mode-dependent, same branching deploy.ts already does for AWS) → k8s_fleet_config_write.

Testing

New fleetsK8sToml.test.ts, mirroring fleetToml.test.ts's coverage: appendMember works against the k8s file's shape, appendK8sFleetBlock writes all fields / omits optional ones / spaces blocks correctly. npm run typecheck clean, npm test 106/106 (4 new), npm run build succeeds.

Scope note

The deploy_provision/K8sDriver dispatch design question is still the one blocking item for full end-to-end k8s onboarding — tracked in #104, unresolved as of this PR. With this PR, every independently-buildable piece of #104's scope is now open as a PR.

Ref #104. Stacks on #109 (→ #108#107#106#105) — merge in order.

… fleets-k8s.toml (studio#104)

Sixth sub-item of #104, stacked on #109. Mirrors fleetToml.ts for
fleets-k8s.toml, same rationale: k8s_fleet_config_write (#107) has no
partial/append primitive, so the client computes the new/edited TOML text
and calls it with the whole file.

`findFleetBlock`/`appendMember` are identical between the two files (same
`[fleet.<name>]` table shape, same `members = [...]` array, neither
references any AWS-specific field) — reused via import from fleetToml.ts
rather than duplicated. Exported `quote()` from fleetToml.ts (was a private
helper) so both modules share the one implementation.

Only `appendK8sFleetBlock` (creating a brand-new fleet block) is new code —
required/optional fields differ from AWS's appendFleetBlock: `context`
(optional) + `namespace` (required, always written) instead of
region+profile, same `expected_principal` (optional) as AWS.

**Not wired into deploy.ts's submit flow yet** — the k8s identity form still
can't submit (see #108: deploy_provision has no k8s dispatch, architecture
question still open in #104). This PR is the write-path helper only, same
"build the piece, wire it once its dependency resolves" pattern as #107's
k8s_fleet_config_write tool (also not yet called by anything).

Verified locally: npm run typecheck clean, npm test 106/106 (4 new tests),
npm run build succeeds.

Ref: studio#104.
brettchien added a commit that referenced this pull request Aug 27, 2026
…104)

t_provision now branches on a new provider arg (default "aws", unchanged
behavior): "k8s" calls provision_from_library_k8s (#114) with context/
expected_principal taken as direct args, not resolved via a fleet name —
the console's identity form already collects context/namespace/service-
account directly (#108/#109), and for a brand-new fleet there's no existing
K8sFleetBinding to look up anyway. Fleet-scoped k8s lookup (for redeploying
into an already-known k8s fleet) is left as explicit future work, not
needed for this dispatch to exist.

Also updates deploy_provision's tool description, which was stale after
#113 (redeploy no longer requires an existing manifest) and needed the new
provider/context/expected_principal params documented.

NOTE — branch lineage: this stack (#112#113#114→this) was cut from `main`
before #104's original stack (#105-110) merged, not from #110 — so
K8sFleetBinding.expected_principal (originally #107) is re-added here too.
Identical field in both places; trivial merge conflict to resolve whenever
both land, flagging explicitly rather than silently duplicating without a
note.

With this, deploy_provision fully supports k8s end-to-end (provisioning
side) — the remaining piece for full onboarding is unblocking console's
k8s "Next" button (#108/#109's placeholder), a separate follow-up.

Ref: studio#104.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant