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 }
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 } return ns.WithNetNSPath(args.Netns, false, func(hostNS *os.File) error { return ip.DelLinkByName(args.IfName) }) }
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 } if args.Netns == "" { return nil } return ns.WithNetNSPath(args.Netns, func(_ ns.NetNS) error { return ip.DelLinkByName(args.IfName) }) }
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) } ConfigureLogging(conf.LogLevel) workload, orchestrator, err := GetIdentifiers(args) if err != nil { return err } logger := CreateContextLogger(workload) // Allow the hostname to be overridden by the network config if conf.Hostname != "" { hostname = conf.Hostname } logger.WithFields(log.Fields{ "Workload": workload, "Orchestrator": orchestrator, "Node": hostname, }).Info("Extracted identifiers") // Always try to release the address. Don't deal with any errors till the endpoints are cleaned up. fmt.Fprintf(os.Stderr, "Calico CNI releasing IP address\n") logger.WithFields(log.Fields{"paths": os.Getenv("CNI_PATH"), "type": conf.IPAM.Type}).Debug("Looking for IPAM plugin in paths") ipamErr := ipam.ExecDel(conf.IPAM.Type, args.StdinData) if ipamErr != nil { logger.Error(ipamErr) } calicoClient, err := CreateClient(conf) if err != nil { return err } if err := calicoClient.WorkloadEndpoints().Delete(api.WorkloadEndpointMetadata{ Name: args.IfName, Node: hostname, Orchestrator: orchestrator, Workload: workload}); err != nil { return err } // Only try to delete the device if a namespace was passed in. if args.Netns != "" { fmt.Fprintf(os.Stderr, "Calico CNI deleting device in netns %s\n", args.Netns) err = ns.WithNetNSPath(args.Netns, func(_ ns.NetNS) error { _, err = ip.DelLinkByNameAddr(args.IfName, netlink.FAMILY_V4) return err }) if err != nil { return err } } // Return the IPAM error if there was one. The IPAM error will be lost if there was also an error in cleaning up // the device or endpoint, but crucially, the user will know the overall operation failed. return ipamErr }