in pkg/ipamd/datastore/data_store.go [1029:1081]
func (ds *DataStore) RemoveENIFromDataStore(eniID string, force bool) error {
ds.lock.Lock()
defer ds.lock.Unlock()
eni, ok := ds.eniPool[eniID]
if !ok {
return errors.New(UnknownENIError)
}
if eni.hasPods() {
if !force {
return errors.New(ENIInUseError)
}
// This scenario can occur if the reconciliation process discovered this ENI was detached
// from the EC2 instance outside of the control of ipamd. If this happens, there's nothing
// we can do other than force all pods to be unassigned from the IPs on this ENI.
ds.log.Warnf("Force removing eni %s with %d assigned pods", eniID, eni.AssignedIPv4Addresses())
prometheusmetrics.ForceRemovedENIs.Inc()
prometheusmetrics.ForceRemovedIPs.Add(float64(eni.AssignedIPv4Addresses()))
for _, assignedaddr := range eni.AvailableIPv4Cidrs {
for _, addr := range assignedaddr.IPAddresses {
if addr.Assigned() {
ds.unassignPodIPAddressUnsafe(addr)
}
}
ds.total -= assignedaddr.Size()
if assignedaddr.IsPrefix {
ds.allocatedPrefix--
}
}
if err := ds.writeBackingStoreUnsafe(); err != nil {
ds.log.Warnf("Unable to update backing store: %v", err)
// Continuing, because 'force'
}
}
for _, assignedaddr := range eni.AvailableIPv4Cidrs {
ds.total -= assignedaddr.Size()
if assignedaddr.IsPrefix {
ds.allocatedPrefix--
}
}
ds.log.Infof("RemoveENIFromDataStore %s: IP/Prefix address pool stats: free %d addresses, total: %d, assigned: %d, total prefixes: %d",
eniID, len(eni.AvailableIPv4Cidrs), ds.total, ds.assigned, ds.allocatedPrefix)
delete(ds.eniPool, eniID)
// Prometheus gauge
prometheusmetrics.Enis.Set(float64(len(ds.eniPool)))
// Delete ENI IPs In Use when ENI is removed
prometheusmetrics.EniIPsInUse.DeleteLabelValues(eniID)
return nil
}