ipvlan: support enslaving an interface returned by ipam

For IP allocation schemes that cannot be interface agnostic, master can be set
to "ipam". In this configuration, the IPAM plugin is required to return a single
interface name for the ipvlan plugin to enslave.
This commit is contained in:
Paul Fisher
2017-11-01 10:14:04 -07:00
parent 7f98c94613
commit 4779f1d2bf
3 changed files with 53 additions and 6 deletions

View File

@ -138,11 +138,6 @@ func cmdAdd(args *skel.CmdArgs) error {
}
defer netns.Close()
ipvlanInterface, err := createIpvlan(n, args.IfName, netns)
if err != nil {
return err
}
// run the IPAM plugin and get back the config to apply
r, err := ipam.ExecAdd(n.IPAM.Type, args.StdinData)
if err != nil {
@ -157,6 +152,21 @@ func cmdAdd(args *skel.CmdArgs) error {
if len(result.IPs) == 0 {
return errors.New("IPAM plugin returned missing IP config")
}
if n.Master == "ipam" {
// Use an IPAM supplied master interface
if len(result.Interfaces) == 1 && result.Interfaces[0].Name != "" {
n.Master = result.Interfaces[0].Name
} else {
return errors.New("IPAM plugin returned missing master interface")
}
}
ipvlanInterface, err := createIpvlan(n, args.IfName, netns)
if err != nil {
return err
}
for _, ipc := range result.IPs {
// All addresses belong to the ipvlan interface
ipc.Interface = current.Int(0)