in pkg/awsutils/awsutils.go [1958:2034]
func (cache *EC2InstanceMetadataCache) getLeakedENIs() ([]ec2types.NetworkInterface, error) {
leakedENIFilters := []ec2types.Filter{
{
Name: aws.String("tag-key"),
Values: []string{eniNodeTagKey},
},
{
Name: aws.String("status"),
Values: []string{
string(ec2types.NetworkInterfaceStatusAvailable),
},
},
{
Name: aws.String("vpc-id"),
Values: []string{
cache.vpcID,
},
},
}
if cache.clusterName != "" {
leakedENIFilters = append(leakedENIFilters, ec2types.Filter{
Name: aws.String(fmt.Sprintf("tag:%s", eniClusterTagKey)),
Values: []string{
cache.clusterName,
},
})
}
input := &ec2.DescribeNetworkInterfacesInput{
Filters: leakedENIFilters,
MaxResults: aws.Int32(describeENIPageSize),
}
var networkInterfaces []ec2types.NetworkInterface
filterFn := func(networkInterface ec2types.NetworkInterface) error {
// Verify the description starts with "aws-K8S-"
if !strings.HasPrefix(aws.ToString(networkInterface.Description), eniDescriptionPrefix) {
return nil
}
// Check that it's not a newly created ENI
tags := convertSDKTagsToTags(networkInterface.TagSet)
if value, ok := tags[eniCreatedAtTagKey]; ok {
parsedTime, err := time.Parse(time.RFC3339, value)
if err != nil {
log.Warnf("ParsedTime format %s is wrong so retagging with current TS", parsedTime)
cache.tagENIcreateTS(aws.ToString(networkInterface.NetworkInterfaceId), maxENIBackoffDelay)
}
if time.Since(parsedTime) < eniDeleteCooldownTime {
log.Infof("Found an ENI created less than 5 minutes ago, so not cleaning it up")
return nil
}
log.Debugf("%v", value)
} else {
/* Set a time if we didn't find one. This is to prevent accidentally deleting ENIs that are in the
* process of being attached by CNI versions v1.5.x or earlier.
*/
cache.tagENIcreateTS(aws.ToString(networkInterface.NetworkInterfaceId), maxENIBackoffDelay)
return nil
}
networkInterfaces = append(networkInterfaces, networkInterface)
return nil
}
err := cache.getENIsFromPaginatedDescribeNetworkInterfaces(input, filterFn)
if err != nil {
return nil, errors.Wrap(err, "awsutils: unable to obtain filtered list of network interfaces")
}
if len(networkInterfaces) < 1 {
log.Debug("No AWS CNI leaked ENIs found.")
return nil, nil
}
log.Debugf("Found %d leaked ENIs with the AWS CNI tag.", len(networkInterfaces))
return networkInterfaces, nil
}