// Leave method is invoked when a Sandbox detaches from an endpoint. func (d *driver) Leave(nid, eid string) error { defer osl.InitOSContext()() network, err := d.getNetwork(nid) if err != nil { return types.InternalMaskableErrorf("%s", err) } endpoint, err := network.getEndpoint(eid) if err != nil { return err } if endpoint == nil { return EndpointNotFoundError(eid) } if !network.config.EnableICC { if err = d.link(network, endpoint, false); err != nil { return err } } return nil }
// DeleteEndpoint remove the endpoint and associated netlink interface func (d *driver) DeleteEndpoint(nid, eid string) error { defer osl.InitOSContext()() if err := validateID(nid, eid); err != nil { return err } n := d.network(nid) if n == nil { return fmt.Errorf("network id %q not found", nid) } ep := n.endpoint(eid) if ep == nil { return fmt.Errorf("endpoint id %q not found", eid) } if link, err := ns.NlHandle().LinkByName(ep.srcName); err == nil { ns.NlHandle().LinkDel(link) } if err := d.storeDelete(ep); err != nil { logrus.Warnf("Failed to remove macvlan endpoint %s from store: %v", ep.id[0:7], err) } n.deleteEndpoint(ep.id) return nil }
func (d *driver) RevokeExternalConnectivity(nid, eid string) error { defer osl.InitOSContext()() network, err := d.getNetwork(nid) if err != nil { return err } endpoint, err := network.getEndpoint(eid) if err != nil { return err } if endpoint == nil { return EndpointNotFoundError(eid) } err = network.releasePorts(endpoint) if err != nil { logrus.Warn(err) } endpoint.portMapping = nil if err = d.storeUpdate(endpoint); err != nil { return fmt.Errorf("failed to update bridge endpoint %s to store: %v", endpoint.id[0:7], err) } return nil }
func deleteInterfaceBySubnet(brPrefix string, s *subnet) error { defer osl.InitOSContext()() nlh := ns.NlHandle() links, err := nlh.LinkList() if err != nil { return fmt.Errorf("failed to list interfaces while deleting bridge interface by subnet: %v", err) } for _, l := range links { name := l.Attrs().Name if _, ok := l.(*netlink.Bridge); ok && strings.HasPrefix(name, brPrefix) { addrList, err := nlh.AddrList(l, netlink.FAMILY_V4) if err != nil { logrus.Errorf("error getting AddressList for bridge %s", name) continue } for _, addr := range addrList { if netutils.NetworkOverlaps(addr.IPNet, s.subnetIP) { err = nlh.LinkDel(l) if err != nil { logrus.Errorf("error deleting bridge (%s) with subnet %v: %v", name, addr.IPNet, err) } } } } } return nil }
func (d *driver) ProgramExternalConnectivity(nid, eid string, options map[string]interface{}) error { defer osl.InitOSContext()() network, err := d.getNetwork(nid) if err != nil { return err } endpoint, err := network.getEndpoint(eid) if err != nil { return err } if endpoint == nil { return EndpointNotFoundError(eid) } endpoint.extConnConfig, err = parseConnectivityOptions(options) if err != nil { return err } // Program any required port mapping and store them in the endpoint endpoint.portMapping, err = network.allocatePorts(endpoint, network.config.DefaultBindingIP, d.config.EnableUserlandProxy) if err != nil { return err } if !network.config.EnableICC { return d.link(network, endpoint, true) } return nil }
func createVethPair() (string, string, error) { defer osl.InitOSContext()() // Generate a name for what will be the host side pipe interface name1, err := netutils.GenerateIfaceName(vethPrefix, vethLen) if err != nil { return "", "", fmt.Errorf("error generating veth name1: %v", err) } // Generate a name for what will be the sandbox side pipe interface name2, err := netutils.GenerateIfaceName(vethPrefix, vethLen) if err != nil { return "", "", fmt.Errorf("error generating veth name2: %v", err) } // Generate and add the interface pipe host <-> sandbox veth := &netlink.Veth{ LinkAttrs: netlink.LinkAttrs{Name: name1, TxQLen: 0}, PeerName: name2} if err := netlink.LinkAdd(veth); err != nil { return "", "", fmt.Errorf("error creating veth pair: %v", err) } return name1, name2, nil }
func deleteVxlanByVNI(path string, vni uint32) error { defer osl.InitOSContext()() nlh := ns.NlHandle() if path != "" { ns, err := netns.GetFromPath(path) if err != nil { return fmt.Errorf("failed to get ns handle for %s: %v", path, err) } defer ns.Close() nlh, err = netlink.NewHandleAt(ns) if err != nil { return fmt.Errorf("failed to get netlink handle for ns %s: %v", path, err) } defer nlh.Delete() } links, err := nlh.LinkList() if err != nil { return fmt.Errorf("failed to list interfaces while deleting vxlan interface by vni: %v", err) } for _, l := range links { if l.Type() == "vxlan" && (vni == 0 || l.(*netlink.Vxlan).VxlanId == int(vni)) { err = nlh.LinkDel(l) if err != nil { return fmt.Errorf("error deleting vxlan interface with id %d: %v", vni, err) } return nil } } return fmt.Errorf("could not find a vxlan interface to delete with id %d", vni) }
func (d *driver) DeleteEndpoint(nid, eid string) error { var err error defer osl.InitOSContext()() // Get the network handler and make sure it exists d.Lock() n, ok := d.networks[nid] d.Unlock() if !ok { return types.InternalMaskableErrorf("network %s does not exist", nid) } if n == nil { return driverapi.ErrNoNetwork(nid) } // Sanity Check n.Lock() if n.id != nid { n.Unlock() return InvalidNetworkIDError(nid) } n.Unlock() // Check endpoint id and if an endpoint is actually there ep, err := n.getEndpoint(eid) if err != nil { return err } if ep == nil { return EndpointNotFoundError(eid) } // Remove it n.Lock() delete(n.endpoints, eid) n.Unlock() // On failure make sure to set back ep in n.endpoints, but only // if it hasn't been taken over already by some other thread. defer func() { if err != nil { n.Lock() if _, ok := n.endpoints[eid]; !ok { n.endpoints[eid] = ep } n.Unlock() } }() // Try removal of link. Discard error: it is a best effort. // Also make sure defer does not see this error either. if link, err := netlink.LinkByName(ep.srcName); err == nil { netlink.LinkDel(link) } return nil }
// CreateNetwork the network for the specified driver type func (d *driver) CreateNetwork(nid string, option map[string]interface{}, nInfo driverapi.NetworkInfo, ipV4Data, ipV6Data []driverapi.IPAMData) error { defer osl.InitOSContext()() kv, err := kernel.GetKernelVersion() if err != nil { return fmt.Errorf("Failed to check kernel version for %s driver support: %v", ipvlanType, err) } // ensure Kernel version is >= v4.2 for ipvlan support if kv.Kernel < ipvlanKernelVer || (kv.Kernel == ipvlanKernelVer && kv.Major < ipvlanMajorVer) { return fmt.Errorf("kernel version failed to meet the minimum ipvlan kernel requirement of %d.%d, found %d.%d.%d", ipvlanKernelVer, ipvlanMajorVer, kv.Kernel, kv.Major, kv.Minor) } // reject a null v4 network if len(ipV4Data) == 0 || ipV4Data[0].Pool.String() == "0.0.0.0/0" { return fmt.Errorf("ipv4 pool is empty") } // parse and validate the config and bind to networkConfiguration config, err := parseNetworkOptions(nid, option) if err != nil { return err } config.ID = nid err = config.processIPAM(nid, ipV4Data, ipV6Data) if err != nil { return err } // verify the ipvlan mode from -o ipvlan_mode option switch config.IpvlanMode { case "", modeL2: // default to ipvlan L2 mode if -o ipvlan_mode is empty config.IpvlanMode = modeL2 case modeL3: config.IpvlanMode = modeL3 default: return fmt.Errorf("requested ipvlan mode '%s' is not valid, 'l2' mode is the ipvlan driver default", config.IpvlanMode) } // loopback is not a valid parent link if config.Parent == "lo" { return fmt.Errorf("loopback interface is not a valid %s parent link", ipvlanType) } // if parent interface not specified, create a dummy type link to use named dummy+net_id if config.Parent == "" { config.Parent = getDummyName(stringid.TruncateID(config.ID)) // empty parent and --internal are handled the same. Set here to update k/v config.Internal = true } err = d.createNetwork(config) if err != nil { return err } // update persistent db, rollback on fail err = d.storeUpdate(config) if err != nil { d.deleteNetwork(config.ID) logrus.Debugf("encoutered an error rolling back a network create for %s : %v", config.ID, err) return err } return nil }
// CreateNetwork the network for the specified driver type func (d *driver) CreateNetwork(nid string, option map[string]interface{}, ipV4Data, ipV6Data []driverapi.IPAMData) error { defer osl.InitOSContext()() kv, err := kernel.GetKernelVersion() if err != nil { return fmt.Errorf("failed to check kernel version for %s driver support: %v", macvlanType, err) } // ensure Kernel version is >= v3.9 for macvlan support if kv.Kernel < macvlanKernelVer || (kv.Kernel == macvlanKernelVer && kv.Major < macvlanMajorVer) { return fmt.Errorf("kernel version failed to meet the minimum macvlan kernel requirement of %d.%d, found %d.%d.%d", macvlanKernelVer, macvlanMajorVer, kv.Kernel, kv.Major, kv.Minor) } // parse and validate the config and bind to networkConfiguration config, err := parseNetworkOptions(nid, option) if err != nil { return err } config.ID = nid err = config.processIPAM(nid, ipV4Data, ipV6Data) if err != nil { return err } // verify the macvlan mode from -o macvlan_mode option switch config.MacvlanMode { case "", modeBridge: // default to macvlan bridge mode if -o macvlan_mode is empty config.MacvlanMode = modeBridge case modeOpt: config.MacvlanMode = modeOpt case modePassthru: config.MacvlanMode = modePassthru case modeVepa: config.MacvlanMode = modeVepa default: return fmt.Errorf("requested macvlan mode '%s' is not valid, 'bridge' mode is the macvlan driver default", config.MacvlanMode) } // loopback is not a valid parent link if config.Parent == "lo" { return fmt.Errorf("loopback interface is not a valid %s parent link", macvlanType) } // if parent interface not specified, create a dummy type link to use named dummy+net_id if config.Parent == "" { config.Parent = getDummyName(stringid.TruncateID(config.ID)) // empty parent and --internal are handled the same. Set here to update k/v config.Internal = true } err = d.createNetwork(config) if err != nil { return err } // update persistent db, rollback on fail err = d.storeUpdate(config) if err != nil { d.deleteNetwork(config.ID) logrus.Debugf("encoutered an error rolling back a network create for %s : %v", config.ID, err) return err } return nil }
func deleteInterface(name string) error { defer osl.InitOSContext()() out, err := exec.Command("/usr/sbin/dladm", "delete-vxlan", name).Output() if err != nil { return fmt.Errorf("error creating vxlan interface: %v %s", err, out) } return nil }
func (d *driver) DeleteNetwork(nid string) error { var err error defer osl.InitOSContext()() // Get network handler and remove it from driver d.Lock() n, ok := d.networks[nid] d.Unlock() if !ok { return types.InternalMaskableErrorf("network %s does not exist", nid) } n.Lock() config := n.config n.Unlock() d.Lock() delete(d.networks, nid) d.Unlock() // On failure set network handler back in driver, but // only if is not already taken over by some other thread defer func() { if err != nil { d.Lock() if _, ok := d.networks[nid]; !ok { d.networks[nid] = n } d.Unlock() } }() // Sanity check if n == nil { err = driverapi.ErrNoNetwork(nid) return err } // We only delete the bridge when it's not the default bridge. This is keep the backward compatible behavior. if !config.DefaultBridge { if err := d.nlh.LinkDel(n.bridge.Link); err != nil { logrus.Warnf("Failed to remove bridge interface %s on network %s delete: %v", config.BridgeName, nid, err) } } // clean all relevant iptables rules for _, cleanFunc := range n.iptCleanFuncs { if errClean := cleanFunc(); errClean != nil { logrus.Warnf("Failed to clean iptables rules for bridge network: %v", errClean) } } return d.storeDelete(config) }
// CreateEndpoint assigns the mac, ip and endpoint id for the new container func (d *driver) CreateEndpoint(nid, eid string, ifInfo driverapi.InterfaceInfo, epOptions map[string]interface{}) error { defer osl.InitOSContext()() if err := validateID(nid, eid); err != nil { return err } n, err := d.getNetwork(nid) if err != nil { return fmt.Errorf("network id %q not found", nid) } ep := &endpoint{ id: eid, nid: nid, addr: ifInfo.Address(), addrv6: ifInfo.AddressIPv6(), mac: ifInfo.MacAddress(), } if ep.addr == nil { return fmt.Errorf("create endpoint was not passed an IP address") } if ep.mac == nil { ep.mac = netutils.GenerateMACFromIP(ep.addr.IP) if err := ifInfo.SetMacAddress(ep.mac); err != nil { return err } } // disallow portmapping -p if opt, ok := epOptions[netlabel.PortMap]; ok { if _, ok := opt.([]types.PortBinding); ok { if len(opt.([]types.PortBinding)) > 0 { logrus.Warnf("%s driver does not support port mappings", macvlanType) } } } // disallow port exposure --expose if opt, ok := epOptions[netlabel.ExposedPorts]; ok { if _, ok := opt.([]types.TransportPort); ok { if len(opt.([]types.TransportPort)) > 0 { logrus.Warnf("%s driver does not support port exposures", macvlanType) } } } if err := d.storeUpdate(ep); err != nil { return fmt.Errorf("failed to save macvlan endpoint %s to store: %v", ep.id[0:7], err) } n.addEndpoint(ep) return nil }
func deleteInterface(name string) error { defer osl.InitOSContext()() link, err := netlink.LinkByName(name) if err != nil { return fmt.Errorf("failed to find interface with name %s: %v", name, err) } if err := netlink.LinkDel(link); err != nil { return fmt.Errorf("error deleting interface with name %s: %v", name, err) } return nil }
func (d *driver) ProgramExternalConnectivity(nid, eid string, options map[string]interface{}) error { defer osl.InitOSContext()() network, err := d.getNetwork(nid) if err != nil { return err } endpoint, err := network.getEndpoint(eid) if err != nil { return err } if endpoint == nil { return EndpointNotFoundError(eid) } endpoint.extConnConfig, err = parseConnectivityOptions(options) if err != nil { return err } // Program any required port mapping and store them in the endpoint endpoint.portMapping, err = network.allocatePorts(endpoint, network.config.DefaultBindingIP, d.config.EnableUserlandProxy) if err != nil { return err } defer func() { if err != nil { if e := network.releasePorts(endpoint); e != nil { logrus.Errorf("Failed to release ports allocated for the bridge endpoint %s on failure %v because of %v", eid, err, e) } endpoint.portMapping = nil } }() if err = d.storeUpdate(endpoint); err != nil { return fmt.Errorf("failed to update bridge endpoint %s to store: %v", endpoint.id[0:7], err) } if !network.config.EnableICC { return d.link(network, endpoint, true) } return nil }
// Leave method is invoked when a Sandbox detaches from an endpoint. func (d *driver) Leave(nid, eid string) error { defer osl.InitOSContext()() network, err := d.getNetwork(nid) if err != nil { return err } endpoint, err := network.getEndpoint(eid) if err != nil { return err } if endpoint == nil { return fmt.Errorf("could not find endpoint with id %s", eid) } return nil }
// DeleteNetwork the network for the specified driver type func (d *driver) DeleteNetwork(nid string) error { defer osl.InitOSContext()() n := d.network(nid) if n == nil { return fmt.Errorf("network id %s not found", nid) } // if the driver created the slave interface, delete it, otherwise leave it if ok := n.config.CreatedSlaveLink; ok { // if the interface exists, only delete if it matches iface.vlan or dummy.net_id naming if ok := parentExists(n.config.Parent); ok { // only delete the link if it is named the net_id if n.config.Parent == getDummyName(stringid.TruncateID(nid)) { err := delDummyLink(n.config.Parent) if err != nil { logrus.Debugf("link %s was not deleted, continuing the delete network operation: %v", n.config.Parent, err) } } else { // only delete the link if it matches iface.vlan naming err := delVlanLink(n.config.Parent) if err != nil { logrus.Debugf("link %s was not deleted, continuing the delete network operation: %v", n.config.Parent, err) } } } } for _, ep := range n.endpoints { if link, err := ns.NlHandle().LinkByName(ep.srcName); err == nil { ns.NlHandle().LinkDel(link) } if err := d.storeDelete(ep); err != nil { logrus.Warnf("Failed to remove macvlan endpoint %s from store: %v", ep.id[0:7], err) } } // delete the *network d.deleteNetwork(nid) // delete the network record from persistent cache err := d.storeDelete(n.config) if err != nil { return fmt.Errorf("error deleting deleting id %s from datastore: %v", nid, err) } return nil }
func createVxlan(name string, vni uint32) error { defer osl.InitOSContext()() vxlan := &netlink.Vxlan{ LinkAttrs: netlink.LinkAttrs{Name: name}, VxlanId: int(vni), Learning: true, Port: int(nl.Swap16(vxlanPort)), //network endian order Proxy: true, L3miss: true, L2miss: true, } if err := netlink.LinkAdd(vxlan); err != nil { return fmt.Errorf("error creating vxlan interface: %v", err) } return nil }
// CreateEndpoint assigns the mac, ip and endpoint id for the new container func (d *driver) CreateEndpoint(nid, eid string, ifInfo driverapi.InterfaceInfo, epOptions map[string]interface{}) error { defer osl.InitOSContext()() if err := validateID(nid, eid); err != nil { return err } n, err := d.getNetwork(nid) if err != nil { return fmt.Errorf("network id %q not found", nid) } if ifInfo.MacAddress() != nil { return fmt.Errorf("%s interfaces do not support custom mac address assigment", ipvlanType) } ep := &endpoint{ id: eid, addr: ifInfo.Address(), addrv6: ifInfo.AddressIPv6(), mac: ifInfo.MacAddress(), } if ep.addr == nil { return fmt.Errorf("create endpoint was not passed an IP address") } // disallow port mapping -p if opt, ok := epOptions[netlabel.PortMap]; ok { if _, ok := opt.([]types.PortBinding); ok { if len(opt.([]types.PortBinding)) > 0 { logrus.Warnf("%s driver does not support port mappings", ipvlanType) } } } // disallow port exposure --expose if opt, ok := epOptions[netlabel.ExposedPorts]; ok { if _, ok := opt.([]types.TransportPort); ok { if len(opt.([]types.TransportPort)) > 0 { logrus.Warnf("%s driver does not support port exposures", ipvlanType) } } } n.addEndpoint(ep) return nil }
func createVxlan(name string, vni uint32) error { defer osl.InitOSContext()() vxlan := &netlink.Vxlan{ LinkAttrs: netlink.LinkAttrs{Name: name}, VxlanId: int(vni), Learning: true, Port: vxlanPort, Proxy: true, L3miss: true, L2miss: true, } if err := ns.NlHandle().LinkAdd(vxlan); err != nil { return fmt.Errorf("error creating vxlan interface: %v", err) } return nil }
// Join method is invoked when a Sandbox is attached to an endpoint. func (d *driver) Join(nid, eid string, sboxKey string, jinfo driverapi.JoinInfo, options map[string]interface{}) error { defer osl.InitOSContext()() network, err := d.getNetwork(nid) if err != nil { return err } endpoint, err := network.getEndpoint(eid) if err != nil { return err } if endpoint == nil { return EndpointNotFoundError(eid) } for _, iNames := range jinfo.InterfaceNames() { // Make sure to set names on the correct interface ID. if iNames.ID() == ifaceID { err = iNames.SetNames(endpoint.srcName, containerVethPrefix) if err != nil { return err } } } err = jinfo.SetGateway(network.bridge.gatewayIPv4) if err != nil { return err } err = jinfo.SetGatewayIPv6(network.bridge.gatewayIPv6) if err != nil { return err } if !network.config.EnableICC { return d.link(network, endpoint, options, true) } return nil }
// DeleteEndpoint remove the endpoint and associated netlink interface func (d *driver) DeleteEndpoint(nid, eid string) error { defer osl.InitOSContext()() if err := validateID(nid, eid); err != nil { return err } n := d.network(nid) if n == nil { return fmt.Errorf("network id %q not found", nid) } ep := n.endpoint(eid) if ep == nil { return fmt.Errorf("endpoint id %q not found", eid) } if link, err := netlink.LinkByName(ep.srcName); err == nil { netlink.LinkDel(link) } return nil }
func deleteVxlanByVNI(vni uint32) error { defer osl.InitOSContext()() links, err := netlink.LinkList() if err != nil { return fmt.Errorf("failed to list interfaces while deleting vxlan interface by vni: %v", err) } for _, l := range links { if l.Type() == "vxlan" && l.(*netlink.Vxlan).VxlanId == int(vni) { err = netlink.LinkDel(l) if err != nil { return fmt.Errorf("error deleting vxlan interface with id %d: %v", vni, err) } return nil } } return fmt.Errorf("could not find a vxlan interface to delete with id %d", vni) }
// Join method is invoked when a Sandbox is attached to an endpoint. func (d *driver) Join(nid, eid string, sboxKey string, jinfo driverapi.JoinInfo, options map[string]interface{}) error { defer osl.InitOSContext()() network, err := d.getNetwork(nid) if err != nil { return err } endpoint, err := network.getEndpoint(eid) if err != nil { return err } if endpoint == nil { return EndpointNotFoundError(eid) } endpoint.containerConfig, err = parseContainerOptions(options) if err != nil { return err } iNames := jinfo.InterfaceName() err = iNames.SetNames(endpoint.srcName, containerVethPrefix) if err != nil { return err } err = jinfo.SetGateway(network.bridge.gatewayIPv4) if err != nil { return err } err = jinfo.SetGatewayIPv6(network.bridge.gatewayIPv6) if err != nil { return err } return nil }
// ElectInterfaceAddresses looks for an interface on the OS with the specified name // and returns its IPv4 and IPv6 addresses in CIDR form. If the interface does not exist, // it chooses from a predifined list the first IPv4 address which does not conflict // with other interfaces on the system. func ElectInterfaceAddresses(name string) (*net.IPNet, []*net.IPNet, error) { var ( v4Net *net.IPNet v6Nets []*net.IPNet err error ) InitNetworks() defer osl.InitOSContext()() link, _ := netlink.LinkByName(name) if link != nil { v4addr, err := netlink.AddrList(link, netlink.FAMILY_V4) if err != nil { return nil, nil, err } v6addr, err := netlink.AddrList(link, netlink.FAMILY_V6) if err != nil { return nil, nil, err } if len(v4addr) > 0 { v4Net = v4addr[0].IPNet } for _, nlAddr := range v6addr { v6Nets = append(v6Nets, nlAddr.IPNet) } } if link == nil || v4Net == nil { // Choose from predifined broad networks v4Net, err = FindAvailableNetwork(PredefinedBroadNetworks) if err != nil { return nil, nil, err } } return v4Net, v6Nets, nil }
// Leave method is invoked when a Sandbox detaches from an endpoint. func (d *driver) Leave(nid, eid string) error { defer osl.InitOSContext()() network, err := d.getNetwork(nid) if err != nil { return err } endpoint, err := network.getEndpoint(eid) if err != nil { return err } if endpoint == nil { return EndpointNotFoundError(eid) } if !network.config.EnableICC { return d.link(network, endpoint, nil, false) } return nil }
func createVxlan(name string, vni uint32, mtu int) error { defer osl.InitOSContext()() // Get default interface to plumb the vxlan on routeCmd := "/usr/sbin/ipadm show-addr -p -o addrobj " + "`/usr/sbin/route get default | /usr/bin/grep interface | " + "/usr/bin/awk '{print $2}'`" out, err := exec.Command("/usr/bin/bash", "-c", routeCmd).Output() if err != nil { return fmt.Errorf("cannot get default route: %v", err) } defaultInterface := strings.SplitN(string(out), "/", 2) propList := fmt.Sprintf("interface=%s,vni=%d", defaultInterface[0], vni) out, err = exec.Command("/usr/sbin/dladm", "create-vxlan", "-t", "-p", propList, name).Output() if err != nil { return fmt.Errorf("error creating vxlan interface: %v %s", err, out) } return nil }
// ElectInterfaceAddresses looks for an interface on the OS with the // specified name and returns returns all its IPv4 and IPv6 addresses in CIDR notation. // If a failure in retrieving the addresses or no IPv4 address is found, an error is returned. // If the interface does not exist, it chooses from a predefined // list the first IPv4 address which does not conflict with other // interfaces on the system. func ElectInterfaceAddresses(name string) ([]*net.IPNet, []*net.IPNet, error) { var ( v4Nets []*net.IPNet v6Nets []*net.IPNet ) defer osl.InitOSContext()() link, _ := ns.NlHandle().LinkByName(name) if link != nil { v4addr, err := ns.NlHandle().AddrList(link, netlink.FAMILY_V4) if err != nil { return nil, nil, err } v6addr, err := ns.NlHandle().AddrList(link, netlink.FAMILY_V6) if err != nil { return nil, nil, err } for _, nlAddr := range v4addr { v4Nets = append(v4Nets, nlAddr.IPNet) } for _, nlAddr := range v6addr { v6Nets = append(v6Nets, nlAddr.IPNet) } } if link == nil || len(v4Nets) == 0 { // Choose from predefined broad networks v4Net, err := FindAvailableNetwork(ipamutils.PredefinedBroadNetworks) if err != nil { return nil, nil, err } v4Nets = append(v4Nets, v4Net) } return v4Nets, v6Nets, nil }
func createVxlan(vni uint32) (string, error) { defer osl.InitOSContext()() name, err := netutils.GenerateIfaceName("vxlan", 7) if err != nil { return "", fmt.Errorf("error generating vxlan name: %v", err) } vxlan := &netlink.Vxlan{ LinkAttrs: netlink.LinkAttrs{Name: name}, VxlanId: int(vni), Learning: true, Port: int(nl.Swap16(vxlanPort)), //network endian order Proxy: true, L3miss: true, L2miss: true, } if err := netlink.LinkAdd(vxlan); err != nil { return "", fmt.Errorf("error creating vxlan interface: %v", err) } return name, nil }
func (d *driver) RevokeExternalConnectivity(nid, eid string) error { defer osl.InitOSContext()() network, err := d.getNetwork(nid) if err != nil { return err } endpoint, err := network.getEndpoint(eid) if err != nil { return err } if endpoint == nil { return EndpointNotFoundError(eid) } err = network.releasePorts(endpoint) if err != nil { logrus.Warn(err) } return nil }