mirror of
				https://github.com/coredns/coredns.git
				synced 2025-10-31 02:03:20 -04:00 
			
		
		
		
	mw/k8s: use request.Request in parseRequest
This commit is contained in:
		| @@ -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: ""}) | ||||||
| } | } | ||||||
|   | |||||||
| @@ -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 | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -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 | ||||||
|   | |||||||
| @@ -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 | ||||||
|   | |||||||
| @@ -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) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user