aboutsummaryrefslogtreecommitdiff
path: root/middleware/kubernetes
diff options
context:
space:
mode:
authorGravatar Chris O'Haver <cohaver@infoblox.com> 2017-07-20 08:19:29 -0400
committerGravatar John Belamaric <jbelamaric@infoblox.com> 2017-07-20 08:19:29 -0400
commit58006cf84700ec42ba851256dd5ca46533ad76c9 (patch)
tree35db6890b1256ba72cf197e72f46605f59d85dc6 /middleware/kubernetes
parent81315b0b3b5dd203c777f0dbc733b62c0050cc2f (diff)
downloadcoredns-58006cf84700ec42ba851256dd5ca46533ad76c9.tar.gz
coredns-58006cf84700ec42ba851256dd5ca46533ad76c9.tar.zst
coredns-58006cf84700ec42ba851256dd5ca46533ad76c9.zip
middleware/kubernetes: fix aaaa response (#780)
* fix aaaa response * unit tests
Diffstat (limited to 'middleware/kubernetes')
-rw-r--r--middleware/kubernetes/handler.go4
-rw-r--r--middleware/kubernetes/handler_test.go16
-rw-r--r--middleware/kubernetes/kubernetes.go13
3 files changed, 25 insertions, 8 deletions
diff --git a/middleware/kubernetes/handler.go b/middleware/kubernetes/handler.go
index a5916ccf7..e7660c3a9 100644
--- a/middleware/kubernetes/handler.go
+++ b/middleware/kubernetes/handler.go
@@ -57,7 +57,7 @@ func (k Kubernetes) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.M
path = strings.Join(dns.SplitDomainName(path)[1:], ".")
newstate := state.NewWithQuestion(strings.Join([]string{name, path}, "."), state.QType())
records, extra, _, err = k.routeRequest(zone, newstate)
- if !k.IsNameError(err) {
+ if !k.IsNameError(err) && len(records) > 0 {
records = append(records, nil)
copy(records[1:], records)
records[0] = newCNAME(origQName, records[0].Header().Name, records[0].Header().Ttl)
@@ -79,7 +79,7 @@ func (k Kubernetes) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.M
// Search . in this middleware
newstate := state.NewWithQuestion(strings.Join([]string{name, "."}, ""), state.QType())
records, extra, _, err = k.routeRequest(zone, newstate)
- if !k.IsNameError(err) {
+ if !k.IsNameError(err) && len(records) > 0 {
records = append(records, nil)
copy(records[1:], records)
records[0] = newCNAME(origQName, records[0].Header().Name, records[0].Header().Ttl)
diff --git a/middleware/kubernetes/handler_test.go b/middleware/kubernetes/handler_test.go
index 6d045ebd1..eada291b0 100644
--- a/middleware/kubernetes/handler_test.go
+++ b/middleware/kubernetes/handler_test.go
@@ -81,6 +81,22 @@ var dnsTestCases = map[string](*test.Case){
test.CNAME("svc0.testns.fed.svc.cluster.local. 0 IN CNAME svc0.testns.fed.svc.fd-az.fd-r.federal.test."),
},
},
+ "AAAA Service (existing service)": {
+ Qname: "svc1.testns.svc.cluster.local.", Qtype: dns.TypeAAAA,
+ Rcode: dns.RcodeSuccess,
+ Answer: []dns.RR{},
+ Ns: []dns.RR{
+ test.SOA("cluster.local. 300 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1499347823 7200 1800 86400 60"),
+ },
+ },
+ "AAAA Service (non-existing service)": {
+ Qname: "svc0.testns.svc.cluster.local.", Qtype: dns.TypeAAAA,
+ Rcode: dns.RcodeNameError,
+ Answer: []dns.RR{},
+ Ns: []dns.RR{
+ test.SOA("cluster.local. 300 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1499347823 7200 1800 86400 60"),
+ },
+ },
}
var autopathCases = map[string](*test.Case){
diff --git a/middleware/kubernetes/kubernetes.go b/middleware/kubernetes/kubernetes.go
index a65b3710b..6b55329d5 100644
--- a/middleware/kubernetes/kubernetes.go
+++ b/middleware/kubernetes/kubernetes.go
@@ -115,10 +115,7 @@ func (k *Kubernetes) Services(state request.Request, exact bool, opt middleware.
return nil, nil, e
}
switch state.Type() {
- case "AAAA":
- // AAAA not implemented
- return nil, nil, errNoItems
- case "A", "CNAME":
+ case "A", "AAAA", "CNAME":
if state.Type() == "A" && isDefaultNS(state.Name(), r) {
// If this is an A request for "ns.dns", respond with a "fake" record for coredns.
// SOA records always use this hardcoded name
@@ -126,6 +123,10 @@ func (k *Kubernetes) Services(state request.Request, exact bool, opt middleware.
return svcs, nil, nil
}
s, e := k.Entries(r)
+ if state.QType() == dns.TypeAAAA {
+ // AAAA not implemented
+ return nil, nil, e
+ }
return s, nil, e // Haven't implemented debug queries yet.
case "SRV":
s, e := k.Entries(r)
@@ -325,8 +326,8 @@ func (k *Kubernetes) parseRequest(lowerCasedName string, qtype uint16) (r record
}
offset = 2
}
- if qtype == dns.TypeA && len(segs) == 4 {
- // This is an endpoint A record request. Get first element as endpoint.
+ if (qtype == dns.TypeA || qtype == dns.TypeAAAA) && len(segs) == 4 {
+ // This is an endpoint A/AAAA record request. Get first element as endpoint.
r.endpoint = segs[0]
offset = 1
}