in pkg/ipamd/ipamd.go [817:863]
func (c *IPAMContext) increaseDatastorePool(ctx context.Context) error {
log.Debug("Starting to increase pool size")
prometheusmetrics.IpamdActionsInprogress.WithLabelValues("increaseDatastorePool").Add(float64(1))
defer prometheusmetrics.IpamdActionsInprogress.WithLabelValues("increaseDatastorePool").Sub(float64(1))
if c.isTerminating() {
log.Debug("AWS CNI is terminating, will not try to attach any new IPs or ENIs right now")
return nil
}
if !c.manageENIsNonScheduleable && c.isNodeNonSchedulable() {
log.Debug("AWS CNI is on a non schedulable node, will not try to attach any new IPs or ENIs right now")
return nil
}
// Try to add more Cidrs to existing ENIs first.
if c.inInsufficientCidrCoolingPeriod() {
log.Debugf("Recently we had InsufficientCidr error hence will wait for %v before retrying", insufficientCidrErrorCooldown)
return nil
}
increasedPool, err := c.tryAssignCidrs()
if err != nil {
if containsInsufficientCIDRsOrSubnetIPs(err) {
log.Errorf("Unable to attach IPs/Prefixes for the ENI, subnet doesn't seem to have enough IPs/Prefixes. Consider using new subnet or carve a reserved range using create-subnet-cidr-reservation")
c.lastInsufficientCidrError = time.Now()
return nil
}
log.Errorf(err.Error())
return err
}
if increasedPool {
c.updateLastNodeIPPoolAction()
} else {
// If we did not add any IPs, try to allocate an ENI.
if c.hasRoomForEni() {
if err = c.tryAllocateENI(ctx); err == nil {
c.updateLastNodeIPPoolAction()
} else {
// Note that no error is returned if ENI allocation fails. This is because ENI allocation failure should not cause node to be "NotReady".
log.Debugf("Error trying to allocate ENI: %v", err)
}
} else {
log.Debugf("Skipping ENI allocation as the max ENI limit is already reached")
}
}
return nil
}