mirror of
https://github.com/coredns/coredns.git
synced 2025-10-27 16:24:19 -04:00
plugin/k8s_external: implement zone transfers (#4977)
Implement transfer for k8s_external. Notifies not supported. Signed-off-by: Chris O'Haver <cohaver@infoblox.com>
This commit is contained in:
142
plugin/k8s_external/transfer_test.go
Normal file
142
plugin/k8s_external/transfer_test.go
Normal file
@@ -0,0 +1,142 @@
|
||||
package external
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/coredns/coredns/plugin"
|
||||
"github.com/coredns/coredns/plugin/kubernetes"
|
||||
"github.com/coredns/coredns/plugin/test"
|
||||
"github.com/coredns/coredns/plugin/transfer"
|
||||
|
||||
"github.com/miekg/dns"
|
||||
)
|
||||
|
||||
func TestImplementsTransferer(t *testing.T) {
|
||||
var e plugin.Handler
|
||||
e = &External{}
|
||||
_, ok := e.(transfer.Transferer)
|
||||
if !ok {
|
||||
t.Error("Transferer not implemented")
|
||||
}
|
||||
}
|
||||
|
||||
func TestTransferAXFR(t *testing.T) {
|
||||
k := kubernetes.New([]string{"cluster.local."})
|
||||
k.Namespaces = map[string]struct{}{"testns": {}}
|
||||
k.APIConn = &external{}
|
||||
|
||||
e := New()
|
||||
e.Zones = []string{"example.com."}
|
||||
e.externalFunc = k.External
|
||||
e.externalAddrFunc = externalAddress // internal test function
|
||||
e.externalSerialFunc = externalSerial // internal test function
|
||||
e.externalServicesFunc = k.ExternalServices
|
||||
|
||||
ch, err := e.Transfer("example.com.", 0)
|
||||
|
||||
if err != nil {
|
||||
t.Fatalf("Unexpected error: %v", err)
|
||||
}
|
||||
var records []dns.RR
|
||||
for rrs := range ch {
|
||||
records = append(records, rrs...)
|
||||
}
|
||||
|
||||
expect := []dns.RR{}
|
||||
for _, tc := range append(tests, testsApex...) {
|
||||
if tc.Rcode != dns.RcodeSuccess {
|
||||
continue
|
||||
}
|
||||
|
||||
for _, ans := range tc.Answer {
|
||||
// Exclude wildcard test cases
|
||||
if strings.Contains(ans.Header().Name, "*") {
|
||||
continue
|
||||
}
|
||||
|
||||
// Exclude TXT records
|
||||
if ans.Header().Rrtype == dns.TypeTXT {
|
||||
continue
|
||||
}
|
||||
expect = append(expect, ans)
|
||||
}
|
||||
}
|
||||
|
||||
diff := difference(expect, records)
|
||||
if len(diff) != 0 {
|
||||
t.Errorf("Got back %d records that do not exist in test cases, should be 0:", len(diff))
|
||||
for _, rec := range diff {
|
||||
t.Errorf("%+v", rec)
|
||||
}
|
||||
}
|
||||
|
||||
diff = difference(records, expect)
|
||||
if len(diff) != 0 {
|
||||
t.Errorf("Result is missing %d records, should be 0:", len(diff))
|
||||
for _, rec := range diff {
|
||||
t.Errorf("%+v", rec)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func TestTransferIXFR(t *testing.T) {
|
||||
k := kubernetes.New([]string{"cluster.local."})
|
||||
k.Namespaces = map[string]struct{}{"testns": {}}
|
||||
k.APIConn = &external{}
|
||||
|
||||
e := New()
|
||||
e.Zones = []string{"example.com."}
|
||||
e.externalFunc = k.External
|
||||
e.externalAddrFunc = externalAddress // internal test function
|
||||
e.externalSerialFunc = externalSerial // internal test function
|
||||
e.externalServicesFunc = k.ExternalServices
|
||||
|
||||
ch, err := e.Transfer("example.com.", externalSerial("example.com."))
|
||||
|
||||
if err != nil {
|
||||
t.Fatalf("Unexpected error: %v", err)
|
||||
}
|
||||
var records []dns.RR
|
||||
for rrs := range ch {
|
||||
records = append(records, rrs...)
|
||||
}
|
||||
|
||||
expect := []dns.RR{
|
||||
test.SOA("example.com. 5 IN SOA ns1.dns.example.com. hostmaster.dns.example.com. 1499347823 7200 1800 86400 5"),
|
||||
}
|
||||
|
||||
diff := difference(expect, records)
|
||||
if len(diff) != 0 {
|
||||
t.Errorf("Got back %d records that do not exist in test cases, should be 0:", len(diff))
|
||||
for _, rec := range diff {
|
||||
t.Errorf("%+v", rec)
|
||||
}
|
||||
}
|
||||
|
||||
diff = difference(records, expect)
|
||||
if len(diff) != 0 {
|
||||
t.Errorf("Result is missing %d records, should be 0:", len(diff))
|
||||
for _, rec := range diff {
|
||||
t.Errorf("%+v", rec)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// difference shows what we're missing when comparing two RR slices
|
||||
func difference(testRRs []dns.RR, gotRRs []dns.RR) []dns.RR {
|
||||
expectedRRs := map[string]struct{}{}
|
||||
for _, rr := range testRRs {
|
||||
expectedRRs[rr.String()] = struct{}{}
|
||||
}
|
||||
|
||||
foundRRs := []dns.RR{}
|
||||
for _, rr := range gotRRs {
|
||||
if _, ok := expectedRRs[rr.String()]; !ok {
|
||||
foundRRs = append(foundRRs, rr)
|
||||
}
|
||||
}
|
||||
return foundRRs
|
||||
}
|
||||
Reference in New Issue
Block a user