aboutsummaryrefslogtreecommitdiff
path: root/plugin
diff options
context:
space:
mode:
Diffstat (limited to 'plugin')
-rw-r--r--plugin/auto/auto.go4
-rw-r--r--plugin/backend.go8
-rw-r--r--plugin/backend_lookup.go67
-rw-r--r--plugin/etcd/etcd.go21
-rw-r--r--plugin/etcd/handler.go28
-rw-r--r--plugin/etcd/lookup_test.go1
-rw-r--r--plugin/etcd/setup.go6
-rw-r--r--plugin/federation/federation.go4
-rw-r--r--plugin/file/file.go4
-rw-r--r--plugin/file/lookup.go20
-rw-r--r--plugin/file/reload_test.go6
-rw-r--r--plugin/kubernetes/handler.go28
-rw-r--r--plugin/kubernetes/kubernetes.go11
-rw-r--r--plugin/kubernetes/kubernetes_test.go3
-rw-r--r--plugin/kubernetes/reverse.go5
-rw-r--r--plugin/kubernetes/xfr.go2
-rw-r--r--plugin/pkg/upstream/upstream.go7
-rw-r--r--plugin/route53/route53.go2
-rw-r--r--plugin/template/template.go4
19 files changed, 117 insertions, 114 deletions
diff --git a/plugin/auto/auto.go b/plugin/auto/auto.go
index a09c22801..84e3222cd 100644
--- a/plugin/auto/auto.go
+++ b/plugin/auto/auto.go
@@ -41,7 +41,7 @@ type (
// ServeDNS implements the plugin.Handler interface.
func (a Auto) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (int, error) {
- state := request.Request{W: w, Req: r, Context: ctx}
+ state := request.Request{W: w, Req: r}
qname := state.Name()
// Precheck with the origins, i.e. are we allowed to look here?
@@ -66,7 +66,7 @@ func (a Auto) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (i
return xfr.ServeDNS(ctx, w, r)
}
- answer, ns, extra, result := z.Lookup(state, qname)
+ answer, ns, extra, result := z.Lookup(ctx, state, qname)
m := new(dns.Msg)
m.SetReply(r)
diff --git a/plugin/backend.go b/plugin/backend.go
index b2d4df19e..32443a955 100644
--- a/plugin/backend.go
+++ b/plugin/backend.go
@@ -13,18 +13,18 @@ import (
type ServiceBackend interface {
// Services communicates with the backend to retrieve the service definitions. Exact indicates
// on exact match should be returned.
- Services(state request.Request, exact bool, opt Options) ([]msg.Service, error)
+ Services(ctx context.Context, 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, error)
+ Reverse(ctx context.Context, 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)
+ Lookup(ctx context.Context, state request.Request, name string, typ uint16) (*dns.Msg, error)
// 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)
+ Records(ctx context.Context, state request.Request, exact bool) ([]msg.Service, error)
// IsNameError return true if err indicated a record not found condition
IsNameError(err error) bool
diff --git a/plugin/backend_lookup.go b/plugin/backend_lookup.go
index 0649ccfa5..096cf806b 100644
--- a/plugin/backend_lookup.go
+++ b/plugin/backend_lookup.go
@@ -1,6 +1,7 @@
package plugin
import (
+ "context"
"fmt"
"math"
"net"
@@ -13,8 +14,8 @@ 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, err error) {
- services, err := checkForApex(b, zone, state, opt)
+func A(ctx context.Context, b ServiceBackend, zone string, state request.Request, previousRecords []dns.RR, opt Options) (records []dns.RR, err error) {
+ services, err := checkForApex(ctx, b, zone, state, opt)
if err != nil {
return nil, err
}
@@ -43,7 +44,7 @@ func A(b ServiceBackend, zone string, state request.Request, previousRecords []d
if dns.IsSubDomain(zone, dns.Fqdn(serv.Host)) {
state1 := state.NewWithQuestion(serv.Host, state.QType())
state1.Zone = zone
- nextRecords, err := A(b, zone, state1, append(previousRecords, newRecord), opt)
+ nextRecords, err := A(ctx, 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.
@@ -57,7 +58,7 @@ func A(b ServiceBackend, zone string, state request.Request, previousRecords []d
// This means we can not complete the CNAME, try to look else where.
target := newRecord.Target
// Lookup
- m1, e1 := b.Lookup(state, target, state.QType())
+ m1, e1 := b.Lookup(ctx, state, target, state.QType())
if e1 != nil {
continue
}
@@ -80,8 +81,8 @@ func A(b ServiceBackend, zone string, state request.Request, previousRecords []d
}
// 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, err error) {
- services, err := checkForApex(b, zone, state, opt)
+func AAAA(ctx context.Context, b ServiceBackend, zone string, state request.Request, previousRecords []dns.RR, opt Options) (records []dns.RR, err error) {
+ services, err := checkForApex(ctx, b, zone, state, opt)
if err != nil {
return nil, err
}
@@ -111,7 +112,7 @@ func AAAA(b ServiceBackend, zone string, state request.Request, previousRecords
if dns.IsSubDomain(zone, dns.Fqdn(serv.Host)) {
state1 := state.NewWithQuestion(serv.Host, state.QType())
state1.Zone = zone
- nextRecords, err := AAAA(b, zone, state1, append(previousRecords, newRecord), opt)
+ nextRecords, err := AAAA(ctx, 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.
@@ -124,7 +125,7 @@ func AAAA(b ServiceBackend, zone string, state request.Request, previousRecords
}
// This means we can not complete the CNAME, try to look else where.
target := newRecord.Target
- m1, e1 := b.Lookup(state, target, state.QType())
+ m1, e1 := b.Lookup(ctx, state, target, state.QType())
if e1 != nil {
continue
}
@@ -149,8 +150,8 @@ func AAAA(b ServiceBackend, zone string, state request.Request, previousRecords
// 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, err error) {
- services, err := b.Services(state, false, opt)
+func SRV(ctx context.Context, b ServiceBackend, zone string, state request.Request, opt Options) (records, extra []dns.RR, err error) {
+ services, err := b.Services(ctx, state, false, opt)
if err != nil {
return nil, nil, err
}
@@ -199,12 +200,12 @@ func SRV(b ServiceBackend, zone string, state request.Request, opt Options) (rec
lookup[srv.Target] = struct{}{}
if !dns.IsSubDomain(zone, srv.Target) {
- m1, e1 := b.Lookup(state, srv.Target, dns.TypeA)
+ m1, e1 := b.Lookup(ctx, state, srv.Target, dns.TypeA)
if e1 == nil {
extra = append(extra, m1.Answer...)
}
- m1, e1 = b.Lookup(state, srv.Target, dns.TypeAAAA)
+ m1, e1 = b.Lookup(ctx, state, srv.Target, dns.TypeAAAA)
if e1 == nil {
// If we have seen CNAME's we *assume* that they are already added.
for _, a := range m1.Answer {
@@ -218,7 +219,7 @@ func SRV(b ServiceBackend, zone string, state request.Request, opt Options) (rec
// 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, e1 := A(b, zone, state1, nil, opt)
+ addr, e1 := A(ctx, b, zone, state1, nil, opt)
if e1 == nil {
extra = append(extra, addr...)
}
@@ -242,8 +243,8 @@ func SRV(b ServiceBackend, zone string, state request.Request, opt Options) (rec
}
// 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, err error) {
- services, err := b.Services(state, false, opt)
+func MX(ctx context.Context, b ServiceBackend, zone string, state request.Request, opt Options) (records, extra []dns.RR, err error) {
+ services, err := b.Services(ctx, state, false, opt)
if err != nil {
return nil, nil, err
}
@@ -266,12 +267,12 @@ func MX(b ServiceBackend, zone string, state request.Request, opt Options) (reco
lookup[mx.Mx] = struct{}{}
if !dns.IsSubDomain(zone, mx.Mx) {
- m1, e1 := b.Lookup(state, mx.Mx, dns.TypeA)
+ m1, e1 := b.Lookup(ctx, state, mx.Mx, dns.TypeA)
if e1 == nil {
extra = append(extra, m1.Answer...)
}
- m1, e1 = b.Lookup(state, mx.Mx, dns.TypeAAAA)
+ m1, e1 = b.Lookup(ctx, state, mx.Mx, dns.TypeAAAA)
if e1 == nil {
// If we have seen CNAME's we *assume* that they are already added.
for _, a := range m1.Answer {
@@ -284,7 +285,7 @@ func MX(b ServiceBackend, zone string, state request.Request, opt Options) (reco
}
// Internal name
state1 := state.NewWithQuestion(mx.Mx, dns.TypeA)
- addr, e1 := A(b, zone, state1, nil, opt)
+ addr, e1 := A(ctx, b, zone, state1, nil, opt)
if e1 == nil {
extra = append(extra, addr...)
}
@@ -308,8 +309,8 @@ func MX(b ServiceBackend, zone string, state request.Request, opt Options) (reco
}
// CNAME returns CNAME records from the backend or an error.
-func CNAME(b ServiceBackend, zone string, state request.Request, opt Options) (records []dns.RR, err error) {
- services, err := b.Services(state, true, opt)
+func CNAME(ctx context.Context, b ServiceBackend, zone string, state request.Request, opt Options) (records []dns.RR, err error) {
+ services, err := b.Services(ctx, state, true, opt)
if err != nil {
return nil, err
}
@@ -324,8 +325,8 @@ func CNAME(b ServiceBackend, zone string, state request.Request, opt Options) (r
}
// TXT returns TXT records from Backend or an error.
-func TXT(b ServiceBackend, zone string, state request.Request, opt Options) (records []dns.RR, err error) {
- services, err := b.Services(state, false, opt)
+func TXT(ctx context.Context, b ServiceBackend, zone string, state request.Request, opt Options) (records []dns.RR, err error) {
+ services, err := b.Services(ctx, state, false, opt)
if err != nil {
return nil, err
}
@@ -337,8 +338,8 @@ func TXT(b ServiceBackend, zone string, state request.Request, opt Options) (rec
}
// 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, err error) {
- services, err := b.Reverse(state, true, opt)
+func PTR(ctx context.Context, b ServiceBackend, zone string, state request.Request, opt Options) (records []dns.RR, err error) {
+ services, err := b.Reverse(ctx, state, true, opt)
if err != nil {
return nil, err
}
@@ -357,14 +358,14 @@ func PTR(b ServiceBackend, zone string, state request.Request, opt Options) (rec
}
// NS returns NS records from the backend
-func NS(b ServiceBackend, zone string, state request.Request, opt Options) (records, extra []dns.RR, err error) {
+func NS(ctx context.Context, 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, err := b.Services(state, false, opt)
+ services, err := b.Services(ctx, state, false, opt)
if err != nil {
return nil, nil, err
}
@@ -387,7 +388,7 @@ func NS(b ServiceBackend, zone string, state request.Request, opt Options) (reco
}
// SOA returns a SOA record from the backend.
-func SOA(b ServiceBackend, zone string, state request.Request, opt Options) ([]dns.RR, error) {
+func SOA(ctx context.Context, b ServiceBackend, zone string, state request.Request, opt Options) ([]dns.RR, error) {
minTTL := b.MinTTL(state)
ttl := uint32(300)
if minTTL < ttl {
@@ -416,11 +417,11 @@ func SOA(b ServiceBackend, zone string, state request.Request, opt Options) ([]d
}
// BackendError writes an error response to the client.
-func BackendError(b ServiceBackend, zone string, rcode int, state request.Request, err error, opt Options) (int, error) {
+func BackendError(ctx context.Context, 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 = true
- m.Ns, _ = SOA(b, zone, state, opt)
+ m.Ns, _ = SOA(ctx, b, zone, state, opt)
state.W.WriteMsg(m)
// Return success as the rcode to signal we have written to the client.
@@ -439,9 +440,9 @@ func newAddress(s msg.Service, name string, ip net.IP, what uint16) dns.RR {
}
// checkForApex checks the special apex.dns directory for records that will be returned as A or AAAA.
-func checkForApex(b ServiceBackend, zone string, state request.Request, opt Options) ([]msg.Service, error) {
+func checkForApex(ctx context.Context, b ServiceBackend, zone string, state request.Request, opt Options) ([]msg.Service, error) {
if state.Name() != zone {
- return b.Services(state, false, opt)
+ return b.Services(ctx, state, false, opt)
}
// If the zone name itself is queried we fake the query to search for a special entry
@@ -450,14 +451,14 @@ func checkForApex(b ServiceBackend, zone string, state request.Request, opt Opti
state.Clear()
state.Req.Question[0].Name = dnsutil.Join("apex.dns", zone)
- services, err := b.Services(state, false, opt)
+ services, err := b.Services(ctx, state, false, opt)
if err == nil {
state.Req.Question[0].Name = old
return services, err
}
state.Req.Question[0].Name = old
- return b.Services(state, false, opt)
+ return b.Services(ctx, state, false, opt)
}
// item holds records.
diff --git a/plugin/etcd/etcd.go b/plugin/etcd/etcd.go
index 236923b51..5c8f9f110 100644
--- a/plugin/etcd/etcd.go
+++ b/plugin/etcd/etcd.go
@@ -36,14 +36,13 @@ type Etcd struct {
PathPrefix string
Upstream *upstream.Upstream
Client *etcdcv3.Client
- Ctx context.Context
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 plugin.Options) (services []msg.Service, err error) {
- services, err = e.Records(state, exact)
+func (e *Etcd) Services(ctx context.Context, state request.Request, exact bool, opt plugin.Options) (services []msg.Service, err error) {
+ services, err = e.Records(ctx, state, exact)
if err != nil {
return
}
@@ -53,13 +52,13 @@ func (e *Etcd) Services(state request.Request, exact bool, opt plugin.Options) (
}
// Reverse implements the ServiceBackend interface.
-func (e *Etcd) Reverse(state request.Request, exact bool, opt plugin.Options) (services []msg.Service, err error) {
- return e.Services(state, exact, opt)
+func (e *Etcd) Reverse(ctx context.Context, state request.Request, exact bool, opt plugin.Options) (services []msg.Service, err error) {
+ return e.Services(ctx, state, exact, opt)
}
// Lookup implements the ServiceBackend interface.
-func (e *Etcd) Lookup(state request.Request, name string, typ uint16) (*dns.Msg, error) {
- return e.Upstream.Lookup(state, name, typ)
+func (e *Etcd) Lookup(ctx context.Context, state request.Request, name string, typ uint16) (*dns.Msg, error) {
+ return e.Upstream.Lookup(ctx, state, name, typ)
}
// IsNameError implements the ServiceBackend interface.
@@ -69,11 +68,11 @@ func (e *Etcd) IsNameError(err error) bool {
// 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) {
+func (e *Etcd) Records(ctx context.Context, state request.Request, exact bool) ([]msg.Service, error) {
name := state.Name()
path, star := msg.PathWithWildcard(name, e.PathPrefix)
- r, err := e.get(path, !exact)
+ r, err := e.get(ctx, path, !exact)
if err != nil {
return nil, err
}
@@ -81,8 +80,8 @@ func (e *Etcd) Records(state request.Request, exact bool) ([]msg.Service, error)
return e.loopNodes(r.Kvs, segments, star, state.QType())
}
-func (e *Etcd) get(path string, recursive bool) (*etcdcv3.GetResponse, error) {
- ctx, cancel := context.WithTimeout(e.Ctx, etcdTimeout)
+func (e *Etcd) get(ctx context.Context, path string, recursive bool) (*etcdcv3.GetResponse, error) {
+ ctx, cancel := context.WithTimeout(ctx, etcdTimeout)
defer cancel()
if recursive == true {
if !strings.HasSuffix(path, "/") {
diff --git a/plugin/etcd/handler.go b/plugin/etcd/handler.go
index d9c6de4c9..c62956736 100644
--- a/plugin/etcd/handler.go
+++ b/plugin/etcd/handler.go
@@ -12,7 +12,7 @@ import (
// ServeDNS implements the plugin.Handler interface.
func (e *Etcd) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (int, error) {
opt := plugin.Options{}
- state := request.Request{W: w, Req: r, Context: ctx}
+ state := request.Request{W: w, Req: r}
zone := plugin.Zones(e.Zones).Matches(state.Name())
if zone == "" {
@@ -26,44 +26,44 @@ func (e *Etcd) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (
switch state.QType() {
case dns.TypeA:
- records, err = plugin.A(e, zone, state, nil, opt)
+ records, err = plugin.A(ctx, e, zone, state, nil, opt)
case dns.TypeAAAA:
- records, err = plugin.AAAA(e, zone, state, nil, opt)
+ records, err = plugin.AAAA(ctx, e, zone, state, nil, opt)
case dns.TypeTXT:
- records, err = plugin.TXT(e, zone, state, opt)
+ records, err = plugin.TXT(ctx, e, zone, state, opt)
case dns.TypeCNAME:
- records, err = plugin.CNAME(e, zone, state, opt)
+ records, err = plugin.CNAME(ctx, e, zone, state, opt)
case dns.TypePTR:
- records, err = plugin.PTR(e, zone, state, opt)
+ records, err = plugin.PTR(ctx, e, zone, state, opt)
case dns.TypeMX:
- records, extra, err = plugin.MX(e, zone, state, opt)
+ records, extra, err = plugin.MX(ctx, e, zone, state, opt)
case dns.TypeSRV:
- records, extra, err = plugin.SRV(e, zone, state, opt)
+ records, extra, err = plugin.SRV(ctx, e, zone, state, opt)
case dns.TypeSOA:
- records, err = plugin.SOA(e, zone, state, opt)
+ records, err = plugin.SOA(ctx, e, zone, state, opt)
case dns.TypeNS:
if state.Name() == zone {
- records, extra, err = plugin.NS(e, zone, state, opt)
+ records, extra, err = plugin.NS(ctx, e, zone, state, opt)
break
}
fallthrough
default:
// Do a fake A lookup, so we can distinguish between NODATA and NXDOMAIN
- _, err = plugin.A(e, zone, state, nil, opt)
+ _, err = plugin.A(ctx, e, zone, state, nil, opt)
}
if err != nil && e.IsNameError(err) {
if e.Fall.Through(state.Name()) {
return plugin.NextOrFailure(e.Name(), e.Next, ctx, w, r)
}
// Make err nil when returning here, so we don't log spam for NXDOMAIN.
- return plugin.BackendError(e, zone, dns.RcodeNameError, state, nil /* err */, opt)
+ return plugin.BackendError(ctx, e, zone, dns.RcodeNameError, state, nil /* err */, opt)
}
if err != nil {
- return plugin.BackendError(e, zone, dns.RcodeServerFailure, state, err, opt)
+ return plugin.BackendError(ctx, e, zone, dns.RcodeServerFailure, state, err, opt)
}
if len(records) == 0 {
- return plugin.BackendError(e, zone, dns.RcodeSuccess, state, err, opt)
+ return plugin.BackendError(ctx, e, zone, dns.RcodeSuccess, state, err, opt)
}
m := new(dns.Msg)
diff --git a/plugin/etcd/lookup_test.go b/plugin/etcd/lookup_test.go
index e440baedb..115710785 100644
--- a/plugin/etcd/lookup_test.go
+++ b/plugin/etcd/lookup_test.go
@@ -294,7 +294,6 @@ func newEtcdPlugin() *Etcd {
return &Etcd{
Upstream: upstream.New(),
PathPrefix: "skydns",
- Ctx: context.Background(),
Zones: []string{"skydns.test.", "skydns_extra.test.", "skydns_zonea.test.", "skydns_zoneb.test.", "skydns_zonec.test.", "skydns_zoned.test.", "in-addr.arpa."},
Client: client,
}
diff --git a/plugin/etcd/setup.go b/plugin/etcd/setup.go
index 3cf73377f..a5f9c5af2 100644
--- a/plugin/etcd/setup.go
+++ b/plugin/etcd/setup.go
@@ -1,7 +1,6 @@
package etcd
import (
- "context"
"crypto/tls"
"github.com/coredns/coredns/core/dnsserver"
@@ -38,10 +37,7 @@ func setup(c *caddy.Controller) error {
}
func etcdParse(c *caddy.Controller) (*Etcd, error) {
- etc := Etcd{
- PathPrefix: "skydns",
- Ctx: context.Background(),
- }
+ etc := Etcd{PathPrefix: "skydns"}
var (
tlsConfig *tls.Config
err error
diff --git a/plugin/federation/federation.go b/plugin/federation/federation.go
index 424067941..7fe2a6f62 100644
--- a/plugin/federation/federation.go
+++ b/plugin/federation/federation.go
@@ -51,7 +51,7 @@ func (f *Federation) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.
return plugin.NextOrFailure(f.Name(), f.Next, ctx, w, r)
}
- state := request.Request{W: w, Req: r, Context: ctx}
+ state := request.Request{W: w, Req: r}
zone := plugin.Zones(f.zones).Matches(state.Name())
if zone == "" {
@@ -109,7 +109,7 @@ func (f *Federation) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.
m.Answer = []dns.RR{service.NewCNAME(state.QName(), service.Host)}
if f.Upstream != nil {
- aRecord, err := f.Upstream.Lookup(state, service.Host, state.QType())
+ aRecord, err := f.Upstream.Lookup(ctx, state, service.Host, state.QType())
if err == nil && aRecord != nil && len(aRecord.Answer) > 0 {
m.Answer = append(m.Answer, aRecord.Answer...)
}
diff --git a/plugin/file/file.go b/plugin/file/file.go
index 0010f0811..40ebbedf7 100644
--- a/plugin/file/file.go
+++ b/plugin/file/file.go
@@ -31,7 +31,7 @@ type (
// ServeDNS implements the plugin.Handle interface.
func (f File) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (int, error) {
- state := request.Request{W: w, Req: r, Context: ctx}
+ state := request.Request{W: w, Req: r}
qname := state.Name()
// TODO(miek): match the qname better in the map
@@ -79,7 +79,7 @@ func (f File) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (i
return xfr.ServeDNS(ctx, w, r)
}
- answer, ns, extra, result := z.Lookup(state, qname)
+ answer, ns, extra, result := z.Lookup(ctx, state, qname)
m := new(dns.Msg)
m.SetReply(r)
diff --git a/plugin/file/lookup.go b/plugin/file/lookup.go
index d020b7788..52b78114c 100644
--- a/plugin/file/lookup.go
+++ b/plugin/file/lookup.go
@@ -1,6 +1,8 @@
package file
import (
+ "context"
+
"github.com/coredns/coredns/plugin/file/tree"
"github.com/coredns/coredns/request"
@@ -25,7 +27,7 @@ const (
// Lookup looks up qname and qtype in the zone. When do is true DNSSEC records are included.
// Three sets of records are returned, one for the answer, one for authority and one for the additional section.
-func (z *Zone) Lookup(state request.Request, qname string) ([]dns.RR, []dns.RR, []dns.RR, Result) {
+func (z *Zone) Lookup(ctx context.Context, state request.Request, qname string) ([]dns.RR, []dns.RR, []dns.RR, Result) {
qtype := state.QType()
do := state.Do()
@@ -106,7 +108,7 @@ func (z *Zone) Lookup(state request.Request, qname string) ([]dns.RR, []dns.RR,
// Only one DNAME is allowed per name. We just pick the first one to synthesize from.
dname := dnamerrs[0]
if cname := synthesizeCNAME(state.Name(), dname.(*dns.DNAME)); cname != nil {
- answer, ns, extra, rcode := z.additionalProcessing(state, elem, []dns.RR{cname})
+ answer, ns, extra, rcode := z.additionalProcessing(ctx, state, elem, []dns.RR{cname})
if do {
sigs := elem.Types(dns.TypeRRSIG)
@@ -157,7 +159,7 @@ func (z *Zone) Lookup(state request.Request, qname string) ([]dns.RR, []dns.RR,
if found && shot {
if rrs := elem.Types(dns.TypeCNAME); len(rrs) > 0 && qtype != dns.TypeCNAME {
- return z.additionalProcessing(state, elem, rrs)
+ return z.additionalProcessing(ctx, state, elem, rrs)
}
rrs := elem.Types(qtype, qname)
@@ -193,7 +195,7 @@ func (z *Zone) Lookup(state request.Request, qname string) ([]dns.RR, []dns.RR,
auth := z.ns(do)
if rrs := wildElem.Types(dns.TypeCNAME, qname); len(rrs) > 0 {
- return z.additionalProcessing(state, wildElem, rrs)
+ return z.additionalProcessing(ctx, state, wildElem, rrs)
}
rrs := wildElem.Types(qtype, qname)
@@ -296,7 +298,7 @@ func (z *Zone) ns(do bool) []dns.RR {
}
// aditionalProcessing adds signatures and tries to resolve CNAMEs that point to external names.
-func (z *Zone) additionalProcessing(state request.Request, elem *tree.Elem, rrs []dns.RR) ([]dns.RR, []dns.RR, []dns.RR, Result) {
+func (z *Zone) additionalProcessing(ctx context.Context, state request.Request, elem *tree.Elem, rrs []dns.RR) ([]dns.RR, []dns.RR, []dns.RR, Result) {
qtype := state.QType()
do := state.Do()
@@ -312,7 +314,7 @@ func (z *Zone) additionalProcessing(state request.Request, elem *tree.Elem, rrs
targetName := rrs[0].(*dns.CNAME).Target
elem, _ = z.Tree.Search(targetName)
if elem == nil {
- rrs = append(rrs, z.externalLookup(state, targetName, qtype)...)
+ rrs = append(rrs, z.externalLookup(ctx, state, targetName, qtype)...)
return rrs, z.ns(do), nil, Success
}
@@ -333,7 +335,7 @@ Redo:
targetName := cname[0].(*dns.CNAME).Target
elem, _ = z.Tree.Search(targetName)
if elem == nil {
- rrs = append(rrs, z.externalLookup(state, targetName, qtype)...)
+ rrs = append(rrs, z.externalLookup(ctx, state, targetName, qtype)...)
return rrs, z.ns(do), nil, Success
}
@@ -371,8 +373,8 @@ func cnameForType(targets []dns.RR, origQtype uint16) []dns.RR {
return ret
}
-func (z *Zone) externalLookup(state request.Request, target string, qtype uint16) []dns.RR {
- m, e := z.Upstream.Lookup(state, target, qtype)
+func (z *Zone) externalLookup(ctx context.Context, state request.Request, target string, qtype uint16) []dns.RR {
+ m, e := z.Upstream.Lookup(ctx, state, target, qtype)
if e != nil {
return nil
}
diff --git a/plugin/file/reload_test.go b/plugin/file/reload_test.go
index 2f7b6cf0f..1139b8a44 100644
--- a/plugin/file/reload_test.go
+++ b/plugin/file/reload_test.go
@@ -1,6 +1,7 @@
package file
import (
+ "context"
"io/ioutil"
"os"
"strings"
@@ -33,17 +34,18 @@ func TestZoneReload(t *testing.T) {
z.Reload()
time.Sleep(time.Second)
+ ctx := context.TODO()
r := new(dns.Msg)
r.SetQuestion("miek.nl", dns.TypeSOA)
state := request.Request{W: &test.ResponseWriter{}, Req: r}
- if _, _, _, res := z.Lookup(state, "miek.nl."); res != Success {
+ if _, _, _, res := z.Lookup(ctx, state, "miek.nl."); res != Success {
t.Fatalf("Failed to lookup, got %d", res)
}
r = new(dns.Msg)
r.SetQuestion("miek.nl", dns.TypeNS)
state = request.Request{W: &test.ResponseWriter{}, Req: r}
- if _, _, _, res := z.Lookup(state, "miek.nl."); res != Success {
+ if _, _, _, res := z.Lookup(ctx, state, "miek.nl."); res != Success {
t.Fatalf("Failed to lookup, got %d", res)
}
diff --git a/plugin/kubernetes/handler.go b/plugin/kubernetes/handler.go
index 8952de45a..324e08da6 100644
--- a/plugin/kubernetes/handler.go
+++ b/plugin/kubernetes/handler.go
@@ -11,7 +11,7 @@ import (
// ServeDNS implements the plugin.Handler interface.
func (k Kubernetes) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (int, error) {
- state := request.Request{W: w, Req: r, Context: ctx}
+ state := request.Request{W: w, Req: r}
qname := state.QName()
zone := plugin.Zones(k.Zones).Matches(qname)
@@ -29,24 +29,24 @@ func (k Kubernetes) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.M
switch state.QType() {
case dns.TypeA:
- records, err = plugin.A(&k, zone, state, nil, plugin.Options{})
+ records, err = plugin.A(ctx, &k, zone, state, nil, plugin.Options{})
case dns.TypeAAAA:
- records, err = plugin.AAAA(&k, zone, state, nil, plugin.Options{})
+ records, err = plugin.AAAA(ctx, &k, zone, state, nil, plugin.Options{})
case dns.TypeTXT:
- records, err = plugin.TXT(&k, zone, state, plugin.Options{})
+ records, err = plugin.TXT(ctx, &k, zone, state, plugin.Options{})
case dns.TypeCNAME:
- records, err = plugin.CNAME(&k, zone, state, plugin.Options{})
+ records, err = plugin.CNAME(ctx, &k, zone, state, plugin.Options{})
case dns.TypePTR:
- records, err = plugin.PTR(&k, zone, state, plugin.Options{})
+ records, err = plugin.PTR(ctx, &k, zone, state, plugin.Options{})
case dns.TypeMX:
- records, extra, err = plugin.MX(&k, zone, state, plugin.Options{})
+ records, extra, err = plugin.MX(ctx, &k, zone, state, plugin.Options{})
case dns.TypeSRV:
- records, extra, err = plugin.SRV(&k, zone, state, plugin.Options{})
+ records, extra, err = plugin.SRV(ctx, &k, zone, state, plugin.Options{})
case dns.TypeSOA:
- records, err = plugin.SOA(&k, zone, state, plugin.Options{})
+ records, err = plugin.SOA(ctx, &k, zone, state, plugin.Options{})
case dns.TypeNS:
if state.Name() == zone {
- records, extra, err = plugin.NS(&k, zone, state, plugin.Options{})
+ records, extra, err = plugin.NS(ctx, &k, zone, state, plugin.Options{})
break
}
fallthrough
@@ -54,7 +54,7 @@ func (k Kubernetes) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.M
k.Transfer(ctx, state)
default:
// Do a fake A lookup, so we can distinguish between NODATA and NXDOMAIN
- _, err = plugin.A(&k, zone, state, nil, plugin.Options{})
+ _, err = plugin.A(ctx, &k, zone, state, nil, plugin.Options{})
}
if k.IsNameError(err) {
@@ -63,16 +63,16 @@ func (k Kubernetes) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.M
}
if !k.APIConn.HasSynced() {
// If we haven't synchronized with the kubernetes cluster, return server failure
- return plugin.BackendError(&k, zone, dns.RcodeServerFailure, state, nil /* err */, plugin.Options{})
+ return plugin.BackendError(ctx, &k, zone, dns.RcodeServerFailure, state, nil /* err */, plugin.Options{})
}
- return plugin.BackendError(&k, zone, dns.RcodeNameError, state, nil /* err */, plugin.Options{})
+ return plugin.BackendError(ctx, &k, zone, dns.RcodeNameError, state, nil /* err */, plugin.Options{})
}
if err != nil {
return dns.RcodeServerFailure, err
}
if len(records) == 0 {
- return plugin.BackendError(&k, zone, dns.RcodeSuccess, state, nil, plugin.Options{})
+ return plugin.BackendError(ctx, &k, zone, dns.RcodeSuccess, state, nil, plugin.Options{})
}
m := new(dns.Msg)
diff --git a/plugin/kubernetes/kubernetes.go b/plugin/kubernetes/kubernetes.go
index 10f058c5a..df9d67060 100644
--- a/plugin/kubernetes/kubernetes.go
+++ b/plugin/kubernetes/kubernetes.go
@@ -2,6 +2,7 @@
package kubernetes
import (
+ "context"
"errors"
"fmt"
"net"
@@ -86,7 +87,7 @@ var (
)
// Services implements the ServiceBackend interface.
-func (k *Kubernetes) Services(state request.Request, exact bool, opt plugin.Options) (svcs []msg.Service, err error) {
+func (k *Kubernetes) Services(ctx context.Context, state request.Request, exact bool, opt plugin.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() {
@@ -119,7 +120,7 @@ func (k *Kubernetes) Services(state request.Request, exact bool, opt plugin.Opti
return []msg.Service{svc}, nil
}
- s, e := k.Records(state, false)
+ s, e := k.Records(ctx, state, false)
// SRV for external services is not yet implemented, so remove those records.
@@ -141,8 +142,8 @@ func (k *Kubernetes) Services(state request.Request, exact bool, opt plugin.Opti
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) {
- return k.Upstream.Lookup(state, name, typ)
+func (k *Kubernetes) Lookup(ctx context.Context, state request.Request, name string, typ uint16) (*dns.Msg, error) {
+ return k.Upstream.Lookup(ctx, state, name, typ)
}
// IsNameError implements the ServiceBackend interface.
@@ -236,7 +237,7 @@ func (k *Kubernetes) InitKubeCache() (err error) {
}
// Records looks up services in kubernetes.
-func (k *Kubernetes) Records(state request.Request, exact bool) ([]msg.Service, error) {
+func (k *Kubernetes) Records(ctx context.Context, state request.Request, exact bool) ([]msg.Service, error) {
r, e := parseRequest(state)
if e != nil {
return nil, e
diff --git a/plugin/kubernetes/kubernetes_test.go b/plugin/kubernetes/kubernetes_test.go
index 26f3747ee..6d078f67e 100644
--- a/plugin/kubernetes/kubernetes_test.go
+++ b/plugin/kubernetes/kubernetes_test.go
@@ -1,6 +1,7 @@
package kubernetes
import (
+ "context"
"testing"
"github.com/coredns/coredns/plugin"
@@ -281,7 +282,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, plugin.Options{})
+ svcs, e := k.Services(context.TODO(), state, false, plugin.Options{})
if e != nil {
t.Errorf("Test %d: got error '%v'", i, e)
continue
diff --git a/plugin/kubernetes/reverse.go b/plugin/kubernetes/reverse.go
index 5873bcbc8..12b67ff30 100644
--- a/plugin/kubernetes/reverse.go
+++ b/plugin/kubernetes/reverse.go
@@ -1,6 +1,7 @@
package kubernetes
import (
+ "context"
"strings"
"github.com/coredns/coredns/plugin"
@@ -10,11 +11,11 @@ import (
)
// Reverse implements the ServiceBackend interface.
-func (k *Kubernetes) Reverse(state request.Request, exact bool, opt plugin.Options) ([]msg.Service, error) {
+func (k *Kubernetes) Reverse(ctx context.Context, state request.Request, exact bool, opt plugin.Options) ([]msg.Service, error) {
ip := dnsutil.ExtractAddressFromReverse(state.Name())
if ip == "" {
- _, e := k.Records(state, exact)
+ _, e := k.Records(ctx, state, exact)
return nil, e
}
diff --git a/plugin/kubernetes/xfr.go b/plugin/kubernetes/xfr.go
index fb17544ad..7ea99fd8d 100644
--- a/plugin/kubernetes/xfr.go
+++ b/plugin/kubernetes/xfr.go
@@ -45,7 +45,7 @@ func (k *Kubernetes) Transfer(ctx context.Context, state request.Request) (int,
ch := make(chan *dns.Envelope)
tr := new(dns.Transfer)
- soa, err := plugin.SOA(k, state.Zone, state, plugin.Options{})
+ soa, err := plugin.SOA(ctx, k, state.Zone, state, plugin.Options{})
if err != nil {
return dns.RcodeServerFailure, nil
}
diff --git a/plugin/pkg/upstream/upstream.go b/plugin/pkg/upstream/upstream.go
index 8e1881a38..c0c50d2a8 100644
--- a/plugin/pkg/upstream/upstream.go
+++ b/plugin/pkg/upstream/upstream.go
@@ -2,6 +2,7 @@
package upstream
import (
+ "context"
"fmt"
"github.com/miekg/dns"
@@ -18,8 +19,8 @@ type Upstream struct{}
func New() *Upstream { return &Upstream{} }
// Lookup routes lookups to our selves or forward to a remote.
-func (u *Upstream) Lookup(state request.Request, name string, typ uint16) (*dns.Msg, error) {
- server, ok := state.Context.Value(dnsserver.Key{}).(*dnsserver.Server)
+func (u *Upstream) Lookup(ctx context.Context, state request.Request, name string, typ uint16) (*dns.Msg, error) {
+ server, ok := ctx.Value(dnsserver.Key{}).(*dnsserver.Server)
if !ok {
return nil, fmt.Errorf("no full server is running")
}
@@ -29,7 +30,7 @@ func (u *Upstream) Lookup(state request.Request, name string, typ uint16) (*dns.
nw := nonwriter.New(state.W)
- server.ServeDNS(state.Context, nw, req)
+ server.ServeDNS(ctx, nw, req)
return nw.Msg, nil
}
diff --git a/plugin/route53/route53.go b/plugin/route53/route53.go
index 7cc0e9059..21854d1e4 100644
--- a/plugin/route53/route53.go
+++ b/plugin/route53/route53.go
@@ -117,7 +117,7 @@ func (h *Route53) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg
var result file.Result
for _, hostedZone := range z {
h.zMu.RLock()
- m.Answer, m.Ns, m.Extra, result = hostedZone.z.Lookup(state, qname)
+ m.Answer, m.Ns, m.Extra, result = hostedZone.z.Lookup(ctx, state, qname)
h.zMu.RUnlock()
if len(m.Answer) != 0 {
break
diff --git a/plugin/template/template.go b/plugin/template/template.go
index 887badf6f..1c9f61622 100644
--- a/plugin/template/template.go
+++ b/plugin/template/template.go
@@ -51,7 +51,7 @@ type templateData struct {
// ServeDNS implements the plugin.Handler interface.
func (h Handler) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (int, error) {
- state := request.Request{W: w, Req: r, Context: ctx}
+ state := request.Request{W: w, Req: r}
zone := plugin.Zones(h.Zones).Matches(state.Name())
if zone == "" {
@@ -85,7 +85,7 @@ func (h Handler) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg)
}
msg.Answer = append(msg.Answer, rr)
if template.upstream != nil && (state.QType() == dns.TypeA || state.QType() == dns.TypeAAAA) && rr.Header().Rrtype == dns.TypeCNAME {
- up, _ := template.upstream.Lookup(state, rr.(*dns.CNAME).Target, state.QType())
+ up, _ := template.upstream.Lookup(ctx, state, rr.(*dns.CNAME).Target, state.QType())
msg.Answer = append(msg.Answer, up.Answer...)
}
}