mirror of
				https://github.com/coredns/coredns.git
				synced 2025-10-31 02:03:20 -04:00 
			
		
		
		
	mw/k8s: remove dependence on global var (#888)
* mw/k8s: remove dependence on global var Remove the global coreDNSRecord that was used. Remove tests the referenced that var. Cleanup the rest. * Rename function as well * fixes
This commit is contained in:
		| @@ -112,7 +112,7 @@ func (k *Kubernetes) Services(state request.Request, exact bool, opt middleware. | |||||||
| 		return []msg.Service{svc}, nil, nil | 		return []msg.Service{svc}, nil, nil | ||||||
| 	case dns.TypeNS: | 	case dns.TypeNS: | ||||||
| 		// We can only get here if the qname equal the zone, see ServeDNS in handler.go. | 		// We can only get here if the qname equal the zone, see ServeDNS in handler.go. | ||||||
| 		ns := k.coreDNSRecord() | 		ns := k.nsAddr() | ||||||
| 		svc := msg.Service{Host: ns.A.String(), Key: msg.Path(state.QName(), "coredns")} | 		svc := msg.Service{Host: ns.A.String(), Key: msg.Path(state.QName(), "coredns")} | ||||||
| 		return []msg.Service{svc}, nil, nil | 		return []msg.Service{svc}, nil, nil | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -10,15 +10,11 @@ import ( | |||||||
| 	"k8s.io/client-go/1.5/pkg/api" | 	"k8s.io/client-go/1.5/pkg/api" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| const defaultNSName = "ns.dns." |  | ||||||
|  |  | ||||||
| var corednsRecord dns.A |  | ||||||
|  |  | ||||||
| // DefaultNSMsg returns an msg.Service representing an A record for | // DefaultNSMsg returns an msg.Service representing an A record for | ||||||
| // ns.dns.[zone] -> dns service ip. This A record is needed to legitimize | // ns.dns.[zone] -> dns service ip. This A record is needed to legitimize | ||||||
| // the SOA response in middleware.NS(), which is hardcoded at ns.dns.[zone]. | // the SOA response in middleware.NS(), which is hardcoded at ns.dns.[zone]. | ||||||
| func (k *Kubernetes) defaultNSMsg(r recordRequest) msg.Service { | func (k *Kubernetes) defaultNSMsg(r recordRequest) msg.Service { | ||||||
| 	ns := k.coreDNSRecord() | 	ns := k.nsAddr() | ||||||
| 	s := msg.Service{ | 	s := msg.Service{ | ||||||
| 		Key:  msg.Path(strings.Join([]string{defaultNSName, r.zone}, "."), "coredns"), | 		Key:  msg.Path(strings.Join([]string{defaultNSName, r.zone}, "."), "coredns"), | ||||||
| 		Host: ns.A.String(), | 		Host: ns.A.String(), | ||||||
| @@ -30,57 +26,55 @@ func isDefaultNS(name string, r recordRequest) bool { | |||||||
| 	return strings.Index(name, defaultNSName) == 0 && strings.Index(name, r.zone) == len(defaultNSName) | 	return strings.Index(name, defaultNSName) == 0 && strings.Index(name, r.zone) == len(defaultNSName) | ||||||
| } | } | ||||||
|  |  | ||||||
| func (k *Kubernetes) coreDNSRecord() dns.A { | func (k *Kubernetes) nsAddr() *dns.A { | ||||||
| 	var ( | 	var ( | ||||||
| 		svcName      string | 		svcName      string | ||||||
| 		svcNamespace string | 		svcNamespace string | ||||||
| 		dnsIP        net.IP |  | ||||||
| 	) | 	) | ||||||
|  |  | ||||||
| 	if len(corednsRecord.Hdr.Name) == 0 || corednsRecord.A == nil { | 	rr := new(dns.A) | ||||||
| 		// get local Pod IP | 	localIP := k.interfaceAddrsFunc() | ||||||
| 		localIP := k.interfaceAddrsFunc() | 	endpointsList := k.APIConn.EndpointsList() | ||||||
| 		// Find endpoint matching IP to get service and namespace |  | ||||||
| 		endpointsList := k.APIConn.EndpointsList() |  | ||||||
|  |  | ||||||
| 	FindEndpoint: | 	rr.A = localIP | ||||||
| 		for _, ep := range endpointsList.Items { |  | ||||||
| 			for _, eps := range ep.Subsets { |  | ||||||
| 				for _, addr := range eps.Addresses { |  | ||||||
| 					if localIP.Equal(net.ParseIP(addr.IP)) { |  | ||||||
|  |  | ||||||
| 						svcNamespace = ep.ObjectMeta.Namespace | FindEndpoint: | ||||||
| 						svcName = ep.ObjectMeta.Name | 	for _, ep := range endpointsList.Items { | ||||||
| 						break 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 | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		if len(svcName) == 0 { |  | ||||||
| 			corednsRecord.Hdr.Name = defaultNSName |  | ||||||
| 			corednsRecord.A = localIP |  | ||||||
| 			return corednsRecord |  | ||||||
| 		} |  | ||||||
| 		// Find service to get ClusterIP |  | ||||||
| 		serviceList := k.APIConn.ServiceList() |  | ||||||
| 	FindService: |  | ||||||
| 		for _, svc := range serviceList { |  | ||||||
| 			if svcName == svc.Name && svcNamespace == svc.Namespace { |  | ||||||
| 				if svc.Spec.ClusterIP == api.ClusterIPNone { |  | ||||||
| 					dnsIP = localIP |  | ||||||
| 				} else { |  | ||||||
| 					dnsIP = net.ParseIP(svc.Spec.ClusterIP) |  | ||||||
| 				} |  | ||||||
| 				break FindService |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 		if dnsIP == nil { |  | ||||||
| 			dnsIP = localIP |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		corednsRecord.Hdr.Name = strings.Join([]string{svcName, svcNamespace, "svc."}, ".") |  | ||||||
| 		corednsRecord.A = dnsIP |  | ||||||
| 	} | 	} | ||||||
| 	return corednsRecord |  | ||||||
|  | 	if len(svcName) == 0 { | ||||||
|  | 		rr.Hdr.Name = defaultNSName | ||||||
|  | 		rr.A = localIP | ||||||
|  | 		return rr | ||||||
|  | 	} | ||||||
|  | 	// Find service to get ClusterIP | ||||||
|  | 	serviceList := k.APIConn.ServiceList() | ||||||
|  |  | ||||||
|  | FindService: | ||||||
|  | 	for _, svc := range serviceList { | ||||||
|  | 		if svcName == svc.Name && svcNamespace == svc.Namespace { | ||||||
|  | 			if svc.Spec.ClusterIP == api.ClusterIPNone { | ||||||
|  | 				rr.A = localIP | ||||||
|  | 			} else { | ||||||
|  | 				rr.A = net.ParseIP(svc.Spec.ClusterIP) | ||||||
|  | 			} | ||||||
|  | 			break FindService | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	rr.Hdr.Name = strings.Join([]string{svcName, svcNamespace, "svc."}, ".") | ||||||
|  |  | ||||||
|  | 	return rr | ||||||
| } | } | ||||||
|  |  | ||||||
|  | const defaultNSName = "ns.dns." | ||||||
|   | |||||||
| @@ -1,42 +1,11 @@ | |||||||
| package kubernetes | package kubernetes | ||||||
|  |  | ||||||
| import "testing" | import ( | ||||||
| import "net" | 	"net" | ||||||
|  | 	"testing" | ||||||
|  |  | ||||||
| import "k8s.io/client-go/1.5/pkg/api" | 	"k8s.io/client-go/1.5/pkg/api" | ||||||
| import "github.com/miekg/dns" | ) | ||||||
|  |  | ||||||
| func TestDefaultNSMsg(t *testing.T) { |  | ||||||
| 	k := Kubernetes{Zones: []string{"inter.webs.test."}} |  | ||||||
| 	corednsRecord.Hdr.Name = "coredns.kube-system." |  | ||||||
| 	corednsRecord.A = net.IP("1.2.3.4") |  | ||||||
| 	r, _ := k.parseRequest("ns.dns.inter.webs.test.", dns.TypeA, "inter.webs.test.") |  | ||||||
|  |  | ||||||
| 	expected := "/coredns/test/webs/inter/dns/ns" |  | ||||||
| 	svc := k.defaultNSMsg(r) |  | ||||||
| 	if svc.Key != expected { |  | ||||||
| 		t.Errorf("Expected  result '%v'. Instead got result '%v'.", expected, svc.Key) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func TestIsDefaultNS(t *testing.T) { |  | ||||||
| 	k := Kubernetes{Zones: []string{"inter.webs.test."}} |  | ||||||
| 	r, _ := k.parseRequest("ns.dns.inter.webs.test", dns.TypeA, "inter.webs.test.") |  | ||||||
|  |  | ||||||
| 	var name string |  | ||||||
| 	var expected bool |  | ||||||
|  |  | ||||||
| 	name = "ns.dns.inter.webs.test." |  | ||||||
| 	expected = true |  | ||||||
| 	if isDefaultNS(name, r) != expected { |  | ||||||
| 		t.Errorf("Expected IsDefaultNS('%v') to be '%v'.", name, expected) |  | ||||||
| 	} |  | ||||||
| 	name = "ns.dns.blah.inter.webs.test" |  | ||||||
| 	expected = false |  | ||||||
| 	if isDefaultNS(name, r) != expected { |  | ||||||
| 		t.Errorf("Expected IsDefaultNS('%v') to be '%v'.", name, expected) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| type APIConnTest struct{} | type APIConnTest struct{} | ||||||
|  |  | ||||||
| @@ -83,24 +52,20 @@ func (APIConnTest) EndpointsList() api.EndpointsList { | |||||||
|  |  | ||||||
| func (APIConnTest) GetNodeByName(name string) (api.Node, error) { return api.Node{}, nil } | func (APIConnTest) GetNodeByName(name string) (api.Node, error) { return api.Node{}, nil } | ||||||
|  |  | ||||||
| func TestDoCoreDNSRecord(t *testing.T) { | func TestNsAddr(t *testing.T) { | ||||||
|  |  | ||||||
| 	corednsRecord = dns.A{} |  | ||||||
| 	k := Kubernetes{Zones: []string{"inter.webs.test"}} | 	k := Kubernetes{Zones: []string{"inter.webs.test"}} | ||||||
|  |  | ||||||
| 	k.interfaceAddrsFunc = func() net.IP { return net.ParseIP("172.0.40.10") } | 	k.interfaceAddrsFunc = func() net.IP { return net.ParseIP("172.0.40.10") } | ||||||
|  |  | ||||||
| 	k.APIConn = &APIConnTest{} | 	k.APIConn = &APIConnTest{} | ||||||
|  |  | ||||||
| 	cdr := k.coreDNSRecord() | 	cdr := k.nsAddr() | ||||||
|  |  | ||||||
| 	expected := "10.0.0.111" | 	expected := "10.0.0.111" | ||||||
|  |  | ||||||
| 	if cdr.A.String() != expected { | 	if cdr.A.String() != expected { | ||||||
| 		t.Errorf("Expected A to be '%v', got '%v'", expected, cdr.A.String()) | 		t.Errorf("Expected A to be %q, got %q", expected, cdr.A.String()) | ||||||
| 	} | 	} | ||||||
| 	expected = "dns-service.kube-system.svc." | 	expected = "dns-service.kube-system.svc." | ||||||
| 	if cdr.Hdr.Name != expected { | 	if cdr.Hdr.Name != expected { | ||||||
| 		t.Errorf("Expected Hdr.Name to be '%v', got '%v'", expected, cdr.Hdr.Name) | 		t.Errorf("Expected Hdr.Name to be %q, got %q", expected, cdr.Hdr.Name) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user