in pkg/batcher/createfleet.go [55:115]
func execCreateFleetBatch(ec2api sdk.EC2API) BatchExecutor[ec2.CreateFleetInput, ec2.CreateFleetOutput] {
return func(ctx context.Context, inputs []*ec2.CreateFleetInput) []Result[ec2.CreateFleetOutput] {
results := make([]Result[ec2.CreateFleetOutput], 0, len(inputs))
firstInput := inputs[0]
//nolint:gosec
firstInput.TargetCapacitySpecification.TotalTargetCapacity = aws.Int32(int32(len(inputs)))
output, err := ec2api.CreateFleet(ctx, firstInput)
if err != nil {
for range inputs {
results = append(results, Result[ec2.CreateFleetOutput]{Err: err})
}
return results
}
// we can get partial fulfillment of a CreateFleet request, so we:
// 1) split out the single instance IDs and deliver to each requestor
// 2) deliver errors to any remaining requestors for which we don't have an instance
requestIdx := -1
for _, reservation := range output.Instances {
for _, instanceID := range reservation.InstanceIds {
requestIdx++
if requestIdx >= len(inputs) {
log.FromContext(ctx).Error(serrors.Wrap(fmt.Errorf("received more instances than requested, ignoring instance"), "instance-id", instanceID), "received error while batching")
continue
}
results = append(results, Result[ec2.CreateFleetOutput]{
Output: &ec2.CreateFleetOutput{
FleetId: output.FleetId,
Errors: output.Errors,
Instances: []ec2types.CreateFleetInstance{
{
InstanceIds: []string{instanceID},
InstanceType: reservation.InstanceType,
LaunchTemplateAndOverrides: reservation.LaunchTemplateAndOverrides,
Lifecycle: reservation.Lifecycle,
Platform: reservation.Platform,
},
},
ResultMetadata: output.ResultMetadata,
},
})
}
}
if requestIdx != len(inputs) {
// we should receive some sort of error, but just in case
if len(output.Errors) == 0 {
output.Errors = append(output.Errors, ec2types.CreateFleetError{
ErrorCode: aws.String("too few instances returned"),
ErrorMessage: aws.String("too few instances returned"),
})
}
for i := requestIdx + 1; i < len(inputs); i++ {
results = append(results, Result[ec2.CreateFleetOutput]{
Output: &ec2.CreateFleetOutput{
Errors: output.Errors,
ResultMetadata: output.ResultMetadata,
}})
}
}
return results
}
}