coredns/middleware/kubernetes/ns.go
Miek Gieben acfa6501e0 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
2017-08-10 23:13:08 +01:00

80 lines
1.8 KiB
Go

package kubernetes
import (
"net"
"strings"
"github.com/coredns/coredns/middleware/etcd/msg"
"github.com/miekg/dns"
"k8s.io/client-go/1.5/pkg/api"
)
// DefaultNSMsg returns an msg.Service representing an A record for
// 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].
func (k *Kubernetes) defaultNSMsg(r recordRequest) msg.Service {
ns := k.nsAddr()
s := msg.Service{
Key: msg.Path(strings.Join([]string{defaultNSName, r.zone}, "."), "coredns"),
Host: ns.A.String(),
}
return s
}
func isDefaultNS(name string, r recordRequest) bool {
return strings.Index(name, defaultNSName) == 0 && strings.Index(name, r.zone) == len(defaultNSName)
}
func (k *Kubernetes) nsAddr() *dns.A {
var (
svcName string
svcNamespace string
)
rr := new(dns.A)
localIP := k.interfaceAddrsFunc()
endpointsList := k.APIConn.EndpointsList()
rr.A = localIP
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
}
}
}
}
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."