in pkg/ipamd/datastore/data_store.go [511:559]
func (ds *DataStore) DelIPv4CidrFromStore(eniID string, cidr net.IPNet, force bool) error {
ds.lock.Lock()
defer ds.lock.Unlock()
curENI, ok := ds.eniPool[eniID]
if !ok {
ds.log.Debugf("Unknown ENI %s while deleting the CIDR", eniID)
return errors.New(UnknownENIError)
}
strIPv4Cidr := cidr.String()
var deletableCidr *CidrInfo
deletableCidr, ok = curENI.AvailableIPv4Cidrs[strIPv4Cidr]
if !ok {
ds.log.Debugf("Unknown %s CIDR", strIPv4Cidr)
return errors.New(UnknownIPError)
}
// SIP case : This runs just once
// PD case : if (force is false) then if there are any unassigned IPs, those will get freed but the first assigned IP will
// break the loop, should be fine since freed IPs will be reused for new pods.
updateBackingStore := false
for _, addr := range deletableCidr.IPAddresses {
if addr.Assigned() {
if !force {
return errors.New(IPInUseError)
}
prometheusmetrics.ForceRemovedIPs.Inc()
ds.unassignPodIPAddressUnsafe(addr)
updateBackingStore = true
}
}
if updateBackingStore {
if err := ds.writeBackingStoreUnsafe(); err != nil {
ds.log.Warnf("Unable to update backing store: %v", err)
// Continuing because 'force'
}
}
ds.total -= deletableCidr.Size()
if deletableCidr.IsPrefix {
ds.allocatedPrefix--
prometheusmetrics.TotalPrefixes.Set(float64(ds.allocatedPrefix))
}
prometheusmetrics.TotalIPs.Set(float64(ds.total))
delete(curENI.AvailableIPv4Cidrs, strIPv4Cidr)
ds.log.Infof("Deleted ENI(%s)'s IP/Prefix %s from datastore", eniID, strIPv4Cidr)
return nil
}