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:
parent
8ad8c75ab4
commit
2c0fc3182c
8 changed files with 25 additions and 53 deletions
|
@ -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
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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: ""})
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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()
|
||||||
|
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue