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
}