aboutsummaryrefslogtreecommitdiff
path: root/middleware/kubernetes
diff options
context:
space:
mode:
Diffstat (limited to 'middleware/kubernetes')
-rw-r--r--middleware/kubernetes/handler.go11
-rw-r--r--middleware/kubernetes/kubernetes.go6
-rw-r--r--middleware/kubernetes/lookup.go80
-rw-r--r--middleware/kubernetes/setup.go2
4 files changed, 29 insertions, 70 deletions
diff --git a/middleware/kubernetes/handler.go b/middleware/kubernetes/handler.go
index 1986820d5..a89dedc0f 100644
--- a/middleware/kubernetes/handler.go
+++ b/middleware/kubernetes/handler.go
@@ -2,16 +2,17 @@ package kubernetes
import (
"fmt"
- "strings"
"github.com/miekg/coredns/middleware"
+ "github.com/miekg/coredns/middleware/pkg/dnsutil"
+ "github.com/miekg/coredns/request"
"github.com/miekg/dns"
"golang.org/x/net/context"
)
func (k Kubernetes) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (int, error) {
- state := middleware.State{W: w, Req: r}
+ state := request.Request{W: w, Req: r}
if state.QClass() != dns.ClassINET {
return dns.RcodeServerFailure, fmt.Errorf("can only deal with ClassINET")
}
@@ -21,8 +22,8 @@ func (k Kubernetes) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.M
m.Authoritative, m.RecursionAvailable, m.Compress = true, true, true
// TODO: find an alternative to this block
- if strings.HasSuffix(state.Name(), arpaSuffix) {
- ip, _ := extractIP(state.Name())
+ ip := dnsutil.ExtractAddressFromReverse(state.Name())
+ if ip != "" {
records := k.getServiceRecordForIP(ip, state.Name())
if len(records) > 0 {
srvPTR := &records[0]
@@ -100,7 +101,7 @@ func (k Kubernetes) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.M
}
// NoData write a nodata response to the client.
-func (k Kubernetes) Err(zone string, rcode int, state middleware.State) (int, error) {
+func (k Kubernetes) Err(zone string, rcode int, state request.Request) (int, error) {
m := new(dns.Msg)
m.SetRcode(state.Req, rcode)
m.Ns = []dns.RR{k.SOA(zone, state)}
diff --git a/middleware/kubernetes/kubernetes.go b/middleware/kubernetes/kubernetes.go
index 569e089e0..0bd1dc7a4 100644
--- a/middleware/kubernetes/kubernetes.go
+++ b/middleware/kubernetes/kubernetes.go
@@ -4,13 +4,13 @@ package kubernetes
import (
"errors"
"log"
- "strings"
"time"
"github.com/miekg/coredns/middleware"
"github.com/miekg/coredns/middleware/kubernetes/msg"
"github.com/miekg/coredns/middleware/kubernetes/nametemplate"
"github.com/miekg/coredns/middleware/kubernetes/util"
+ "github.com/miekg/coredns/middleware/pkg/dnsutil"
"github.com/miekg/coredns/middleware/proxy"
"github.com/miekg/dns"
@@ -100,8 +100,8 @@ func (k *Kubernetes) getZoneForName(name string) (string, []string) {
func (k *Kubernetes) Records(name string, exact bool) ([]msg.Service, error) {
// TODO: refector this.
// Right now GetNamespaceFromSegmentArray do not supports PRE queries
- if strings.HasSuffix(name, arpaSuffix) {
- ip, _ := extractIP(name)
+ ip := dnsutil.ExtractAddressFromReverse(name)
+ if ip != "" {
records := k.getServiceRecordForIP(ip, name)
return records, nil
}
diff --git a/middleware/kubernetes/lookup.go b/middleware/kubernetes/lookup.go
index 0096e1fdb..e14d2275e 100644
--- a/middleware/kubernetes/lookup.go
+++ b/middleware/kubernetes/lookup.go
@@ -4,21 +4,17 @@ import (
"fmt"
"math"
"net"
- "strings"
"time"
"github.com/miekg/coredns/middleware"
"github.com/miekg/coredns/middleware/kubernetes/msg"
+ "github.com/miekg/coredns/middleware/pkg/dnsutil"
+ "github.com/miekg/coredns/request"
"github.com/miekg/dns"
)
-const (
- // arpaSuffix is the standard suffix for PTR IP reverse lookups.
- arpaSuffix = ".in-addr.arpa."
-)
-
-func (k Kubernetes) records(state middleware.State, exact bool) ([]msg.Service, error) {
+func (k Kubernetes) records(state request.Request, exact bool) ([]msg.Service, error) {
services, err := k.Records(state.Name(), exact)
if err != nil {
return nil, err
@@ -28,7 +24,7 @@ func (k Kubernetes) records(state middleware.State, exact bool) ([]msg.Service,
return services, nil
}
-func (k Kubernetes) A(zone string, state middleware.State, previousRecords []dns.RR) (records []dns.RR, err error) {
+func (k Kubernetes) A(zone string, state request.Request, previousRecords []dns.RR) (records []dns.RR, err error) {
services, err := k.records(state, false)
if err != nil {
return nil, err
@@ -49,11 +45,11 @@ func (k Kubernetes) A(zone string, state middleware.State, previousRecords []dns
// don't add it, and just continue
continue
}
- if isDuplicateCNAME(newRecord, previousRecords) {
+ if dnsutil.DuplicateCNAME(newRecord, previousRecords) {
continue
}
- state1 := copyState(state, serv.Host, state.QType())
+ state1 := state.NewWithQuestion(serv.Host, state.QType())
nextRecords, err := k.A(zone, state1, append(previousRecords, newRecord))
if err == nil {
@@ -87,7 +83,7 @@ func (k Kubernetes) A(zone string, state middleware.State, previousRecords []dns
return records, nil
}
-func (k Kubernetes) AAAA(zone string, state middleware.State, previousRecords []dns.RR) (records []dns.RR, err error) {
+func (k Kubernetes) AAAA(zone string, state request.Request, previousRecords []dns.RR) (records []dns.RR, err error) {
services, err := k.records(state, false)
if err != nil {
return nil, err
@@ -108,11 +104,11 @@ func (k Kubernetes) AAAA(zone string, state middleware.State, previousRecords []
// don't add it, and just continue
continue
}
- if isDuplicateCNAME(newRecord, previousRecords) {
+ if dnsutil.DuplicateCNAME(newRecord, previousRecords) {
continue
}
- state1 := copyState(state, serv.Host, state.QType())
+ state1 := state.NewWithQuestion(serv.Host, state.QType())
nextRecords, err := k.AAAA(zone, state1, append(previousRecords, newRecord))
if err == nil {
@@ -149,7 +145,7 @@ func (k Kubernetes) AAAA(zone string, state middleware.State, previousRecords []
// SRV returns SRV records from kubernetes.
// If the Target is not a name but an IP address, a name is created on the fly.
-func (k Kubernetes) SRV(zone string, state middleware.State) (records []dns.RR, extra []dns.RR, err error) {
+func (k Kubernetes) SRV(zone string, state request.Request) (records []dns.RR, extra []dns.RR, err error) {
services, err := k.records(state, false)
if err != nil {
return nil, nil, err
@@ -207,7 +203,7 @@ func (k Kubernetes) SRV(zone string, state middleware.State) (records []dns.RR,
}
// 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 := copyState(state, srv.Target, dns.TypeA)
+ state1 := state.NewWithQuestion(srv.Target, dns.TypeA)
addr, e1 := k.A(zone, state1, nil)
if e1 == nil {
extra = append(extra, addr...)
@@ -231,21 +227,21 @@ func (k Kubernetes) SRV(zone string, state middleware.State) (records []dns.RR,
}
// Returning MX records from kubernetes not implemented.
-func (k Kubernetes) MX(zone string, state middleware.State) (records []dns.RR, extra []dns.RR, err error) {
+func (k Kubernetes) MX(zone string, state request.Request) (records []dns.RR, extra []dns.RR, err error) {
return nil, nil, err
}
// Returning CNAME records from kubernetes not implemented.
-func (k Kubernetes) CNAME(zone string, state middleware.State) (records []dns.RR, err error) {
+func (k Kubernetes) CNAME(zone string, state request.Request) (records []dns.RR, err error) {
return nil, err
}
// Returning TXT records from kubernetes not implemented.
-func (k Kubernetes) TXT(zone string, state middleware.State) (records []dns.RR, err error) {
+func (k Kubernetes) TXT(zone string, state request.Request) (records []dns.RR, err error) {
return nil, err
}
-func (k Kubernetes) NS(zone string, state middleware.State) (records, extra []dns.RR, err error) {
+func (k Kubernetes) NS(zone string, state request.Request) (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()
@@ -278,7 +274,7 @@ func (k Kubernetes) NS(zone string, state middleware.State) (records, extra []dn
}
// SOA Record returns a SOA record.
-func (k Kubernetes) SOA(zone string, state middleware.State) *dns.SOA {
+func (k Kubernetes) SOA(zone string, state request.Request) *dns.SOA {
header := dns.RR_Header{Name: zone, Rrtype: dns.TypeSOA, Ttl: 300, Class: dns.ClassINET}
return &dns.SOA{Hdr: header,
Mbox: "hostmaster." + zone,
@@ -291,9 +287,9 @@ func (k Kubernetes) SOA(zone string, state middleware.State) *dns.SOA {
}
}
-func (k Kubernetes) PTR(zone string, state middleware.State) ([]dns.RR, error) {
- reverseIP, ok := extractIP(state.Name())
- if !ok {
+func (k Kubernetes) PTR(zone string, state request.Request) ([]dns.RR, error) {
+ reverseIP := dnsutil.ExtractAddressFromReverse(state.Name())
+ if reverseIP == "" {
return nil, fmt.Errorf("does not support reverse lookup for %s", state.QName())
}
@@ -318,41 +314,3 @@ func (k Kubernetes) PTR(zone string, state middleware.State) ([]dns.RR, error) {
}
return records, nil
}
-
-func isDuplicateCNAME(r *dns.CNAME, records []dns.RR) bool {
- for _, rec := range records {
- if v, ok := rec.(*dns.CNAME); ok {
- if v.Target == r.Target {
- return true
- }
- }
- }
- return false
-}
-
-func copyState(state middleware.State, target string, typ uint16) middleware.State {
- state1 := middleware.State{W: state.W, Req: state.Req.Copy()}
- state1.Req.Question[0] = dns.Question{Name: dns.Fqdn(target), Qtype: dns.ClassINET, Qclass: typ}
- return state1
-}
-
-// extractIP turns a standard PTR reverse record lookup name
-// into an IP address
-func extractIP(reverseName string) (string, bool) {
- if !strings.HasSuffix(reverseName, arpaSuffix) {
- return "", false
- }
- search := strings.TrimSuffix(reverseName, arpaSuffix)
-
- // reverse the segments and then combine them
- segments := reverseArray(strings.Split(search, "."))
- return strings.Join(segments, "."), true
-}
-
-func reverseArray(arr []string) []string {
- for i := 0; i < len(arr)/2; i++ {
- j := len(arr) - i - 1
- arr[i], arr[j] = arr[j], arr[i]
- }
- return arr
-}
diff --git a/middleware/kubernetes/setup.go b/middleware/kubernetes/setup.go
index fc3c036b8..09e4478e3 100644
--- a/middleware/kubernetes/setup.go
+++ b/middleware/kubernetes/setup.go
@@ -68,7 +68,7 @@ func kubernetesParse(c *caddy.Controller) (Kubernetes, error) {
}
k8s.Zones = NormalizeZoneList(zones)
- middleware.Zones(k8s.Zones).FullyQualify()
+ middleware.Zones(k8s.Zones).Normalize()
if k8s.Zones == nil || len(k8s.Zones) < 1 {
err = errors.New("Zone name must be provided for kubernetes middleware.")