diff options
author | 2019-01-08 08:30:03 -0500 | |
---|---|---|
committer | 2019-01-08 08:30:03 -0500 | |
commit | 18f25dbef3a33092925e48e7d7f9c8d8f744cd05 (patch) | |
tree | a8b06f1b3f95adece02aff322e9a77aa2406a62e /plugin/kubernetes | |
parent | 418edd2a2feeb759218afbf02784b1904569ec14 (diff) | |
download | coredns-18f25dbef3a33092925e48e7d7f9c8d8f744cd05.tar.gz coredns-18f25dbef3a33092925e48e7d7f9c8d8f744cd05.tar.zst coredns-18f25dbef3a33092925e48e7d7f9c8d8f744cd05.zip |
plugin/kubernetes: fix case preservation and add test (#2430)
* fix case preservation and add test
* only fix case in k8s
Diffstat (limited to 'plugin/kubernetes')
-rw-r--r-- | plugin/kubernetes/handler.go | 5 | ||||
-rw-r--r-- | plugin/kubernetes/handler_case_test.go | 71 |
2 files changed, 74 insertions, 2 deletions
diff --git a/plugin/kubernetes/handler.go b/plugin/kubernetes/handler.go index 4d70279b7..e829a5f78 100644 --- a/plugin/kubernetes/handler.go +++ b/plugin/kubernetes/handler.go @@ -18,11 +18,12 @@ func (k Kubernetes) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.M m.SetReply(r) m.Authoritative = true - zone := plugin.Zones(k.Zones).Matches(state.Name()) + qname := state.QName() + zone := plugin.Zones(k.Zones).Matches(qname) if zone == "" { return plugin.NextOrFailure(k.Name(), k.Next, ctx, w, r) } - + zone = qname[len(qname)-len(zone):] // maintain case of original query state.Zone = zone var ( diff --git a/plugin/kubernetes/handler_case_test.go b/plugin/kubernetes/handler_case_test.go new file mode 100644 index 000000000..e59f21166 --- /dev/null +++ b/plugin/kubernetes/handler_case_test.go @@ -0,0 +1,71 @@ +package kubernetes + +import ( + "context" + "testing" + + "github.com/coredns/coredns/plugin/pkg/dnstest" + "github.com/coredns/coredns/plugin/test" + + "github.com/miekg/dns" +) + +var dnsPreserveCaseCases = []test.Case{ + // Negative response + { + Qname: "not-a-service.testns.svc.ClUsTeR.lOcAl.", Qtype: dns.TypeA, + Rcode: dns.RcodeNameError, + Ns: []dns.RR{ + test.SOA("ClUsTeR.lOcAl. 30 IN SOA ns.dns.ClUsTeR.lOcAl. hostmaster.ClUsTeR.lOcAl. 1499347823 7200 1800 86400 60"), + }, + }, + // A Service + { + Qname: "SvC1.TeStNs.SvC.cLuStEr.LoCaL.", Qtype: dns.TypeA, + Rcode: dns.RcodeSuccess, + Answer: []dns.RR{ + test.A("SvC1.TeStNs.SvC.cLuStEr.LoCaL. 5 IN A 10.0.0.1"), + }, + }, + // SRV Service + { + Qname: "_HtTp._TcP.sVc1.TeStNs.SvC.cLuStEr.LoCaL.", Qtype: dns.TypeSRV, + Rcode: dns.RcodeSuccess, + Answer: []dns.RR{ + test.SRV("_HtTp._TcP.sVc1.TeStNs.SvC.cLuStEr.LoCaL. 5 IN SRV 0 100 80 svc1.testns.svc.cLuStEr.LoCaL."), + }, + Extra: []dns.RR{ + test.A("svc1.testns.svc.cLuStEr.LoCaL. 5 IN A 10.0.0.1"), + }, + }, +} + +func TestPreserveCase(t *testing.T) { + k := New([]string{"cluster.local."}) + k.APIConn = &APIConnServeTest{} + k.opts.ignoreEmptyService = true + k.Next = test.NextHandler(dns.RcodeSuccess, nil) + ctx := context.TODO() + + for i, tc := range dnsPreserveCaseCases { + r := tc.Msg() + + w := dnstest.NewRecorder(&test.ResponseWriter{}) + + _, err := k.ServeDNS(ctx, w, r) + if err != tc.Error { + t.Errorf("Test %d expected no error, got %v", i, err) + return + } + if tc.Error != nil { + continue + } + + resp := w.Msg + if resp == nil { + t.Fatalf("Test %d, got nil message and no error for %q", i, r.Question[0].Name) + } + + test.SortAndCheck(t, resp, tc) + } +} |