From 2d0b8293a416771ebc2ba01861bdce4f78915c04 Mon Sep 17 00:00:00 2001 From: Chris OHaver Date: Sun, 15 Jan 2017 14:37:18 +0000 Subject: [PATCH] Add txt response per k8s spec --- middleware/kubernetes/kubernetes.go | 34 +++++++++++++++++++++++++---- test/kubernetes_test.go | 7 ++++++ 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/middleware/kubernetes/kubernetes.go b/middleware/kubernetes/kubernetes.go index be0a57778..9141cd40a 100644 --- a/middleware/kubernetes/kubernetes.go +++ b/middleware/kubernetes/kubernetes.go @@ -44,8 +44,9 @@ type Kubernetes struct { } const ( - PodModeDisabled = "disabled" // default. pod requests are ignored - PodModeInsecure = "insecure" // ALL pod requests are answered without verfying they exist + PodModeDisabled = "disabled" // default. pod requests are ignored + PodModeInsecure = "insecure" // ALL pod requests are answered without verfying they exist + DnsSchemaVersion = "1.0.0" // https://github.com/kubernetes/dns/blob/master/docs/specification.md ) type endpoint struct { @@ -82,8 +83,28 @@ func (k *Kubernetes) Services(state request.Request, exact bool, opt middleware. if e != nil { return nil, nil, e } - s, e := k.Records(r) - return s, nil, e // Haven't implemented debug queries yet. + + switch state.Type() { + case "A", "SRV": + s, e := k.Records(r) + return s, nil, e // Haven't implemented debug queries yet. + case "TXT": + s, e := k.recordsForTXT(r) + return s, nil, e + } + return nil, nil, nil +} + +func (k *Kubernetes) recordsForTXT(r recordRequest) ([]msg.Service, error) { + switch r.typeName { + case "dns-version": + s := msg.Service{ + Text: DnsSchemaVersion, + TTL: 28800, + Key: msg.Path(r.typeName+"."+r.zone, "coredns")} + return []msg.Service{s}, nil + } + return nil, nil } // PrimaryZone will return the first non-reverse zone being handled by this middleware @@ -253,6 +274,11 @@ func (k *Kubernetes) parseRequest(lowerCasedName, qtype string) (r recordRequest return r, nil } + if len(segs) == 1 && qtype == "TXT" { + r.typeName = segs[0] + return r, nil + } + return r, errors.New("invalid request") } diff --git a/test/kubernetes_test.go b/test/kubernetes_test.go index e93bea973..69bd6502c 100644 --- a/test/kubernetes_test.go +++ b/test/kubernetes_test.go @@ -218,6 +218,13 @@ var dnsTestCases = []test.Case{ test.PTR("115.0.0.10.in-addr.arpa. 303 IN PTR svc-c.test-1.svc.cluster.local."), }, }, + { + Qname: "dns-version.cluster.local.", Qtype: dns.TypeTXT, + Rcode: dns.RcodeSuccess, + Answer: []dns.RR{ + test.TXT("dns-version.cluster.local. 28800 IN TXT \"1.0.0\""), + }, + }, } var dnsTestCasesPodsInsecure = []test.Case{