Remove debug queries (#1058)

* Remove debug from interface and methods

* remove debug queries from etcd

* remove debug queries from k8s - they were not used

* And remove from mw/proxy-google as well

* Remove debug query test
This commit is contained in:
Miek Gieben
2017-09-12 10:52:43 +01:00
committed by GitHub
parent c2105a4f41
commit 3e252deabb
17 changed files with 99 additions and 462 deletions

View File

@@ -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.

View File

@@ -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"),
},
},
}

View File

@@ -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) {

View File

@@ -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)

View File

@@ -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,]\""),
},
},
}

View File

@@ -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()