diff options
Diffstat (limited to 'middleware/kubernetes')
-rw-r--r-- | middleware/kubernetes/handler.go | 11 | ||||
-rw-r--r-- | middleware/kubernetes/kubernetes.go | 6 | ||||
-rw-r--r-- | middleware/kubernetes/lookup.go | 80 | ||||
-rw-r--r-- | middleware/kubernetes/setup.go | 2 |
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.") |