func()

in plugins/eni/engine/nsclosure.go [110:177]


func (closureContext *setupNamespaceClosureContext) run(_ ns.NetNS) error {
	// Get the link for the ENI device
	eniLink, err := closureContext.netLink.LinkByName(closureContext.deviceName)
	if err != nil {
		return errors.Wrapf(err,
			"setupNamespaceClosure engine: unable to get link for device '%s'",
			closureContext.deviceName)
	}

	err = closureContext.netLink.LinkSetName(eniLink, closureContext.ifName)
	if err != nil {
		return errors.Wrap(err, "setupNamespaceClosure engine: unable to change interface name")
	}

	// Add IP addresses to the link
	for _, addr := range closureContext.ipAddrs {
		err = closureContext.netLink.AddrAdd(eniLink, addr)
		if err != nil {
			return errors.Wrap(err,
				"setupNamespaceClosure engine: unable to add ip address to the interface")
		}
	}

	// Bring it up
	err = closureContext.netLink.LinkSetUp(eniLink)
	if err != nil {
		return errors.Wrap(err,
			"setupNamespaceClosure engine: unable to bring up the device")
	}

	// Change the MTU if it is customized
	if closureContext.mtu != 0 {
		err = closureContext.netLink.LinkSetMTU(eniLink, closureContext.mtu)
		if err != nil {
			return errors.Wrap(err, "setupNamespaceClosure engine: unable to set mtu of interface")
		}
	}

	// Add a blackhole route for IMDS endpoint if required
	if closureContext.blockIMDS {
		_, imdsNetwork, err := net.ParseCIDR(instanceMetadataEndpoint)
		if err != nil {
			// This should never happen because we always expect
			// 169.254.169.254/32 to be parsed without any errors
			return errors.Wrapf(err, "setupNamespaceClosure engine: unable to parse instance metadata endpoint")
		}
		if err = closureContext.netLink.RouteAdd(&netlink.Route{
			Dst:  imdsNetwork,
			Type: syscall.RTN_BLACKHOLE,
		}); err != nil {
			return errors.Wrapf(err, "setupNamespaceClosure engine: unable to add route to block instance metadata")
		}
	}

	// Setup IP routes for the gateways
	for _, gwAddr := range closureContext.gatewayAddrs {
		err = closureContext.netLink.RouteAdd(&netlink.Route{
			LinkIndex: eniLink.Attrs().Index,
			Gw:        gwAddr,
		})
		if err != nil && !isRouteExistsError(err) {
			return errors.Wrap(err,
				"setupNamespaceClosure engine: unable to add the route for the gateway")
		}
	}

	return nil
}