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
|
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() {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user