func AssignFlavors()

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
}