fix bridge to call IPAM after link creation

This commit is contained in:
Eugene Yakubovich 2015-05-19 11:53:41 -07:00
parent 01298363ad
commit 0c3baa8ff0

View File

@ -94,7 +94,7 @@ func bridgeByName(name string) (*netlink.Bridge, error) {
return br, nil 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{ br := &netlink.Bridge{
LinkAttrs: netlink.LinkAttrs{ LinkAttrs: netlink.LinkAttrs{
Name: brName, Name: brName,
@ -118,14 +118,10 @@ func ensureBridge(brName string, mtu int, ipn *net.IPNet) (*netlink.Bridge, erro
return nil, err return nil, err
} }
if ipn != nil {
return br, ensureBridgeAddr(br, ipn)
}
return br, nil 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 var hostVethName string
err := ns.WithNetNSPath(netns, func(hostNS *os.File) error { 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 return err
} }
if err = plugin.ConfigureIface(ifName, pr); err != nil {
return err
}
hostVethName = hostVeth.Attrs().Name hostVethName = hostVeth.Attrs().Name
return nil return nil
}) })
@ -165,17 +157,9 @@ func calcGatewayIP(ipn *net.IPNet) net.IP {
return ip.NextIP(nid) return ip.NextIP(nid)
} }
func setupBridge(n *NetConf, ipConf *plugin.IPConfig) (*netlink.Bridge, error) { func setupBridge(n *NetConf) (*netlink.Bridge, error) {
var gwn *net.IPNet
if n.IsGW {
gwn = &net.IPNet{
IP: ipConf.Gateway,
Mask: ipConf.IP.Mask,
}
}
// create bridge if necessary // create bridge if necessary
br, err := ensureBridge(n.BrName, n.MTU, gwn) br, err := ensureBridge(n.BrName, n.MTU)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to create bridge %q: %v", n.BrName, err) 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 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 // run the IPAM plugin and get back the config to apply
result, err := plugin.ExecAdd(n.IPAM.Type, args.StdinData) result, err := plugin.ExecAdd(n.IPAM.Type, args.StdinData)
if err != nil { if err != nil {
@ -203,14 +196,23 @@ func cmdAdd(args *skel.CmdArgs) error {
result.IP4.Gateway = calcGatewayIP(&result.IP4.IP) 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 { if err != nil {
return err return err
} }
if err = setupVeth(args.Netns, br, args.IfName, n.MTU, result); err != nil { if n.IsGW {
gwn := &net.IPNet{
IP: result.IP4.Gateway,
Mask: result.IP4.IP.Mask,
}
if err = ensureBridgeAddr(br, gwn); err != nil {
return err return err
} }
}
if n.IPMasq { if n.IPMasq {
chain := "CNI-" + n.Name chain := "CNI-" + n.Name
@ -228,14 +230,14 @@ func cmdDel(args *skel.CmdArgs) error {
return err return err
} }
err = ns.WithNetNSPath(args.Netns, func(hostNS *os.File) error { err = plugin.ExecDel(n.IPAM.Type, args.StdinData)
return ip.DelLinkByName(args.IfName)
})
if err != nil { if err != nil {
return err 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() { func main() {