diff options
Diffstat (limited to 'plugin/kubernetes/autopath.go')
-rw-r--r-- | plugin/kubernetes/autopath.go | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/plugin/kubernetes/autopath.go b/plugin/kubernetes/autopath.go new file mode 100644 index 000000000..f758869f1 --- /dev/null +++ b/plugin/kubernetes/autopath.go @@ -0,0 +1,53 @@ +package kubernetes + +import ( + "github.com/coredns/coredns/plugin" + "github.com/coredns/coredns/request" + + "k8s.io/client-go/1.5/pkg/api" +) + +// AutoPath implements the AutoPathFunc call from the autopath plugin. +// 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 := plugin.Zones(k.Zones).Matches(state.Name()) + if zone == "" { + return nil + } + + ip := state.IP() + + pod := k.podWithIP(ip) + if pod == nil { + return nil + } + + 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 + } + + search = append(search, k.autoPathSearch...) + search = append(search, "") // sentinal + return search +} + +// 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) { + objList := k.APIConn.PodIndex(ip) + for _, o := range objList { + p, ok := o.(*api.Pod) + if !ok { + return nil + } + return p + } + return nil +} |