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, 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 conf.IPMasq { h := sha512.Sum512([]byte(args.ContainerID)) chain := fmt.Sprintf("CNI-%s-%x", conf.Name, h[:8]) if err = ip.TeardownIPMasq(ipn, chain); err != nil { return err } } return ipam.ExecDel(conf.IPAM.Type, args.StdinData) }
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, 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 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 ipam.ExecDel(conf.IPAM.Type, args.StdinData) }
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 }
func cmdDel(args *skel.CmdArgs) error { n, err := loadConf(args.StdinData) if err != nil { return err } err = ipam.ExecDel(n.IPAM.Type, args.StdinData) if err != nil { return err } linkFactory := &links.Factory{Netlinker: nl.Netlink} containerNS := namespace.NewNamespace(args.Netns) err = containerNS.Execute(func(ns *os.File) error { linkFactory.DeleteLinkByName(args.IfName) return nil }) if err != nil { return fmt.Errorf("failed to delete link in container namespace: %s", err) } sandboxRepo, err := getSandboxRepo() if err != nil { return fmt.Errorf("failed to open sandbox repository: %s", err) } sandboxNS, err := sandboxRepo.Get(fmt.Sprintf("vni-%d", vni)) if err != nil { return fmt.Errorf("failed to get sandbox namespace: %s", err) } var sandboxLinks []netlink.Link err = sandboxNS.Execute(func(ns *os.File) error { var err error sandboxLinks, err = linkFactory.ListLinks() return err }) if err != nil { return fmt.Errorf("failed to get sandbox links: %s", err) } for _, link := range sandboxLinks { if _, ok := link.(*netlink.Veth); ok { return nil // we still have a container attached } } err = sandboxNS.Destroy() if err != nil { return fmt.Errorf("failed to destroy sandbox namespace: %s", err) } return nil }
func cmdDel(args *skel.CmdArgs) error { netconfBytes, err := consumeScratchNetConf(args.ContainerID) if err != nil { return err } n := &types.NetConf{} if err = json.Unmarshal(netconfBytes, n); err != nil { return fmt.Errorf("failed to parse netconf: %v", err) } return ipam.ExecDel(n.Type, netconfBytes) }
func cmdDel(args *skel.CmdArgs) error { n, err := loadNetConf(args.StdinData) if err != nil { return err } err = ipam.ExecDel(n.IPAM.Type, args.StdinData) if err != nil { return err } return ns.WithNetNSPath(args.Netns, false, func(hostNS *os.File) error { return ip.DelLinkByName(args.IfName) }) }