// Run CNI IPAM for the container, either allocating an IP address and returning // it (for ADD) or releasing the lease and cleaning up (for DEL) func (m *podManager) runIPAM(netnsPath string, action cniserver.CNICommand, id string) (*cnitypes.Result, error) { args := &invoke.Args{ Command: string(action), ContainerID: id, NetNS: netnsPath, IfName: podInterfaceName, Path: "/opt/cni/bin", } if action == cniserver.CNI_ADD { result, err := invoke.ExecPluginWithResult("/opt/cni/bin/host-local", m.ipamConfig, args) if err != nil { return nil, fmt.Errorf("failed to run CNI IPAM ADD: %v", err) } if result.IP4 == nil { return nil, fmt.Errorf("failed to obtain IP address from CNI IPAM") } return result, nil } else if action == cniserver.CNI_DEL { err := invoke.ExecPluginWithoutResult("/opt/cni/bin/host-local", m.ipamConfig, args) if err != nil { return nil, fmt.Errorf("failed to run CNI IPAM DEL: %v", err) } return nil, nil } return nil, fmt.Errorf("invalid IPAM action %v", action) }
func (c *CNIConfig) AddNetwork(net *NetworkConfig, rt *RuntimeConf) (*types.Result, error) { pluginPath, err := invoke.FindInPath(net.Network.Type, c.Path) if err != nil { return nil, err } return invoke.ExecPluginWithResult(pluginPath, net.Bytes, c.args("ADD", rt)) }
// Run CNI IPAM allocation for the container and return the allocated IP address func (m *podManager) ipamAdd(netnsPath string, id string) (*cnitypes.Result, error) { if netnsPath == "" { return nil, fmt.Errorf("netns required for CNI_ADD") } args := createIPAMArgs(netnsPath, cniserver.CNI_ADD, id) result, err := invoke.ExecPluginWithResult("/opt/cni/bin/host-local", m.ipamConfig, args) if err != nil { return nil, fmt.Errorf("failed to run CNI IPAM ADD: %v", err) } if result.IP4 == nil { return nil, fmt.Errorf("failed to obtain IP address from CNI IPAM") } return result, nil }