Zonas y recordsets publicados por ExternalDNS (un DNSEndpoint por recordset).
Go ExternalDNSopenkeel-designate
El módulo
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
Extracto de openkeel-designate/README.md (en inglés).
API REST
78 operaciones de la API REST original (rutas y acciones de cuerpo) y su estado en OpenKeel.
Los intercambios funcionales de API de Designate en Python se reproducen contra el servicio Go, con vectores de algoritmo y las expectativas de los clientes cubiertas por el replay.
Replay de los intercambios grabados
Replay E2E de los tests funcionales de API
548 intercambios de 299 tests funcionales de API de Python dan el mismo estado y el mismo cuerpo.
Ejecución
go test -tags e2e ./test/e2e/..., E2E_MYSQL_DSN para MariaDB 11.4; E2E_STRICT=1 se supera con 32 diferencias conocidas.
Último resultado 516 / 548 idénticos en ambos motores (el replay del original Python da 501 / 548).
Fuente: openkeel-designate/docs/CONFORMANCE.md
Tests unitarios y golden tests
Vectores de algoritmo
Los números de serie SOA, el estado de zonas y registros, los resultados de poll y la importación de archivos de zona se calculan como en Python.
Ejecución
go test ./... en internal/central y internal/zonefile.
Último resultado 263 / 263.
Fuente: openkeel-designate/docs/CONFORMANCE.md
Contrato de cliente
Expectativas de los clientes
Filtros por nombre, links.next, recuentos, cabeceras de Designate, 202 PENDING, 404 en zonas eliminadas, 400 para registros gestionados, actualizaciones PTR tal como esperan los clientes.
Ejecución
Cubierto por el replay. designateclient/OSC, Neutron, Heat, Skyline y designate-tempest-plugin reales no ejecutados.
Último resultado Todas se cumplen por construcción y están cubiertas por el replay.
Fuente: openkeel-designate/docs/CONFORMANCE.md
Tests unitarios y golden tests
Reconciliador y back ends
El ciclo de vida de las zonas frente a un servidor DNS, la API de zonas de PowerDNS, el escritor ExternalDNS y el receptor de notificaciones se comportan según lo especificado.
Ejecución
internal/reconciler con un servidor DNS simulado, internal/backend, internal/sink.
Último resultado Superado.
Fuente: openkeel-designate/docs/CONFORMANCE.md
Excluido del rewrite
Designate conserva sus 78 operaciones de API pero publica los registros mediante ExternalDNS y las API de los proveedores DNS, por lo que desaparecen mdns, los destinos de pool de tipo BIND y los workers RPC.
Asumido por la plataforma Cloud Native
mdns, AXFR/NOTIFY y destinos de pool
Asumido por ExternalDNS
Por qué se excluyó
Las zonas se crean mediante la API del servidor DNS (PowerDNS, Route 53, Azure, Google, Cloudflare) y los recordsets pasan a ser DNSEndpoints que publica ExternalDNS.
Por qué la solución no se ve afectada
El estado de la zona se confirma consultando los servidores autoritativos. El serial SOA y los servidores de nombres servidos corresponden al proveedor, y las claves TSIG son informativas.
Fuente: openkeel-designate/docs/CONFORMANCE.md
Mecánica interna simplificada
RPC de central, worker y producer, y bloqueos tooz
Asumido por Kubernetes Leases
Por qué se excluyó
Central se ejecuta dentro del proceso con una transacción por petición; un único reconciliador, que mantiene un Lease, sustituye a worker, producer y mdns.
Por qué la solución no se ve afectada
Mismo comportamiento de la API, incluido 202 PENDING en las escrituras; ya no puede producirse un MessagingTimeout 504.
Fuente: openkeel-designate/docs/CONFORMANCE.md
Asumido por la plataforma Cloud Native
Registros SPF, SSHFP, CAA, CERT, HTTPS, SVCB
Asumido por ExternalDNS
Por qué se excluyó
ExternalDNS no puede publicar estos tipos.
Por qué la solución no se ve afectada
Se rechazan con el propio 400 de Designate, 'not a supported record type'. Los operadores pueden habilitarlos para un backend que los publique.
Fuente: openkeel-designate/docs/CONFORMANCE.md
Asumido por la plataforma Cloud Native
Zonas secundarias en proveedores DNS en la nube
Asumido por ExternalDNS
Por qué se excluyó
ExternalDNS no gestiona zonas secundarias; solo un backend con zonas secundarias (PowerDNS) puede obtenerlas.
Por qué la solución no se ve afectada
Las zonas secundarias funcionan en PowerDNS; en Route 53, Azure, Cloud DNS o Cloudflare pasan a ERROR.
Fuente: openkeel-designate/docs/CONFORMANCE.md
Aquí solo figura lo que se excluyó por diseño; el trabajo aún no realizado está en los Known gaps del docs/CONFORMANCE.md del módulo. Todos los módulos
Interacciones Designate
Vista de servicio generada por la skill de diagramas a partir del modelo de OpenKeel.