| 
									
										
										
										
											2017-05-22 16:05:48 -04:00
										 |  |  | package kubernetes | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"net" | 
					
						
							|  |  |  | 	"strings" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/miekg/dns" | 
					
						
							|  |  |  | 	"k8s.io/client-go/1.5/pkg/api" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func isDefaultNS(name string, r recordRequest) bool { | 
					
						
							| 
									
										
										
										
											2017-06-02 23:54:33 -04:00
										 |  |  | 	return strings.Index(name, defaultNSName) == 0 && strings.Index(name, r.zone) == len(defaultNSName) | 
					
						
							| 
									
										
										
										
											2017-05-22 16:05:48 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-10 23:13:08 +01:00
										 |  |  | func (k *Kubernetes) nsAddr() *dns.A { | 
					
						
							| 
									
										
										
										
											2017-08-03 23:14:11 -07:00
										 |  |  | 	var ( | 
					
						
							|  |  |  | 		svcName      string | 
					
						
							|  |  |  | 		svcNamespace string | 
					
						
							|  |  |  | 	) | 
					
						
							| 
									
										
										
										
											2017-05-22 16:05:48 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-10 23:13:08 +01:00
										 |  |  | 	rr := new(dns.A) | 
					
						
							|  |  |  | 	localIP := k.interfaceAddrsFunc() | 
					
						
							|  |  |  | 	endpointsList := k.APIConn.EndpointsList() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	rr.A = localIP | 
					
						
							| 
									
										
										
										
											2017-05-22 16:05:48 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-10 23:13:08 +01:00
										 |  |  | FindEndpoint: | 
					
						
							|  |  |  | 	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 | 
					
						
							|  |  |  | 					svcName = ep.ObjectMeta.Name | 
					
						
							|  |  |  | 					break FindEndpoint | 
					
						
							| 
									
										
										
										
											2017-05-22 16:05:48 -04:00
										 |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-08-10 23:13:08 +01:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-05-22 16:05:48 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-10 23:13:08 +01:00
										 |  |  | 	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) | 
					
						
							| 
									
										
										
										
											2017-05-22 16:05:48 -04:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2017-08-10 23:13:08 +01:00
										 |  |  | 			break FindService | 
					
						
							| 
									
										
										
										
											2017-05-22 16:05:48 -04:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-08-10 23:13:08 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	rr.Hdr.Name = strings.Join([]string{svcName, svcNamespace, "svc."}, ".") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return rr | 
					
						
							| 
									
										
										
										
											2017-05-22 16:05:48 -04:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2017-08-10 23:13:08 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | const defaultNSName = "ns.dns." |