in pkg/scheduler/flavorassigner/flavorassigner.go [229:281]
func AssignFlavors(log logr.Logger, wl *workload.Info, resourceFlavors map[kueue.ResourceFlavorReference]*kueue.ResourceFlavor, cq *cache.ClusterQueue) Assignment {
assignment := Assignment{
TotalBorrow: make(cache.FlavorResourceQuantities),
PodSets: make([]PodSetAssignment, 0, len(wl.TotalRequests)),
usage: make(cache.FlavorResourceQuantities),
}
for i, podSet := range wl.TotalRequests {
if _, found := cq.RGByResource[corev1.ResourcePods]; found {
podSet.Requests[corev1.ResourcePods] = int64(wl.Obj.Spec.PodSets[i].Count)
}
psAssignment := PodSetAssignment{
Name: podSet.Name,
Flavors: make(ResourceAssignment, len(podSet.Requests)),
Requests: podSet.Requests.ToResourceList(),
Count: podSet.Count,
}
for resName := range podSet.Requests {
if _, found := psAssignment.Flavors[resName]; found {
// This resource got assigned the same flavor as its resource group.
// No need to compute again.
continue
}
rg, found := cq.RGByResource[resName]
if !found {
psAssignment.Flavors = nil
psAssignment.Status = &Status{
reasons: []string{fmt.Sprintf("resource %s unavailable in ClusterQueue", resName)},
}
break
}
flavors, status := assignment.findFlavorForResourceGroup(log, rg, podSet.Requests, resourceFlavors, cq, &wl.Obj.Spec.PodSets[i].Template.Spec)
if status.IsError() || len(flavors) == 0 {
psAssignment.Flavors = nil
psAssignment.Status = status
break
}
psAssignment.append(flavors, status)
}
assignment.append(podSet.Requests, &psAssignment)
if psAssignment.Status.IsError() || (len(podSet.Requests) > 0 && len(psAssignment.Flavors) == 0) {
// This assignment failed, no need to continue tracking.
assignment.TotalBorrow = nil
return assignment
}
}
if len(assignment.TotalBorrow) == 0 {
assignment.TotalBorrow = nil
}
return assignment
}