Skip to content

Commit 49a50da

Browse files
authored
fix: modify cleanup path to always delete link (#3519)
* fix cleanup path to always delete link * remove error log as we no longer return errors
1 parent 082ab85 commit 49a50da

File tree

3 files changed

+49
-18
lines changed

3 files changed

+49
-18
lines changed

netlink/mocknetlink.go

+4
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ type MockNetlink struct {
2222
errorString string
2323
deleteRouteFn routeValidateFn
2424
addRouteFn routeValidateFn
25+
DeleteLinkFn func(name string) error
2526
}
2627

2728
func NewMockNetlink(returnError bool, errorString string) *MockNetlink {
@@ -55,6 +56,9 @@ func (f *MockNetlink) SetLinkMTU(name string, mtu int) error {
5556
}
5657

5758
func (f *MockNetlink) DeleteLink(name string) error {
59+
if f.DeleteLinkFn != nil {
60+
return f.DeleteLinkFn(name)
61+
}
5862
return f.error()
5963
}
6064

network/transparent_vlan_endpointclient_linux.go

+6-9
Original file line numberDiff line numberDiff line change
@@ -622,7 +622,7 @@ func (client *TransparentVlanEndpointClient) AddDefaultArp(interfaceName, destMa
622622

623623
func (client *TransparentVlanEndpointClient) DeleteEndpoints(ep *endpoint) error {
624624
// Vnet NS
625-
err := ExecuteInNS(client.nsClient, client.vnetNSName, func() error {
625+
_ = ExecuteInNS(client.nsClient, client.vnetNSName, func() error {
626626
// Passing in functionality to get number of routes after deletion
627627
getNumRoutesLeft := func() (int, error) {
628628
routes, err := vishnetlink.RouteList(nil, vishnetlink.FAMILY_V4)
@@ -632,11 +632,9 @@ func (client *TransparentVlanEndpointClient) DeleteEndpoints(ep *endpoint) error
632632
return len(routes), nil
633633
}
634634

635-
return client.DeleteEndpointsImpl(ep, getNumRoutesLeft)
635+
client.DeleteEndpointsImpl(ep, getNumRoutesLeft)
636+
return nil
636637
})
637-
if err != nil {
638-
logger.Warn("could not delete transparent vlan endpoints", zap.String("errorMsg", err.Error()))
639-
}
640638

641639
// VM NS
642640
if err := client.DeleteSnatEndpoint(); err != nil {
@@ -646,16 +644,16 @@ func (client *TransparentVlanEndpointClient) DeleteEndpoints(ep *endpoint) error
646644
}
647645

648646
// getNumRoutesLeft is a function which gets the current number of routes in the namespace. Namespace: Vnet
649-
func (client *TransparentVlanEndpointClient) DeleteEndpointsImpl(ep *endpoint, _ func() (int, error)) error {
647+
func (client *TransparentVlanEndpointClient) DeleteEndpointsImpl(ep *endpoint, _ func() (int, error)) {
650648
routeInfoList := client.GetVnetRoutes(ep.IPAddresses)
651649
if err := deleteRoutes(client.netlink, client.netioshim, client.vnetVethName, routeInfoList); err != nil {
652-
return errors.Wrap(err, "failed to remove routes")
650+
logger.Error("Failed to remove routes", zap.Error(err))
653651
}
654652

655653
logger.Info("Deleting host veth", zap.String("vnetVethName", client.vnetVethName))
656654
// Delete Host Veth
657655
if err := client.netlink.DeleteLink(client.vnetVethName); err != nil {
658-
return errors.Wrapf(err, "deleteLink for %v failed", client.vnetVethName)
656+
logger.Error("Failed to delete link", zap.Error(err), zap.String("vnetVethName", client.vnetVethName))
659657
}
660658

661659
// TODO: revist if this require in future.
@@ -670,7 +668,6 @@ func (client *TransparentVlanEndpointClient) DeleteEndpointsImpl(ep *endpoint, _
670668
}
671669
}
672670
*/
673-
return nil
674671
}
675672

676673
// Helper function that allows executing a function in a VM namespace

network/transparent_vlan_endpointclient_linux_test.go

+39-9
Original file line numberDiff line numberDiff line change
@@ -633,7 +633,6 @@ func TestTransparentVlanDeleteEndpoints(t *testing.T) {
633633
routesLeft: func() (int, error) {
634634
return numDefaultRoutes, nil
635635
},
636-
wantErr: false,
637636
},
638637
{
639638
name: "Delete endpoint do not delete vnet ns it is still in use",
@@ -659,7 +658,6 @@ func TestTransparentVlanDeleteEndpoints(t *testing.T) {
659658
routesLeft: func() (int, error) {
660659
return numDefaultRoutes + 1, nil
661660
},
662-
wantErr: false,
663661
},
664662
//nolint gocritic
665663
/* {
@@ -694,15 +692,47 @@ func TestTransparentVlanDeleteEndpoints(t *testing.T) {
694692
for _, tt := range tests {
695693
tt := tt
696694
t.Run(tt.name, func(t *testing.T) {
697-
err := tt.client.DeleteEndpointsImpl(tt.ep, tt.routesLeft)
698-
if tt.wantErr {
699-
require.Error(t, err)
700-
require.Contains(t, err.Error(), tt.wantErrMsg, "Expected:%v actual:%v", tt.wantErrMsg, err.Error())
701-
} else {
702-
require.NoError(t, err)
703-
}
695+
tt.client.DeleteEndpointsImpl(tt.ep, tt.routesLeft)
704696
})
705697
}
698+
699+
t.Run("Delete endpoint runs even if delete routes fails", func(t *testing.T) {
700+
nl := netlink.NewMockNetlink(true, "netlink failure")
701+
// count number of times delete and link and set route are called
702+
// even if deleting the routes fail, we should still delete the veth pair in the vnet ns
703+
deleteLinkFlag := 0
704+
nl.DeleteLinkFn = func(_ string) error {
705+
deleteLinkFlag++
706+
return errors.New("err mock")
707+
}
708+
errOnDeleteRouteFlag := 0
709+
nl.SetDeleteRouteValidationFn(func(_ *netlink.Route) error {
710+
errOnDeleteRouteFlag++
711+
return errors.New("err mock")
712+
})
713+
714+
client := TransparentVlanEndpointClient{
715+
primaryHostIfName: "eth0",
716+
vlanIfName: "eth0.1",
717+
vnetVethName: "A1veth0",
718+
containerVethName: "B1veth0",
719+
vnetNSName: "az_ns_1",
720+
netnsClient: &mockNetns{
721+
deleteNamed: defaultDeleteNamed,
722+
},
723+
netlink: nl,
724+
plClient: platform.NewMockExecClient(false),
725+
netUtilsClient: networkutils.NewNetworkUtils(nl, plc),
726+
netioshim: netio.NewMockNetIO(false, 0),
727+
}
728+
ep := &endpoint{
729+
IPAddresses: IPAddresses,
730+
}
731+
client.DeleteEndpointsImpl(ep, func() (int, error) { return 0, nil })
732+
733+
require.Equal(t, 1, errOnDeleteRouteFlag, "error must occur during delete route path")
734+
require.Equal(t, 1, deleteLinkFlag, "delete link must still be called")
735+
})
706736
}
707737

708738
func TestTransparentVlanConfigureContainerInterfacesAndRoutes(t *testing.T) {

0 commit comments

Comments
 (0)