in plugins/vpc-branch-eni/plugin/commands.go [187:265]
func (plugin *Plugin) Del(args *cniSkel.CmdArgs) error {
// Parse network configuration.
netConfig, err := config.New(args)
if err != nil {
log.Errorf("Failed to parse netconfig from args: %v.", err)
return err
}
log.Infof("Executing DEL with netconfig: %+v.", netConfig)
// Derive names from CNI network config.
var branchName string
if netConfig.InterfaceType == config.IfTypeVLAN {
branchName = args.IfName
} else {
// Find the trunk link name if not known.
if netConfig.TrunkName == "" {
trunk, err := eni.NewTrunk("", netConfig.TrunkMACAddress, eni.TrunkIsolationModeVLAN)
if err != nil {
// Log and ignore the failure.
log.Errorf("Failed to find trunk with MAC address %v: %v.", netConfig.TrunkMACAddress, err)
return nil
}
netConfig.TrunkName = trunk.GetLinkName()
}
branchName = fmt.Sprintf(branchLinkNameFormat, netConfig.TrunkName, netConfig.BranchVlanID)
}
tapBridgeName := fmt.Sprintf(bridgeNameFormat, netConfig.BranchVlanID)
tapLinkName := args.IfName
// Search for the target network namespace.
netns, err := netns.GetNetNS(args.Netns)
if err == nil {
// In target network namespace...
err = netns.Run(func() error {
if netConfig.InterfaceType == config.IfTypeMACVTAP ||
netConfig.InterfaceType == config.IfTypeTAP {
// Delete the tap link.
la := netlink.NewLinkAttrs()
la.Name = tapLinkName
tapLink := &netlink.Tuntap{LinkAttrs: la}
log.Infof("Deleting tap link: %v.", tapLinkName)
err = netlink.LinkDel(tapLink)
if err != nil {
log.Errorf("Failed to delete tap link: %v.", err)
}
}
// Delete the branch link.
la := netlink.NewLinkAttrs()
la.Name = branchName
branchLink := &netlink.Vlan{LinkAttrs: la}
log.Infof("Deleting branch link: %v.", branchName)
err = netlink.LinkDel(branchLink)
if err != nil {
log.Errorf("Failed to delete branch link: %v.", err)
}
if netConfig.InterfaceType == config.IfTypeTAP {
// Delete the tap bridge.
la = netlink.NewLinkAttrs()
la.Name = tapBridgeName
tapBridge := &netlink.Bridge{LinkAttrs: la}
log.Infof("Deleting tap bridge: %v.", tapBridgeName)
err = netlink.LinkDel(tapBridge)
if err != nil {
log.Errorf("Failed to delete tap bridge: %v.", err)
}
}
return nil
})
} else {
// Log and ignore the failure. DEL can be called multiple times and thus must be idempotent.
log.Errorf("Failed to find netns %s, ignoring: %v.", args.Netns, err)
}
return nil
}