mw/k8s: use request.Request in parseRequest
This commit is contained in:
parent
b5d2a82ed7
commit
6e91408f61
5 changed files with 31 additions and 19 deletions
|
@ -6,6 +6,7 @@ import (
|
|||
"testing"
|
||||
|
||||
"github.com/coredns/coredns/middleware/etcd/msg"
|
||||
"github.com/coredns/coredns/request"
|
||||
"github.com/miekg/dns"
|
||||
"k8s.io/client-go/1.5/pkg/api"
|
||||
)
|
||||
|
@ -90,12 +91,18 @@ func TestFederationCNAMERecord(t *testing.T) {
|
|||
k.APIConn = apiConnFedTest{}
|
||||
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"})
|
||||
|
||||
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"})
|
||||
|
||||
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: ""})
|
||||
}
|
||||
|
|
|
@ -120,7 +120,7 @@ func (k *Kubernetes) Services(state request.Request, exact bool, opt middleware.
|
|||
return []msg.Service{svc}, nil, nil
|
||||
}
|
||||
|
||||
r, e := k.parseRequest(state.Name(), state.QType(), state.Zone)
|
||||
r, e := k.parseRequest(state)
|
||||
if e != nil {
|
||||
return nil, nil, e
|
||||
}
|
||||
|
|
|
@ -29,7 +29,6 @@ FindEndpoint:
|
|||
for _, eps := range ep.Subsets {
|
||||
for _, addr := range eps.Addresses {
|
||||
if localIP.Equal(net.ParseIP(addr.IP)) {
|
||||
|
||||
svcNamespace = ep.ObjectMeta.Namespace
|
||||
svcName = ep.ObjectMeta.Name
|
||||
break FindEndpoint
|
||||
|
|
|
@ -2,6 +2,7 @@ package kubernetes
|
|||
|
||||
import (
|
||||
"github.com/coredns/coredns/middleware/pkg/dnsutil"
|
||||
"github.com/coredns/coredns/request"
|
||||
|
||||
"github.com/miekg/dns"
|
||||
)
|
||||
|
@ -23,33 +24,29 @@ type recordRequest struct {
|
|||
federation string
|
||||
}
|
||||
|
||||
// TODO(miek): make it use request.Request.
|
||||
func (k *Kubernetes) parseRequest(lowerCasedName string, qtype uint16, zone ...string) (r recordRequest, err error) {
|
||||
// parseRequest parses the qname to find all the elements we need for querying k8s.
|
||||
func (k *Kubernetes) parseRequest(state request.Request) (r recordRequest, err error) {
|
||||
// 3 Possible cases
|
||||
// SRV Request: _port._protocol.service.namespace.[federation.]type.zone
|
||||
// A Request (endpoint): endpoint.service.namespace.[federation.]type.zone
|
||||
// A Request (service): service.namespace.[federation.]type.zone
|
||||
|
||||
if len(zone) == 0 {
|
||||
panic("parseRequest must be called with a zone")
|
||||
}
|
||||
|
||||
base, _ := dnsutil.TrimZone(lowerCasedName, zone[0])
|
||||
base, _ := dnsutil.TrimZone(state.Name(), state.Zone)
|
||||
segs := dns.SplitDomainName(base)
|
||||
|
||||
r.zone = zone[0]
|
||||
r.zone = state.Zone
|
||||
r.federation, segs = k.stripFederation(segs)
|
||||
|
||||
if qtype == dns.TypeNS {
|
||||
if state.QType() == dns.TypeNS {
|
||||
return r, nil
|
||||
}
|
||||
|
||||
if qtype == dns.TypeA && isDefaultNS(lowerCasedName, r) {
|
||||
if state.QType() == dns.TypeA && isDefaultNS(state.Name(), r) {
|
||||
return r, nil
|
||||
}
|
||||
|
||||
offset := 0
|
||||
if qtype == dns.TypeSRV {
|
||||
if state.QType() == dns.TypeSRV {
|
||||
// The kubernetes peer-finder expects queries with empty port and service to resolve
|
||||
// If neither is specified, treat it as a wildcard
|
||||
if len(segs) == 3 {
|
||||
|
@ -87,7 +84,7 @@ func (k *Kubernetes) parseRequest(lowerCasedName string, qtype uint16, zone ...s
|
|||
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.
|
||||
r.endpoint = segs[0]
|
||||
offset = 1
|
||||
|
|
|
@ -3,6 +3,7 @@ package kubernetes
|
|||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/coredns/coredns/request"
|
||||
"github.com/miekg/dns"
|
||||
)
|
||||
|
||||
|
@ -35,7 +36,11 @@ func TestParseRequest(t *testing.T) {
|
|||
},
|
||||
}
|
||||
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 {
|
||||
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 {
|
||||
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)
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue