53cb7fa059
A forward zone with no forwarders now renders "forwarders { };", which
BIND accepts and treats as disabling forwarding for the zone.
86 lines
3.0 KiB
Go
86 lines
3.0 KiB
Go
package controller
|
|
|
|
import (
|
|
"context"
|
|
"strings"
|
|
"testing"
|
|
|
|
bindv1alpha1 "git.unkin.net/unkin/bind-operator/api/v1alpha1"
|
|
)
|
|
|
|
// A primary zone with known secondaries renders notify explicit + also-notify
|
|
// so a dynamic update NOTIFYs the secondaries immediately.
|
|
func TestBuildZoneConfigPrimaryAlsoNotify(t *testing.T) {
|
|
r := &BindZoneReconciler{}
|
|
zone := &bindv1alpha1.BindZone{
|
|
Spec: bindv1alpha1.BindZoneSpec{
|
|
ZoneName: "main.unkin.net",
|
|
Type: bindv1alpha1.ZonePrimary,
|
|
},
|
|
}
|
|
|
|
cfg, err := r.buildZoneConfig(context.Background(), zone, "transfer-key", []string{"10.42.2.6", "10.42.1.5"}, "externaldns-key")
|
|
if err != nil {
|
|
t.Fatalf("buildZoneConfig: %v", err)
|
|
}
|
|
if !strings.Contains(cfg, "notify explicit") {
|
|
t.Errorf("expected notify explicit in %q", cfg)
|
|
}
|
|
// also-notify entries are keyed so secondaries can admit the NOTIFY by TSIG
|
|
// key (allow-notify { key ... }) instead of by (churning) pod IP.
|
|
if !strings.Contains(cfg, `also-notify { 10.42.2.6 key "externaldns-key"; 10.42.1.5 key "externaldns-key"; }`) {
|
|
t.Errorf("expected keyed also-notify with the secondary IPs in %q", cfg)
|
|
}
|
|
}
|
|
|
|
// also-notify entries carry no key when none is configured (unkeyed NOTIFY).
|
|
func TestBuildZoneConfigPrimaryAlsoNotifyUnkeyed(t *testing.T) {
|
|
r := &BindZoneReconciler{}
|
|
zone := &bindv1alpha1.BindZone{
|
|
Spec: bindv1alpha1.BindZoneSpec{ZoneName: "main.unkin.net", Type: bindv1alpha1.ZonePrimary},
|
|
}
|
|
cfg, err := r.buildZoneConfig(context.Background(), zone, "transfer-key", []string{"10.42.2.6"}, "")
|
|
if err != nil {
|
|
t.Fatalf("buildZoneConfig: %v", err)
|
|
}
|
|
if !strings.Contains(cfg, "also-notify { 10.42.2.6; }") {
|
|
t.Errorf("expected unkeyed also-notify in %q", cfg)
|
|
}
|
|
}
|
|
|
|
// With no secondaries, no also-notify is emitted (single-replica cluster).
|
|
func TestBuildZoneConfigPrimaryNoNotifyTargets(t *testing.T) {
|
|
r := &BindZoneReconciler{}
|
|
zone := &bindv1alpha1.BindZone{
|
|
Spec: bindv1alpha1.BindZoneSpec{ZoneName: "main.unkin.net", Type: bindv1alpha1.ZonePrimary},
|
|
}
|
|
|
|
cfg, err := r.buildZoneConfig(context.Background(), zone, "transfer-key", nil, "externaldns-key")
|
|
if err != nil {
|
|
t.Fatalf("buildZoneConfig: %v", err)
|
|
}
|
|
if strings.Contains(cfg, "also-notify") || strings.Contains(cfg, "notify explicit") {
|
|
t.Errorf("did not expect notify clauses with no targets: %q", cfg)
|
|
}
|
|
}
|
|
|
|
func TestBuildZoneConfigForwardForwarders(t *testing.T) {
|
|
r := &BindZoneReconciler{}
|
|
for _, tc := range []struct {
|
|
fwd []string
|
|
want string
|
|
}{
|
|
{nil, "{ type forward; forward only; forwarders { }; };"},
|
|
{[]string{"198.18.19.15"}, "{ type forward; forward only; forwarders { 198.18.19.15; }; };"},
|
|
} {
|
|
zone := &bindv1alpha1.BindZone{Spec: bindv1alpha1.BindZoneSpec{ZoneName: "spamhaus.org", Type: bindv1alpha1.ZoneForward, Forwarders: tc.fwd}}
|
|
cfg, err := r.buildZoneConfig(context.Background(), zone, "", nil, "")
|
|
if err != nil {
|
|
t.Fatalf("buildZoneConfig: %v", err)
|
|
}
|
|
if cfg != tc.want {
|
|
t.Errorf("forwarders %v:\ngot %q\nwant %q", tc.fwd, cfg, tc.want)
|
|
}
|
|
}
|
|
}
|