// Search the network namespace of a process for interfaces matching a predicate // Note that the predicate is called while the goroutine is inside the process' netns func FindNetDevs(processID int, match func(link netlink.Link) bool) ([]NetDev, error) { var netDevs []NetDev ns, err := netns.GetFromPid(processID) if err != nil { if os.IsNotExist(err) { return nil, nil } return nil, err } defer ns.Close() err = weavenet.WithNetNSUnsafe(ns, func() error { return forEachLink(func(link netlink.Link) error { if match(link) { netDev, err := linkToNetDev(link) if err != nil { return err } netDevs = append(netDevs, netDev) } return nil }) }) return netDevs, err }
func (c *CNIPlugin) CmdDel(args *skel.CmdArgs) error { conf, err := loadNetConf(args.StdinData) if err != nil { return err } ns, err := netns.GetFromPath(args.Netns) if err != nil { return err } defer ns.Close() err = weavenet.WithNetNSUnsafe(ns, func() error { link, err := netlink.LinkByName(args.IfName) if err != nil { return err } return netlink.LinkDel(link) }) if err != nil { return fmt.Errorf("error removing interface: %s", err) } // Default IPAM is Weave's own if conf.IPAM.Type == "" { err = ipamplugin.NewIpam(c.weave).Release(args) } else { err = ipam.ExecDel(conf.IPAM.Type, args.StdinData) } if err != nil { return fmt.Errorf("unable to release IP address: %s", err) } return nil }