func PackablesFor()

in pkg/controllers/provisioning/binpacking/packable.go [44:91]


func PackablesFor(ctx context.Context, instanceTypes []cloudprovider.InstanceType, constraints *v1alpha5.Constraints, pods []*v1.Pod, daemons []*v1.Pod) []*Packable {
	packables := []*Packable{}
	for _, instanceType := range instanceTypes {
		packable := PackableFor(instanceType)
		// First pass at filtering down to viable instance types;
		// additional filtering will be done by later steps (such as
		// removing instance types that obviously lack resources, such
		// as GPUs, for the workload being presented).
		if err := multierr.Combine(
			packable.validateOfferings(constraints),
			packable.validateInstanceType(constraints),
			packable.validateArchitecture(constraints),
			packable.validateOperatingSystems(constraints),
			packable.validateAWSPodENI(pods),
			packable.validateGPUs(pods),
		); err != nil {
			continue
		}
		// Calculate Kubelet Overhead
		if ok := packable.reserve(instanceType.Overhead()); !ok {
			logging.FromContext(ctx).Debugf("Excluding instance type %s because there are not enough resources for kubelet and system overhead", packable.Name())
			continue
		}
		// Calculate Daemonset Overhead
		if len(packable.Pack(daemons).unpacked) > 0 {
			logging.FromContext(ctx).Debugf("Excluding instance type %s because there are not enough resources for daemons", packable.Name())
			continue
		}
		packables = append(packables, packable)
	}
	// Sort in ascending order so that the packer can short circuit bin-packing for larger instance types
	sort.Slice(packables, func(i, j int) bool {
		// Check GPU equality assuming GPU classes are mutually exclusive
		if packables[i].AMDGPUs().Equal(*packables[j].AMDGPUs()) ||
			packables[i].NvidiaGPUs().Equal(*packables[j].NvidiaGPUs()) ||
			packables[i].AWSNeurons().Equal(*packables[j].AWSNeurons()) {
			if packables[i].CPU().Equal(*packables[j].CPU()) {
				// check for memory
				return packables[i].Memory().Cmp(*packables[j].Memory()) == -1
			}
			return packables[i].CPU().Cmp(*packables[j].CPU()) == -1
		}
		return packables[i].AMDGPUs().Cmp(*packables[j].AMDGPUs()) == -1 ||
			packables[i].NvidiaGPUs().Cmp(*packables[j].NvidiaGPUs()) == -1 ||
			packables[i].AWSNeurons().Cmp(*packables[j].AWSNeurons()) == -1
	})
	return packables
}