func cmdDel(args *skel.CmdArgs) error { n, err := loadNetConf(args.StdinData) if err != nil { return err } if err := ipam.ExecDel(n.IPAM.Type, args.StdinData); err != nil { return err } var ipn *net.IPNet err = ns.WithNetNSPath(args.Netns, false, 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 n.IPMasq { chain := utils.FormatChainName(n.Name, args.ContainerID) comment := utils.FormatComment(n.Name, args.ContainerID) if err = ip.TeardownIPMasq(ipn, chain, comment); err != nil { return err } } return nil }
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) } if err := ipam.ExecDel(conf.IPAM.Type, args.StdinData); err != nil { return err } if args.Netns == "" { return nil } var ipn *net.IPNet err := ns.WithNetNSPath(args.Netns, func(_ ns.NetNS) error { var err error ipn, err = ip.DelLinkByNameAddr(args.IfName, netlink.FAMILY_V4) return err }) if err != nil { return err } if conf.IPMasq { chain := utils.FormatChainName(conf.Name, args.ContainerID) comment := utils.FormatComment(conf.Name, args.ContainerID) if err = ip.TeardownIPMasq(ipn, chain, comment); err != nil { return err } } return nil }
// 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 { if an.conf.Type == "flannel" { if err := kvmTransformFlannelNetwork(&an); err != nil { stderr.PrintE("error transforming flannel network", err) continue } } 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 { stderr.PrintE(fmt.Sprintf("cannot find link `%v`", an.runtime.IfName), err) continue } else { err := netlink.LinkDel(link) if err != nil { stderr.PrintE(fmt.Sprintf("cannot remove link `%v`", an.runtime.IfName), err) continue } } default: stderr.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 { stderr.PrintE("error executing network plugin", err) } // remove masquerading if it was prepared if an.conf.IPMasq { chain := cniutils.FormatChainName(an.conf.Name, n.podID.String()) comment := cniutils.FormatChainName(an.conf.Name, n.podID.String()) err := ip.TeardownIPMasq(&net.IPNet{ IP: an.runtime.IP, Mask: net.IPMask(an.runtime.Mask), }, chain, comment) if err != nil { stderr.PrintE("error on removing masquerading", err) } } } }