in pkg/ipamd/ipamd.go [1571:1638]
func (c *IPAMContext) verifyAndAddIPsToDatastore(eni string, attachedENIIPs []ec2types.NetworkInterfacePrivateIpAddress, needEC2Reconcile bool) map[string]bool {
var ec2VerifiedAddresses []ec2types.NetworkInterfacePrivateIpAddress
seenIPs := make(map[string]bool)
for _, privateIPv4 := range attachedENIIPs {
strPrivateIPv4 := aws.ToString(privateIPv4.PrivateIpAddress)
if strPrivateIPv4 == c.primaryIP[eni] {
log.Infof("Reconcile and skip primary IP %s on ENI %s", strPrivateIPv4, eni)
continue
}
// Check if this IP was recently freed
ipv4Addr := net.IPNet{IP: net.ParseIP(strPrivateIPv4), Mask: net.IPv4Mask(255, 255, 255, 255)}
found, recentlyFreed := c.reconcileCooldownCache.RecentlyFreed(strPrivateIPv4)
if found {
if recentlyFreed {
log.Debugf("Reconcile skipping IP %s on ENI %s because it was recently unassigned from the ENI.", strPrivateIPv4, eni)
continue
} else {
if needEC2Reconcile {
// IMDS data might be stale
log.Debugf("This IP was recently freed, but is now out of cooldown. We need to verify with EC2 control plane.")
// Only call EC2 once for this ENI
if ec2VerifiedAddresses == nil {
var err error
// Call EC2 to verify IPs on this ENI
ec2VerifiedAddresses, err = c.awsClient.GetIPv4sFromEC2(eni)
if err != nil {
log.Errorf("Failed to fetch ENI IP addresses from EC2! %v", err)
// Do not delete this IP from the datastore or cooldown until we have confirmed with EC2
seenIPs[strPrivateIPv4] = true
continue
}
}
// Verify that the IP really belongs to this ENI
isReallyAttachedToENI := false
for _, ec2Addr := range ec2VerifiedAddresses {
if strPrivateIPv4 == aws.ToString(ec2Addr.PrivateIpAddress) {
isReallyAttachedToENI = true
log.Debugf("Verified that IP %s is attached to ENI %s", strPrivateIPv4, eni)
break
}
}
if !isReallyAttachedToENI {
log.Warnf("Skipping IP %s on ENI %s because it does not belong to this ENI!", strPrivateIPv4, eni)
continue
}
}
// The IP can be removed from the cooldown cache
// TODO: Here we could check if the IP is still used by a pod stuck in Terminating state. (Issue #1091)
c.reconcileCooldownCache.Remove(strPrivateIPv4)
}
}
log.Infof("Trying to add %s", strPrivateIPv4)
// Try to add the IP
err := c.dataStore.AddIPv4CidrToStore(eni, ipv4Addr, false)
if err != nil && err.Error() != datastore.IPAlreadyInStoreError {
log.Errorf("Failed to reconcile IP %s on ENI %s", strPrivateIPv4, eni)
ipamdErrInc("ipReconcileAdd")
// Continue to check the other IPs instead of bailout due to one wrong IP
continue
}
// Mark action
seenIPs[strPrivateIPv4] = true
prometheusmetrics.ReconcileCnt.With(prometheus.Labels{"fn": "eniDataStorePoolReconcileAdd"}).Inc()
}
return seenIPs
}