in plugins/eni/engine/engine.go [314:363]
func (engine *engine) SetupContainerNamespace(args *skel.CmdArgs,
deviceName string,
macAddress string,
ipAddresses []string,
gatewayAddresses []string,
blockIMDS bool,
stayDown bool,
mtu int) error {
// Get the device link for the ENI
eniLink, err := engine.netLink.LinkByName(deviceName)
if err != nil {
return errors.Wrapf(err,
"setupContainerNamespace engine: unable to get link for device '%s'", deviceName)
}
// Get the handle for the container's network namespace
containerNS, err := engine.ns.GetNS(args.Netns)
if err != nil {
return errors.Wrapf(err,
"setupContainerNamespace engine: unable to get network namespace for '%s'", args.Netns)
}
// Assign the ENI device to container's network namespace
err = engine.netLink.LinkSetNsFd(eniLink, int(containerNS.Fd()))
if err != nil {
return errors.Wrapf(err,
"setupContainerNamespace engine: unable to move device '%s' to container namespace '%s'", deviceName, args.Netns)
}
if stayDown {
// The 'stay-down' config is set. No need to configure anything else.
return nil
}
// Generate the closure to execute within the container's namespace
toRun, err := newSetupNamespaceClosureContext(engine.netLink, args.IfName, deviceName, macAddress,
ipAddresses, gatewayAddresses, blockIMDS, mtu)
if err != nil {
return errors.Wrap(err,
"setupContainerNamespace engine: unable to create closure to execute in container namespace")
}
// Execute the closure within the container's namespace
err = engine.ns.WithNetNSPath(args.Netns, toRun.run)
if err != nil {
return errors.Wrapf(err,
"setupContainerNamespace engine: unable to setup device '%s' in namespace '%s'", deviceName, args.Netns)
}
return nil
}