func FilterRejectInstanceTypes()

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
}