in pkg/scheduler/flavorassigner/flavorassigner.go [316:389]
func (a *Assignment) findFlavorForResourceGroup(
log logr.Logger,
rg *cache.ResourceGroup,
requests workload.Requests,
resourceFlavors map[kueue.ResourceFlavorReference]*kueue.ResourceFlavor,
cq *cache.ClusterQueue,
spec *corev1.PodSpec) (ResourceAssignment, *Status) {
status := &Status{}
requests = filterRequestedResources(requests, rg.CoveredResources)
var bestAssignment ResourceAssignment
bestAssignmentMode := NoFit
// We will only check against the flavors' labels for the resource.
selector := flavorSelector(spec, rg.LabelKeys)
for _, flvQuotas := range rg.Flavors {
flavor, exist := resourceFlavors[flvQuotas.Name]
if !exist {
log.Error(nil, "Flavor not found", "Flavor", flvQuotas.Name)
status.append(fmt.Sprintf("flavor %s not found", flvQuotas.Name))
continue
}
taint, untolerated := corev1helpers.FindMatchingUntoleratedTaint(flavor.Spec.NodeTaints, spec.Tolerations, func(t *corev1.Taint) bool {
return t.Effect == corev1.TaintEffectNoSchedule || t.Effect == corev1.TaintEffectNoExecute
})
if untolerated {
status.append(fmt.Sprintf("untolerated taint %s in flavor %s", taint, flvQuotas.Name))
continue
}
if match, err := selector.Match(&corev1.Node{ObjectMeta: metav1.ObjectMeta{Labels: flavor.Spec.NodeLabels}}); !match || err != nil {
if err != nil {
status.err = err
return nil, status
}
status.append(fmt.Sprintf("flavor %s doesn't match node affinity", flvQuotas.Name))
continue
}
assignments := make(ResourceAssignment, len(requests))
// Calculate representativeMode for this assignment as the worst mode among all requests.
representativeMode := Fit
for rName, val := range requests {
resQuota := flvQuotas.Resources[rName]
// Check considering the flavor usage by previous pod sets.
mode, borrow, s := fitsResourceQuota(flvQuotas.Name, rName, val+a.usage[flvQuotas.Name][rName], cq, resQuota)
if s != nil {
status.reasons = append(status.reasons, s.reasons...)
}
if mode < representativeMode {
representativeMode = mode
}
if representativeMode == NoFit {
// The flavor doesn't fit, no need to check other resources.
break
}
assignments[rName] = &FlavorAssignment{
Name: flvQuotas.Name,
Mode: mode,
borrow: borrow,
}
}
if representativeMode > bestAssignmentMode {
bestAssignment = assignments
bestAssignmentMode = representativeMode
if bestAssignmentMode == Fit {
// All the resources fit in the cohort, no need to check more flavors.
return bestAssignment, nil
}
}
}
return bestAssignment, status
}