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
}