aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--plugin/backend_lookup.go75
-rw-r--r--plugin/etcd/handler.go3
-rw-r--r--plugin/etcd/msg/service.go31
-rw-r--r--plugin/kubernetes/handler.go4
-rw-r--r--plugin/kubernetes/kubernetes.go2
-rw-r--r--plugin/pkg/dnsutil/dedup.go12
6 files changed, 66 insertions, 61 deletions
diff --git a/plugin/backend_lookup.go b/plugin/backend_lookup.go
index 89bc56a2f..33d1846a8 100644
--- a/plugin/backend_lookup.go
+++ b/plugin/backend_lookup.go
@@ -19,6 +19,8 @@ func A(b ServiceBackend, zone string, state request.Request, previousRecords []d
return nil, err
}
+ dup := make(map[string]bool)
+
for _, serv := range services {
what, ip := serv.HostType()
@@ -67,10 +69,13 @@ func A(b ServiceBackend, zone string, state request.Request, previousRecords []d
continue
case dns.TypeA:
- records = append(records, serv.NewA(state.QName(), ip))
+ if _, ok := dup[serv.Host]; !ok {
+ dup[serv.Host] = true
+ records = append(records, serv.NewA(state.QName(), ip))
+ }
case dns.TypeAAAA:
- // nodata?
+ // nada
}
}
return records, nil
@@ -83,6 +88,8 @@ func AAAA(b ServiceBackend, zone string, state request.Request, previousRecords
return nil, err
}
+ dup := make(map[string]bool)
+
for _, serv := range services {
what, ip := serv.HostType()
@@ -132,10 +139,13 @@ func AAAA(b ServiceBackend, zone string, state request.Request, previousRecords
// both here again
case dns.TypeA:
- // nada?
+ // nada
case dns.TypeAAAA:
- records = append(records, serv.NewAAAA(state.QName(), ip))
+ if _, ok := dup[serv.Host]; !ok {
+ dup[serv.Host] = true
+ records = append(records, serv.NewAAAA(state.QName(), ip))
+ }
}
}
return records, nil
@@ -149,7 +159,18 @@ func SRV(b ServiceBackend, zone string, state request.Request, opt Options) (rec
return nil, nil, err
}
- // Looping twice to get the right weight vs priority
+ type s struct {
+ n string
+ p uint16
+ }
+ dup := make(map[s]bool)
+ type a struct {
+ n string
+ a string
+ }
+ dupAddr := make(map[a]bool)
+
+ // Looping twice to get the right weight vs priority. This might break because we may drop duplicate SRV records latter on.
w := make(map[int]int)
for _, serv := range services {
weight := 100
@@ -212,11 +233,19 @@ func SRV(b ServiceBackend, zone string, state request.Request, opt Options) (rec
// IPv6 lookups here as well? AAAA(zone, state1, nil).
case dns.TypeA, dns.TypeAAAA:
+ addr := serv.Host
serv.Host = msg.Domain(serv.Key)
srv := serv.NewSRV(state.QName(), weight)
- records = append(records, srv)
- extra = append(extra, newAddress(serv, srv.Target, ip, what))
+ if _, ok := dup[s{srv.Target, srv.Port}]; !ok {
+ dup[s{srv.Target, srv.Port}] = true
+ records = append(records, srv)
+ }
+
+ if _, ok := dupAddr[a{srv.Target, addr}]; !ok {
+ dupAddr[a{srv.Target, addr}] = true
+ extra = append(extra, newAddress(serv, srv.Target, ip, what))
+ }
}
}
return records, extra, nil
@@ -229,6 +258,17 @@ func MX(b ServiceBackend, zone string, state request.Request, opt Options) (reco
return nil, nil, err
}
+ type s struct {
+ n string
+ p uint16
+ }
+ dup := make(map[s]bool)
+ type a struct {
+ n string
+ a string
+ }
+ dupAddr := make(map[a]bool)
+
lookup := make(map[string]bool)
for _, serv := range services {
if !serv.Mail {
@@ -271,9 +311,19 @@ func MX(b ServiceBackend, zone string, state request.Request, opt Options) (reco
// e.AAAA as well
case dns.TypeA, dns.TypeAAAA:
+ addr := serv.Host
serv.Host = msg.Domain(serv.Key)
- records = append(records, serv.NewMX(state.QName()))
- extra = append(extra, newAddress(serv, serv.Host, ip, what))
+ mx := serv.NewMX(state.QName())
+
+ if _, ok := dup[s{mx.Mx, mx.Preference}]; !ok {
+ dup[s{mx.Mx, mx.Preference}] = true
+ records = append(records, mx)
+ }
+ // Fake port to be 0 for address...
+ if _, ok := dupAddr[a{serv.Host, addr}]; !ok {
+ dupAddr[a{serv.Host, addr}] = true
+ extra = append(extra, newAddress(serv, serv.Host, ip, what))
+ }
}
}
return records, extra, nil
@@ -318,9 +368,14 @@ func PTR(b ServiceBackend, zone string, state request.Request, opt Options) (rec
return nil, err
}
+ dup := make(map[string]bool)
+
for _, serv := range services {
if ip := net.ParseIP(serv.Host); ip == nil {
- records = append(records, serv.NewPTR(state.QName(), serv.Host))
+ if _, ok := dup[serv.Host]; !ok {
+ dup[serv.Host] = true
+ records = append(records, serv.NewPTR(state.QName(), serv.Host))
+ }
}
}
return records, nil
diff --git a/plugin/etcd/handler.go b/plugin/etcd/handler.go
index f69fdad00..8520680d8 100644
--- a/plugin/etcd/handler.go
+++ b/plugin/etcd/handler.go
@@ -4,7 +4,6 @@ import (
"context"
"github.com/coredns/coredns/plugin"
- "github.com/coredns/coredns/plugin/pkg/dnsutil"
"github.com/coredns/coredns/request"
"github.com/miekg/dns"
@@ -88,8 +87,6 @@ func (e *Etcd) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (
m.Answer = append(m.Answer, records...)
m.Extra = append(m.Extra, extra...)
- // TODO(miek): get rid of this by not adding dups in the first place, dnsutil.Append()?
- m = dnsutil.Dedup(m)
state.SizeAndDo(m)
m, _ = state.Scrub(m)
w.WriteMsg(m)
diff --git a/plugin/etcd/msg/service.go b/plugin/etcd/msg/service.go
index 9250cb634..68ffc544b 100644
--- a/plugin/etcd/msg/service.go
+++ b/plugin/etcd/msg/service.go
@@ -2,7 +2,6 @@
package msg
import (
- "fmt"
"net"
"strings"
@@ -37,36 +36,6 @@ type Service struct {
Key string `json:"-"`
}
-// RR returns an RR representation of s. It is in a condensed form to minimize space
-// when this is returned in a DNS message.
-// The RR will look like:
-// 1.rails.production.east.skydns.local. 300 CH TXT "service1.example.com:8080(10,0,,false)[0,]"
-// etcd Key Ttl Host:Port < see below >
-// between parens: (Priority, Weight, Text (only first 200 bytes!), Mail)
-// between blockquotes: [TargetStrip,Group]
-// If the record is synthesised by CoreDNS (i.e. no lookup in etcd happened):
-//
-// TODO(miek): what to put here?
-//
-func (s *Service) RR() *dns.TXT {
- l := len(s.Text)
- if l > 200 {
- l = 200
- }
- t := new(dns.TXT)
- t.Hdr.Class = dns.ClassCHAOS
- t.Hdr.Ttl = s.TTL
- t.Hdr.Rrtype = dns.TypeTXT
- t.Hdr.Name = Domain(s.Key)
-
- t.Txt = make([]string, 1)
- t.Txt[0] = fmt.Sprintf("%s:%d(%d,%d,%s,%t)[%d,%s]",
- s.Host, s.Port,
- s.Priority, s.Weight, s.Text[:l], s.Mail,
- s.TargetStrip, s.Group)
- return t
-}
-
// NewSRV returns a new SRV record based on the Service.
func (s *Service) NewSRV(name string, weight uint16) *dns.SRV {
host := targetStrip(dns.Fqdn(s.Host), s.TargetStrip)
diff --git a/plugin/kubernetes/handler.go b/plugin/kubernetes/handler.go
index 012ce200b..c02bdedf9 100644
--- a/plugin/kubernetes/handler.go
+++ b/plugin/kubernetes/handler.go
@@ -4,7 +4,6 @@ import (
"context"
"github.com/coredns/coredns/plugin"
- "github.com/coredns/coredns/plugin/pkg/dnsutil"
"github.com/coredns/coredns/request"
"github.com/miekg/dns"
@@ -79,9 +78,6 @@ func (k Kubernetes) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.M
m.Answer = append(m.Answer, records...)
m.Extra = append(m.Extra, extra...)
- // TODO(miek): get rid of this by not adding dups in the first place, dnsutil.Append()?
- m = dnsutil.Dedup(m)
-
state.SizeAndDo(m)
m, _ = state.Scrub(m)
w.WriteMsg(m)
diff --git a/plugin/kubernetes/kubernetes.go b/plugin/kubernetes/kubernetes.go
index d07b99f0e..af0e64ee9 100644
--- a/plugin/kubernetes/kubernetes.go
+++ b/plugin/kubernetes/kubernetes.go
@@ -107,7 +107,7 @@ func (k *Kubernetes) Services(state request.Request, exact bool, opt plugin.Opti
return []msg.Service{svc}, nil
case dns.TypeNS:
- // We can only get here if the qname equal the zone, see ServeDNS in handler.go.
+ // We can only get here if the qname equals 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
diff --git a/plugin/pkg/dnsutil/dedup.go b/plugin/pkg/dnsutil/dedup.go
deleted file mode 100644
index dae656a01..000000000
--- a/plugin/pkg/dnsutil/dedup.go
+++ /dev/null
@@ -1,12 +0,0 @@
-package dnsutil
-
-import "github.com/miekg/dns"
-
-// Dedup de-duplicates a message.
-func Dedup(m *dns.Msg) *dns.Msg {
- // TODO(miek): expensive!
- m.Answer = dns.Dedup(m.Answer, nil)
- m.Ns = dns.Dedup(m.Ns, nil)
- m.Extra = dns.Dedup(m.Extra, nil)
- return m
-}