Zones and recordsets published by ExternalDNS (one DNSEndpoint per recordset).
Go ExternalDNSopenkeel-designate
The module
OpenKeel implementation in Go of OpenStack Designate (DNS as a Service), generated from the reverse-specification of branch stable/2026.2 by the generate-go-from-spec skill. It replaces the Python service without its clients noticing (python-designateclient and its OSC plugin, Neutron's DNS driver, Heat's OS::Designate::*, Skyline): same 78 routes, status codes, {code, type, message, request_id} error bodies and policies, writes answered 202 PENDING. What is reproduced and what differs is in docs/CONFORMANCE.md; the security checklist is in docs/SECURITY.md.
DNS publication is Kubernetes-native: zones are created through the DNS server's API (PowerDNS), recordsets become ExternalDNSDNSEndpoint custom resources, and a reconciler reports ACTIVE/ERROR by querying the authoritative servers. designate-worker, designate-producer and designate-mdns are replaced by that reconciler; designate-central runs in-process (no RPC).
Go module: github.com/openkeel/openkeel-designate
Binaries (one image):
designate-api: API on port 9001, health and metrics on 9090, -migrate for the migration Job;
designate-reconciler: pushes zones (PowerDNS API + DNSEndpoints), polls the servers, purges deleted zones; one active replica (Lease);
designate-sink: Nova and Neutron notifications to managed records (optional, RabbitMQ);
designate-manage: database sync, pool update --file pools.yaml, pool show-config.
Configuration: YAML, see config/config.example.yaml
Setting up a development environment, the database and the tests: docs/GETTING-STARTED.md
Database schema, migrations and upgrades: docs/DATABASE.md
Excerpt from openkeel-designate/README.md (in English).
REST API
78 operations of the original REST API (routes and body actions), and their state in OpenKeel.
Python Designate's functional API exchanges are replayed against the Go service, with algorithm vectors and the client expectations covered by the replay.
Replay of recorded exchanges
E2E replay of functional API tests
548 exchanges of 299 Python functional API tests give the same status and body.
How it runs
go test -tags e2e ./test/e2e/..., E2E_MYSQL_DSN for MariaDB 11.4; E2E_STRICT=1 passes with 32 known differences.
Latest result 516 / 548 identical on both engines (the Python original replays 501 / 548).
Source: openkeel-designate/docs/CONFORMANCE.md
Unit and golden tests
Algorithm vectors
SOA serials, zone and record status, poll results and zone file import compute as in Python.
How it runs
go test ./... in internal/central and internal/zonefile.
Latest result 263 / 263.
Source: openkeel-designate/docs/CONFORMANCE.md
Client contract
Client expectations
Name filters, links.next, counts, Designate headers, 202 PENDING, 404 on deleted zones, 400 for managed records, PTR updates as clients expect.
How it runs
Covered by the replay. Real designateclient/OSC, Neutron, Heat, Skyline and designate-tempest-plugin not run.
Latest result All met by construction and covered by the replay.
Source: openkeel-designate/docs/CONFORMANCE.md
Unit and golden tests
Reconciler and backends
Zone lifecycle against a DNS server, the PowerDNS zone API, the ExternalDNS writer and the notification sink behave as specified.
How it runs
internal/reconciler with a fake DNS server, internal/backend, internal/sink.
Latest result Pass.
Source: openkeel-designate/docs/CONFORMANCE.md
Left out of the rewrite
Designate keeps its 78 API operations but publishes records through ExternalDNS and DNS provider APIs, so mdns, BIND-style pool targets and the RPC workers are gone.
Done by the Cloud Native platform
mdns, AXFR/NOTIFY and pool targets
Taken over by ExternalDNS
Why it was left out
Zones are created through the DNS server's API (PowerDNS, Route 53, Azure, Google, Cloudflare) and recordsets become DNSEndpoints that ExternalDNS publishes.
Why the solution is not affected
Zone status is confirmed by querying the authoritative servers. SOA serial and served name servers belong to the provider, and TSIG keys are informational.
Source: openkeel-designate/docs/CONFORMANCE.md
Internal machinery simplified
Central, worker, producer RPC and tooz locks
Taken over by Kubernetes Leases
Why it was left out
Central runs in-process with one transaction per request; one reconciler, holding a Lease, replaces worker, producer and mdns.
Why the solution is not affected
Same API behaviour, including 202 PENDING on writes; a MessagingTimeout 504 can no longer happen.
Source: openkeel-designate/docs/CONFORMANCE.md
Done by the Cloud Native platform
SPF, SSHFP, CAA, CERT, HTTPS, SVCB records
Taken over by ExternalDNS
Why it was left out
ExternalDNS cannot publish these types.
Why the solution is not affected
They are refused with Designate's own 400 'not a supported record type'. Operators may enable them for a backend that publishes them.
Source: openkeel-designate/docs/CONFORMANCE.md
Done by the Cloud Native platform
Secondary zones on cloud DNS providers
Taken over by ExternalDNS
Why it was left out
ExternalDNS does not handle secondary zones; only a backend with secondary zones (PowerDNS) can pull them.
Why the solution is not affected
Secondary zones work on PowerDNS; on Route 53, Azure, Cloud DNS or Cloudflare they go to ERROR.
Source: openkeel-designate/docs/CONFORMANCE.md
Only what was left out by design is listed here; the work not done yet is in the Known gaps of the module's docs/CONFORMANCE.md. Every module
Designate interactions
Service view generated by the diagram skill from the OpenKeel model.