Set SOA record TTL as min of TTL/MINIMUM (#2295)

* Set SOA record TTL as min of TTL/MINIMUM

According to
https://tools.ietf.org/html/rfc2308#section-3:

  The TTL of this record is set from the minimum
  of the MINIMUM field of the SOA record and the
  TTL of the SOA itself, and indicates how long a
  resolver may cache the negative answer.

Set the TTL accordingly so as to not always
negative cache SOA records for 300 seconds.

* Inline min func

* Update SOA record tests

* Fix types
This commit is contained in:
stuart nelson 2018-11-16 14:42:49 +01:00 committed by Chris O'Haver
parent 3f6dfba1f0
commit 8dbe1fbee2
9 changed files with 43 additions and 37 deletions

View file

@ -391,7 +391,13 @@ func NS(b ServiceBackend, zone string, state request.Request, opt Options) (reco
// SOA returns a SOA record from the backend. // SOA returns a SOA record from the backend.
func SOA(b ServiceBackend, zone string, state request.Request, opt Options) ([]dns.RR, 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} minTTL := b.MinTTL(state)
ttl := uint32(300)
if minTTL < ttl {
ttl = minTTL
}
header := dns.RR_Header{Name: zone, Rrtype: dns.TypeSOA, Ttl: ttl, Class: dns.ClassINET}
Mbox := hostmaster + "." Mbox := hostmaster + "."
Ns := "ns.dns." Ns := "ns.dns."
@ -407,7 +413,7 @@ func SOA(b ServiceBackend, zone string, state request.Request, opt Options) ([]d
Refresh: 7200, Refresh: 7200,
Retry: 1800, Retry: 1800,
Expire: 86400, Expire: 86400,
Minttl: b.MinTTL(state), Minttl: minTTL,
} }
return []dns.RR{soa}, nil return []dns.RR{soa}, nil
} }

View file

