in pkg/providers/instance/instance.go [491:530]
func FilterRejectInstanceTypes(nodeClaim *karpv1.NodeClaim, instanceTypes []*cloudprovider.InstanceType) ([]*cloudprovider.InstanceType, []*cloudprovider.InstanceType, error) {
var err error
schedulingRequirements := scheduling.NewNodeSelectorRequirementsWithMinValues(nodeClaim.Spec.Requirements...)
// We filter out non-reserved instances regardless of the min-values settings, since if the launch is eligible for
// reserved instances that's all we'll include in our fleet request.
if reqs := schedulingRequirements; reqs.Get(karpv1.CapacityTypeLabelKey).Has(karpv1.CapacityTypeReserved) {
filtered, rejected := filterRejectReservedInstanceTypes(reqs, instanceTypes)
if _, err = cloudprovider.InstanceTypes(filtered).SatisfiesMinValues(schedulingRequirements); err != nil {
return nil, nil, cloudprovider.NewCreateError(fmt.Errorf("failed to construct CreateFleet request while respecting minValues requirements, %w", err), "InstanceTypeFilteringFailed", "Failed to filter instance types while respecting minValues")
}
if len(filtered) > 0 {
// TODO: Support FilterReject on Truncating instance types
filtered, err = cloudprovider.InstanceTypes(filtered).Truncate(schedulingRequirements, maxInstanceTypes)
if err != nil {
return nil, nil, cloudprovider.NewCreateError(fmt.Errorf("truncating instance types, %w", err), "InstanceTypeFilteringFailed", "Error truncating instance types based on the passed-in requirements")
}
return filtered, rejected, nil
}
}
// Only filter the instances if there are no minValues in the requirement.
var rejected []*cloudprovider.InstanceType
filtered := instanceTypes
if !schedulingRequirements.HasMinValues() {
var r []*cloudprovider.InstanceType
filtered, r = filterRejectExoticInstanceTypes(filtered)
rejected = append(rejected, r...)
// If we could potentially launch either a spot or on-demand node, we want to filter out the spot instance types that
// are more expensive than the cheapest on-demand type.
if isMixedCapacityLaunch(nodeClaim, filtered) {
filtered, r = filterRejectUnwantedSpot(filtered)
rejected = append(rejected, r...)
}
}
// TODO: Support FilterReject on Truncating instance types
filtered, err = cloudprovider.InstanceTypes(filtered).Truncate(schedulingRequirements, maxInstanceTypes)
if err != nil {
return nil, nil, cloudprovider.NewCreateError(fmt.Errorf("truncating instance types, %w", err), "InstanceTypeFilteringFailed", "Error truncating instance types based on the passed-in requirements")
}
return filtered, rejected, nil
}