func cmdDel(args *skel.CmdArgs) error { conf := NetConf{} if err := json.Unmarshal(args.StdinData, &conf); err != nil { return fmt.Errorf("failed to load netconf: %v", err) } var ipn *net.IPNet err := ns.WithNetNSPath(args.Netns, func(hostNS *os.File) error { var err error ipn, err = ip.DelLinkByNameAddr(args.IfName, netlink.FAMILY_V4) return err }) if err != nil { return err } if conf.IPMasq { h := sha512.Sum512([]byte(args.Netns)) chain := fmt.Sprintf("CNI-%s-%x", conf.Name, h[:8]) if err = ip.TeardownIPMasq(ipn, chain); err != nil { return err } } return plugin.ExecDel(conf.IPAM.Type, args.StdinData) }
// teardownKvmNets teardown every active networking from networking by // removing tuntap interface and releasing its ip from IPAM plugin func (n *Networking) teardownKvmNets() { for _, an := range n.nets { switch an.conf.Type { case "ptp": // remove tuntap interface tuntap.RemovePersistentIface(an.runtime.IfName, tuntap.Tap) // remove masquerading if it was prepared if an.conf.IPMasq { h := sha512.Sum512([]byte(n.podID.String())) chain := fmt.Sprintf("CNI-%s-%x", an.conf.Name, h[:8]) err := ip.TeardownIPMasq(&net.IPNet{ IP: an.runtime.IP, Mask: net.IPMask(an.runtime.Mask), }, chain) if err != nil { log.Printf("Error on removing masquerading: %q", err) } } // ugly hack again to directly call IPAM plugin to release IP an.conf.Type = an.conf.IPAM.Type _, err := n.execNetPlugin("DEL", &an, an.runtime.IfName) if err != nil { log.Printf("Error executing network plugin: %q", err) } default: log.Printf("Unsupported network type: %q", an.conf.Type) } } }
// teardownKvmNets teardown every active networking from networking by // removing tuntap interface and releasing its ip from IPAM plugin func (n *Networking) teardownKvmNets() { for _, an := range n.nets { switch an.conf.Type { case "ptp", "bridge": // remove tuntap interface tuntap.RemovePersistentIface(an.runtime.IfName, tuntap.Tap) case "macvlan": link, err := netlink.LinkByName(an.runtime.IfName) if err != nil { log.Printf("Cannot find link `%v`: %v", an.runtime.IfName, err) continue } else { err := netlink.LinkDel(link) if err != nil { log.Printf("Cannot remove link `%v`: %v", an.runtime.IfName, err) continue } } default: log.Printf("Unsupported network type: %q", an.conf.Type) continue } // ugly hack again to directly call IPAM plugin to release IP an.conf.Type = an.conf.IPAM.Type _, err := n.execNetPlugin("DEL", &an, an.runtime.IfName) if err != nil { log.Printf("Error executing network plugin: %q", err) } // remove masquerading if it was prepared if an.conf.IPMasq { chain := getChainName(n.podID.String(), an.conf.Name) err := ip.TeardownIPMasq(&net.IPNet{ IP: an.runtime.IP, Mask: net.IPMask(an.runtime.Mask), }, chain) if err != nil { log.Printf("Error on removing masquerading: %q", err) } } } }