Files
DDI/docs/adr/0014-konfigurationserzeugung.md
T
beug.k@beugsiud.deandClaude Opus 5.5 3564686db0 feat(configgen): BIND and Kea configuration generator with integration tests
- configgen: input model shared by derivation and renderers
- derive: forward zones per domain, reverse zones (IPv4 octet, IPv6 nibble
  boundaries), A/AAAA/PTR from static and manual_dhcp entries, Kea subnets
  with effective pools and reservations; pure and deterministic
- bindgen: zone-statement include, options include, zone files with strict
  validation, canonical ordering and RFC 1035 TXT escaping
- keagen: typed Kea DHCPv4 JSON with strict validation
- golden-file, validation, determinism and fuzz tests
- integration tests check generated files with real named-checkconf,
  named-checkzone (BIND 9.18, 9.20) and kea-dhcp4 -t (Kea 2.6, 3.2);
  new CI job

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 14:19:25 +02:00

2.2 KiB
Raw Blame History

0014 – Konfigurationserzeugung: rein, typisiert, Golden-Files

  • Status: Akzeptiert
  • Datum: 2026-10-12

Entscheidung

  • Der Generator ist eine Sammlung reiner Funktionen: Render(input) → (artefakte, error). Kein Datenbank-, Zeit- oder Zufallszugriff im Generator. Alles, was variieren könnte (Zeitstempel, Seriennummer, Schlüssel), steht im Eingabeobjekt.
  • Ausgaben sind deterministisch: Maps werden sortiert, Reihenfolgen sind fest definiert.
  • Typisierte Zwischenmodelle statt Text-Templates:
    • Kea: Go-Structs, serialisiert mit encoding/json. Nutzereingaben können damit die JSON-Struktur nicht verlassen.
    • BIND: eigener kleiner Writer für named.conf-Blöcke und Zonendateien. Jeder Wert läuft durch typisierte Validierer (Label nach RFC 1035/1123, FQDN, TTL, IP, CIDR, MAC). TXT-Inhalte werden in Character-Strings ≤ 255 Byte aufgeteilt und escaped. Strings, die Steuerzeichen enthalten, werden abgelehnt.
    • Kein text/template und keine String-Verkettung mit Nutzereingaben.
  • SOA-Seriennummer = Revisionsnummer des Clusters (streng monoton, 32 Bit). Bei Übernahme bestehender Zonen mit höherer Seriennummer wird ein Offset gespeichert.
  • Tests: Golden-Files unter testdata/ (Aktualisierung mit go test ./... -update), Fuzz-Tests für die Validierer und in den Integrationstests (/test) die Prüfung jeder erzeugten Konfiguration mit echtem named-checkconf/named-checkzone und kea-dhcp4 -t in Containern.

Nachträge

  • 2026-10-13 (M2): Aufteilung in die Pakete configgen (Eingabemodell), configgen/derive (Ableitung aus IPAM), configgen/bindgen und configgen/keagen (Renderer). TXT-Inhalte mit Bytes außerhalb von 0x20–0x7E werden nicht abgelehnt, sondern als \DDD escaped (RFC 1035 §5.1); Namen mit Steuerzeichen bleiben verboten. Die Anfangsdatei dynamischer Zonen darf Records enthalten (z. B. vorbereitete SRV-Einträge); danach gehört sie BIND. Die Integrationstests liegen unter server/internal/configgen/integration (Build-Tag integration), weil Go-internal-Pakete aus /test nicht importierbar sind.

Konsequenzen

Gleicher Datenbankstand ergibt byte-gleiche Konfiguration. Diffs zwischen Revisionen sind deshalb aussagekräftig.