From a99321c87c39326fb078b4ae8349250f5686e95c Mon Sep 17 00:00:00 2001 From: Andrew Sy Kim Date: Tue, 26 May 2020 12:09:27 -0400 Subject: [PATCH 1/3] proxy utils: check network interfaces only once Signed-off-by: Andrew Sy Kim --- pkg/proxy/util/utils.go | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/pkg/proxy/util/utils.go b/pkg/proxy/util/utils.go index 24954ff50f71..e32dfc6875e6 100644 --- a/pkg/proxy/util/utils.go +++ b/pkg/proxy/util/utils.go @@ -181,29 +181,35 @@ func GetNodeAddresses(cidrs []string, nw NetworkInterfacer) (sets.String, error) 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. for _, cidr := range cidrs { if IsZeroCIDR(cidr) { continue } + _, 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 { addrs, err := nw.Addrs(&itf) if err != nil { return nil, fmt.Errorf("error getting address from interface %s, error: %v", itf.Name, err) } + for _, addr := range addrs { if addr == nil { continue } + ip, _, err := net.ParseCIDR(addr.String()) if err != nil { return nil, fmt.Errorf("error parsing CIDR for interface %s, error: %v", itf.Name, err) } + if ipNet.Contains(ip) { if utilnet.IsIPv6(ip) && !uniqueAddressList.Has(IPv6ZeroCIDR) { uniqueAddressList.Insert(ip.String()) From f96d35fc11172cf574f73756ee873b5ba55a8ba1 Mon Sep 17 00:00:00 2001 From: Andrew Sy Kim Date: Tue, 26 May 2020 12:12:00 -0400 Subject: [PATCH 2/3] proxy utils: GetNodeAddresses should check if matching addresses were found Signed-off-by: Andrew Sy Kim --- pkg/proxy/util/utils.go | 5 +++++ pkg/proxy/util/utils_test.go | 8 ++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/pkg/proxy/util/utils.go b/pkg/proxy/util/utils.go index e32dfc6875e6..d7f94345e2dd 100644 --- a/pkg/proxy/util/utils.go +++ b/pkg/proxy/util/utils.go @@ -221,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 } diff --git a/pkg/proxy/util/utils_test.go b/pkg/proxy/util/utils_test.go index 234d2049794d..50f5239d21c2 100644 --- a/pkg/proxy/util/utils_test.go +++ b/pkg/proxy/util/utils_test.go @@ -18,6 +18,7 @@ package util import ( "context" + "fmt" "net" "reflect" "testing" @@ -260,6 +261,7 @@ func TestGetNodeAddressses(t *testing.T) { nw *fake.FakeNetwork itfAddrsPairs []InterfaceAddrsPair expected sets.String + expectedErr error }{ { // case 0 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"}}, }, }, - 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 cidrs: []string{}, @@ -455,9 +458,10 @@ func TestGetNodeAddressses(t *testing.T) { testCases[i].nw.AddInterfaceAddr(&pair.itf, pair.addrs) } 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) } + if !addrList.Equal(testCases[i].expected) { t.Errorf("case [%d], unexpected mismatch, expected: %v, got: %v", i, testCases[i].expected, addrList) } From 18741157ef04478ef2f3f9693808496575307791 Mon Sep 17 00:00:00 2001 From: Andrew Sy Kim Date: Thu, 28 May 2020 11:48:48 -0400 Subject: [PATCH 3/3] proxier/ipvs: remove redundant length check for node addresses Signed-off-by: Andrew Sy Kim --- pkg/proxy/ipvs/proxier.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pkg/proxy/ipvs/proxier.go b/pkg/proxy/ipvs/proxier.go index eb762c9ce78a..77270dae4771 100644 --- a/pkg/proxy/ipvs/proxier.go +++ b/pkg/proxy/ipvs/proxier.go @@ -1104,8 +1104,7 @@ func (proxier *Proxier) syncProxyRules() { nodeAddrSet, err := utilproxy.GetNodeAddresses(proxier.nodePortAddresses, proxier.networkInterfacer) if err != nil { klog.Errorf("Failed to get node ip address matching nodeport cidr: %v", err) - } - if err == nil && nodeAddrSet.Len() > 0 { + } else { nodeAddresses = nodeAddrSet.List() for _, address := range nodeAddresses { if utilproxy.IsZeroCIDR(address) {