func()

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
}