Skip to content

feat(external): verify-only DNS provider for customer-managed zones - #16

Merged
reoring merged 11 commits into
mainfrom
work/20261018/external-integration
Oct 18, 2026
Merged

reoring merged 11 commits into
mainfrom
work/20261018/external-integration

Conversation

@reoring

@reoring reoring commented Oct 18, 2026

Copy link
Copy Markdown
Contributor

Implements the verify-only external DNS provider designed in #15 (this branch includes those docs; #15 can be closed in favour of this PR or merged first — the merge is identical).

What

  • Core: ZoneClass.spec.identityRef is optional — required iff the selected Provider version declares identity, forbidden otherwise (admission, no network); core projection preserves provider condition Status/Reason/Message; provider enable flags (--route53-controller-enabled, --cloudflare-controller-enabled, --route53-endpoint-conversion-enabled, --external-controller-enabled + env) gate controller registration, identity webhooks, conversion handlers and provider-only RBAC; Helm admission parity incl. ZoneClass status; UI ZoneClass form supports credentialless providers.
  • External provider (internal/go/providers/external, pkg/go/api/external): Provider external.dns.appthrust.io/v1alpha1 (A/AAAA/CNAME, no identity); ZoneClass resolver.{mode,servers} + expectedNameservers; exact-set A/AAAA verification, bounded CNAME chains, wildcard witnesses; Cluster/Recursive views plus RD=0 authority checks; bounded scheduler (30–300 s, ±10 % jitter, backoff, 32 names/pass, per-Zone amortized NS work, 40 QPS / 80 burst flags); UID/generation/policy-bound receipts; bookkeeping-only deletion (verified withdrawal is explicitly a later Withdrawn extension); endpoint conversion handler (endpoint.external.dns.appthrust.io/v1alpha1 endpointrecordsetconversions); four metrics with closed labels. QUERY-only miekg/dns transport; no DNS writes anywhere.
  • Packaging: chart providers.external.*, Provider/capability/APIService templates (cert-manager CA injection; render fails without webhook.enabled + certManager.enabled), conversion-create RBAC only when enabled, no Secret/identity permissions in external-only installs; opt-in Kustomize overlay app/operator/config/external; README install example with the M+2 customer-record requirement.

Not in this PR

Verified-withdrawal receipt before retired-target reuse (platform Phase 4b); kest scenario against an in-kind authoritative fixture (test-policy entry added, test file follows).

Verification

  • task test — all packages ok (unit tests use fake resolver/clock; loopback UDP/TCP DNS fixture; no public DNS)
  • task controller-chart:check — lint/template/central-profile/package ok
  • go vet ./... clean; UI tsc --noEmit + bun test ok; git diff --check clean

Make ZoneClass identityRef optional with Provider-version admission, preserve projected condition messages, gate cloud registrations and privileges, and support credentialless ZoneClass UI creation. Regenerate deepcopy and both CRD distributions; add deterministic admission, projection, chart and UI regressions.

Contract: dns-api PR #15 / 99d0753 docs/design/external-provider.md (ZoneClass Parameters, Conditions and Public Data, Packaging), core-api.md, provider-extension.md, controllers-webhooks.md (Provider Enablement), ui.md (Zone Classes), and test-policy.md. Platform PR #5331 / cd995cf0ed design/platform/onprem/README.md sections 4.3, 4.4 step 4, 4.7, and Phase 4.

Codegen: devbox run -- task generate manifests controller-chart:sync-crds completed. Tests, builds, linters and UI typecheck intentionally deferred to the primary integration agent.
Provider external.dns.appthrust.io/v1alpha1 (A/AAAA/CNAME, no identity), ZoneClass resolver policy and expectedNameservers, exact-set A/AAAA verification with bounded CNAME chains and wildcard witnesses, Cluster/Recursive views plus RD=0 authority checks, bounded scheduling (30-300s, jitter, backoff, 32 names/pass, 40 QPS/80 burst), UID/generation/policy-bound receipts, bookkeeping-only deletion, endpoint conversion handler, metrics. Design: docs/design/external-provider.md.
…8/external-integration

# Conflicts:
#	docs/design/controllers-webhooks.md
#	docs/design/core-api.md
#	docs/design/ui.md
…ernal-integration

# Conflicts:
#	docs/design/provider-extension.md
#	docs/design/test-policy.md
…ore admission accepts the manifest

The core webhook requires a description on every property and array item; the external Provider was rejected on install. The built-in-manifest validation test now covers external_extensions.yaml.
@reoring
reoring merged commit 24a27d9 into main Oct 18, 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