| 
									
										
										
										
											2017-08-09 03:13:38 -07:00
										 |  |  | package kubernetes | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-09 04:06:48 -07:00
										 |  |  | import ( | 
					
						
							| 
									
										
										
										
											2017-08-10 19:26:31 +01:00
										 |  |  | 	"github.com/coredns/coredns/middleware" | 
					
						
							| 
									
										
										
										
											2017-08-09 04:06:48 -07:00
										 |  |  | 	"github.com/coredns/coredns/request" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"k8s.io/client-go/1.5/pkg/api" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-10 19:26:31 +01:00
										 |  |  | // AutoPath implements the AutoPathFunc call from the autopath middleware. | 
					
						
							|  |  |  | // It returns a per-query search path or nil indicating no searchpathing should happen. | 
					
						
							|  |  |  | func (k *Kubernetes) AutoPath(state request.Request) []string { | 
					
						
							|  |  |  | 	// Check if the query falls in a zone we are actually authoriative for and thus if we want autopath. | 
					
						
							|  |  |  | 	zone := middleware.Zones(k.Zones).Matches(state.Name()) | 
					
						
							|  |  |  | 	if zone == "" { | 
					
						
							|  |  |  | 		return nil | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-09 04:06:48 -07:00
										 |  |  | 	ip := state.IP() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-10 19:26:31 +01:00
										 |  |  | 	pod := k.podWithIP(ip) | 
					
						
							| 
									
										
										
										
											2017-08-09 04:06:48 -07:00
										 |  |  | 	if pod == nil { | 
					
						
							| 
									
										
										
										
											2017-08-10 19:26:31 +01:00
										 |  |  | 		return nil | 
					
						
							| 
									
										
										
										
											2017-08-09 04:06:48 -07:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-10 19:26:31 +01:00
										 |  |  | 	search := make([]string, 3) | 
					
						
							|  |  |  | 	if zone == "." { | 
					
						
							|  |  |  | 		search[0] = pod.Namespace + ".svc." | 
					
						
							|  |  |  | 		search[1] = "svc." | 
					
						
							|  |  |  | 		search[2] = "." | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		search[0] = pod.Namespace + ".svc." + zone | 
					
						
							|  |  |  | 		search[1] = "svc." + zone | 
					
						
							|  |  |  | 		search[2] = zone | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-08-09 04:06:48 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-10 19:26:31 +01:00
										 |  |  | 	search = append(search, k.autoPathSearch...) | 
					
						
							| 
									
										
										
										
											2017-08-09 04:06:48 -07:00
										 |  |  | 	search = append(search, "") // sentinal | 
					
						
							| 
									
										
										
										
											2017-08-10 19:26:31 +01:00
										 |  |  | 	return search | 
					
						
							| 
									
										
										
										
											2017-08-09 04:06:48 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-10 19:26:31 +01:00
										 |  |  | // podWithIP return the api.Pod for source IP ip. It returns nil if nothing can be found. | 
					
						
							|  |  |  | func (k *Kubernetes) podWithIP(ip string) (p *api.Pod) { | 
					
						
							| 
									
										
										
										
											2017-08-09 03:13:38 -07:00
										 |  |  | 	objList := k.APIConn.PodIndex(ip) | 
					
						
							|  |  |  | 	for _, o := range objList { | 
					
						
							|  |  |  | 		p, ok := o.(*api.Pod) | 
					
						
							|  |  |  | 		if !ok { | 
					
						
							|  |  |  | 			return nil | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return p | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } |