in pkg/awsutils/awsutils.go [1692:1743]
func (cache *EC2InstanceMetadataCache) AllocIPAddresses(eniID string, numIPs int) (*ec2.AssignPrivateIpAddressesOutput, error) {
var needIPs = numIPs
ipLimit := cache.GetENIIPv4Limit()
if ipLimit < needIPs {
needIPs = ipLimit
}
// If we don't need any more IPs, exit
if needIPs < 1 {
return nil, nil
}
log.Infof("Trying to allocate %d IP addresses on ENI %s", needIPs, eniID)
log.Debugf("PD enabled - %t", cache.enablePrefixDelegation)
input := &ec2.AssignPrivateIpAddressesInput{}
if cache.enablePrefixDelegation {
needPrefixes := needIPs
input = &ec2.AssignPrivateIpAddressesInput{
NetworkInterfaceId: aws.String(eniID),
Ipv4PrefixCount: aws.Int32(int32(needPrefixes)),
}
} else {
input = &ec2.AssignPrivateIpAddressesInput{
NetworkInterfaceId: aws.String(eniID),
SecondaryPrivateIpAddressCount: aws.Int32(int32(needIPs)),
}
}
start := time.Now()
output, err := cache.ec2SVC.AssignPrivateIpAddresses(context.Background(), input)
prometheusmetrics.Ec2ApiReq.WithLabelValues("AssignPrivateIpAddresses").Inc()
prometheusmetrics.AwsAPILatency.WithLabelValues("AssignPrivateIpAddresses", fmt.Sprint(err != nil), awsReqStatus(err)).Observe(msSince(start))
if err != nil {
checkAPIErrorAndBroadcastEvent(err, "ec2:AssignPrivateIpAddresses")
log.Errorf("Failed to allocate a private IP/Prefix addresses on ENI %v: %v", eniID, err)
awsAPIErrInc("AssignPrivateIpAddresses", err)
prometheusmetrics.Ec2ApiErr.WithLabelValues("AssignPrivateIpAddresses").Inc()
return nil, err
}
if output != nil {
if cache.enablePrefixDelegation {
log.Infof("Allocated %d private IP prefixes", len(output.AssignedIpv4Prefixes))
} else {
log.Infof("Allocated %d private IP addresses", len(output.AssignedPrivateIpAddresses))
}
}
return output, nil
}