macvlan and ipvlan: rename tmp iface name prior to calling IPAM
This commit is contained in:
@ -56,9 +56,7 @@ func loadConf(bytes []byte) (*NetConf, error) {
|
||||
|
||||
func modeFromString(s string) (netlink.IPVlanMode, error) {
|
||||
switch s {
|
||||
case "":
|
||||
return netlink.IPVLAN_MODE_L2, nil
|
||||
case "l2":
|
||||
case "", "l2":
|
||||
return netlink.IPVLAN_MODE_L2, nil
|
||||
case "l3":
|
||||
return netlink.IPVLAN_MODE_L3, nil
|
||||
@ -78,6 +76,13 @@ func createIpvlan(conf *NetConf, ifName string, netns *os.File) error {
|
||||
return fmt.Errorf("failed to lookup master %q: %v", conf.Master, err)
|
||||
}
|
||||
|
||||
// due to kernel bug we have to create with tmpname or it might
|
||||
// collide with the name on the host and error out
|
||||
tmpName, err := ip.RandomVethName()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
mv := &netlink.IPVlan{
|
||||
LinkAttrs: netlink.LinkAttrs{
|
||||
MTU: conf.MTU,
|
||||
@ -92,7 +97,13 @@ func createIpvlan(conf *NetConf, ifName string, netns *os.File) error {
|
||||
return fmt.Errorf("failed to create ipvlan: %v", err)
|
||||
}
|
||||
|
||||
return err
|
||||
return ns.WithNetNS(netns, func(_ *os.File) error {
|
||||
err := renameLink(tmpName, ifName)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to rename ipvlan to %q: %v", ifName, err)
|
||||
}
|
||||
return nil
|
||||
})
|
||||
}
|
||||
|
||||
func cmdAdd(args *skel.CmdArgs) error {
|
||||
@ -107,12 +118,7 @@ func cmdAdd(args *skel.CmdArgs) error {
|
||||
}
|
||||
defer netns.Close()
|
||||
|
||||
tmpName, err := ip.RandomVethName()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err = createIpvlan(n, tmpName, netns); err != nil {
|
||||
if err = createIpvlan(n, args.IfName, netns); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@ -126,11 +132,6 @@ func cmdAdd(args *skel.CmdArgs) error {
|
||||
}
|
||||
|
||||
err = ns.WithNetNS(netns, func(_ *os.File) error {
|
||||
err := renameLink(tmpName, args.IfName)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to rename ipvlan to %q: %v", args.IfName, err)
|
||||
}
|
||||
|
||||
return plugin.ConfigureIface(args.IfName, result)
|
||||
})
|
||||
if err != nil {
|
||||
|
Reference in New Issue
Block a user