@ -81,7 +81,7 @@ var dnsTestCases = []test.Case{
Qname: "doesnotexist.skydns.test.", Qtype: dns.TypeA, Qname: "doesnotexist.skydns.test.", Qtype: dns.TypeA,
Rcode: dns.RcodeNameError, Rcode: dns.RcodeNameError,
Ns: []dns.RR{ Ns: []dns.RR{
test.SOA("skydns.test. 300 SOA ns.dns.skydns.test. hostmaster.skydns.test. 0 0 0 0 0"), test.SOA("skydns.test. 30 SOA ns.dns.skydns.test. hostmaster.skydns.test. 0 0 0 0 0"),
}, },
}, },
// A Test // A Test
@ -126,7 +126,7 @@ var dnsTestCases = []test.Case{
// CNAME (unresolvable internal name) // CNAME (unresolvable internal name)
{ {
Qname: "cname.prod.region1.skydns.test.", Qtype: dns.TypeA, Qname: "cname.prod.region1.skydns.test.", Qtype: dns.TypeA,
Ns: []dns.RR{test.SOA("skydns.test. 300 SOA ns.dns.skydns.test. hostmaster.skydns.test. 0 0 0 0 0")}, Ns: []dns.RR{test.SOA("skydns.test. 30 SOA ns.dns.skydns.test. hostmaster.skydns.test. 0 0 0 0 0")},
}, },
// Wildcard Test // Wildcard Test
{ {
@ -182,26 +182,26 @@ var dnsTestCases = []test.Case{
// CNAME loop detection // CNAME loop detection
{ {
Qname: "a.cname.skydns.test.", Qtype: dns.TypeA, Qname: "a.cname.skydns.test.", Qtype: dns.TypeA,
Ns: []dns.RR{test.SOA("skydns.test. 300 SOA ns.dns.skydns.test. hostmaster.skydns.test. 1407441600 28800 7200 604800 60")}, Ns: []dns.RR{test.SOA("skydns.test. 30 SOA ns.dns.skydns.test. hostmaster.skydns.test. 1407441600 28800 7200 604800 60")},
}, },
// NODATA Test // NODATA Test
{ {
Qname: "a.server1.dev.region1.skydns.test.", Qtype: dns.TypeTXT, Qname: "a.server1.dev.region1.skydns.test.", Qtype: dns.TypeTXT,
Ns: []dns.RR{test.SOA("skydns.test. 300 SOA ns.dns.skydns.test. hostmaster.skydns.test. 0 0 0 0 0")}, Ns: []dns.RR{test.SOA("skydns.test. 30 SOA ns.dns.skydns.test. hostmaster.skydns.test. 0 0 0 0 0")},
}, },
// NODATA Test // NODATA Test
{ {
Qname: "a.server1.dev.region1.skydns.test.", Qtype: dns.TypeHINFO, Qname: "a.server1.dev.region1.skydns.test.", Qtype: dns.TypeHINFO,
Ns: []dns.RR{test.SOA("skydns.test. 300 SOA ns.dns.skydns.test. hostmaster.skydns.test. 0 0 0 0 0")}, Ns: []dns.RR{test.SOA("skydns.test. 30 SOA ns.dns.skydns.test. hostmaster.skydns.test. 0 0 0 0 0")},
}, },
// NXDOMAIN Test // NXDOMAIN Test
{ {
Qname: "a.server1.nonexistent.region1.skydns.test.", Qtype: dns.TypeHINFO, Rcode: dns.RcodeNameError, Qname: "a.server1.nonexistent.region1.skydns.test.", Qtype: dns.TypeHINFO, Rcode: dns.RcodeNameError,
Ns: []dns.RR{test.SOA("skydns.test. 300 SOA ns.dns.skydns.test. hostmaster.skydns.test. 0 0 0 0 0")}, Ns: []dns.RR{test.SOA("skydns.test. 30 SOA ns.dns.skydns.test. hostmaster.skydns.test. 0 0 0 0 0")},
}, },
{ {
Qname: "skydns.test.", Qtype: dns.TypeSOA, Qname: "skydns.test.", Qtype: dns.TypeSOA,
Answer: []dns.RR{test.SOA("skydns.test. 300 IN SOA ns.dns.skydns.test. hostmaster.skydns.test. 1460498836 14400 3600 604800 60")}, Answer: []dns.RR{test.SOA("skydns.test. 30 IN SOA ns.dns.skydns.test. hostmaster.skydns.test. 1460498836 14400 3600 604800 60")},
}, },
// NS Record Test // NS Record Test
{ {
@ -218,7 +218,7 @@ var dnsTestCases = []test.Case{
// NS Record Test // NS Record Test
{ {
Qname: "a.skydns.test.", Qtype: dns.TypeNS, Rcode: dns.RcodeNameError, Qname: "a.skydns.test.", Qtype: dns.TypeNS, Rcode: dns.RcodeNameError,
Ns: []dns.RR{test.SOA("skydns.test. 300 IN SOA ns.dns.skydns.test. hostmaster.skydns.test. 1460498836 14400 3600 604800 60")}, Ns: []dns.RR{test.SOA("skydns.test. 30 IN SOA ns.dns.skydns.test. hostmaster.skydns.test. 1460498836 14400 3600 604800 60")},
}, },
// A Record For NS Record Test // A Record For NS Record Test
{ {
@ -230,7 +230,7 @@ var dnsTestCases = []test.Case{
}, },
{ {
Qname: "skydns_extra.test.", Qtype: dns.TypeSOA, Qname: "skydns_extra.test.", Qtype: dns.TypeSOA,
Answer: []dns.RR{test.SOA("skydns_extra.test. 300 IN SOA ns.dns.skydns_extra.test. hostmaster.skydns_extra.test. 1460498836 14400 3600 604800 60")}, Answer: []dns.RR{test.SOA("skydns_extra.test. 30 IN SOA ns.dns.skydns_extra.test. hostmaster.skydns_extra.test. 1460498836 14400 3600 604800 60")},
}, },
// A Record Test for backward compatibility for zone records // A Record Test for backward compatibility for zone records
{ {

View file

@ -75,7 +75,7 @@ var dnsTestCasesOther = []test.Case{
// NODATA as this is not an Mail: true record. // NODATA as this is not an Mail: true record.
Qname: "a.server1.dev.region1.skydns.test.", Qtype: dns.TypeMX, Qname: "a.server1.dev.region1.skydns.test.", Qtype: dns.TypeMX,
Ns: []dns.RR{ Ns: []dns.RR{
test.SOA("skydns.test. 300 SOA ns.dns.skydns.test. hostmaster.skydns.test. 0 0 0 0 0"), test.SOA("skydns.test. 30 SOA ns.dns.skydns.test. hostmaster.skydns.test. 0 0 0 0 0"),
}, },
}, },
{ {

View file

@ -16,7 +16,7 @@ var dnsEmptyServiceTestCases = []test.Case{
Qname: "svcempty.testns.svc.cluster.local.", Qtype: dns.TypeA, Qname: "svcempty.testns.svc.cluster.local.", Qtype: dns.TypeA,
Rcode: dns.RcodeNameError, Rcode: dns.RcodeNameError,
Ns: []dns.RR{ Ns: []dns.RR{
test.SOA("cluster.local. 300 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1499347823 7200 1800 86400 60"), test.SOA("cluster.local. 30 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1499347823 7200 1800 86400 60"),
}, },
}, },
} }

View file

@ -15,14 +15,14 @@ var podModeDisabledCases = []test.Case{
Qname: "10-240-0-1.podns.pod.cluster.local.", Qtype: dns.TypeA, Qname: "10-240-0-1.podns.pod.cluster.local.", Qtype: dns.TypeA,
Rcode: dns.RcodeNameError, Rcode: dns.RcodeNameError,
Ns: []dns.RR{ Ns: []dns.RR{
test.SOA("cluster.local. 300 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1499347823 7200 1800 86400 60"), test.SOA("cluster.local. 30 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1499347823 7200 1800 86400 60"),
}, },
}, },
{ {
Qname: "172-0-0-2.podns.pod.cluster.local.", Qtype: dns.TypeA, Qname: "172-0-0-2.podns.pod.cluster.local.", Qtype: dns.TypeA,
Rcode: dns.RcodeNameError, Rcode: dns.RcodeNameError,
Ns: []dns.RR{ Ns: []dns.RR{
test.SOA("cluster.local. 300 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1499347823 7200 1800 86400 60"), test.SOA("cluster.local. 30 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1499347823 7200 1800 86400 60"),
}, },
}, },
} }

View file

@ -29,35 +29,35 @@ var podModeInsecureCases = []test.Case{
Qname: "blah.podns.pod.cluster.local.", Qtype: dns.TypeA, Qname: "blah.podns.pod.cluster.local.", Qtype: dns.TypeA,
Rcode: dns.RcodeNameError, Rcode: dns.RcodeNameError,
Ns: []dns.RR{ Ns: []dns.RR{
test.SOA("cluster.local. 300 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1515173576 7200 1800 86400 30"), test.SOA("cluster.local. 30 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1515173576 7200 1800 86400 30"),
}, },
}, },
{ {
Qname: "blah.podns.pod.cluster.local.", Qtype: dns.TypeAAAA, Qname: "blah.podns.pod.cluster.local.", Qtype: dns.TypeAAAA,
Rcode: dns.RcodeNameError, Rcode: dns.RcodeNameError,
Ns: []dns.RR{ Ns: []dns.RR{
test.SOA("cluster.local. 300 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1515173576 7200 1800 86400 30"), test.SOA("cluster.local. 30 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1515173576 7200 1800 86400 30"),
}, },
}, },
{ {
Qname: "blah.podns.pod.cluster.local.", Qtype: dns.TypeHINFO, Qname: "blah.podns.pod.cluster.local.", Qtype: dns.TypeHINFO,
Rcode: dns.RcodeNameError, Rcode: dns.RcodeNameError,
Ns: []dns.RR{ Ns: []dns.RR{
test.SOA("cluster.local. 300 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1515173576 7200 1800 86400 30"), test.SOA("cluster.local. 30 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1515173576 7200 1800 86400 30"),
}, },
}, },
{ {
Qname: "blah.pod-nons.pod.cluster.local.", Qtype: dns.TypeA, Qname: "blah.pod-nons.pod.cluster.local.", Qtype: dns.TypeA,
Rcode: dns.RcodeNameError, Rcode: dns.RcodeNameError,
Ns: []dns.RR{ Ns: []dns.RR{
test.SOA("cluster.local. 300 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1515173576 7200 1800 86400 30"), test.SOA("cluster.local. 30 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1515173576 7200 1800 86400 30"),
}, },
}, },
{ {
Qname: "podns.pod.cluster.local.", Qtype: dns.TypeA, Qname: "podns.pod.cluster.local.", Qtype: dns.TypeA,
Rcode: dns.RcodeSuccess, Rcode: dns.RcodeSuccess,
Ns: []dns.RR{ Ns: []dns.RR{
test.SOA("cluster.local. 300 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1515173576 7200 1800 86400 30"), test.SOA("cluster.local. 30 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1515173576 7200 1800 86400 30"),
}, },
}, },
} }

View file

@ -22,28 +22,28 @@ var podModeVerifiedCases = []test.Case{
Qname: "podns.pod.cluster.local.", Qtype: dns.TypeA, Qname: "podns.pod.cluster.local.", Qtype: dns.TypeA,
Rcode: dns.RcodeSuccess, Rcode: dns.RcodeSuccess,
Ns: []dns.RR{ Ns: []dns.RR{
test.SOA("cluster.local. 300 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1499347823 7200 1800 86400 60"), test.SOA("cluster.local. 30 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1499347823 7200 1800 86400 60"),
}, },
}, },
{ {
Qname: "svcns.svc.cluster.local.", Qtype: dns.TypeA, Qname: "svcns.svc.cluster.local.", Qtype: dns.TypeA,
Rcode: dns.RcodeSuccess, Rcode: dns.RcodeSuccess,
Ns: []dns.RR{ Ns: []dns.RR{
test.SOA("cluster.local. 300 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1499347823 7200 1800 86400 60"), test.SOA("cluster.local. 30 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1499347823 7200 1800 86400 60"),
}, },
}, },
{ {
Qname: "pod-nons.pod.cluster.local.", Qtype: dns.TypeA, Qname: "pod-nons.pod.cluster.local.", Qtype: dns.TypeA,
Rcode: dns.RcodeNameError, Rcode: dns.RcodeNameError,
Ns: []dns.RR{ Ns: []dns.RR{
test.SOA("cluster.local. 300 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1499347823 7200 1800 86400 60"), test.SOA("cluster.local. 30 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1499347823 7200 1800 86400 60"),
}, },
}, },
{ {
Qname: "172-0-0-2.podns.pod.cluster.local.", Qtype: dns.TypeA, Qname: "172-0-0-2.podns.pod.cluster.local.", Qtype: dns.TypeA,
Rcode: dns.RcodeNameError, Rcode: dns.RcodeNameError,
Ns: []dns.RR{ Ns: []dns.RR{
test.SOA("cluster.local. 300 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1499347823 7200 1800 86400 60"), test.SOA("cluster.local. 30 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1499347823 7200 1800 86400 60"),
}, },
}, },
} }

