Skip to content

Commit

Permalink
Merge c12f35d into e1907bd
Browse files Browse the repository at this point in the history
  • Loading branch information
dcbw committed May 12, 2016
2 parents e1907bd + c12f35d commit ae5f7e7
Show file tree
Hide file tree
Showing 27 changed files with 1,553 additions and 470 deletions.
41 changes: 21 additions & 20 deletions pkg/ip/link.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,11 @@ import (
"os"

"github.com/containernetworking/cni/pkg/ns"
"github.com/containernetworking/cni/pkg/ops"
"github.com/vishvananda/netlink"
)

func makeVethPair(name, peer string, mtu int) (netlink.Link, error) {
func makeVethPair(netops ops.NetOps, name, peer string, mtu int) (netlink.Link, error) {
veth := &netlink.Veth{
LinkAttrs: netlink.LinkAttrs{
Name: name,
Expand All @@ -33,21 +34,21 @@ func makeVethPair(name, peer string, mtu int) (netlink.Link, error) {
},
PeerName: peer,
}
if err := netlink.LinkAdd(veth); err != nil {
if err := netops.LinkAdd(veth); err != nil {
return nil, err
}

return veth, nil
}

func makeVeth(name string, mtu int) (peerName string, veth netlink.Link, err error) {
func makeVeth(netops ops.NetOps, name string, mtu int) (peerName string, veth netlink.Link, err error) {
for i := 0; i < 10; i++ {
peerName, err = RandomVethName()
if err != nil {
return
}

veth, err = makeVethPair(name, peerName, mtu)
veth, err = makeVethPair(netops, name, peerName, mtu)
switch {
case err == nil:
return
Expand Down Expand Up @@ -81,36 +82,36 @@ func RandomVethName() (string, error) {
// SetupVeth sets up a virtual ethernet link.
// Should be in container netns, and will switch back to hostNS to set the host
// veth end up.
func SetupVeth(contVethName string, mtu int, hostNS *os.File) (hostVeth, contVeth netlink.Link, err error) {
func SetupVeth(netops ops.NetOps, contVethName string, mtu int, hostNS ns.NetNS) (hostVeth, contVeth netlink.Link, err error) {
var hostVethName string
hostVethName, contVeth, err = makeVeth(contVethName, mtu)
hostVethName, contVeth, err = makeVeth(netops, contVethName, mtu)
if err != nil {
return
}

if err = netlink.LinkSetUp(contVeth); err != nil {
if err = netops.LinkSetUp(contVeth); err != nil {
err = fmt.Errorf("failed to set %q up: %v", contVethName, err)
return
}

hostVeth, err = netlink.LinkByName(hostVethName)
hostVeth, err = netops.LinkByName(hostVethName)
if err != nil {
err = fmt.Errorf("failed to lookup %q: %v", hostVethName, err)
return
}

if err = netlink.LinkSetNsFd(hostVeth, int(hostNS.Fd())); err != nil {
if err = netops.LinkSetNsFd(hostVeth, int(hostNS.Fd())); err != nil {
err = fmt.Errorf("failed to move veth to host netns: %v", err)
return
}

err = ns.WithNetNS(hostNS, false, func(_ *os.File) error {
hostVeth, err := netlink.LinkByName(hostVethName)
err = hostNS.Do(func(_ ns.NetNS) error {
hostVeth, err := netops.LinkByName(hostVethName)
if err != nil {
return fmt.Errorf("failed to lookup %q in %q: %v", hostVethName, hostNS.Name(), err)
return fmt.Errorf("failed to lookup %q in %q: %v", hostVethName, hostNS.Path(), err)
}

if err = netlink.LinkSetUp(hostVeth); err != nil {
if err = netops.LinkSetUp(hostVeth); err != nil {
return fmt.Errorf("failed to set %q up: %v", hostVethName, err)
}
return nil
Expand All @@ -119,13 +120,13 @@ func SetupVeth(contVethName string, mtu int, hostNS *os.File) (hostVeth, contVet
}

// DelLinkByName removes an interface link.
func DelLinkByName(ifName string) error {
iface, err := netlink.LinkByName(ifName)
func DelLinkByName(netops ops.NetOps, ifName string) error {
iface, err := netops.LinkByName(ifName)
if err != nil {
return fmt.Errorf("failed to lookup %q: %v", ifName, err)
}

if err = netlink.LinkDel(iface); err != nil {
if err = netops.LinkDel(iface); err != nil {
return fmt.Errorf("failed to delete %q: %v", ifName, err)
}

Expand All @@ -134,18 +135,18 @@ func DelLinkByName(ifName string) error {

// DelLinkByNameAddr remove an interface returns its IP address
// of the specified family
func DelLinkByNameAddr(ifName string, family int) (*net.IPNet, error) {
iface, err := netlink.LinkByName(ifName)
func DelLinkByNameAddr(netops ops.NetOps, ifName string, family int) (*net.IPNet, error) {
iface, err := netops.LinkByName(ifName)
if err != nil {
return nil, fmt.Errorf("failed to lookup %q: %v", ifName, err)
}

addrs, err := netlink.AddrList(iface, family)
addrs, err := netops.AddrList(iface, family)
if err != nil || len(addrs) == 0 {
return nil, fmt.Errorf("failed to get IP addresses for %q: %v", ifName, err)
}

if err = netlink.LinkDel(iface); err != nil {
if err = netops.LinkDel(iface); err != nil {
return nil, fmt.Errorf("failed to delete %q: %v", ifName, err)
}

Expand Down
14 changes: 8 additions & 6 deletions pkg/ip/route.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,18 +17,20 @@ package ip
import (
"net"

"github.com/containernetworking/cni/pkg/ops"

"github.com/vishvananda/netlink"
)

// AddDefaultRoute sets the default route on the given gateway.
func AddDefaultRoute(gw net.IP, dev netlink.Link) error {
func AddDefaultRoute(netops ops.NetOps, gw net.IP, dev netlink.Link) error {
_, defNet, _ := net.ParseCIDR("0.0.0.0/0")
return AddRoute(defNet, gw, dev)
return AddRoute(netops, defNet, gw, dev)
}

// AddRoute adds a universally-scoped route to a device.
func AddRoute(ipn *net.IPNet, gw net.IP, dev netlink.Link) error {
return netlink.RouteAdd(&netlink.Route{
func AddRoute(netops ops.NetOps, ipn *net.IPNet, gw net.IP, dev netlink.Link) error {
return netops.RouteAdd(&netlink.Route{
LinkIndex: dev.Attrs().Index,
Scope: netlink.SCOPE_UNIVERSE,
Dst: ipn,
Expand All @@ -37,8 +39,8 @@ func AddRoute(ipn *net.IPNet, gw net.IP, dev netlink.Link) error {
}

// AddHostRoute adds a host-scoped route to a device.
func AddHostRoute(ipn *net.IPNet, gw net.IP, dev netlink.Link) error {
return netlink.RouteAdd(&netlink.Route{
func AddHostRoute(netops ops.NetOps, ipn *net.IPNet, gw net.IP, dev netlink.Link) error {
return netops.RouteAdd(&netlink.Route{
LinkIndex: dev.Attrs().Index,
Scope: netlink.SCOPE_HOST,
Dst: ipn,
Expand Down
11 changes: 6 additions & 5 deletions pkg/ipam/ipam.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import (

"github.com/containernetworking/cni/pkg/invoke"
"github.com/containernetworking/cni/pkg/ip"
"github.com/containernetworking/cni/pkg/ops"
"github.com/containernetworking/cni/pkg/types"

"github.com/vishvananda/netlink"
Expand All @@ -35,19 +36,19 @@ func ExecDel(plugin string, netconf []byte) error {

// ConfigureIface takes the result of IPAM plugin and
// applies to the ifName interface
func ConfigureIface(ifName string, res *types.Result) error {
link, err := netlink.LinkByName(ifName)
func ConfigureIface(netops ops.NetOps, ifName string, res *types.Result) error {
link, err := netops.LinkByName(ifName)
if err != nil {
return fmt.Errorf("failed to lookup %q: %v", ifName, err)
}

if err := netlink.LinkSetUp(link); err != nil {
if err := netops.LinkSetUp(link); err != nil {
return fmt.Errorf("failed to set %q UP: %v", ifName, err)
}

// TODO(eyakubovich): IPv6
addr := &netlink.Addr{IPNet: &res.IP4.IP, Label: ""}
if err = netlink.AddrAdd(link, addr); err != nil {
if err = netops.AddrAdd(link, addr); err != nil {
return fmt.Errorf("failed to add IP addr to %q: %v", ifName, err)
}

Expand All @@ -56,7 +57,7 @@ func ConfigureIface(ifName string, res *types.Result) error {
if gw == nil {
gw = res.IP4.Gateway
}
if err = ip.AddRoute(&r.Dst, gw, link); err != nil {
if err = ip.AddRoute(netops, &r.Dst, gw, link); err != nil {
// we skip over duplicate routes as we assume the first one wins
if !os.IsExist(err) {
return fmt.Errorf("failed to add route '%v via %v dev %v': %v", r.Dst, gw, ifName, err)
Expand Down

0 comments on commit ae5f7e7

Please sign in to comment.