in cmd/egress-v4-cni-plugin/cni.go [343:420]
func cmdDel(args *skel.CmdArgs) error {
netConf, log, err := loadConf(args.StdinData)
if err != nil {
return fmt.Errorf("failed to parse config: %v", err)
}
//We only need this plugin to kick in if v6 is enabled
if netConf.Enabled == "false" {
return nil
}
log.Debugf("Received Del Request: conf=%v", netConf)
if err := ipam.ExecDel(netConf.IPAM.Type, args.StdinData); err != nil {
log.Debugf("running IPAM plugin failed: %v", err)
return fmt.Errorf("running IPAM plugin failed: %v", err)
}
ipnets := []*net.IPNet{}
if args.Netns != "" {
err := ns.WithNetNSPath(args.Netns, func(hostNS ns.NetNS) error {
var err error
// DelLinkByNameAddr function deletes an interface and returns IPs assigned to it but it
// excludes IPs that are not global unicast addresses (or) private IPs. Will not work for
// our scenario as we use 169.254.0.0/16 range for v4 IPs.
//Get the interface we want to delete
iface, err := netlink.LinkByName(netConf.IfName)
if err != nil {
if _, ok := err.(netlink.LinkNotFoundError); ok {
return nil
}
return nil
}
//Retrieve IP addresses assigned to the interface
addrs, err := netlink.AddrList(iface, netlink.FAMILY_V4)
if err != nil {
return fmt.Errorf("failed to get IP addresses for %q: %v", netConf.IfName, err)
}
//Delete the interface/link.
if err = netlink.LinkDel(iface); err != nil {
return fmt.Errorf("failed to delete %q: %v", netConf.IfName, err)
}
for _, addr := range addrs {
ipnets = append(ipnets, addr.IPNet)
}
if err != nil && err == ip.ErrLinkNotFound {
log.Debugf("DEL: Link Not Found, returning", err)
return nil
}
return err
})
//DEL should be best effort. We should clean up as much as we can and avoid returning error
if err != nil {
log.Debugf("DEL: Executing in container ns errored out, returning", err)
}
}
chain := utils.MustFormatChainNameWithPrefix(netConf.Name, args.ContainerID, "E4-")
comment := utils.FormatComment(netConf.Name, args.ContainerID)
if netConf.NodeIP != nil {
log.Debugf("DEL: SNAT setup, let's clean them up. Size of ipnets: %d", len(ipnets))
for _, ipn := range ipnets {
if err := snat.Snat4Del(ipn.IP, chain, comment); err != nil {
return err
}
}
}
return nil
}