OpenKeel: the sovereign French Cloud solution of the inherent group, with a European reach Discover inherent

Components · Services and orchestration

Designate

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 ExternalDNS DNSEndpoint 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.

  • 78Implemented

How compatibility is tested

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.

Diagram openkeel-designate.svg Full screen
The 4 interactions of the model
FromToProtocolWhat
Designate APIDesignate worker + sinkRabbitMQRPC zone/recordset
RabbitMQ clusterDesignate worker + sinkRabbitMQsink: Nova/Neutron events
Designate worker + sinkExternalDNSKubernetes APIDNSEndpoint per recordset
Designate worker + sinkAuthoritative DNSREST APIzone API, status polling

Specifications