fix bridge to call IPAM after link creation
authorEugene Yakubovich <eugene.yakubovich@coreos.com>
Tue, 19 May 2015 18:53:41 +0000 (11:53 -0700)
committerEugene Yakubovich <eugene.yakubovich@coreos.com>
Wed, 20 May 2015 00:43:44 +0000 (17:43 -0700)
plugins/main/bridge/bridge.go

index d3d572f..2515c0e 100644 (file)
@@ -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() {