initialize via sub-function

This commit is contained in:
Bryan Boreham committed 2016-05-25 17:17:19 +01:00
1 parent 9f8b94645d
commit 9aaa7f19fd
3 files changed
+25 -27

No files matched your search

+11 -1
View File
@@ -9,7 +9,7 @@ import (
)
// create and attach local name to the Weave bridge
func CreateAndAttachVeth(localName, peerName, bridgeName string, mtu int) (*netlink.Veth, error) {
func CreateAndAttachVeth(localName, peerName, bridgeName string, mtu int, init func(local, guest netlink.Link) error) (*netlink.Veth, error) {
maybeBridge, err := netlink.LinkByName(bridgeName)
if err != nil {
return nil, fmt.Errorf(`bridge "%s" not present; did you launch weave?`, bridgeName)
@@ -54,6 +54,16 @@ func CreateAndAttachVeth(localName, peerName, bridgeName string, mtu int) (*netl
return cleanup(`device "%s" is not a bridge`, bridgeName)
}
if init != nil {
guest, err := netlink.LinkByName(peerName)
if err != nil {
return cleanup("unable to find guest veth %s: %s", peerName, err)
}
if err := init(local, guest); err != nil {
return cleanup("initializing veth: %s", err)
}
}
if err := netlink.LinkSetUp(local); err != nil {
return cleanup("unable to bring veth up: %s", err)
}
+13 -25
View File
@@ -95,39 +95,27 @@ func (c *CNIPlugin) CmdAdd(args *skel.CmdArgs) error {
}
name, peerName := vethPair(id)
local, err := weavenet.CreateAndAttachVeth(name, peerName, conf.BrName, conf.MTU)
if err != nil {
return err
}
cleanup := func(err error) error {
netlink.LinkDel(local)
return err
}
guest, err := netlink.LinkByName(local.PeerName)
if err != nil {
return cleanup(err)
}
if err = netlink.LinkSetNsFd(guest, int(ns)); err != nil {
return cleanup(fmt.Errorf("failed to move veth to container netns: %s", err))
}
err = common.WithNetNS(ns, func() error {
return setupGuestIP4(local.PeerName, args.IfName, result.IP4.IP, result.IP4.Gateway, result.IP4.Routes)
_, err = weavenet.CreateAndAttachVeth(name, peerName, conf.BrName, conf.MTU, func(local, guest netlink.Link) error {
if err = netlink.LinkSetNsFd(guest, int(ns)); err != nil {
return fmt.Errorf("failed to move veth to container netns: %s", err)
}
if err = common.WithNetNS(ns, func() error {
return setupGuestIP4(guest, args.IfName, result.IP4.IP, result.IP4.Gateway, result.IP4.Routes)
}); err != nil {
return fmt.Errorf("error setting up interface: %s", err)
}
return nil
})
if err != nil {
return cleanup(fmt.Errorf("error setting up interface: %s", err))
return err
}
result.DNS = conf.DNS
return result.Print()
}
func setupGuestIP4(origName, name string, ipnet net.IPNet, gw net.IP, routes []types.Route) error {
guest, err := netlink.LinkByName(origName)
if err != nil {
return err
}
func setupGuestIP4(guest netlink.Link, name string, ipnet net.IPNet, gw net.IP, routes []types.Route) error {
var err error
if err = netlink.LinkSetName(guest, name); err != nil {
return err
}
+1 -1
View File
@@ -101,7 +101,7 @@ func (driver *driver) JoinEndpoint(j *api.JoinRequest) (*api.JoinResponse, error
driver.logReq("JoinEndpoint", j, fmt.Sprintf("%s:%s to %s", j.NetworkID, j.EndpointID, j.SandboxKey))
name, peerName := vethPair(j.EndpointID)
if _, err := weavenet.CreateAndAttachVeth(name, peerName, WeaveBridge, 0); err != nil {
if _, err := weavenet.CreateAndAttachVeth(name, peerName, WeaveBridge, 0, nil); err != nil {
return nil, driver.error("JoinEndpoint", "%s", err)
}