diff --git a/middleware/kubernetes/federation_test.go b/middleware/kubernetes/federation_test.go index be5069c26..410d2a54e 100644 --- a/middleware/kubernetes/federation_test.go +++ b/middleware/kubernetes/federation_test.go @@ -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: ""}) } diff --git a/middleware/kubernetes/kubernetes.go b/middleware/kubernetes/kubernetes.go index e710e60f9..be6fde424 100644 --- a/middleware/kubernetes/kubernetes.go +++ b/middleware/kubernetes/kubernetes.go @@ -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 } diff --git a/middleware/kubernetes/ns.go b/middleware/kubernetes/ns.go index 28de73f2a..8556469c4 100644 --- a/middleware/kubernetes/ns.go +++ b/middleware/kubernetes/ns.go @@ -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 diff --git a/middleware/kubernetes/parse.go b/middleware/kubernetes/parse.go index 790060896..1ab8fd1c6 100644 --- a/middleware/kubernetes/parse.go +++ b/middleware/kubernetes/parse.go @@ -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 diff --git a/middleware/kubernetes/parse_test.go b/middleware/kubernetes/parse_test.go index 164bf295e..010b9e542 100644 --- a/middleware/kubernetes/parse_test.go +++ b/middleware/kubernetes/parse_test.go @@ -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) } }