middleware/kubernetes: cleanup (#818)

Drop the interfaceAddr interfaces and just use a function. Cleanup
all fallout from that. Remove the use of global variables and cleanup
the tests a bit.
This commit is contained in:
Miek Gieben 2017-08-03 23:14:11 -07:00 committed by GitHub
parent 8ad8c75ab4
commit 2c0fc3182c
8 changed files with 25 additions and 53 deletions

View file

@ -13,10 +13,6 @@ type Federation struct {
zone string zone string
} }
var localNodeName string
var federationZone string
var federationRegion string
const ( const (
// TODO: Do not hardcode these labels. Pull them out of the API instead. // TODO: Do not hardcode these labels. Pull them out of the API instead.
// //
@ -80,21 +76,18 @@ func (k *Kubernetes) federationCNAMERecord(r recordRequest) msg.Service {
} }
func (k *Kubernetes) localNodeName() string { func (k *Kubernetes) localNodeName() string {
if localNodeName != "" { localIP := k.interfaceAddrsFunc()
return localNodeName
}
localIP := k.localPodIP()
if localIP == nil { if localIP == nil {
return "" return ""
} }
// Find endpoint matching localIP // Find endpoint matching localIP
endpointsList := k.APIConn.EndpointsList() endpointsList := k.APIConn.EndpointsList()
for _, ep := range endpointsList.Items { for _, ep := range endpointsList.Items {
for _, eps := range ep.Subsets { for _, eps := range ep.Subsets {
for _, addr := range eps.Addresses { for _, addr := range eps.Addresses {
if localIP.Equal(net.ParseIP(addr.IP)) { if localIP.Equal(net.ParseIP(addr.IP)) {
localNodeName = *addr.NodeName return *addr.NodeName
return localNodeName
} }
} }
} }

View file

@ -88,11 +88,9 @@ func TestFederationCNAMERecord(t *testing.T) {
k := Kubernetes{Zones: []string{"inter.webs"}} k := Kubernetes{Zones: []string{"inter.webs"}}
k.Federations = []Federation{{name: "fed", zone: "era.tion.com"}} k.Federations = []Federation{{name: "fed", zone: "era.tion.com"}}
k.APIConn = apiConnFedTest{} k.APIConn = apiConnFedTest{}
k.interfaceAddrsFunc = func() net.IP { return net.ParseIP("10.9.8.7") }
var r recordRequest r, _ := k.parseRequest("s1.ns.fed.svc.inter.webs", dns.TypeA)
r, _ = k.parseRequest("s1.ns.fed.svc.inter.webs", dns.TypeA)
localPodIP = net.ParseIP("10.9.8.7")
testFederationCNAMERecord(t, k, r, msg.Service{Key: "/coredns/webs/inter/svc/fed/ns/s1", Host: "s1.ns.fed.svc.fd-az.fd-r.era.tion.com"}) testFederationCNAMERecord(t, k, r, msg.Service{Key: "/coredns/webs/inter/svc/fed/ns/s1", Host: "s1.ns.fed.svc.fd-az.fd-r.era.tion.com"})
r, _ = k.parseRequest("ep1.s1.ns.fed.svc.inter.webs", dns.TypeA) r, _ = k.parseRequest("ep1.s1.ns.fed.svc.inter.webs", dns.TypeA)
@ -100,5 +98,4 @@ func TestFederationCNAMERecord(t *testing.T) {
r, _ = k.parseRequest("ep1.s1.ns.foo.svc.inter.webs", dns.TypeA) r, _ = k.parseRequest("ep1.s1.ns.foo.svc.inter.webs", dns.TypeA)
testFederationCNAMERecord(t, k, r, msg.Service{Key: "", Host: ""}) testFederationCNAMERecord(t, k, r, msg.Service{Key: "", Host: ""})
} }

View file

@ -269,7 +269,7 @@ func TestServeDNS(t *testing.T) {
k.APIConn = &APIConnServeTest{} k.APIConn = &APIConnServeTest{}
k.AutoPath.Enabled = true k.AutoPath.Enabled = true
k.AutoPath.HostSearchPath = []string{"hostdom.test"} k.AutoPath.HostSearchPath = []string{"hostdom.test"}
//k.Proxy = test.MockHandler(nextMWMap) k.interfaceAddrsFunc = localPodIP
k.Next = testHandler(nextMWMap) k.Next = testHandler(nextMWMap)
ctx := context.TODO() ctx := context.TODO()

View file

@ -46,7 +46,7 @@ type Kubernetes struct {
ReverseCidrs []net.IPNet ReverseCidrs []net.IPNet
Fallthrough bool Fallthrough bool
AutoPath AutoPath
interfaceAddrs interfaceAddrser interfaceAddrsFunc func() net.IP
} }
type AutoPath struct { type AutoPath struct {
@ -98,8 +98,6 @@ type recordRequest struct {
federation string federation string
} }
var localPodIP net.IP
var ( var (
errNoItems = errors.New("no items found") errNoItems = errors.New("no items found")
errNsNotExposed = errors.New("namespace is not exposed") errNsNotExposed = errors.New("namespace is not exposed")
@ -651,11 +649,11 @@ func symbolContainsWildcard(symbol string) bool {
return (symbol == "*" || symbol == "any") return (symbol == "*" || symbol == "any")
} }
func (k *Kubernetes) localPodIP() net.IP { func localPodIP() net.IP {
if localPodIP != nil { addrs, err := net.InterfaceAddrs()
return localPodIP if err != nil {
return nil
} }
addrs, _ := k.interfaceAddrs.interfaceAddrs()
for _, addr := range addrs { for _, addr := range addrs {
ip, _, _ := net.ParseCIDR(addr.String()) ip, _, _ := net.ParseCIDR(addr.String())
@ -663,8 +661,7 @@ func (k *Kubernetes) localPodIP() net.IP {
if ip == nil || ip.IsLoopback() { if ip == nil || ip.IsLoopback() {
continue continue
} }
localPodIP = ip return ip
return localPodIP
} }
return nil return nil
} }

View file

@ -432,6 +432,7 @@ func TestServices(t *testing.T) {
k := Kubernetes{Zones: []string{"interwebs.test"}} k := Kubernetes{Zones: []string{"interwebs.test"}}
k.Federations = []Federation{{name: "fed", zone: "era.tion.com"}} k.Federations = []Federation{{name: "fed", zone: "era.tion.com"}}
k.interfaceAddrsFunc = localPodIP
k.APIConn = &APIConnServiceTest{} k.APIConn = &APIConnServiceTest{}
type svcAns struct { type svcAns struct {

View file

@ -41,25 +41,15 @@ func isDefaultNS(name string, r recordRequest) bool {
} }
func (k *Kubernetes) coreDNSRecord() dns.A { func (k *Kubernetes) coreDNSRecord() dns.A {
var localIP net.IP var (
var svcName string svcName string
var svcNamespace string svcNamespace string
var dnsIP net.IP dnsIP net.IP
)
if len(corednsRecord.Hdr.Name) == 0 || corednsRecord.A == nil { if len(corednsRecord.Hdr.Name) == 0 || corednsRecord.A == nil {
// get local Pod IP // get local Pod IP
addrs, _ := k.interfaceAddrs.interfaceAddrs() localIP := k.interfaceAddrsFunc()
for _, addr := range addrs {
ip, _, _ := net.ParseCIDR(addr.String())
ip = ip.To4()
if ip == nil || ip.IsLoopback() {
continue
}
localIP = ip
break
}
// Find endpoint matching IP to get service and namespace // Find endpoint matching IP to get service and namespace
endpointsList := k.APIConn.EndpointsList() endpointsList := k.APIConn.EndpointsList()

View file

@ -96,19 +96,13 @@ func (APIConnTest) EndpointsList() api.EndpointsList {
func (APIConnTest) GetNodeByName(name string) (api.Node, error) { return api.Node{}, nil } func (APIConnTest) GetNodeByName(name string) (api.Node, error) { return api.Node{}, nil }
type interfaceAddrsTest struct{}
func (i interfaceAddrsTest) interfaceAddrs() ([]net.Addr, error) {
_, ipnet, _ := net.ParseCIDR("172.0.40.10/32")
return []net.Addr{ipnet}, nil
}
func TestDoCoreDNSRecord(t *testing.T) { func TestDoCoreDNSRecord(t *testing.T) {
corednsRecord = dns.A{} corednsRecord = dns.A{}
k := Kubernetes{Zones: []string{"inter.webs.test"}} k := Kubernetes{Zones: []string{"inter.webs.test"}}
k.interfaceAddrs = &interfaceAddrsTest{} k.interfaceAddrsFunc = func() net.IP { return net.ParseIP("172.0.40.10") }
k.APIConn = &APIConnTest{} k.APIConn = &APIConnTest{}
cdr := k.coreDNSRecord() cdr := k.coreDNSRecord()

View file

@ -56,10 +56,10 @@ func setup(c *caddy.Controller) error {
func kubernetesParse(c *caddy.Controller) (*Kubernetes, error) { func kubernetesParse(c *caddy.Controller) (*Kubernetes, error) {
k8s := &Kubernetes{ k8s := &Kubernetes{
ResyncPeriod: defaultResyncPeriod, ResyncPeriod: defaultResyncPeriod,
interfaceAddrs: &interfaceAddrs{}, interfaceAddrsFunc: localPodIP,
PodMode: PodModeDisabled, PodMode: PodModeDisabled,
Proxy: proxy.Proxy{}, Proxy: proxy.Proxy{},
} }
for c.Next() { for c.Next() {