Merge pull request #91461 from andrewsykim/fix-get-node-addresses

Improvements for proxy utils GetNodeAddresses
This commit is contained in:
Kubernetes Prow Robot 2020-05-28 12:24:53 -07:00 committed by GitHub
commit 4320e57494
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 22 additions and 8 deletions

View File

@ -1104,8 +1104,7 @@ func (proxier *Proxier) syncProxyRules() {
nodeAddrSet, err := utilproxy.GetNodeAddresses(proxier.nodePortAddresses, proxier.networkInterfacer) nodeAddrSet, err := utilproxy.GetNodeAddresses(proxier.nodePortAddresses, proxier.networkInterfacer)
if err != nil { if err != nil {
klog.Errorf("Failed to get node ip address matching nodeport cidr: %v", err) klog.Errorf("Failed to get node ip address matching nodeport cidr: %v", err)
} } else {
if err == nil && nodeAddrSet.Len() > 0 {
nodeAddresses = nodeAddrSet.List() nodeAddresses = nodeAddrSet.List()
for _, address := range nodeAddresses { for _, address := range nodeAddresses {
if utilproxy.IsZeroCIDR(address) { if utilproxy.IsZeroCIDR(address) {

View File

@ -181,29 +181,35 @@ func GetNodeAddresses(cidrs []string, nw NetworkInterfacer) (sets.String, error)
uniqueAddressList.Insert(cidr) uniqueAddressList.Insert(cidr)
} }
} }
itfs, err := nw.Interfaces()
if err != nil {
return nil, fmt.Errorf("error listing all interfaces from host, error: %v", err)
}
// Second round of iteration to parse IPs based on cidr. // Second round of iteration to parse IPs based on cidr.
for _, cidr := range cidrs { for _, cidr := range cidrs {
if IsZeroCIDR(cidr) { if IsZeroCIDR(cidr) {
continue continue
} }
_, ipNet, _ := net.ParseCIDR(cidr) _, ipNet, _ := net.ParseCIDR(cidr)
itfs, err := nw.Interfaces()
if err != nil {
return nil, fmt.Errorf("error listing all interfaces from host, error: %v", err)
}
for _, itf := range itfs { for _, itf := range itfs {
addrs, err := nw.Addrs(&itf) addrs, err := nw.Addrs(&itf)
if err != nil { if err != nil {
return nil, fmt.Errorf("error getting address from interface %s, error: %v", itf.Name, err) return nil, fmt.Errorf("error getting address from interface %s, error: %v", itf.Name, err)
} }
for _, addr := range addrs { for _, addr := range addrs {
if addr == nil { if addr == nil {
continue continue
} }
ip, _, err := net.ParseCIDR(addr.String()) ip, _, err := net.ParseCIDR(addr.String())
if err != nil { if err != nil {
return nil, fmt.Errorf("error parsing CIDR for interface %s, error: %v", itf.Name, err) return nil, fmt.Errorf("error parsing CIDR for interface %s, error: %v", itf.Name, err)
} }
if ipNet.Contains(ip) { if ipNet.Contains(ip) {
if utilnet.IsIPv6(ip) && !uniqueAddressList.Has(IPv6ZeroCIDR) { if utilnet.IsIPv6(ip) && !uniqueAddressList.Has(IPv6ZeroCIDR) {
uniqueAddressList.Insert(ip.String()) uniqueAddressList.Insert(ip.String())
@ -215,6 +221,11 @@ func GetNodeAddresses(cidrs []string, nw NetworkInterfacer) (sets.String, error)
} }
} }
} }
if uniqueAddressList.Len() == 0 {
return nil, fmt.Errorf("no addresses found for cidrs %v", cidrs)
}
return uniqueAddressList, nil return uniqueAddressList, nil
} }

View File

@ -18,6 +18,7 @@ package util
import ( import (
"context" "context"
"fmt"
"net" "net"
"reflect" "reflect"
"testing" "testing"
@ -260,6 +261,7 @@ func TestGetNodeAddressses(t *testing.T) {
nw *fake.FakeNetwork nw *fake.FakeNetwork
itfAddrsPairs []InterfaceAddrsPair itfAddrsPairs []InterfaceAddrsPair
expected sets.String expected sets.String
expectedErr error
}{ }{
{ // case 0 { // case 0
cidrs: []string{"10.20.30.0/24"}, cidrs: []string{"10.20.30.0/24"},
@ -375,7 +377,8 @@ func TestGetNodeAddressses(t *testing.T) {
addrs: []net.Addr{fake.AddrStruct{Val: "127.0.0.1/8"}}, addrs: []net.Addr{fake.AddrStruct{Val: "127.0.0.1/8"}},
}, },
}, },
expected: sets.NewString(), expected: nil,
expectedErr: fmt.Errorf("no addresses found for cidrs %v", []string{"10.20.30.0/24", "100.200.201.0/24"}),
}, },
{ // case 8 { // case 8
cidrs: []string{}, cidrs: []string{},
@ -455,9 +458,10 @@ func TestGetNodeAddressses(t *testing.T) {
testCases[i].nw.AddInterfaceAddr(&pair.itf, pair.addrs) testCases[i].nw.AddInterfaceAddr(&pair.itf, pair.addrs)
} }
addrList, err := GetNodeAddresses(testCases[i].cidrs, testCases[i].nw) addrList, err := GetNodeAddresses(testCases[i].cidrs, testCases[i].nw)
if err != nil { if !reflect.DeepEqual(err, testCases[i].expectedErr) {
t.Errorf("case [%d], unexpected error: %v", i, err) t.Errorf("case [%d], unexpected error: %v", i, err)
} }
if !addrList.Equal(testCases[i].expected) { if !addrList.Equal(testCases[i].expected) {
t.Errorf("case [%d], unexpected mismatch, expected: %v, got: %v", i, testCases[i].expected, addrList) t.Errorf("case [%d], unexpected mismatch, expected: %v, got: %v", i, testCases[i].expected, addrList)
} }