mw/k8s: use request.Request in parseRequest

This commit is contained in:
Miek Gieben 2017-08-11 12:12:21 +01:00
parent b5d2a82ed7
commit 6e91408f61
5 changed files with 31 additions and 19 deletions

View file

@ -6,6 +6,7 @@ import (
"testing" "testing"
"github.com/coredns/coredns/middleware/etcd/msg" "github.com/coredns/coredns/middleware/etcd/msg"
"github.com/coredns/coredns/request"
"github.com/miekg/dns" "github.com/miekg/dns"
"k8s.io/client-go/1.5/pkg/api" "k8s.io/client-go/1.5/pkg/api"
) )
@ -90,12 +91,18 @@ func TestFederationCNAMERecord(t *testing.T) {
k.APIConn = apiConnFedTest{} k.APIConn = apiConnFedTest{}
k.interfaceAddrsFunc = func() net.IP { return net.ParseIP("10.9.8.7") } k.interfaceAddrsFunc = func() net.IP { return net.ParseIP("10.9.8.7") }
r, _ := k.parseRequest("s1.ns.fed.svc.inter.webs.", dns.TypeA, "inter.webs.") m := new(dns.Msg)
state := request.Request{Zone: "inter.webs.", Req: m}
m.SetQuestion("s1.ns.fed.svc.inter.webs.", dns.TypeA)
r, _ := k.parseRequest(state)
testFederationCNAMERecord(t, k, r, msg.Service{Key: "/coredns/webs/inter/svc/fed/ns/s1", Host: "s1.ns.fed.svc.fd-az.fd-r.era.tion.com"}) testFederationCNAMERecord(t, k, r, msg.Service{Key: "/coredns/webs/inter/svc/fed/ns/s1", Host: "s1.ns.fed.svc.fd-az.fd-r.era.tion.com"})
r, _ = k.parseRequest("ep1.s1.ns.fed.svc.inter.webs.", dns.TypeA, "inter.webs.") m.SetQuestion("ep1.s1.ns.fed.svc.inter.webs.", dns.TypeA)
r, _ = k.parseRequest(state)
testFederationCNAMERecord(t, k, r, msg.Service{Key: "/coredns/webs/inter/svc/fed/ns/s1/ep1", Host: "ep1.s1.ns.fed.svc.fd-az.fd-r.era.tion.com"}) testFederationCNAMERecord(t, k, r, msg.Service{Key: "/coredns/webs/inter/svc/fed/ns/s1/ep1", Host: "ep1.s1.ns.fed.svc.fd-az.fd-r.era.tion.com"})
r, _ = k.parseRequest("ep1.s1.ns.foo.svc.inter.webs.", dns.TypeA, "inter.webs.") m.SetQuestion("ep1.s1.ns.foo.svc.inter.webs.", dns.TypeA)
r, _ = k.parseRequest(state)
testFederationCNAMERecord(t, k, r, msg.Service{Key: "", Host: ""}) testFederationCNAMERecord(t, k, r, msg.Service{Key: "", Host: ""})
} }

View file

@ -120,7 +120,7 @@ func (k *Kubernetes) Services(state request.Request, exact bool, opt middleware.
return []msg.Service{svc}, nil, nil return []msg.Service{svc}, nil, nil
} }
r, e := k.parseRequest(state.Name(), state.QType(), state.Zone) r, e := k.parseRequest(state)
if e != nil { if e != nil {
return nil, nil, e return nil, nil, e
} }

View file

@ -29,7 +29,6 @@ FindEndpoint:
for _, eps := range ep.Subsets { for _, eps := range ep.Subsets {
for _, addr := range eps.Addresses { for _, addr := range eps.Addresses {
if localIP.Equal(net.ParseIP(addr.IP)) { if localIP.Equal(net.ParseIP(addr.IP)) {
svcNamespace = ep.ObjectMeta.Namespace svcNamespace = ep.ObjectMeta.Namespace
svcName = ep.ObjectMeta.Name svcName = ep.ObjectMeta.Name
break FindEndpoint break FindEndpoint

View file

@ -2,6 +2,7 @@ package kubernetes
import ( import (
"github.com/coredns/coredns/middleware/pkg/dnsutil" "github.com/coredns/coredns/middleware/pkg/dnsutil"
"github.com/coredns/coredns/request"
"github.com/miekg/dns" "github.com/miekg/dns"
) )
@ -23,33 +24,29 @@ type recordRequest struct {
federation string federation string
} }
// TODO(miek): make it use request.Request. // parseRequest parses the qname to find all the elements we need for querying k8s.
func (k *Kubernetes) parseRequest(lowerCasedName string, qtype uint16, zone ...string) (r recordRequest, err error) { func (k *Kubernetes) parseRequest(state request.Request) (r recordRequest, err error) {
// 3 Possible cases // 3 Possible cases
// SRV Request: _port._protocol.service.namespace.[federation.]type.zone // SRV Request: _port._protocol.service.namespace.[federation.]type.zone
// A Request (endpoint): endpoint.service.namespace.[federation.]type.zone // A Request (endpoint): endpoint.service.namespace.[federation.]type.zone
// A Request (service): service.namespace.[federation.]type.zone // A Request (service): service.namespace.[federation.]type.zone
if len(zone) == 0 { base, _ := dnsutil.TrimZone(state.Name(), state.Zone)
panic("parseRequest must be called with a zone")
}
base, _ := dnsutil.TrimZone(lowerCasedName, zone[0])
segs := dns.SplitDomainName(base) segs := dns.SplitDomainName(base)
r.zone = zone[0] r.zone = state.Zone
r.federation, segs = k.stripFederation(segs) r.federation, segs = k.stripFederation(segs)
if qtype == dns.TypeNS { if state.QType() == dns.TypeNS {
return r, nil return r, nil
} }
if qtype == dns.TypeA && isDefaultNS(lowerCasedName, r) { if state.QType() == dns.TypeA && isDefaultNS(state.Name(), r) {
return r, nil return r, nil
} }
offset := 0 offset := 0
if qtype == dns.TypeSRV { if state.QType() == dns.TypeSRV {
// The kubernetes peer-finder expects queries with empty port and service to resolve // The kubernetes peer-finder expects queries with empty port and service to resolve
// If neither is specified, treat it as a wildcard // If neither is specified, treat it as a wildcard
if len(segs) == 3 { if len(segs) == 3 {
@ -87,7 +84,7 @@ func (k *Kubernetes) parseRequest(lowerCasedName string, qtype uint16, zone ...s
offset = 2 offset = 2
} }
} }
if (qtype == dns.TypeA || qtype == dns.TypeAAAA) && len(segs) == 4 { if (state.QType() == dns.TypeA || state.QType() == dns.TypeAAAA) && len(segs) == 4 {
// This is an endpoint A/AAAA record request. Get first element as endpoint. // This is an endpoint A/AAAA record request. Get first element as endpoint.
r.endpoint = segs[0] r.endpoint = segs[0]
offset = 1 offset = 1

View file

@ -3,6 +3,7 @@ package kubernetes
import ( import (
"testing" "testing"
"github.com/coredns/coredns/request"
"github.com/miekg/dns" "github.com/miekg/dns"
) )
@ -35,7 +36,11 @@ func TestParseRequest(t *testing.T) {
}, },
} }
for i, tc := range tests { for i, tc := range tests {
r, e := k.parseRequest(tc.query, tc.qtype, zone) m := new(dns.Msg)
m.SetQuestion(tc.query, tc.qtype)
state := request.Request{Zone: zone, Req: m}
r, e := k.parseRequest(state)
if e != nil { if e != nil {
t.Errorf("Test %d, expected no error, got '%v'.", i, e) t.Errorf("Test %d, expected no error, got '%v'.", i, e)
} }
@ -58,7 +63,11 @@ func TestParseInvalidRequest(t *testing.T) {
} }
for query, qtype := range invalid { for query, qtype := range invalid {
if _, e := k.parseRequest(query, qtype, zone); e == nil { m := new(dns.Msg)
m.SetQuestion(query, qtype)
state := request.Request{Zone: zone, Req: m}
if _, e := k.parseRequest(state); e == nil {
t.Errorf("Expected error from %s:%d, got none", query, qtype) t.Errorf("Expected error from %s:%d, got none", query, qtype)
} }
} }