func()

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
}