From 76792ffc0b262bc3de9d7ef4d0c53a21697c6cc3 Mon Sep 17 00:00:00 2001 From: Wim Date: Tue, 2 Jun 2015 23:47:18 +0200 Subject: [PATCH] Send SOA with negative responses --- command/agent/dns.go | 3 ++ command/agent/dns_test.go | 76 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+) diff --git a/command/agent/dns.go b/command/agent/dns.go index f4d8bb8891dc..d1ef0d1be665 100644 --- a/command/agent/dns.go +++ b/command/agent/dns.go @@ -333,6 +333,7 @@ PARSE: return INVALID: d.logger.Printf("[WARN] dns: QName invalid: %s", qName) + d.addSOA(d.domain, resp) resp.SetRcode(req, dns.RcodeNameError) } @@ -367,6 +368,7 @@ RPC: // If we have no address, return not found! if out.NodeServices == nil { + d.addSOA(d.domain, resp) resp.SetRcode(req, dns.RcodeNameError) return } @@ -469,6 +471,7 @@ RPC: // If we have no nodes, return not found! if len(out.Nodes) == 0 { + d.addSOA(d.domain, resp) resp.SetRcode(req, dns.RcodeNameError) return } diff --git a/command/agent/dns_test.go b/command/agent/dns_test.go index ec584a1cd2d1..47fb26d2c7eb 100644 --- a/command/agent/dns_test.go +++ b/command/agent/dns_test.go @@ -157,6 +157,28 @@ func TestDNS_NodeLookup(t *testing.T) { if aRec.Hdr.Ttl != 0 { t.Fatalf("Bad: %#v", in.Answer[0]) } + + // lookup a non-existing node, we should receive a SOA + m = new(dns.Msg) + m.SetQuestion("nofoo.node.dc1.consul.", dns.TypeANY) + + c = new(dns.Client) + in, _, err = c.Exchange(m, addr.String()) + if err != nil { + t.Fatalf("err: %v", err) + } + + if len(in.Ns) != 1 { + t.Fatalf("Bad: %#v", in, len(in.Answer)) + } + + soaRec, ok := in.Ns[0].(*dns.SOA) + if !ok { + t.Fatalf("Bad: %#v", in.Ns[0]) + } + if soaRec.Hdr.Ttl != 0 { + t.Fatalf("Bad: %#v", in.Ns[0]) + } } func TestDNS_CaseInsensitiveNodeLookup(t *testing.T) { @@ -524,6 +546,29 @@ func TestDNS_ServiceLookup(t *testing.T) { if aRec.Hdr.Ttl != 0 { t.Fatalf("Bad: %#v", in.Extra[0]) } + + // lookup a non-existing service, we should receive a SOA + m = new(dns.Msg) + m.SetQuestion("nodb.service.consul.", dns.TypeSRV) + + c = new(dns.Client) + addr, _ = srv.agent.config.ClientListener("", srv.agent.config.Ports.DNS) + in, _, err = c.Exchange(m, addr.String()) + if err != nil { + t.Fatalf("err: %v", err) + } + + if len(in.Ns) != 1 { + t.Fatalf("Bad: %#v", in) + } + + soaRec, ok := in.Ns[0].(*dns.SOA) + if !ok { + t.Fatalf("Bad: %#v", in.Ns[0]) + } + if soaRec.Hdr.Ttl != 0 { + t.Fatalf("Bad: %#v", in.Ns[0]) + } } func TestDNS_ServiceLookup_ServiceAddress(t *testing.T) { @@ -1692,3 +1737,34 @@ func TestDNS_ServiceLookup_SRV_RFC_TCP_Default(t *testing.T) { t.Fatalf("Bad: %#v", in.Extra[0]) } } + +func TestDNS_NonExistingLookup(t *testing.T) { + dir, srv := makeDNSServer(t, nil, nil) + defer os.RemoveAll(dir) + defer srv.agent.Shutdown() + + addr, _ := srv.agent.config.ClientListener("", srv.agent.config.Ports.DNS) + + // lookup a non-existing node, we should receive a SOA + m := new(dns.Msg) + m.SetQuestion("nonexisting.consul.", dns.TypeANY) + + c := new(dns.Client) + in, _, err := c.Exchange(m, addr.String()) + if err != nil { + t.Fatalf("err: %v", err) + } + + if len(in.Ns) != 1 { + t.Fatalf("Bad: %#v", in, len(in.Answer)) + } + + soaRec, ok := in.Ns[0].(*dns.SOA) + if !ok { + t.Fatalf("Bad: %#v", in.Ns[0]) + } + if soaRec.Hdr.Ttl != 0 { + t.Fatalf("Bad: %#v", in.Ns[0]) + } + +}