in pkg/awsutils/awsutils.go [771:816]
func (cache *EC2InstanceMetadataCache) awsGetFreeDeviceNumber() (int, error) {
input := &ec2.DescribeInstancesInput{
InstanceIds: []string{cache.instanceID},
}
start := time.Now()
result, err := cache.ec2SVC.DescribeInstances(context.Background(), input)
prometheusmetrics.Ec2ApiReq.WithLabelValues("DescribeInstances").Inc()
prometheusmetrics.AwsAPILatency.WithLabelValues("DescribeInstances", fmt.Sprint(err != nil), awsReqStatus(err)).Observe(msSince(start))
if err != nil {
checkAPIErrorAndBroadcastEvent(err, "ec2:DescribeInstances")
awsAPIErrInc("DescribeInstances", err)
prometheusmetrics.Ec2ApiErr.WithLabelValues("DescribeInstances").Inc()
log.Errorf("awsGetFreeDeviceNumber: Unable to retrieve instance data from EC2 control plane %v", err)
return 0, errors.Wrap(err,
"find a free device number for ENI: not able to retrieve instance data from EC2 control plane")
}
if len(result.Reservations) != 1 {
return 0, errors.Errorf("awsGetFreeDeviceNumber: invalid instance id %s", cache.instanceID)
}
inst := result.Reservations[0].Instances[0]
var device [maxENIs]bool
for _, eni := range inst.NetworkInterfaces {
// We don't support multi-card yet, so only account for network card zero
if eni.Attachment != nil && aws.ToInt32(eni.Attachment.NetworkCardIndex) == 0 {
if aws.ToInt32(eni.Attachment.DeviceIndex) > maxENIs {
log.Warnf("The Device Index %d of the attached ENI %s > instance max slot %d",
aws.ToInt32(eni.Attachment.DeviceIndex), aws.ToString(eni.NetworkInterfaceId),
maxENIs)
} else {
log.Debugf("Discovered device number is used: %d", aws.ToInt32(eni.Attachment.DeviceIndex))
device[aws.ToInt32(eni.Attachment.DeviceIndex)] = true
}
}
}
for freeDeviceIndex := 0; freeDeviceIndex < maxENIs; freeDeviceIndex++ {
if !device[freeDeviceIndex] {
log.Debugf("Found a free device number: %d", freeDeviceIndex)
return freeDeviceIndex, nil
}
}
return 0, errors.New("awsGetFreeDeviceNumber: no available device number")
}