diff --git a/.gitmodules b/.gitmodules index d653c81a..918c7914 100644 --- a/.gitmodules +++ b/.gitmodules @@ -61,9 +61,6 @@ [submodule "vendor/github.com/hashicorp/go-cleanhttp"] path = vendor/github.com/hashicorp/go-cleanhttp url = http://github.com/hashicorp/go-cleanhttp -[submodule "vendor/github.com/appc/cni"] - path = vendor/github.com/appc/cni - url = https://github.com/appc/cni [submodule "vendor/github.com/coreos/go-iptables"] path = vendor/github.com/coreos/go-iptables url = https://github.com/coreos/go-iptables @@ -124,3 +121,6 @@ [submodule "vendor/github.com/weaveworks/common"] path = vendor/github.com/weaveworks/common url = https://github.com/weaveworks/common +[submodule "vendor/github.com/containernetworking/cni"] + path = vendor/github.com/containernetworking/cni + url = https://github.com/containernetworking/cni diff --git a/Makefile b/Makefile index 5fc050a5..63506a8a 100644 --- a/Makefile +++ b/Makefile @@ -173,6 +173,8 @@ ifeq ($(BUILD_IN_CONTAINER),true) # It bind-mounts the source into the container and passes all important variables exes $(EXES) tests lint: $(BUILD_UPTODATE) git submodule update --init +# Containernetworking has another copy of vishvananda/netlink which leads to duplicate definitions + -@rm -r vendor/github.com/containernetworking/cni/vendor @mkdir -p $(shell pwd)/.pkg $(SUDO) docker run $(RM) $(RUN_FLAGS) \ -v $(shell pwd):/go/src/github.com/weaveworks/weave \ diff --git a/plugin/ipam/cni.go b/plugin/ipam/cni.go index 4c9a45a8..ac371f6d 100644 --- a/plugin/ipam/cni.go +++ b/plugin/ipam/cni.go @@ -5,8 +5,9 @@ import ( "fmt" "net" - "github.com/appc/cni/pkg/skel" - "github.com/appc/cni/pkg/types" + "github.com/containernetworking/cni/pkg/skel" + "github.com/containernetworking/cni/pkg/types" + "github.com/containernetworking/cni/pkg/types/current" ) func (i *Ipam) CmdAdd(args *skel.CmdArgs) error { @@ -17,7 +18,7 @@ func (i *Ipam) CmdAdd(args *skel.CmdArgs) error { return result.Print() } -func (i *Ipam) Allocate(args *skel.CmdArgs) (*types.Result, error) { +func (i *Ipam) Allocate(args *skel.CmdArgs) (types.Result, error) { // extract the things we care about conf, err := loadIPAMConf(args.StdinData) if err != nil { @@ -46,12 +47,13 @@ func (i *Ipam) Allocate(args *skel.CmdArgs) (*types.Result, error) { if err != nil { return nil, err } - result := &types.Result{ - IP4: &types.IPConfig{ - IP: *ipnet, + result := ¤t.Result{ + IPs: []*current.IPConfig{{ + Version: "4", + Address: *ipnet, Gateway: conf.Gateway, - Routes: conf.Routes, - }, + }}, + Routes: conf.Routes, } return result, nil } @@ -65,9 +67,9 @@ func (i *Ipam) Release(args *skel.CmdArgs) error { } type ipamConf struct { - Subnet string `json:"subnet,omitempty"` - Gateway net.IP `json:"gateway,omitempty"` - Routes []types.Route `json:"routes"` + Subnet string `json:"subnet,omitempty"` + Gateway net.IP `json:"gateway,omitempty"` + Routes []*types.Route `json:"routes"` } type netConf struct { diff --git a/plugin/net/cni.go b/plugin/net/cni.go index 5ed1c35a..5cb47e91 100644 --- a/plugin/net/cni.go +++ b/plugin/net/cni.go @@ -7,9 +7,10 @@ import ( "net" "syscall" - "github.com/appc/cni/pkg/ipam" - "github.com/appc/cni/pkg/skel" - "github.com/appc/cni/pkg/types" + "github.com/containernetworking/cni/pkg/ipam" + "github.com/containernetworking/cni/pkg/skel" + "github.com/containernetworking/cni/pkg/types" + "github.com/containernetworking/cni/pkg/types/current" "github.com/vishvananda/netlink" "github.com/vishvananda/netns" weaveapi "github.com/weaveworks/weave/api" @@ -40,17 +41,23 @@ func loadNetConf(bytes []byte) (*NetConf, error) { return n, nil } -func (c *CNIPlugin) getIP(ipamType string, args *skel.CmdArgs) (result *types.Result, err error) { +func (c *CNIPlugin) getIP(ipamType string, args *skel.CmdArgs) (newResult *current.Result, err error) { + var result types.Result // Default IPAM is Weave's own if ipamType == "" { result, err = ipamplugin.NewIpam(c.weave).Allocate(args) } else { result, err = ipam.ExecAdd(ipamType, args.StdinData) } - if err == nil && result.IP4 == nil { + if err != nil { + return nil, err + } + newResult, err = current.NewResultFromResult(result) + // Check if ipam returned no results without error + if err == nil && len(newResult.IPs) == 0 { return nil, fmt.Errorf("IPAM plugin failed to allocate IP address") } - return result, err + return newResult, err } func (c *CNIPlugin) CmdAdd(args *skel.CmdArgs) error { @@ -70,10 +77,12 @@ func (c *CNIPlugin) CmdAdd(args *skel.CmdArgs) error { if err != nil { return fmt.Errorf("unable to allocate IP address: %s", err) } + // Only expecting one address + ip := result.IPs[0] // If config says nothing about routes or gateway, default one will be via the bridge - if result.IP4.Routes == nil && result.IP4.Gateway == nil { - bridgeIP, err := weavenet.FindBridgeIP(conf.BrName, &result.IP4.IP) + if len(result.Routes) == 0 && ip.Gateway == nil { + bridgeIP, err := weavenet.FindBridgeIP(conf.BrName, &ip.Address) if err == weavenet.ErrBridgeNoIP { bridgeArgs := *args bridgeArgs.ContainerID = "weave:expose" @@ -81,17 +90,18 @@ func (c *CNIPlugin) CmdAdd(args *skel.CmdArgs) error { if err != nil { return fmt.Errorf("unable to allocate IP address for bridge: %s", err) } - if err := assignBridgeIP(conf.BrName, bridgeIPResult.IP4.IP); err != nil { + bridgeCIDR := bridgeIPResult.IPs[0].Address + if err := assignBridgeIP(conf.BrName, bridgeCIDR); err != nil { return fmt.Errorf("unable to assign IP address to bridge: %s", err) } - if err := weavenet.ExposeNAT(bridgeIPResult.IP4.IP); err != nil { + if err := weavenet.ExposeNAT(bridgeCIDR); err != nil { return fmt.Errorf("unable to create NAT rules: %s", err) } - bridgeIP = bridgeIPResult.IP4.IP.IP + bridgeIP = bridgeCIDR.IP } else if err != nil { return err } - result.IP4.Gateway = bridgeIP + result.IPs[0].Gateway = bridgeIP } ns, err := netns.GetFromPath(args.Netns) @@ -110,11 +120,11 @@ func (c *CNIPlugin) CmdAdd(args *skel.CmdArgs) error { id = fmt.Sprintf("%x", data) } - if err := weavenet.AttachContainer(args.Netns, id, args.IfName, conf.BrName, conf.MTU, false, []*net.IPNet{&result.IP4.IP}, false); err != nil { + if err := weavenet.AttachContainer(args.Netns, id, args.IfName, conf.BrName, conf.MTU, false, []*net.IPNet{&ip.Address}, false); err != nil { return err } if err := weavenet.WithNetNSLinkUnsafe(ns, args.IfName, func(link netlink.Link) error { - return setupRoutes(link, args.IfName, result.IP4.IP, result.IP4.Gateway, result.IP4.Routes) + return setupRoutes(link, args.IfName, ip.Address, ip.Gateway, result.Routes) }); err != nil { return fmt.Errorf("error setting up routes: %s", err) } @@ -123,7 +133,7 @@ func (c *CNIPlugin) CmdAdd(args *skel.CmdArgs) error { return result.Print() } -func setupRoutes(link netlink.Link, name string, ipnet net.IPNet, gw net.IP, routes []types.Route) error { +func setupRoutes(link netlink.Link, name string, ipnet net.IPNet, gw net.IP, routes []*types.Route) error { var err error if routes == nil { // If config says nothing about routes, add a default one if !ipnet.Contains(gw) { @@ -133,7 +143,7 @@ func setupRoutes(link netlink.Link, name string, ipnet net.IPNet, gw net.IP, rou return err } } - routes = []types.Route{{Dst: zeroNetwork}} + routes = []*types.Route{{Dst: zeroNetwork}} } for _, r := range routes { if r.GW != nil { diff --git a/prog/weaveutil/cni.go b/prog/weaveutil/cni.go index 3f5dba4d..e6157261 100644 --- a/prog/weaveutil/cni.go +++ b/prog/weaveutil/cni.go @@ -3,7 +3,8 @@ package main import ( "os" - cni "github.com/appc/cni/pkg/skel" + cni "github.com/containernetworking/cni/pkg/skel" + "github.com/containernetworking/cni/pkg/version" weaveapi "github.com/weaveworks/weave/api" "github.com/weaveworks/weave/common" @@ -14,13 +15,13 @@ import ( func cniNet(args []string) error { weave := weaveapi.NewClient(os.Getenv("WEAVE_HTTP_ADDR"), common.Log) n := netplugin.NewCNIPlugin(weave) - cni.PluginMain(n.CmdAdd, n.CmdDel) + cni.PluginMain(n.CmdAdd, n.CmdDel, version.PluginSupports("0.1.0", "0.2.0", "0.3.0")) return nil } func cniIPAM(args []string) error { weave := weaveapi.NewClient(os.Getenv("WEAVE_HTTP_ADDR"), common.Log) i := ipamplugin.NewIpam(weave) - cni.PluginMain(i.CmdAdd, i.CmdDel) + cni.PluginMain(i.CmdAdd, i.CmdDel, version.PluginSupports("0.1.0", "0.2.0", "0.3.0")) return nil } diff --git a/vendor/github.com/appc/cni b/vendor/github.com/appc/cni deleted file mode 160000 index 8bb41b9d..00000000 --- a/vendor/github.com/appc/cni +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 8bb41b9d6f5029dd7bbdb17045d561736f9fb61a diff --git a/vendor/github.com/containernetworking/cni b/vendor/github.com/containernetworking/cni new file mode 160000 index 00000000..4ce9b019 --- /dev/null +++ b/vendor/github.com/containernetworking/cni @@ -0,0 +1 @@ +Subproject commit 4ce9b019aab51b28a32ff6549784a69f9b209fe4