diff --git a/pkg/proxy/ipvs/proxier.go b/pkg/proxy/ipvs/proxier.go index eb762c9ce78..77270dae477 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) { diff --git a/pkg/proxy/util/utils.go b/pkg/proxy/util/utils.go index 24954ff50f7..d7f94345e2d 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()) @@ -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 } diff --git a/pkg/proxy/util/utils_test.go b/pkg/proxy/util/utils_test.go index 234d2049794..50f5239d21c 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) }