View file

@ -90,7 +90,7 @@ var dnsTestCases = []test.Case{
Qname: "*._not-udp-or-tcp.svc1.testns.svc.cluster.local.", Qtype: dns.TypeSRV, Qname: "*._not-udp-or-tcp.svc1.testns.svc.cluster.local.", Qtype: dns.TypeSRV,
Rcode: dns.RcodeNameError, Rcode: dns.RcodeNameError,
Ns: []dns.RR{ Ns: []dns.RR{
test.SOA("cluster.local. 300 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1499347823 7200 1800 86400 60"), test.SOA("cluster.local. 30 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1499347823 7200 1800 86400 60"),
}, },
}, },
// SRV Service // SRV Service
@ -201,7 +201,7 @@ var dnsTestCases = []test.Case{
Qname: "*.*.hdlsprtls.testns.svc.cluster.local.", Qtype: dns.TypeSRV, Qname: "*.*.hdlsprtls.testns.svc.cluster.local.", Qtype: dns.TypeSRV,
Rcode: dns.RcodeSuccess, Rcode: dns.RcodeSuccess,
Ns: []dns.RR{ Ns: []dns.RR{
test.SOA("cluster.local. 300 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1499347823 7200 1800 86400 60"), test.SOA("cluster.local. 30 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1499347823 7200 1800 86400 60"),
}, },
}, },
// AAAA // AAAA
@ -232,7 +232,7 @@ var dnsTestCases = []test.Case{
Qname: "svc1.testns.svc.cluster.local.", Qtype: dns.TypeAAAA, Qname: "svc1.testns.svc.cluster.local.", Qtype: dns.TypeAAAA,
Rcode: dns.RcodeSuccess, Rcode: dns.RcodeSuccess,
Ns: []dns.RR{ Ns: []dns.RR{
test.SOA("cluster.local. 300 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1499347823 7200 1800 86400 60"), test.SOA("cluster.local. 30 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1499347823 7200 1800 86400 60"),
}, },
}, },
// AAAA Service (non-existing service) // AAAA Service (non-existing service)
@ -240,7 +240,7 @@ var dnsTestCases = []test.Case{
Qname: "svc0.testns.svc.cluster.local.", Qtype: dns.TypeAAAA, Qname: "svc0.testns.svc.cluster.local.", Qtype: dns.TypeAAAA,
Rcode: dns.RcodeNameError, Rcode: dns.RcodeNameError,
Ns: []dns.RR{ Ns: []dns.RR{
test.SOA("cluster.local. 300 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1499347823 7200 1800 86400 60"), test.SOA("cluster.local. 30 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1499347823 7200 1800 86400 60"),
}, },
}, },
// A Service (non-existing service) // A Service (non-existing service)
@ -248,7 +248,7 @@ var dnsTestCases = []test.Case{
Qname: "svc0.testns.svc.cluster.local.", Qtype: dns.TypeA, Qname: "svc0.testns.svc.cluster.local.", Qtype: dns.TypeA,
Rcode: dns.RcodeNameError, Rcode: dns.RcodeNameError,
Ns: []dns.RR{ Ns: []dns.RR{
test.SOA("cluster.local. 300 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1499347823 7200 1800 86400 60"), test.SOA("cluster.local. 30 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1499347823 7200 1800 86400 60"),
}, },
}, },
// A Service (non-existing namespace) // A Service (non-existing namespace)
@ -256,7 +256,7 @@ var dnsTestCases = []test.Case{
Qname: "svc0.svc-nons.svc.cluster.local.", Qtype: dns.TypeA, Qname: "svc0.svc-nons.svc.cluster.local.", Qtype: dns.TypeA,
Rcode: dns.RcodeNameError, Rcode: dns.RcodeNameError,
Ns: []dns.RR{ Ns: []dns.RR{
test.SOA("cluster.local. 300 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1499347823 7200 1800 86400 60"), test.SOA("cluster.local. 30 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1499347823 7200 1800 86400 60"),
}, },
}, },
// TXT Schema // TXT Schema
@ -272,7 +272,7 @@ var dnsTestCases = []test.Case{
Qname: "bogusendpoint.hdls1.testns.svc.cluster.local.", Qtype: dns.TypeA, Qname: "bogusendpoint.hdls1.testns.svc.cluster.local.", Qtype: dns.TypeA,
Rcode: dns.RcodeNameError, Rcode: dns.RcodeNameError,
Ns: []dns.RR{ Ns: []dns.RR{
test.SOA("cluster.local. 300 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1499347823 7200 1800 86400 60"), test.SOA("cluster.local. 30 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1499347823 7200 1800 86400 60"),
}, },
}, },
// A Service does not exist // A Service does not exist
@ -280,7 +280,7 @@ var dnsTestCases = []test.Case{
Qname: "bogusendpoint.svc0.testns.svc.cluster.local.", Qtype: dns.TypeA, Qname: "bogusendpoint.svc0.testns.svc.cluster.local.", Qtype: dns.TypeA,
Rcode: dns.RcodeNameError, Rcode: dns.RcodeNameError,
Ns: []dns.RR{ Ns: []dns.RR{
test.SOA("cluster.local. 300 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1499347823 7200 1800 86400 60"), test.SOA("cluster.local. 30 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1499347823 7200 1800 86400 60"),
}, },
}, },
// AAAA Service // AAAA Service

