Skip to content

Commit

Permalink
Add unit tests for pkg/agent/route/route_windows.go
Browse files Browse the repository at this point in the history
Signed-off-by: Hongliang Liu <lhongliang@vmware.com>
  • Loading branch information
hongliangl committed Jul 25, 2023
1 parent 7919ef4 commit 55a75ef
Show file tree
Hide file tree
Showing 7 changed files with 710 additions and 123 deletions.
17 changes: 2 additions & 15 deletions pkg/agent/route/route_linux_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -920,8 +920,6 @@ func TestAddRoutes(t *testing.T) {
func TestDeleteRoutes(t *testing.T) {
tests := []struct {
name string
networkConfig *config.NetworkConfig
nodeConfig *config.NodeConfig
podCIDR *net.IPNet
existingNodeRoutes map[string][]*netlink.Route
existingNodeNeighbors map[string]*netlink.Neigh
Expand Down Expand Up @@ -966,8 +964,6 @@ func TestDeleteRoutes(t *testing.T) {
mockIPSet := ipsettest.NewMockInterface(ctrl)
c := &Client{netlink: mockNetlink,
ipset: mockIPSet,
networkConfig: tt.networkConfig,
nodeConfig: tt.nodeConfig,
nodeRoutes: sync.Map{},
nodeNeighbors: sync.Map{},
}
Expand Down Expand Up @@ -1456,27 +1452,18 @@ func TestAddExternalIPRoute(t *testing.T) {
tests := []struct {
name string
externalIPs []string
serviceRoutes map[string]*netlink.Route
expectedCalls func(mockNetlink *netlinktest.MockInterfaceMockRecorder)
}{
{
name: "IPv4",
serviceRoutes: map[string]*netlink.Route{
externalIPv4Addr1: ipv4Route1,
externalIPv4Addr2: ipv4Route2,
},
name: "IPv4",
externalIPs: []string{externalIPv4Addr1, externalIPv4Addr2},
expectedCalls: func(mockNetlink *netlinktest.MockInterfaceMockRecorder) {
mockNetlink.RouteReplace(ipv4Route1)
mockNetlink.RouteReplace(ipv4Route2)
},
},
{
name: "IPv6",
serviceRoutes: map[string]*netlink.Route{
externalIPv6Addr1: ipv6Route1,
externalIPv6Addr2: ipv6Route2,
},
name: "IPv6",
externalIPs: []string{externalIPv6Addr1, externalIPv6Addr2},
expectedCalls: func(mockNetlink *netlinktest.MockInterfaceMockRecorder) {
mockNetlink.RouteReplace(ipv6Route1)
Expand Down
47 changes: 25 additions & 22 deletions pkg/agent/route/route_windows.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import (
"antrea.io/antrea/pkg/agent/servicecidr"
"antrea.io/antrea/pkg/agent/util"
"antrea.io/antrea/pkg/agent/util/winfirewall"
"antrea.io/antrea/pkg/agent/util/winnetutil"
binding "antrea.io/antrea/pkg/ovs/openflow"
iputil "antrea.io/antrea/pkg/util/ip"
)
Expand All @@ -57,12 +58,13 @@ var (
type Client struct {
nodeConfig *config.NodeConfig
networkConfig *config.NetworkConfig
netUtil winnetutil.Interface
// nodeRoutes caches ip routes to remote Pods. It's a map of podCIDR to routes.
nodeRoutes *sync.Map
nodeRoutes sync.Map
// serviceRoutes caches ip routes about Services.
serviceRoutes *sync.Map
serviceRoutes sync.Map
// netNatStaticMappings caches Windows NetNat for NodePort.
netNatStaticMappings *sync.Map
netNatStaticMappings sync.Map
fwClient *winfirewall.Client
bridgeInfIndex int
noSNAT bool
Expand All @@ -75,9 +77,10 @@ type Client struct {
func NewClient(networkConfig *config.NetworkConfig, noSNAT, proxyAll, connectUplinkToBridge, multicastEnabled bool, serviceCIDRProvider servicecidr.Interface) (*Client, error) {
return &Client{
networkConfig: networkConfig,
nodeRoutes: &sync.Map{},
serviceRoutes: &sync.Map{},
netNatStaticMappings: &sync.Map{},
netUtil: &util.Handle{},
nodeRoutes: sync.Map{},
serviceRoutes: sync.Map{},
netNatStaticMappings: sync.Map{},
fwClient: winfirewall.NewClient(),
noSNAT: noSNAT,
proxyAll: proxyAll,
Expand Down Expand Up @@ -169,7 +172,7 @@ func (c *Client) Reconcile(podCIDRs []string) error {
if c.proxyAll && c.isServiceRoute(rt) {
continue
}
err := util.RemoveNetRoute(rt)
err := c.netUtil.RemoveNetRoute(rt)
if err != nil {
return err
}
Expand Down Expand Up @@ -204,7 +207,7 @@ func (c *Client) AddRoutes(podCIDR *net.IPNet, nodeName string, peerNodeIP, peer
return nil
}
// Remove the existing route entry if the gateway address is not as expected.
if err := util.RemoveNetRoute(existingRoute); err != nil {
if err := c.netUtil.RemoveNetRoute(existingRoute); err != nil {
klog.Errorf("Failed to delete existing route entry with destination %s gateway %s on %s (%s)", podCIDR.String(), peerGwIP.String(), nodeName, peerNodeIP)
return err
}
Expand All @@ -214,7 +217,7 @@ func (c *Client) AddRoutes(podCIDR *net.IPNet, nodeName string, peerNodeIP, peer
return nil
}

if err := util.ReplaceNetRoute(route); err != nil {
if err := c.netUtil.ReplaceNetRoute(route); err != nil {
return err
}

Expand All @@ -233,7 +236,7 @@ func (c *Client) DeleteRoutes(podCIDR *net.IPNet) error {
}

rt := obj.(*util.Route)
if err := util.RemoveNetRoute(rt); err != nil {
if err := c.netUtil.RemoveNetRoute(rt); err != nil {
return err
}
c.nodeRoutes.Delete(podCIDR.String())
Expand All @@ -248,13 +251,13 @@ func (c *Client) addVirtualServiceIPRoute(isIPv6 bool) error {
svcIP := config.VirtualServiceIPv4

neigh := generateNeigh(svcIP, linkIndex)
if err := util.ReplaceNetNeighbor(neigh); err != nil {
if err := c.netUtil.ReplaceNetNeighbor(neigh); err != nil {
return fmt.Errorf("failed to add new IP neighbour for %s: %w", svcIP, err)
}
klog.InfoS("Added virtual Service IP neighbor", "neighbor", neigh)

route := generateRoute(virtualServiceIPv4Net, net.IPv4zero, linkIndex, util.MetricHigh)
if err := util.ReplaceNetRoute(route); err != nil {
if err := c.netUtil.ReplaceNetRoute(route); err != nil {
return fmt.Errorf("failed to install route for virtual Service IP %s: %w", svcIP.String(), err)
}
c.serviceRoutes.Store(svcIP.String(), route)
Expand All @@ -271,7 +274,7 @@ func (c *Client) addServiceCIDRRoute(serviceCIDR *net.IPNet) error {
oldServiceCIDRRoute, serviceCIDRRouteExists := c.serviceRoutes.Load(serviceIPv4CIDRKey)
// Generate a route with the new ClusterIP CIDR and install it.
route := generateRoute(serviceCIDR, gw, linkIndex, metric)
if err := util.ReplaceNetRoute(route); err != nil {
if err := c.netUtil.ReplaceNetRoute(route); err != nil {
return fmt.Errorf("failed to install a new Service CIDR route: %w", err)
}

Expand Down Expand Up @@ -311,7 +314,7 @@ func (c *Client) addServiceCIDRRoute(serviceCIDR *net.IPNet) error {

// Remove stale routes.
for _, rt := range staleRoutes {
if err := util.RemoveNetRoute(rt); err != nil {
if err := c.netUtil.RemoveNetRoute(rt); err != nil {
if strings.Contains(err.Error(), "No matching MSFT_NetRoute objects") {
klog.InfoS("Failed to delete stale Service CIDR route since the route has been deleted", "route", rt)
} else {
Expand All @@ -332,7 +335,7 @@ func (c *Client) addVirtualNodePortDNATIPRoute(isIPv6 bool) error {
gw := config.VirtualServiceIPv4

route := generateRoute(virtualNodePortDNATIPv4Net, gw, linkIndex, util.MetricHigh)
if err := util.ReplaceNetRoute(route); err != nil {
if err := c.netUtil.ReplaceNetRoute(route); err != nil {
return fmt.Errorf("failed to install route for NodePort DNAT IP %s: %w", vIP.String(), err)
}
c.serviceRoutes.Store(vIP.String(), route)
Expand Down Expand Up @@ -373,7 +376,7 @@ func (c *Client) syncIPInfra() {

func (c *Client) syncRoute() error {
restoreRoute := func(route *util.Route) bool {
if err := util.ReplaceNetRoute(route); err != nil {
if err := c.netUtil.ReplaceNetRoute(route); err != nil {
klog.ErrorS(err, "Failed to sync route", "Route", route)
return false
}
Expand Down Expand Up @@ -409,7 +412,7 @@ func (c *Client) syncNetNatStaticMapping() error {

c.netNatStaticMappings.Range(func(_, v interface{}) bool {
mapping := v.(*util.NetNatStaticMapping)
if err := util.ReplaceNetNatStaticMapping(mapping); err != nil {
if err := c.netUtil.ReplaceNetNatStaticMapping(mapping); err != nil {
klog.ErrorS(err, "Failed to add netNatStaticMapping", "netNatStaticMapping", mapping)
return false
}
Expand All @@ -429,7 +432,7 @@ func (c *Client) isServiceRoute(route *util.Route) bool {
}

func (c *Client) listIPRoutesOnGW() (map[string]*util.Route, error) {
routes, err := util.GetNetRoutesAll()
routes, err := c.netUtil.GetNetRoutesAll()
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -497,7 +500,7 @@ func (c *Client) AddNodePort(nodePortAddresses []net.IP, port uint16, protocol b
InternalPort: port,
Protocol: protocol,
}
if err := util.ReplaceNetNatStaticMapping(netNatStaticMapping); err != nil {
if err := c.netUtil.ReplaceNetNatStaticMapping(netNatStaticMapping); err != nil {
return err
}
c.netNatStaticMappings.Store(fmt.Sprintf("%d-%s", port, protocol), netNatStaticMapping)
Expand All @@ -513,7 +516,7 @@ func (c *Client) DeleteNodePort(nodePortAddresses []net.IP, port uint16, protoco
return nil
}
netNatStaticMapping := obj.(*util.NetNatStaticMapping)
if err := util.RemoveNetNatStaticMapping(netNatStaticMapping); err != nil {
if err := c.netUtil.RemoveNetNatStaticMapping(netNatStaticMapping); err != nil {
return err
}
c.netNatStaticMappings.Delete(key)
Expand All @@ -530,7 +533,7 @@ func (c *Client) AddExternalIPRoute(externalIP net.IP) error {
svcIPNet := util.NewIPNet(externalIP)

route := generateRoute(svcIPNet, gw, linkIndex, metric)
if err := util.ReplaceNetRoute(route); err != nil {
if err := c.netUtil.ReplaceNetRoute(route); err != nil {
return fmt.Errorf("failed to install route for external IP %s: %w", externalIPStr, err)
}
c.serviceRoutes.Store(externalIPStr, route)
Expand All @@ -546,7 +549,7 @@ func (c *Client) DeleteExternalIPRoute(externalIP net.IP) error {
klog.V(2).InfoS("Didn't find route for external IP", "IP", externalIPStr)
return nil
}
if err := util.RemoveNetRoute(route.(*util.Route)); err != nil {
if err := c.netUtil.RemoveNetRoute(route.(*util.Route)); err != nil {
if strings.Contains(err.Error(), "No matching MSFT_NetRoute objects") {
klog.InfoS("Failed to delete route for external IP since it doesn't exist", "IP", externalIPStr)
} else {
Expand Down
Loading

0 comments on commit 55a75ef

Please sign in to comment.