Skip to content

feat(route53): adoption-only private hosted zones via ZoneClass zoneType - #13

Merged
reoring merged 1 commit into
mainfrom
work/20261010/route53-private-zone
Oct 10, 2026
Merged

reoring merged 1 commit into
mainfrom
work/20261010/route53-private-zone

Conversation

@reoring

@reoring reoring commented Oct 10, 2026

Copy link
Copy Markdown
Contributor

Why

AppThrust hosts control-plane endpoint names in a private Route 53 zone. dns-api's Service endpoint source already produces the record; the Route 53 provider rejected private hosted zones (ExternalResourceMismatch), which blocked replacing external-dns on hosting clusters with dns-api.

Contract

  • ZoneClass.spec.parameters.zoneType: Public (default, unchanged behavior) | Private.
  • Private is adoption-only: zoneCreationPolicy must be absent/Deny, zoneDeletionPolicy absent/Retain (else Accepted=False/InvalidParameters); a Zone without spec.adoption gets DeniedByPolicy; dns-api never creates, deletes, or VPC-associates private zones.
  • Adoption verifies the observed zone type matches the class; mismatch keeps ExternalResourceMismatch with a type-specific message.
  • status.provider.data gains zoneType. Private zones have empty status.nameServers.
  • Delete path retains an observed private zone even under a Public/Delete class (defensive).

Changes

Go API + Route 53 zoneunit/zoneclass controllers and tests; Provider schema (chart + operator manifest); sample route53_private_zoneclass.yaml; docs/design/route53-provider.md, README; UI (form select, detail row, copy); kest route53-private-zone-adoption-lifecycle.test.ts gated on ROUTE53_PRIVATE_ZONE_VPC_ID.

Verification

  • go test ./internal/go/providers/route53/... ./internal/go/core/webhook/... ok
  • go vet ok, gofmt -l clean
  • helm lint deploy/charts/dns-api --set providers.route53.enabled=true 0 failed
  • bun x tsc --noEmit -p pkg/ts/ui/tsconfig.json and -p tsconfig.typecheck.json clean
  • kest private-zone lifecycle not executed (needs a VPC); existing CI skips it.

ZoneClass parameters gain zoneType (Public default, Private). Private is
adoption-only: creation policy is forced to Deny, deletion policy to Retain,
and dns-api never creates, deletes, or VPC-associates private hosted zones.
Adoption verifies the observed zone type matches the class; status.provider.data
exposes the observed zoneType. Provider schema, chart, sample, docs, UI form
and detail view, and an env-gated kest lifecycle follow the same contract.
@reoring
reoring merged commit 638bb64 into main Oct 10, 2026
2 checks passed
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