Skip to content

docs: design the verify-only external DNS provider - #15

Closed
reoring wants to merge 1 commit into
mainfrom
work/20261018/external-provider-design
Closed

reoring wants to merge 1 commit into
mainfrom
work/20261018/external-provider-design

Conversation

@reoring

@reoring reoring commented Oct 18, 2026

Copy link
Copy Markdown
Contributor

Purpose

Design for a verify-only external DNS provider: the customer owns authoritative DNS; dns-api sends DNS queries and writes Kubernetes status only — no DNS UPDATE, cloud client, credentials, or fallback writer. Consumer: AppThrust Platform on-premises installs (dns.zone.provider: external, appthrust/platform design/platform/onprem/README.md §4.7).

What this adds (docs only, no code)

  • docs/design/external-provider.md: Provider external.dns.appthrust.io/v1alpha1 (A/AAAA/CNAME, no identity); ZoneClass parameters resolver.{mode,servers} + expectedNameservers with schema/CEL; logical-suffix Zone semantics; exact-set A/AAAA verification with CNAME-chain bounds and wildcard witnesses; resolver policy (Cluster | Recursive, optional direct-authority checks); condition reasons/messages mapped into the fixed unit-level allowlist; bounded scheduling (30–300 s, jitter, backoff, per-Zone amortized NS work, 40 QPS/80 burst manager flags); deletion = bookkeeping only (verified withdrawal is explicitly a later Withdrawn extension); admission/RBAC (no Secret access); packaging (providers.external.enabled, capability + APIService, cert-manager required); metrics; tests per test-policy.
  • Core contract changes it requires: ZoneClass.spec.identityRef optional — required iff the Provider version declares identity, forbidden otherwise (core-api.md, provider-extension.md, ui.md); core projection preserves provider condition Message (controllers-webhooks.md); provider enable flags that gate controller registration, identity webhooks, conversion handlers and provider-only RBAC — marked as not implemented at 87aa1dc (controllers-webhooks.md).
  • Conversion decision: keep EndpointProviderCapability + aggregated APIService (schema equality does not imply conversion equality); rationale in the provider doc.
  • overview.md, README.md index, test-policy.md (external kest scenario against an in-kind authoritative fixture), open-decisions.md (3 open items).

Review

Reviewed by a design reviewer against the code at 87aa1dc; all major/minor findings applied (resource-bound consistency, flag honesty, UI migration, overview contradictions, unit-level reason mapping, present tense).

reoring added a commit that referenced this pull request Oct 18, 2026
)

* docs: design verify-only external DNS provider

* feat(core): support credentialless DNS providers

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.

* feat(external): verify-only DNS provider

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.

* fix(external): avoid unchanged scheduler status patches

* docs: trim trailing blank line

* Wire external DNS provider into manager and deployment packaging

* fix(external): describe every array item in the Provider schemas so core 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.

* docs: DEP-0003 RecordWithdrawal — verified DNS withdrawal before address reuse (Draft)

* docs: DEP-0003 ZoneUnit withdrawal items keyed by claimNamespace/claimName
reoring added a commit that referenced this pull request Oct 18, 2026
* docs: design verify-only external DNS provider

* feat(core): support credentialless DNS providers

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.

* feat(external): verify-only DNS provider

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.

* fix(external): avoid unchanged scheduler status patches

* docs: trim trailing blank line

* Wire external DNS provider into manager and deployment packaging

* fix(external): describe every array item in the Provider schemas so core 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.

* docs: DEP-0003 RecordWithdrawal — verified DNS withdrawal before address reuse (Draft)

* docs: DEP-0003 ZoneUnit withdrawal items keyed by claimNamespace/claimName

* feat(api): define retained DNS withdrawal and retirement contracts

* feat(api): fence withdrawal results to ZoneClass incarnation and generation

* feat(core): compose and project verified DNS withdrawal claims

* feat(external): verify DNS withdrawal before retired address reuse

* feat(endpoint): capture retired DNS pairs before source deletion

* fix(core): preserve admission parity and existing Zone deletion messages

* docs: accept DEP-0003 and reflect verified record withdrawal into docs/design
@reoring

reoring commented Oct 18, 2026

Copy link
Copy Markdown
Contributor Author

Superseded: the design docs landed via #16 (and DEP-0003 via #17).

@reoring reoring closed this Oct 18, 2026
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