func()

in pkg/selector/selector.go [208:260]


func (s Selector) rawFilter(ctx context.Context, filters Filters) ([]*instancetypes.Details, error) {
	filters, err := s.AggregateFilterTransform(ctx, filters)
	if err != nil {
		return nil, err
	}
	var locations, availabilityZones []string

	if filters.CPUArchitecture != nil && *filters.CPUArchitecture == cpuArchitectureAMD64 {
		*filters.CPUArchitecture = ec2types.ArchitectureTypeX8664
	}
	if filters.VirtualizationType != nil && *filters.VirtualizationType == virtualizationTypePV {
		*filters.VirtualizationType = ec2types.VirtualizationTypeParavirtual
	}
	if filters.AvailabilityZones != nil {
		availabilityZones = *filters.AvailabilityZones
		locations = *filters.AvailabilityZones
	} else if filters.Region != nil {
		locations = []string{*filters.Region}
	}
	locationInstanceOfferings, err := s.RetrieveInstanceTypesSupportedInLocations(ctx, locations)
	if err != nil {
		return nil, err
	}

	instanceTypeDetails, err := s.InstanceTypesProvider.Get(ctx, nil)
	if err != nil {
		return nil, err
	}
	filteredInstanceTypes := []*instancetypes.Details{}
	var wg sync.WaitGroup
	instanceTypes := make(chan *instancetypes.Details, len(instanceTypeDetails))
	for _, instanceTypeInfo := range instanceTypeDetails {
		wg.Add(1)
		go func(instanceTypeInfo instancetypes.Details) {
			defer wg.Done()
			it, err := s.prepareFilter(ctx, filters, instanceTypeInfo, availabilityZones, locationInstanceOfferings)
			if err != nil {
				s.Logger.Printf("Unable to prepare filter for %s, %v", instanceTypeInfo.InstanceType, err)
			}
			if it != nil {
				instanceTypes <- it
			}
		}(*instanceTypeInfo)
	}
	go func() {
		wg.Wait()
		close(instanceTypes)
	}()
	for it := range instanceTypes {
		filteredInstanceTypes = append(filteredInstanceTypes, it)
	}
	return sortInstanceTypeInfo(filteredInstanceTypes), nil
}