in pkg/provider/ip/eni/eni.go [249:313]
func (e *eniManager) DeleteIPV4Resource(resourceList []string, resourceType config.ResourceType, ec2APIHelper api.EC2APIHelper, log logr.Logger) ([]string, error) {
e.lock.Lock()
defer e.lock.Unlock()
var failedToUnAssign []string
var errors []error
log = log.WithValues("node name", e.instance.Name())
if resourceList == nil || len(resourceList) == 0 {
return resourceList, fmt.Errorf("failed to unassign since resourceList is empty")
}
// IP address needs to have /19 suffix, whereas prefix already has /28 suffix
if resourceType == config.ResourceTypeIPv4Address {
resourceList = e.stripSubnetMaskFromIPSlice(resourceList)
}
groupedResources := e.groupResourcesPerENI(resourceList)
for eni, resources := range groupedResources {
err := ec2APIHelper.UnassignIPv4Resources(eni.eniID, resourceType, resources)
if err != nil {
errors = append(errors, err)
log.Info("failed to deleted IPv4 resources", "eni", eni.eniID, "resource type", resourceType,
"resources", resources)
failedToUnAssign = append(failedToUnAssign, resources...)
continue
}
eni.remainingCapacity += len(resources)
for _, resource := range resources {
delete(e.resourceToENIMap, resource)
}
log.Info("deleted IPv4 resources", "eni", eni.eniID, "resource type", resourceType, "resources", resources)
}
ipLimit := vpc.Limits[e.instance.Type()].IPv4PerInterface - 1
primaryENIID := e.instance.PrimaryNetworkInterfaceID()
// Clean up ENIs that just have the primary network interface attached to them
i := 0
for _, eni := range e.attachedENIs {
// ENI doesn't have any secondary IP or prefix attached to it and is not the primary network interface
if eni.remainingCapacity == ipLimit && primaryENIID != eni.eniID {
err := ec2APIHelper.DeleteNetworkInterface(&eni.eniID)
if err != nil {
errors = append(errors, err)
e.attachedENIs[i] = eni
i++
continue
}
log.Info("deleted ENI successfully as it has no secondary IP or prefix attached",
"id", eni.eniID)
} else {
e.attachedENIs[i] = eni
i++
}
}
e.attachedENIs = e.attachedENIs[:i]
if errors != nil && len(errors) > 0 {
return failedToUnAssign, fmt.Errorf("failed to unassign one or more %s: %v", resourceType, errors)
}
return nil, nil
}