fix bridge to call IPAM after link creation
This commit is contained in:
parent
01298363ad
commit
0c3baa8ff0
@ -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() {
|
||||
|
Loading…
x
Reference in New Issue
Block a user