func execCreateFleetBatch()

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
	}
}