View file

@ -151,35 +151,35 @@ func TestReverse(t *testing.T) {
Qname: "101.0.0.10.in-addr.arpa.", Qtype: dns.TypePTR, Qname: "101.0.0.10.in-addr.arpa.", Qtype: dns.TypePTR,
Rcode: dns.RcodeNameError, Rcode: dns.RcodeNameError,
Ns: []dns.RR{ Ns: []dns.RR{
test.SOA("0.10.in-addr.arpa. 300 IN SOA ns.dns.0.10.in-addr.arpa. hostmaster.0.10.in-addr.arpa. 1502782828 7200 1800 86400 60"), test.SOA("0.10.in-addr.arpa. 30 IN SOA ns.dns.0.10.in-addr.arpa. hostmaster.0.10.in-addr.arpa. 1502782828 7200 1800 86400 60"),
}, },
}, },
{ {
Qname: "example.org.cluster.local.", Qtype: dns.TypePTR, Qname: "example.org.cluster.local.", Qtype: dns.TypePTR,
Rcode: dns.RcodeNameError, Rcode: dns.RcodeNameError,
Ns: []dns.RR{ Ns: []dns.RR{
test.SOA("cluster.local. 300 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1502989566 7200 1800 86400 60"), test.SOA("cluster.local. 30 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1502989566 7200 1800 86400 60"),
}, },
}, },
{ {
Qname: "svc1.testns.svc.cluster.local.", Qtype: dns.TypePTR, Qname: "svc1.testns.svc.cluster.local.", Qtype: dns.TypePTR,
Rcode: dns.RcodeSuccess, Rcode: dns.RcodeSuccess,
Ns: []dns.RR{ Ns: []dns.RR{
test.SOA("cluster.local. 300 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1502989566 7200 1800 86400 60"), test.SOA("cluster.local. 30 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1502989566 7200 1800 86400 60"),
}, },
}, },
{ {
Qname: "svc1.testns.svc.0.10.in-addr.arpa.", Qtype: dns.TypeA, Qname: "svc1.testns.svc.0.10.in-addr.arpa.", Qtype: dns.TypeA,
Rcode: dns.RcodeNameError, Rcode: dns.RcodeNameError,
Ns: []dns.RR{ Ns: []dns.RR{
test.SOA("0.10.in-addr.arpa. 300 IN SOA ns.dns.0.10.in-addr.arpa. hostmaster.0.10.in-addr.arpa. 1502989566 7200 1800 86400 60"), test.SOA("0.10.in-addr.arpa. 30 IN SOA ns.dns.0.10.in-addr.arpa. hostmaster.0.10.in-addr.arpa. 1502989566 7200 1800 86400 60"),
}, },
}, },
{ {
Qname: "100.0.0.10.cluster.local.", Qtype: dns.TypePTR, Qname: "100.0.0.10.cluster.local.", Qtype: dns.TypePTR,
Rcode: dns.RcodeNameError, Rcode: dns.RcodeNameError,
Ns: []dns.RR{ Ns: []dns.RR{
test.SOA("cluster.local. 300 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1502989566 7200 1800 86400 60"), test.SOA("cluster.local. 30 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1502989566 7200 1800 86400 60"),
}, },
}, },
} }