Zones et recordsets publiés par ExternalDNS (un DNSEndpoint par recordset).
Go ExternalDNSopenkeel-designate
Le 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
Extrait de openkeel-designate/README.md (en anglais).
API REST
78 opérations de l'API REST d'origine (routes et actions de corps), et leur état dans OpenKeel.
Les échanges fonctionnels d'API de Designate Python sont rejoués contre le service Go, avec des vecteurs d'algorithme et les attentes des clients couvertes par le rejeu.
Rejeu des échanges enregistrés
Rejeu E2E des tests fonctionnels d'API
548 échanges de 299 tests fonctionnels d'API Python donnent le même statut et le même corps.
Exécution
go test -tags e2e ./test/e2e/..., E2E_MYSQL_DSN pour MariaDB 11.4 ; E2E_STRICT=1 réussit avec 32 différences connues.
Dernier résultat 516 / 548 identiques sur les deux moteurs (le rejeu de l'original Python donne 501 / 548).
Source : openkeel-designate/docs/CONFORMANCE.md
Tests unitaires et golden tests
Vecteurs d'algorithme
Les numéros de série SOA, le statut des zones et des enregistrements, les résultats de poll et l'import de fichiers de zone se calculent comme en Python.
Exécution
go test ./... dans internal/central et internal/zonefile.
Dernier résultat 263 / 263.
Source : openkeel-designate/docs/CONFORMANCE.md
Contrat client
Attentes des clients
Filtres de nom, links.next, décomptes, en-têtes Designate, 202 PENDING, 404 sur les zones supprimées, 400 pour les enregistrements gérés, mises à jour PTR conformes aux attentes des clients.
Exécution
Couvert par le rejeu. Vrais designateclient/OSC, Neutron, Heat, Skyline et designate-tempest-plugin non exécutés.
Dernier résultat Toutes satisfaites par construction et couvertes par le rejeu.
Source : openkeel-designate/docs/CONFORMANCE.md
Tests unitaires et golden tests
Réconciliateur et back ends
Le cycle de vie des zones face à un serveur DNS, l'API de zones PowerDNS, l'écrivain ExternalDNS et le récepteur de notifications se comportent comme spécifié.
Exécution
internal/reconciler avec un faux serveur DNS, internal/backend, internal/sink.
Dernier résultat Réussi.
Source : openkeel-designate/docs/CONFORMANCE.md
Écarté de la réécriture
Designate conserve ses 78 opérations d'API mais publie les enregistrements via ExternalDNS et les API des fournisseurs DNS : mdns, les cibles de pool de type BIND et les workers RPC disparaissent.
Assuré par la plateforme Cloud Native
mdns, AXFR/NOTIFY et cibles de pool
Repris par ExternalDNS
Pourquoi c'est écarté
Les zones sont créées via l'API du serveur DNS (PowerDNS, Route 53, Azure, Google, Cloudflare) et les recordsets deviennent des DNSEndpoints qu'ExternalDNS publie.
Pourquoi la solution n'est pas affectée
L'état de la zone est confirmé en interrogeant les serveurs faisant autorité. Le serial SOA et les serveurs de noms servis relèvent du fournisseur, et les clés TSIG sont informatives.
Source : openkeel-designate/docs/CONFORMANCE.md
Mécanique interne simplifiée
RPC central, worker, producer et verrous tooz
Repris par Kubernetes Leases
Pourquoi c'est écarté
Central s'exécute dans le processus avec une transaction par requête ; un seul réconciliateur, détenteur d'un Lease, remplace worker, producer et mdns.
Pourquoi la solution n'est pas affectée
Même comportement de l'API, y compris 202 PENDING sur les écritures ; un MessagingTimeout 504 ne peut plus se produire.
Ils sont refusés avec le propre 400 de Designate, 'not a supported record type'. Les opérateurs peuvent les activer pour un backend qui les publie.
Source : openkeel-designate/docs/CONFORMANCE.md
Assuré par la plateforme Cloud Native
Zones secondaires chez les fournisseurs DNS cloud
Repris par ExternalDNS
Pourquoi c'est écarté
ExternalDNS ne gère pas les zones secondaires ; seul un backend qui les prend en charge (PowerDNS) peut les récupérer.
Pourquoi la solution n'est pas affectée
Les zones secondaires fonctionnent sur PowerDNS ; sur Route 53, Azure, Cloud DNS ou Cloudflare elles passent en ERROR.
Source : openkeel-designate/docs/CONFORMANCE.md
Seul ce qui a été écarté par choix de conception figure ici ; le travail pas encore fait se trouve dans les Known gaps du docs/CONFORMANCE.md du module. Tous les modules
Interactions de Designate
Vue « service » générée par la skill diagramme depuis le modèle d'OpenKeel.