in pkg/awsutils/awsutils.go [1773:1837]
func (cache *EC2InstanceMetadataCache) waitForENIAndIPsAttached(eni string, wantedCidrs int, maxBackoffDelay time.Duration) (eniMetadata ENIMetadata, err error) {
start := time.Now()
attempt := 0
// Wait until the ENI shows up in the instance metadata service and has at least some secondary IPs
err = retry.NWithBackoff(retry.NewSimpleBackoff(time.Millisecond*100, maxBackoffDelay, 0.15, 2.0), maxENIEC2APIRetries, func() error {
attempt++
enis, err := cache.GetAttachedENIs()
if err != nil {
log.Warnf("Failed to increase pool, error trying to discover attached ENIs on attempt %d/%d: %v ", attempt, maxENIEC2APIRetries, err)
return ErrNoNetworkInterfaces
}
// Verify that the ENI we are waiting for is in the returned list
for _, returnedENI := range enis {
if eni == returnedENI.ENIID {
// Check how many Secondary IPs or Prefixes have been attached
var eniIPCount int
log.Debugf("ENI ID: %v IP Addr: %s, IPv4Prefixes:- %v, IPv6Prefixes:- %v", returnedENI.ENIID,
returnedENI.IPv4Addresses, returnedENI.IPv4Prefixes, returnedENI.IPv6Prefixes)
if cache.enablePrefixDelegation {
eniIPCount = len(returnedENI.IPv4Prefixes)
if cache.v6Enabled {
eniIPCount = len(returnedENI.IPv6Prefixes)
}
} else {
//Ignore primary IP of the ENI
//wantedCidrs will be at most 1 less then the IP limit for the ENI because of the primary IP in secondary pod
eniIPCount = len(returnedENI.IPv4Addresses) - 1
}
if eniIPCount < 1 {
log.Debugf("No secondary IPv4 addresses/prefixes available yet on ENI %s", returnedENI.ENIID)
return ErrNoSecondaryIPsFound
}
// At least some are attached
eniMetadata = returnedENI
if eniIPCount >= wantedCidrs {
return nil
}
return ErrAllSecondaryIPsNotFound
}
}
log.Debugf("Not able to find the right ENI yet (attempt %d/%d)", attempt, maxENIEC2APIRetries)
return ErrENINotFound
})
prometheusmetrics.AwsAPILatency.WithLabelValues("waitForENIAndIPsAttached", fmt.Sprint(err != nil), awsReqStatus(err)).Observe(msSince(start))
if err != nil {
// If we have at least 1 Secondary IP, by now return what we have without an error
if err == ErrAllSecondaryIPsNotFound {
if !cache.enablePrefixDelegation && len(eniMetadata.IPv4Addresses) > 1 {
// We have some Secondary IPs, return the ones we have
log.Warnf("This ENI only has %d IP addresses, we wanted %d", len(eniMetadata.IPv4Addresses), wantedCidrs)
return eniMetadata, nil
} else if cache.enablePrefixDelegation && len(eniMetadata.IPv4Prefixes) > 1 {
// We have some prefixes, return the ones we have
log.Warnf("This ENI only has %d Prefixes, we wanted %d", len(eniMetadata.IPv4Prefixes), wantedCidrs)
return eniMetadata, nil
}
}
awsAPIErrInc("waitENIAttachedFailedToAssignIPs", err)
return ENIMetadata{}, errors.New("waitForENIAndIPsAttached: giving up trying to retrieve ENIs from metadata service")
}
return eniMetadata, nil
}