diff options
author | 2017-08-10 19:26:31 +0100 | |
---|---|---|
committer | 2017-08-10 19:26:31 +0100 | |
commit | 6cc3f47d466b7c6dda57d4fb8abb784dd278c495 (patch) | |
tree | c6d11c148fd91db91dab053226b6fff64daf4a5a /middleware/kubernetes/autopath.go | |
parent | 3654361be26d79e9b4a25581deb0168228022585 (diff) | |
download | coredns-6cc3f47d466b7c6dda57d4fb8abb784dd278c495.tar.gz coredns-6cc3f47d466b7c6dda57d4fb8abb784dd278c495.tar.zst coredns-6cc3f47d466b7c6dda57d4fb8abb784dd278c495.zip |
middleware/authpath: Fix return from k8s mw (#871)
* middleware/authpath: Fix return from k8s mw
Return the correct search path from the kubernetes' AutoPath function.
Based on preliminary discussion in #870
* PodWithIP can be private
Fix and add docs to functions.
* CR: remove the error from AutoPathFunc
Diffstat (limited to 'middleware/kubernetes/autopath.go')
-rw-r--r-- | middleware/kubernetes/autopath.go | 38 |
1 files changed, 26 insertions, 12 deletions
diff --git a/middleware/kubernetes/autopath.go b/middleware/kubernetes/autopath.go index 4c5870c6b..be71ce326 100644 --- a/middleware/kubernetes/autopath.go +++ b/middleware/kubernetes/autopath.go @@ -1,32 +1,46 @@ package kubernetes import ( - "fmt" - + "github.com/coredns/coredns/middleware" "github.com/coredns/coredns/request" "k8s.io/client-go/1.5/pkg/api" ) -func (k *Kubernetes) AutoPath(state request.Request) ([]string, error) { +// 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 + } + ip := state.IP() - pod := k.PodWithIP(ip) + pod := k.podWithIP(ip) if pod == nil { - return nil, fmt.Errorf("kubernets: no pod found for %s", ip) + return nil } - // something something namespace - namespace := pod.Namespace - - search := []string{namespace} // TODO: way more + 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, nil + return search } -// PodWithIP return the api.Pod for source IP ip. It return nil if nothing can be found. -func (k *Kubernetes) PodWithIP(ip string) (p *api.Pod) { +// 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) |