aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--middleware/backend.go17
-rw-r--r--middleware/backend_lookup.go143
-rw-r--r--middleware/etcd/README.md44
-rw-r--r--middleware/etcd/debug_test.go97
-rw-r--r--middleware/etcd/etcd.go14
-rw-r--r--middleware/etcd/handler.go48
-rw-r--r--middleware/etcd/proxy_lookup_test.go57
-rw-r--r--middleware/etcd/setup.go2
-rw-r--r--middleware/kubernetes/handler.go24
-rw-r--r--middleware/kubernetes/kubernetes.go23
-rw-r--r--middleware/kubernetes/kubernetes_test.go2
-rw-r--r--middleware/kubernetes/reverse.go6
-rw-r--r--middleware/pkg/debug/debug.go21
-rw-r--r--middleware/pkg/debug/debug_test.go21
-rw-r--r--middleware/proxy/google.go17
-rw-r--r--middleware/proxy/google_rr.go13
-rw-r--r--test/etcd_cache_test.go (renamed from test/etcd_cache_debug_test.go)12
17 files changed, 99 insertions, 462 deletions
diff --git a/middleware/backend.go b/middleware/backend.go
index c626b36af..bf4bf8967 100644
--- a/middleware/backend.go
+++ b/middleware/backend.go
@@ -11,27 +11,22 @@ import (
type ServiceBackend interface {
// Services communicates with the backend to retrieve the service definition. Exact indicates
// on exact much are that we are allowed to recurs.
- Services(state request.Request, exact bool, opt Options) ([]msg.Service, []msg.Service, error)
+ Services(state request.Request, exact bool, opt Options) ([]msg.Service, error)
// Reverse communicates with the backend to retrieve service definition based on a IP address
// instead of a name. I.e. a reverse DNS lookup.
- Reverse(state request.Request, exact bool, opt Options) ([]msg.Service, []msg.Service, error)
+ Reverse(state request.Request, exact bool, opt Options) ([]msg.Service, error)
// Lookup is used to find records else where.
Lookup(state request.Request, name string, typ uint16) (*dns.Msg, error)
- // IsNameError return true if err indicated a record not found condition
- IsNameError(err error) bool
-
- // Debug returns a string used when returning debug services.
- Debug() string
-
// Returns _all_ services that matches a certain name.
// Note: it does not implement a specific service.
Records(state request.Request, exact bool) ([]msg.Service, error)
+
+ // IsNameError return true if err indicated a record not found condition
+ IsNameError(err error) bool
}
// Options are extra options that can be specified for a lookup.
-type Options struct {
- Debug string // This is a debug query. A query prefixed with debug.o-o
-}
+type Options struct{}
diff --git a/middleware/backend_lookup.go b/middleware/backend_lookup.go
index 7ad011b98..9e451feed 100644
--- a/middleware/backend_lookup.go
+++ b/middleware/backend_lookup.go
@@ -14,10 +14,10 @@ import (
)
// A returns A records from Backend or an error.
-func A(b ServiceBackend, zone string, state request.Request, previousRecords []dns.RR, opt Options) (records []dns.RR, debug []msg.Service, err error) {
- services, debug, err := b.Services(state, false, opt)
+func A(b ServiceBackend, zone string, state request.Request, previousRecords []dns.RR, opt Options) (records []dns.RR, err error) {
+ services, err := b.Services(state, false, opt)
if err != nil {
- return nil, debug, err
+ return nil, err
}
for _, serv := range services {
@@ -41,14 +41,13 @@ func A(b ServiceBackend, zone string, state request.Request, previousRecords []d
}
state1 := state.NewWithQuestion(serv.Host, state.QType())
- nextRecords, nextDebug, err := A(b, zone, state1, append(previousRecords, newRecord), opt)
+ nextRecords, err := A(b, zone, state1, append(previousRecords, newRecord), opt)
if err == nil {
// Not only have we found something we should add the CNAME and the IP addresses.
if len(nextRecords) > 0 {
records = append(records, newRecord)
records = append(records, nextRecords...)
- debug = append(debug, nextDebug...)
}
continue
}
@@ -61,8 +60,6 @@ func A(b ServiceBackend, zone string, state request.Request, previousRecords []d
// Lookup
m1, e1 := b.Lookup(state, target, state.QType())
if e1 != nil {
- debugMsg := msg.Service{Key: msg.Path(target, b.Debug()), Host: target, Text: " IN " + state.Type() + ": " + e1.Error()}
- debug = append(debug, debugMsg)
continue
}
// Len(m1.Answer) > 0 here is well?
@@ -77,14 +74,14 @@ func A(b ServiceBackend, zone string, state request.Request, previousRecords []d
// nodata?
}
}
- return records, debug, nil
+ return records, nil
}
// AAAA returns AAAA records from Backend or an error.
-func AAAA(b ServiceBackend, zone string, state request.Request, previousRecords []dns.RR, opt Options) (records []dns.RR, debug []msg.Service, err error) {
- services, debug, err := b.Services(state, false, opt)
+func AAAA(b ServiceBackend, zone string, state request.Request, previousRecords []dns.RR, opt Options) (records []dns.RR, err error) {
+ services, err := b.Services(state, false, opt)
if err != nil {
- return nil, debug, err
+ return nil, err
}
for _, serv := range services {
@@ -109,14 +106,13 @@ func AAAA(b ServiceBackend, zone string, state request.Request, previousRecords
}
state1 := state.NewWithQuestion(serv.Host, state.QType())
- nextRecords, nextDebug, err := AAAA(b, zone, state1, append(previousRecords, newRecord), opt)
+ nextRecords, err := AAAA(b, zone, state1, append(previousRecords, newRecord), opt)
if err == nil {
// Not only have we found something we should add the CNAME and the IP addresses.
if len(nextRecords) > 0 {
records = append(records, newRecord)
records = append(records, nextRecords...)
- debug = append(debug, nextDebug...)
}
continue
}
@@ -128,8 +124,6 @@ func AAAA(b ServiceBackend, zone string, state request.Request, previousRecords
}
m1, e1 := b.Lookup(state, target, state.QType())
if e1 != nil {
- debugMsg := msg.Service{Key: msg.Path(target, b.Debug()), Host: target, Text: " IN " + state.Type() + ": " + e1.Error()}
- debug = append(debug, debugMsg)
continue
}
// Len(m1.Answer) > 0 here is well?
@@ -145,15 +139,15 @@ func AAAA(b ServiceBackend, zone string, state request.Request, previousRecords
records = append(records, serv.NewAAAA(state.QName(), ip))
}
}
- return records, debug, nil
+ return records, nil
}
// SRV returns SRV records from the Backend.
// If the Target is not a name but an IP address, a name is created on the fly.
-func SRV(b ServiceBackend, zone string, state request.Request, opt Options) (records, extra []dns.RR, debug []msg.Service, err error) {
- services, debug, err := b.Services(state, false, opt)
+func SRV(b ServiceBackend, zone string, state request.Request, opt Options) (records, extra []dns.RR, err error) {
+ services, err := b.Services(state, false, opt)
if err != nil {
- return nil, nil, nil, err
+ return nil, nil, err
}
// Looping twice to get the right weight vs priority
@@ -196,9 +190,6 @@ func SRV(b ServiceBackend, zone string, state request.Request, opt Options) (rec
m1, e1 := b.Lookup(state, srv.Target, dns.TypeA)
if e1 == nil {
extra = append(extra, m1.Answer...)
- } else {
- debugMsg := msg.Service{Key: msg.Path(srv.Target, b.Debug()), Host: srv.Target, Text: " IN A: " + e1.Error()}
- debug = append(debug, debugMsg)
}
m1, e1 = b.Lookup(state, srv.Target, dns.TypeAAAA)
@@ -209,19 +200,15 @@ func SRV(b ServiceBackend, zone string, state request.Request, opt Options) (rec
extra = append(extra, a)
}
}
- } else {
- debugMsg := msg.Service{Key: msg.Path(srv.Target, b.Debug()), Host: srv.Target, Text: " IN AAAA: " + e1.Error()}
- debug = append(debug, debugMsg)
}
break
}
// Internal name, we should have some info on them, either v4 or v6
// Clients expect a complete answer, because we are a recursor in their view.
state1 := state.NewWithQuestion(srv.Target, dns.TypeA)
- addr, debugAddr, e1 := A(b, zone, state1, nil, opt)
+ addr, e1 := A(b, zone, state1, nil, opt)
if e1 == nil {
extra = append(extra, addr...)
- debug = append(debug, debugAddr...)
}
// IPv6 lookups here as well? AAAA(zone, state1, nil).
@@ -233,14 +220,14 @@ func SRV(b ServiceBackend, zone string, state request.Request, opt Options) (rec
extra = append(extra, newAddress(serv, srv.Target, ip, what))
}
}
- return records, extra, debug, nil
+ return records, extra, nil
}
// MX returns MX records from the Backend. If the Target is not a name but an IP address, a name is created on the fly.
-func MX(b ServiceBackend, zone string, state request.Request, opt Options) (records, extra []dns.RR, debug []msg.Service, err error) {
- services, debug, err := b.Services(state, false, opt)
+func MX(b ServiceBackend, zone string, state request.Request, opt Options) (records, extra []dns.RR, err error) {
+ services, err := b.Services(state, false, opt)
if err != nil {
- return nil, nil, debug, err
+ return nil, nil, err
}
lookup := make(map[string]bool)
@@ -263,10 +250,8 @@ func MX(b ServiceBackend, zone string, state request.Request, opt Options) (reco
m1, e1 := b.Lookup(state, mx.Mx, dns.TypeA)
if e1 == nil {
extra = append(extra, m1.Answer...)
- } else {
- debugMsg := msg.Service{Key: msg.Path(mx.Mx, b.Debug()), Host: mx.Mx, Text: " IN A: " + e1.Error()}
- debug = append(debug, debugMsg)
}
+
m1, e1 = b.Lookup(state, mx.Mx, dns.TypeAAAA)
if e1 == nil {
// If we have seen CNAME's we *assume* that they are already added.
@@ -275,18 +260,14 @@ func MX(b ServiceBackend, zone string, state request.Request, opt Options) (reco
extra = append(extra, a)
}
}
- } else {
- debugMsg := msg.Service{Key: msg.Path(mx.Mx, b.Debug()), Host: mx.Mx, Text: " IN AAAA: " + e1.Error()}
- debug = append(debug, debugMsg)
}
break
}
// Internal name
state1 := state.NewWithQuestion(mx.Mx, dns.TypeA)
- addr, debugAddr, e1 := A(b, zone, state1, nil, opt)
+ addr, e1 := A(b, zone, state1, nil, opt)
if e1 == nil {
extra = append(extra, addr...)
- debug = append(debug, debugAddr...)
}
// e.AAAA as well
@@ -296,14 +277,14 @@ func MX(b ServiceBackend, zone string, state request.Request, opt Options) (reco
extra = append(extra, newAddress(serv, serv.Host, ip, what))
}
}
- return records, extra, debug, nil
+ return records, extra, nil
}
// CNAME returns CNAME records from the backend or an error.
-func CNAME(b ServiceBackend, zone string, state request.Request, opt Options) (records []dns.RR, debug []msg.Service, err error) {
- services, debug, err := b.Services(state, true, opt)
+func CNAME(b ServiceBackend, zone string, state request.Request, opt Options) (records []dns.RR, err error) {
+ services, err := b.Services(state, true, opt)
if err != nil {
- return nil, debug, err
+ return nil, err
}
if len(services) > 0 {
@@ -312,14 +293,14 @@ func CNAME(b ServiceBackend, zone string, state request.Request, opt Options) (r
records = append(records, serv.NewCNAME(state.QName(), serv.Host))
}
}
- return records, debug, nil
+ return records, nil
}
// TXT returns TXT records from Backend or an error.
-func TXT(b ServiceBackend, zone string, state request.Request, opt Options) (records []dns.RR, debug []msg.Service, err error) {
- services, debug, err := b.Services(state, false, opt)
+func TXT(b ServiceBackend, zone string, state request.Request, opt Options) (records []dns.RR, err error) {
+ services, err := b.Services(state, false, opt)
if err != nil {
- return nil, debug, err
+ return nil, err
}
for _, serv := range services {
@@ -328,14 +309,14 @@ func TXT(b ServiceBackend, zone string, state request.Request, opt Options) (rec
}
records = append(records, serv.NewTXT(state.QName()))
}
- return records, debug, nil
+ return records, nil
}
// PTR returns the PTR records from the backend, only services that have a domain name as host are included.
-func PTR(b ServiceBackend, zone string, state request.Request, opt Options) (records []dns.RR, debug []msg.Service, err error) {
- services, debug, err := b.Reverse(state, true, opt)
+func PTR(b ServiceBackend, zone string, state request.Request, opt Options) (records []dns.RR, err error) {
+ services, err := b.Reverse(state, true, opt)
if err != nil {
- return nil, debug, err
+ return nil, err
}
for _, serv := range services {
@@ -343,20 +324,20 @@ func PTR(b ServiceBackend, zone string, state request.Request, opt Options) (rec
records = append(records, serv.NewPTR(state.QName(), serv.Host))
}
}
- return records, debug, nil
+ return records, nil
}
// NS returns NS records from the backend
-func NS(b ServiceBackend, zone string, state request.Request, opt Options) (records, extra []dns.RR, debug []msg.Service, err error) {
+func NS(b ServiceBackend, zone string, state request.Request, opt Options) (records, extra []dns.RR, err error) {
// NS record for this zone live in a special place, ns.dns.<zone>. Fake our lookup.
// only a tad bit fishy...
old := state.QName()
state.Clear()
state.Req.Question[0].Name = "ns.dns." + zone
- services, debug, err := b.Services(state, false, opt)
+ services, err := b.Services(state, false, opt)
if err != nil {
- return nil, nil, debug, err
+ return nil, nil, err
}
// ... and reset
state.Req.Question[0].Name = old
@@ -365,7 +346,7 @@ func NS(b ServiceBackend, zone string, state request.Request, opt Options) (reco
what, ip := serv.HostType()
switch what {
case dns.TypeCNAME:
- return nil, nil, debug, fmt.Errorf("NS record must be an IP address: %s", serv.Host)
+ return nil, nil, fmt.Errorf("NS record must be an IP address: %s", serv.Host)
case dns.TypeA, dns.TypeAAAA:
serv.Host = msg.Domain(serv.Key)
@@ -373,11 +354,11 @@ func NS(b ServiceBackend, zone string, state request.Request, opt Options) (reco
extra = append(extra, newAddress(serv, serv.Host, ip, what))
}
}
- return records, extra, debug, nil
+ return records, extra, nil
}
// SOA returns a SOA record from the backend.
-func SOA(b ServiceBackend, zone string, state request.Request, opt Options) ([]dns.RR, []msg.Service, error) {
+func SOA(b ServiceBackend, zone string, state request.Request, opt Options) ([]dns.RR, error) {
header := dns.RR_Header{Name: zone, Rrtype: dns.TypeSOA, Ttl: 300, Class: dns.ClassINET}
Mbox := hostmaster + "."
@@ -396,60 +377,22 @@ func SOA(b ServiceBackend, zone string, state request.Request, opt Options) ([]d
Expire: 86400,
Minttl: minTTL,
}
- return []dns.RR{soa}, nil, nil
+ return []dns.RR{soa}, nil
}
// BackendError writes an error response to the client.
-func BackendError(b ServiceBackend, zone string, rcode int, state request.Request, debug []msg.Service, err error, opt Options) (int, error) {
+func BackendError(b ServiceBackend, zone string, rcode int, state request.Request, err error, opt Options) (int, error) {
m := new(dns.Msg)
m.SetRcode(state.Req, rcode)
m.Authoritative, m.RecursionAvailable, m.Compress = true, true, true
- m.Ns, _, _ = SOA(b, zone, state, opt)
- if opt.Debug != "" {
- m.Extra = ServicesToTxt(debug)
- txt := ErrorToTxt(err)
- if txt != nil {
- m.Extra = append(m.Extra, ErrorToTxt(err))
- }
- }
+ m.Ns, _ = SOA(b, zone, state, opt)
+
state.SizeAndDo(m)
state.W.WriteMsg(m)
// Return success as the rcode to signal we have written to the client.
return dns.RcodeSuccess, err
}
-// ServicesToTxt puts debug in TXT RRs.
-func ServicesToTxt(debug []msg.Service) []dns.RR {
- if debug == nil {
- return nil
- }
-
- rr := make([]dns.RR, len(debug))
- for i, d := range debug {
- rr[i] = d.RR()
- }
- return rr
-}
-
-// ErrorToTxt puts in error's text into an TXT RR.
-func ErrorToTxt(err error) dns.RR {
- if err == nil {
- return nil
- }
- msg := err.Error()
- if len(msg) > 255 {
- msg = msg[:255]
- }
- t := new(dns.TXT)
- t.Hdr.Class = dns.ClassCHAOS
- t.Hdr.Ttl = 0
- t.Hdr.Rrtype = dns.TypeTXT
- t.Hdr.Name = "."
-
- t.Txt = []string{msg}
- return t
-}
-
func newAddress(s msg.Service, name string, ip net.IP, what uint16) dns.RR {
hdr := dns.RR_Header{Name: name, Rrtype: what, Class: dns.ClassINET, Ttl: s.TTL}
diff --git a/middleware/etcd/README.md b/middleware/etcd/README.md
index 9542dea6b..f7991eb7c 100644
--- a/middleware/etcd/README.md
+++ b/middleware/etcd/README.md
@@ -28,7 +28,6 @@ etcd [ZONES...] {
endpoint ENDPOINT...
upstream ADDRESS...
tls CERT KEY CACERT
- debug
}
~~~
@@ -46,8 +45,6 @@ etcd [ZONES...] {
* a single argument that is the CA PEM file, if the server cert is not signed by a system CA and no client cert is needed
* two arguments - path to cert PEM file, the path to private key PEM file - if the server certificate is signed by a system-installed CA and a client certificate is needed
* three arguments - path to cert PEM file, path to client private key PEM file, path to CA PEM file - if the server certificate is not signed by a system-installed CA and client certificate is needed
-* `debug` allows for debug queries. Prefix the name with `o-o.debug.` to retrieve extra information in the
- additional section of the reply in the form of TXT records.
## Examples
@@ -110,44 +107,3 @@ Querying with dig:
% dig @localhost -x 10.0.0.127 +short
reverse.atoom.net.
~~~
-
-Or with *debug* queries enabled:
-
-~~~
-% dig @localhost -p 1053 o-o.debug.127.0.0.10.in-addr.arpa. PTR
-
-;; OPT PSEUDOSECTION:
-; EDNS: version: 0, flags:; udp: 4096
-;; QUESTION SECTION:
-;o-o.debug.127.0.0.10.in-addr.arpa. IN PTR
-
-;; ANSWER SECTION:
-127.0.0.10.in-addr.arpa. 300 IN PTR reverse.atoom.net.
-
-;; ADDITIONAL SECTION:
-127.0.0.10.in-addr.arpa. 300 CH TXT "reverse.atoom.net.:0(10,0,,false)[0,]"
-~~~
-
-## Debug queries
-
-When debug queries are enabled CoreDNS will return errors and etcd records encountered during the resolution
-process in the response. The general form looks like this:
-
- skydns.test.skydns.dom.a. 0 CH TXT "127.0.0.1:0(10,0,,false)[0,]"
-
-This shows the complete key as the owername, the rdata of the TXT record has:
-`host:port(priority,weight,txt content,mail)[targetstrip,group]`.
-
-Errors when communicating with an upstream will be returned as: `host:0(0,0,error message,false)[0,]`.
-
-An example:
-
- www.example.org. 0 CH TXT "www.example.org.:0(0,0, IN A: unreachable backend,false)[0,]"
-
-Signalling that an A record for www.example.org. was sought, but it failed with that error.
-
-Any errors seen doing parsing will show up like this:
-
- . 0 CH TXT "/skydns/local/skydns/r/a: invalid character '.' after object key:value pair"
-
-which shows `a.r.skydns.local.` has a json encoding problem.
diff --git a/middleware/etcd/debug_test.go b/middleware/etcd/debug_test.go
deleted file mode 100644
index ccb06fa68..000000000
--- a/middleware/etcd/debug_test.go
+++ /dev/null
@@ -1,97 +0,0 @@
-// +build etcd
-
-package etcd
-
-import (
- "testing"
-
- "github.com/coredns/coredns/middleware/etcd/msg"
- "github.com/coredns/coredns/middleware/pkg/dnsrecorder"
- "github.com/coredns/coredns/middleware/test"
-
- "github.com/miekg/dns"
-)
-
-func TestDebugLookup(t *testing.T) {
- etc := newEtcdMiddleware()
- etc.Debugging = true
-
- for _, serv := range servicesDebug {
- set(t, etc, serv.Key, 0, serv)
- defer delete(t, etc, serv.Key)
- }
-
- for _, tc := range dnsTestCasesDebug {
- m := tc.Msg()
-
- rec := dnsrecorder.New(&test.ResponseWriter{})
- etc.ServeDNS(ctxt, rec, m)
-
- resp := rec.Msg
- test.SortAndCheck(t, resp, tc)
- }
-}
-
-func TestDebugLookupFalse(t *testing.T) {
- etc := newEtcdMiddleware()
-
- for _, serv := range servicesDebug {
- set(t, etc, serv.Key, 0, serv)
- defer delete(t, etc, serv.Key)
- }
- for _, tc := range dnsTestCasesDebugFalse {
- m := tc.Msg()
-
- rec := dnsrecorder.New(&test.ResponseWriter{})
- etc.ServeDNS(ctxt, rec, m)
-
- resp := rec.Msg
- test.SortAndCheck(t, resp, tc)
- }
-}
-
-var servicesDebug = []*msg.Service{
- {Host: "127.0.0.1", Key: "a.dom.skydns.test."},
- {Host: "127.0.0.2", Key: "b.sub.dom.skydns.test."},
-}
-
-var dnsTestCasesDebug = []test.Case{
- {
- Qname: "o-o.debug.dom.skydns.test.", Qtype: dns.TypeA,
- Answer: []dns.RR{
- test.A("dom.skydns.test. 300 IN A 127.0.0.1"),
- test.A("dom.skydns.test. 300 IN A 127.0.0.2"),
- },
- Extra: []dns.RR{
- test.TXT(`a.dom.skydns.test. 300 CH TXT "127.0.0.1:0(10,0,,false)[0,]"`),
- test.TXT(`b.sub.dom.skydns.test. 300 CH TXT "127.0.0.2:0(10,0,,false)[0,]"`),
- },
- },
- {
- Qname: "o-o.debug.dom.skydns.test.", Qtype: dns.TypeTXT,
- Ns: []dns.RR{
- test.SOA("skydns.test. 300 IN SOA ns.dns.skydns.test. hostmaster.skydns.test. 1463943291 7200 1800 86400 60"),
- },
- Extra: []dns.RR{
- test.TXT(`a.dom.skydns.test. 300 CH TXT "127.0.0.1:0(10,0,,false)[0,]"`),
- test.TXT(`b.sub.dom.skydns.test. 300 CH TXT "127.0.0.2:0(10,0,,false)[0,]"`),
- },
- },
-}
-
-var dnsTestCasesDebugFalse = []test.Case{
- {
- Qname: "o-o.debug.dom.skydns.test.", Qtype: dns.TypeA,
- Rcode: dns.RcodeNameError,
- Ns: []dns.RR{
- test.SOA("skydns.test. 300 IN SOA ns.dns.skydns.test. hostmaster.skydns.test. 1463943291 7200 1800 86400 60"),
- },
- },
- {
- Qname: "o-o.debug.dom.skydns.test.", Qtype: dns.TypeTXT,
- Rcode: dns.RcodeNameError,
- Ns: []dns.RR{
- test.SOA("skydns.test. 300 IN SOA ns.dns.skydns.test. hostmaster.skydns.test. 1463943291 7200 1800 86400 60"),
- },
- },
-}
diff --git a/middleware/etcd/etcd.go b/middleware/etcd/etcd.go
index 42334fac7..5ef6e0a47 100644
--- a/middleware/etcd/etcd.go
+++ b/middleware/etcd/etcd.go
@@ -30,26 +30,23 @@ type Etcd struct {
Ctx context.Context
Inflight *singleflight.Group
Stubmap *map[string]proxy.Proxy // list of proxies for stub resolving.
- Debugging bool // Do we allow debug queries.
endpoints []string // Stored here as well, to aid in testing.
}
// Services implements the ServiceBackend interface.
-func (e *Etcd) Services(state request.Request, exact bool, opt middleware.Options) (services, debug []msg.Service, err error) {
+func (e *Etcd) Services(state request.Request, exact bool, opt middleware.Options) (services []msg.Service, err error) {
services, err = e.Records(state, exact)
if err != nil {
return
}
- if opt.Debug != "" {
- debug = services
- }
+
services = msg.Group(services)
return
}
// Reverse implements the ServiceBackend interface.
-func (e *Etcd) Reverse(state request.Request, exact bool, opt middleware.Options) (services, debug []msg.Service, err error) {
+func (e *Etcd) Reverse(state request.Request, exact bool, opt middleware.Options) (services []msg.Service, err error) {
return e.Services(state, exact, opt)
}
@@ -66,11 +63,6 @@ func (e *Etcd) IsNameError(err error) bool {
return false
}
-// Debug implements the ServiceBackend interface.
-func (e *Etcd) Debug() string {
- return e.PathPrefix
-}
-
// Records looks up records in etcd. If exact is true, it will lookup just this
// name. This is used when find matches when completing SRV lookups for instance.
func (e *Etcd) Records(state request.Request, exact bool) ([]msg.Service, error) {
diff --git a/middleware/etcd/handler.go b/middleware/etcd/handler.go
index 4758f8aab..7857b1955 100644
--- a/middleware/etcd/handler.go
+++ b/middleware/etcd/handler.go
@@ -2,8 +2,6 @@ package etcd
import (
"github.com/coredns/coredns/middleware"
- "github.com/coredns/coredns/middleware/etcd/msg"
- "github.com/coredns/coredns/middleware/pkg/debug"
"github.com/coredns/coredns/middleware/pkg/dnsutil"
"github.com/coredns/coredns/request"
@@ -17,13 +15,6 @@ func (e *Etcd) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (
state := request.Request{W: w, Req: r}
name := state.Name()
- if e.Debugging {
- if bug := debug.IsDebug(name); bug != "" {
- opt.Debug = r.Question[0].Name
- state.Clear()
- state.Req.Question[0].Name = bug
- }
- }
// We need to check stubzones first, because we may get a request for a zone we
// are not auth. for *but* do have a stubzone forward for. If we do the stubzone
@@ -39,49 +30,39 @@ func (e *Etcd) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (
zone := middleware.Zones(e.Zones).Matches(state.Name())
if zone == "" {
- if opt.Debug != "" {
- r.Question[0].Name = opt.Debug
- }
return middleware.NextOrFailure(e.Name(), e.Next, ctx, w, r)
}
var (
records, extra []dns.RR
- debug []msg.Service
err error
)
switch state.Type() {
case "A":
- records, debug, err = middleware.A(e, zone, state, nil, opt)
+ records, err = middleware.A(e, zone, state, nil, opt)
case "AAAA":
- records, debug, err = middleware.AAAA(e, zone, state, nil, opt)
+ records, err = middleware.AAAA(e, zone, state, nil, opt)
case "TXT":
- records, debug, err = middleware.TXT(e, zone, state, opt)
+ records, err = middleware.TXT(e, zone, state, opt)
case "CNAME":
- records, debug, err = middleware.CNAME(e, zone, state, opt)
+ records, err = middleware.CNAME(e, zone, state, opt)
case "PTR":
- records, debug, err = middleware.PTR(e, zone, state, opt)
+ records, err = middleware.PTR(e, zone, state, opt)
case "MX":
- records, extra, debug, err = middleware.MX(e, zone, state, opt)
+ records, extra, err = middleware.MX(e, zone, state, opt)
case "SRV":
- records, extra, debug, err = middleware.SRV(e, zone, state, opt)
+ records, extra, err = middleware.SRV(e, zone, state, opt)
case "SOA":
- records, debug, err = middleware.SOA(e, zone, state, opt)
+ records, err = middleware.SOA(e, zone, state, opt)
case "NS":
if state.Name() == zone {
- records, extra, debug, err = middleware.NS(e, zone, state, opt)
+ records, extra, err = middleware.NS(e, zone, state, opt)
break
}
fallthrough
default:
// Do a fake A lookup, so we can distinguish between NODATA and NXDOMAIN
- _, debug, err = middleware.A(e, zone, state, nil, opt)
- }
-
- if opt.Debug != "" {
- // Substitute this name with the original when we return the request.
- state.Clear()
- state.Req.Question[0].Name = opt.Debug
+ _, err = middleware.A(e, zone, state, nil, opt)
}
if e.IsNameError(err) {
@@ -89,14 +70,14 @@ func (e *Etcd) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (
return middleware.NextOrFailure(e.Name(), e.Next, ctx, w, r)
}
// Make err nil when returning here, so we don't log spam for NXDOMAIN.
- return middleware.BackendError(e, zone, dns.RcodeNameError, state, debug, nil /* err */, opt)
+ return middleware.BackendError(e, zone, dns.RcodeNameError, state, nil /* err */, opt)
}
if err != nil {
- return middleware.BackendError(e, zone, dns.RcodeServerFailure, state, debug, err, opt)
+ return middleware.BackendError(e, zone, dns.RcodeServerFailure, state, err, opt)
}
if len(records) == 0 {
- return middleware.BackendError(e, zone, dns.RcodeSuccess, state, debug, err, opt)
+ return middleware.BackendError(e, zone, dns.RcodeSuccess, state, err, opt)
}
m := new(dns.Msg)
@@ -104,9 +85,6 @@ func (e *Etcd) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (
m.Authoritative, m.RecursionAvailable, m.Compress = true, true, true
m.Answer = append(m.Answer, records...)
m.Extra = append(m.Extra, extra...)
- if opt.Debug != "" {
- m.Extra = append(m.Extra, middleware.ServicesToTxt(debug)...)
- }
m = dnsutil.Dedup(m)
state.SizeAndDo(m)
diff --git a/middleware/etcd/proxy_lookup_test.go b/middleware/etcd/proxy_lookup_test.go
deleted file mode 100644
index ccda417c2..000000000
--- a/middleware/etcd/proxy_lookup_test.go
+++ /dev/null
@@ -1,57 +0,0 @@
-// +build etcd
-
-package etcd
-
-import (
- "testing"
-
- "github.com/coredns/coredns/middleware/etcd/msg"
- "github.com/coredns/coredns/middleware/pkg/dnsrecorder"
- "github.com/coredns/coredns/middleware/proxy"
- "github.com/coredns/coredns/middleware/test"
-
- "github.com/miekg/dns"
-)
-
-func TestProxyLookupFailDebug(t *testing.T) {
- etc := newEtcdMiddleware()
- etc.Proxy = proxy.NewLookup([]string{"127.0.0.1:154"})
- etc.Debugging = true
-
- for _, serv := range servicesProxy {
- set(t, etc, serv.Key, 0, serv)
- defer delete(t, etc, serv.Key)
- }
-
- for _, tc := range dnsTestCasesProxy {
- m := tc.Msg()
-
- rec := dnsrecorder.New(&test.ResponseWriter{})
- _, err := etc.ServeDNS(ctxt, rec, m)
- if err != nil {
- t.Errorf("expected no error, got %v\n", err)
- continue
- }
-
- resp := rec.Msg
- test.SortAndCheck(t, resp, tc)
- }
-}
-
-var servicesProxy = []*msg.Service{
- {Host: "www.example.org", Key: "a.dom.skydns.test."},
-}
-
-var dnsTestCasesProxy = []test.Case{
- {
- Qname: "o-o.debug.dom.skydns.test.", Qtype: dns.TypeSRV,
- Answer: []dns.RR{
- test.SRV("dom.skydns.test. 300 IN SRV 10 100 0 www.example.org."),
- },
- Extra: []dns.RR{
- test.TXT("a.dom.skydns.test. 300 CH TXT \"www.example.org:0(10,0,,false)[0,]\""),
- test.TXT("www.example.org. 0 CH TXT \"www.example.org.:0(0,0, IN A: unreachable backend: no upstream host,false)[0,]\""),
- test.TXT("www.example.org. 0 CH TXT \"www.example.org.:0(0,0, IN AAAA: unreachable backend: no upstream host,false)[0,]\""),
- },
- },
-}
diff --git a/middleware/etcd/setup.go b/middleware/etcd/setup.go
index ee5a93fff..7cbcfd2ea 100644
--- a/middleware/etcd/setup.go
+++ b/middleware/etcd/setup.go
@@ -77,7 +77,7 @@ func etcdParse(c *caddy.Controller) (*Etcd, bool, error) {
case "fallthrough":
etc.Fallthrough = true
case "debug":
- etc.Debugging = true
+ /* it is a noop now */
case "path":
if !c.NextArg() {
return &Etcd{}, false, c.ArgErr()
diff --git a/middleware/kubernetes/handler.go b/middleware/kubernetes/handler.go
index 58aecfe1a..e83ab3d7d 100644
--- a/middleware/kubernetes/handler.go
+++ b/middleware/kubernetes/handler.go
@@ -32,44 +32,44 @@ func (k Kubernetes) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.M
switch state.Type() {
case "A":
- records, _, err = middleware.A(&k, zone, state, nil, middleware.Options{})
+ records, err = middleware.A(&k, zone, state, nil, middleware.Options{})
case "AAAA":
- records, _, err = middleware.AAAA(&k, zone, state, nil, middleware.Options{})
+ records, err = middleware.AAAA(&k, zone, state, nil, middleware.Options{})
case "TXT":
- records, _, err = middleware.TXT(&k, zone, state, middleware.Options{})
+ records, err = middleware.TXT(&k, zone, state, middleware.Options{})
case "CNAME":
- records, _, err = middleware.CNAME(&k, zone, state, middleware.Options{})
+ records, err = middleware.CNAME(&k, zone, state, middleware.Options{})
case "PTR":
- records, _, err = middleware.PTR(&k, zone, state, middleware.Options{})
+ records, err = middleware.PTR(&k, zone, state, middleware.Options{})
case "MX":
- records, extra, _, err = middleware.MX(&k, zone, state, middleware.Options{})
+ records, extra, err = middleware.MX(&k, zone, state, middleware.Options{})
case "SRV":
- records, extra, _, err = middleware.SRV(&k, zone, state, middleware.Options{})
+ records, extra, err = middleware.SRV(&k, zone, state, middleware.Options{})
case "SOA":
- records, _, err = middleware.SOA(&k, zone, state, middleware.Options{})
+ records, err = middleware.SOA(&k, zone, state, middleware.Options{})
case "NS":
if state.Name() == zone {
- records, extra, _, err = middleware.NS(&k, zone, state, middleware.Options{})
+ records, extra, err = middleware.NS(&k, zone, state, middleware.Options{})
break
}
fallthrough
default:
// Do a fake A lookup, so we can distinguish between NODATA and NXDOMAIN
- _, _, err = middleware.A(&k, zone, state, nil, middleware.Options{})
+ _, err = middleware.A(&k, zone, state, nil, middleware.Options{})
}
if k.IsNameError(err) {
if k.Fallthrough {
return middleware.NextOrFailure(k.Name(), k.Next, ctx, w, r)
}
- return middleware.BackendError(&k, zone, dns.RcodeNameError, state, nil /*debug*/, nil /* err */, middleware.Options{})
+ return middleware.BackendError(&k, zone, dns.RcodeNameError, state, nil /* err */, middleware.Options{})
}
if err != nil {
return dns.RcodeServerFailure, err
}
if len(records) == 0 {
- return middleware.BackendError(&k, zone, dns.RcodeSuccess, state, nil /*debug*/, nil, middleware.Options{})
+ return middleware.BackendError(&k, zone, dns.RcodeSuccess, state, nil, middleware.Options{})
}
m.Answer = append(m.Answer, records...)
diff --git a/middleware/kubernetes/kubernetes.go b/middleware/kubernetes/kubernetes.go
index 42c68e580..fe58df74d 100644
--- a/middleware/kubernetes/kubernetes.go
+++ b/middleware/kubernetes/kubernetes.go
@@ -81,7 +81,7 @@ var (
)
// Services implements the ServiceBackend interface.
-func (k *Kubernetes) Services(state request.Request, exact bool, opt middleware.Options) (svcs []msg.Service, debug []msg.Service, err error) {
+func (k *Kubernetes) Services(state request.Request, exact bool, opt middleware.Options) (svcs []msg.Service, err error) {
// We're looking again at types, which we've already done in ServeDNS, but there are some types k8s just can't answer.
switch state.QType() {
@@ -92,19 +92,19 @@ func (k *Kubernetes) Services(state request.Request, exact bool, opt middleware.
segs := dns.SplitDomainName(t)
if len(segs) != 1 {
- return nil, nil, fmt.Errorf("kubernetes: TXT query can only be for dns-version: %s", state.QName())
+ return nil, fmt.Errorf("kubernetes: TXT query can only be for dns-version: %s", state.QName())
}
if segs[0] != "dns-version" {
- return nil, nil, nil
+ return nil, nil
}
svc := msg.Service{Text: DNSSchemaVersion, TTL: 28800, Key: msg.Path(state.QName(), "coredns")}
- return []msg.Service{svc}, nil, nil
+ return []msg.Service{svc}, nil
case dns.TypeNS:
// We can only get here if the qname equal the zone, see ServeDNS in handler.go.
ns := k.nsAddr()
svc := msg.Service{Host: ns.A.String(), Key: msg.Path(state.QName(), "coredns")}
- return []msg.Service{svc}, nil, nil
+ return []msg.Service{svc}, nil
}
if state.QType() == dns.TypeA && isDefaultNS(state.Name(), state.Zone) {
@@ -112,7 +112,7 @@ func (k *Kubernetes) Services(state request.Request, exact bool, opt middleware.
// SOA records always use this hardcoded name
ns := k.nsAddr()
svc := msg.Service{Host: ns.A.String(), Key: msg.Path(state.QName(), "coredns")}
- return []msg.Service{svc}, nil, nil
+ return []msg.Service{svc}, nil
}
s, e := k.Records(state, false)
@@ -120,7 +120,7 @@ func (k *Kubernetes) Services(state request.Request, exact bool, opt middleware.
// SRV for external services is not yet implemented, so remove those records.
if state.QType() != dns.TypeSRV {
- return s, nil, e
+ return s, e
}
internal := []msg.Service{}
@@ -130,13 +130,11 @@ func (k *Kubernetes) Services(state request.Request, exact bool, opt middleware.
}
}
- return internal, nil, e
+ return internal, e
}
// primaryZone will return the first non-reverse zone being handled by this middleware
-func (k *Kubernetes) primaryZone() string {
- return k.Zones[k.primaryZoneIndex]
-}
+func (k *Kubernetes) primaryZone() string { return k.Zones[k.primaryZoneIndex] }
// Lookup implements the ServiceBackend interface.
func (k *Kubernetes) Lookup(state request.Request, name string, typ uint16) (*dns.Msg, error) {
@@ -148,9 +146,6 @@ func (k *Kubernetes) IsNameError(err error) bool {
return err == errNoItems || err == errNsNotExposed || err == errInvalidRequest
}
-// Debug implements the ServiceBackend interface.
-func (k *Kubernetes) Debug() string { return "debug" }
-
func (k *Kubernetes) getClientConfig() (*rest.Config, error) {
loadingRules := &clientcmd.ClientConfigLoadingRules{}
overrides := &clientcmd.ConfigOverrides{}
diff --git a/middleware/kubernetes/kubernetes_test.go b/middleware/kubernetes/kubernetes_test.go
index 3e6d78f7c..573a517b1 100644
--- a/middleware/kubernetes/kubernetes_test.go
+++ b/middleware/kubernetes/kubernetes_test.go
@@ -222,7 +222,7 @@ func TestServices(t *testing.T) {
Req: &dns.Msg{Question: []dns.Question{{Name: test.qname, Qtype: test.qtype}}},
Zone: "interwebs.test.", // must match from k.Zones[0]
}
- svcs, _, e := k.Services(state, false, middleware.Options{})
+ svcs, e := k.Services(state, false, middleware.Options{})
if e != nil {
t.Errorf("Test %d: got error '%v'", i, e)
continue
diff --git a/middleware/kubernetes/reverse.go b/middleware/kubernetes/reverse.go
index eac5a0b04..25ece8035 100644
--- a/middleware/kubernetes/reverse.go
+++ b/middleware/kubernetes/reverse.go
@@ -10,15 +10,15 @@ import (
)
// Reverse implements the ServiceBackend interface.
-func (k *Kubernetes) Reverse(state request.Request, exact bool, opt middleware.Options) ([]msg.Service, []msg.Service, error) {
+func (k *Kubernetes) Reverse(state request.Request, exact bool, opt middleware.Options) ([]msg.Service, error) {
ip := dnsutil.ExtractAddressFromReverse(state.Name())
if ip == "" {
- return nil, nil, nil
+ return nil, nil
}
records := k.serviceRecordForIP(ip, state.Name())
- return records, nil, nil
+ return records, nil
}
// serviceRecordForIP gets a service record with a cluster ip matching the ip argument
diff --git a/middleware/pkg/debug/debug.go b/middleware/pkg/debug/debug.go
deleted file mode 100644
index 7da79608b..000000000
--- a/middleware/pkg/debug/debug.go
+++ /dev/null
@@ -1,21 +0,0 @@
-package debug
-
-import "strings"
-
-// Name is the domain prefix we check for when it is a debug query.
-const Name = "o-o.debug."
-
-// IsDebug checks if name is a debugging name, i.e. starts with o-o.debug.
-// it returns the empty string if it is not a debug message, otherwise it will return the
-// name with o-o.debug. stripped off. Name will be lowercased before comparing.
-func IsDebug(name string) string {
- if len(name) == len(Name) {
- return ""
- }
- name = strings.ToLower(name)
- debug := strings.HasPrefix(name, Name)
- if !debug {
- return ""
- }
- return name[len(Name):]
-}
diff --git a/middleware/pkg/debug/debug_test.go b/middleware/pkg/debug/debug_test.go
deleted file mode 100644
index 9b0d9ea4f..000000000
--- a/middleware/pkg/debug/debug_test.go
+++ /dev/null
@@ -1,21 +0,0 @@
-package debug
-
-import (
- "strings"
- "testing"
-)
-
-func TestIsDebug(t *testing.T) {
- if ok := IsDebug("o-o.debug.miek.nl."); ok != "miek.nl." {
- t.Errorf("expected o-o.debug.miek.nl. to be debug")
- }
- if ok := IsDebug(strings.ToLower("o-o.Debug.miek.nl.")); ok != "miek.nl." {
- t.Errorf("expected o-o.Debug.miek.nl. to be debug")
- }
- if ok := IsDebug("i-o.debug.miek.nl."); ok != "" {
- t.Errorf("expected i-o.Debug.miek.nl. to be non-debug")
- }
- if ok := IsDebug(strings.ToLower("i-o.Debug.")); ok != "" {
- t.Errorf("expected o-o.Debug. to be non-debug")
- }
-}
diff --git a/middleware/proxy/google.go b/middleware/proxy/google.go
index 205b09379..b7e605fcb 100644
--- a/middleware/proxy/google.go
+++ b/middleware/proxy/google.go
@@ -13,7 +13,6 @@ import (
"sync/atomic"
"time"
- "github.com/coredns/coredns/middleware/pkg/debug"
"github.com/coredns/coredns/middleware/pkg/healthcheck"
"github.com/coredns/coredns/request"
@@ -50,12 +49,6 @@ func (g *google) Exchange(ctx context.Context, addr string, state request.Reques
v.Set("name", state.Name())
v.Set("type", fmt.Sprintf("%d", state.QType()))
- optDebug := false
- if bug := debug.IsDebug(state.Name()); bug != "" {
- optDebug = true
- v.Set("name", bug)
- }
-
buf, backendErr := g.exchangeJSON(addr, v.Encode())
if backendErr == nil {
@@ -64,19 +57,11 @@ func (g *google) Exchange(ctx context.Context, addr string, state request.Reques
return nil, err
}
- m, debug, err := toMsg(gm)
+ m, err := toMsg(gm)
if err != nil {
return nil, err
}
- if optDebug {
- // reset question
- m.Question[0].Name = state.QName()
- // prepend debug RR to the additional section
- m.Extra = append([]dns.RR{debug}, m.Extra...)
-
- }
-
m.Id = state.Req.Id
return m, nil
}
diff --git a/middleware/proxy/google_rr.go b/middleware/proxy/google_rr.go
index 8c7e82bc2..3b9233b7b 100644
--- a/middleware/proxy/google_rr.go
+++ b/middleware/proxy/google_rr.go
@@ -6,8 +6,8 @@ import (
"github.com/miekg/dns"
)
-// toMsg converts a googleMsg into the dns message. The returned RR is the comment disquised as a TXT record.
-func toMsg(g *googleMsg) (*dns.Msg, dns.RR, error) {
+// toMsg converts a googleMsg into the dns message.
+func toMsg(g *googleMsg) (*dns.Msg, error) {
m := new(dns.Msg)
m.Response = true
m.Rcode = g.Status
@@ -28,24 +28,23 @@ func toMsg(g *googleMsg) (*dns.Msg, dns.RR, error) {
for i := 0; i < len(m.Answer); i++ {
m.Answer[i], err = toRR(g.Answer[i])
if err != nil {
- return nil, nil, err
+ return nil, err
}
}
for i := 0; i < len(m.Ns); i++ {
m.Ns[i], err = toRR(g.Authority[i])
if err != nil {
- return nil, nil, err
+ return nil, err
}
}
for i := 0; i < len(m.Extra); i++ {
m.Extra[i], err = toRR(g.Additional[i])
if err != nil {
- return nil, nil, err
+ return nil, err
}
}
- txt, _ := dns.NewRR(". 0 CH TXT " + g.Comment)
- return m, txt, nil
+ return m, nil
}
// toRR transforms a "google" RR to a dns.RR.
diff --git a/test/etcd_cache_debug_test.go b/test/etcd_cache_test.go
index 599e95b5c..db283e73e 100644
--- a/test/etcd_cache_debug_test.go
+++ b/test/etcd_cache_test.go
@@ -18,11 +18,10 @@ import (
// uses some stuff from etcd_tests.go
-func TestEtcdCacheAndDebug(t *testing.T) {
+func TestEtcdCache(t *testing.T) {
corefile := `.:0 {
etcd skydns.test {
path /skydns
- debug
}
cache skydns.test
}`
@@ -51,15 +50,6 @@ func TestEtcdCacheAndDebug(t *testing.T) {
}
checkResponse(t, resp)
- resp, err = p.Lookup(state, "o-o.debug.b.example.skydns.test.", dns.TypeA)
- if err != nil {
- t.Errorf("Expected to receive reply, but didn't: %s", err)
- }
- checkResponse(t, resp)
- if len(resp.Extra) != 1 {
- t.Errorf("Expected one RR in additional section, got: %d", len(resp.Extra))
- }
-
resp, err = p.Lookup(state, "b.example.skydns.test.", dns.TypeA)
if err != nil {
t.Errorf("Expected to receive reply, but didn't: %s", err)