From 0c3baa8ff0d0339b31b72081575fcec5533cb98d Mon Sep 17 00:00:00 2001 From: Eugene Yakubovich Date: Tue, 19 May 2015 11:53:41 -0700 Subject: [PATCH] fix bridge to call IPAM after link creation --- plugins/main/bridge/bridge.go | 56 ++++++++++++++++++----------------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/plugins/main/bridge/bridge.go b/plugins/main/bridge/bridge.go index d3d572f0..2515c0e6 100644 --- a/plugins/main/bridge/bridge.go +++ b/plugins/main/bridge/bridge.go @@ -94,7 +94,7 @@ func bridgeByName(name string) (*netlink.Bridge, error) { return br, nil } -func ensureBridge(brName string, mtu int, ipn *net.IPNet) (*netlink.Bridge, error) { +func ensureBridge(brName string, mtu int) (*netlink.Bridge, error) { br := &netlink.Bridge{ LinkAttrs: netlink.LinkAttrs{ Name: brName, @@ -118,14 +118,10 @@ func ensureBridge(brName string, mtu int, ipn *net.IPNet) (*netlink.Bridge, erro return nil, err } - if ipn != nil { - return br, ensureBridgeAddr(br, ipn) - } - return br, nil } -func setupVeth(netns string, br *netlink.Bridge, ifName string, mtu int, pr *plugin.Result) error { +func setupVeth(netns string, br *netlink.Bridge, ifName string, mtu int) error { var hostVethName string err := ns.WithNetNSPath(netns, func(hostNS *os.File) error { @@ -135,10 +131,6 @@ func setupVeth(netns string, br *netlink.Bridge, ifName string, mtu int, pr *plu return err } - if err = plugin.ConfigureIface(ifName, pr); err != nil { - return err - } - hostVethName = hostVeth.Attrs().Name return nil }) @@ -165,17 +157,9 @@ func calcGatewayIP(ipn *net.IPNet) net.IP { return ip.NextIP(nid) } -func setupBridge(n *NetConf, ipConf *plugin.IPConfig) (*netlink.Bridge, error) { - var gwn *net.IPNet - if n.IsGW { - gwn = &net.IPNet{ - IP: ipConf.Gateway, - Mask: ipConf.IP.Mask, - } - } - +func setupBridge(n *NetConf) (*netlink.Bridge, error) { // create bridge if necessary - br, err := ensureBridge(n.BrName, n.MTU, gwn) + br, err := ensureBridge(n.BrName, n.MTU) if err != nil { return nil, fmt.Errorf("failed to create bridge %q: %v", n.BrName, err) } @@ -189,6 +173,15 @@ func cmdAdd(args *skel.CmdArgs) error { return err } + br, err := setupBridge(n) + if err != nil { + return err + } + + if err = setupVeth(args.Netns, br, args.IfName, n.MTU); err != nil { + return err + } + // run the IPAM plugin and get back the config to apply result, err := plugin.ExecAdd(n.IPAM.Type, args.StdinData) if err != nil { @@ -203,13 +196,22 @@ func cmdAdd(args *skel.CmdArgs) error { result.IP4.Gateway = calcGatewayIP(&result.IP4.IP) } - br, err := setupBridge(n, result.IP4) + err = ns.WithNetNSPath(args.Netns, func(hostNS *os.File) error { + return plugin.ConfigureIface(args.IfName, result) + }) if err != nil { return err } - if err = setupVeth(args.Netns, br, args.IfName, n.MTU, result); err != nil { - return err + if n.IsGW { + gwn := &net.IPNet{ + IP: result.IP4.Gateway, + Mask: result.IP4.IP.Mask, + } + + if err = ensureBridgeAddr(br, gwn); err != nil { + return err + } } if n.IPMasq { @@ -228,14 +230,14 @@ func cmdDel(args *skel.CmdArgs) error { return err } - err = ns.WithNetNSPath(args.Netns, func(hostNS *os.File) error { - return ip.DelLinkByName(args.IfName) - }) + err = plugin.ExecDel(n.IPAM.Type, args.StdinData) if err != nil { return err } - return plugin.ExecDel(n.IPAM.Type, args.StdinData) + return ns.WithNetNSPath(args.Netns, func(hostNS *os.File) error { + return ip.DelLinkByName(args.IfName) + }) } func main() {