in pkg/trimaran/loadvariationriskbalancing/loadvariationriskbalancing.go [92:132]
func (pl *LoadVariationRiskBalancing) Score(ctx context.Context, cycleState *framework.CycleState, pod *v1.Pod, nodeName string) (int64, *framework.Status) {
klog.V(6).Infof("Calculating score for pod %q on node %q", pod.GetName(), nodeName)
score := framework.MinNodeScore
nodeInfo, err := pl.handle.SnapshotSharedLister().NodeInfos().Get(nodeName)
if err != nil {
return score, framework.NewStatus(framework.Error, fmt.Sprintf("getting node %q from Snapshot: %v", nodeName, err))
}
// get node metrics
metrics := pl.collector.getNodeMetrics(nodeName)
if metrics == nil {
klog.Warningf("failure getting metrics for node %q; using minimum score", nodeName)
return score, nil
}
podRequest := getResourceRequested(pod)
node := nodeInfo.Node()
// calculate CPU score
var cpuScore float64 = 0
cpuStats, cpuOK := createResourceStats(metrics, node, podRequest, v1.ResourceCPU, watcher.CPU)
if cpuOK {
cpuScore = cpuStats.computeScore(pl.collector.args.SafeVarianceMargin, pl.collector.args.SafeVarianceSensitivity)
}
klog.V(6).Infof("pod:%s; node:%s; CPUScore=%f", pod.GetName(), nodeName, cpuScore)
// calculate Memory score
var memoryScore float64 = 0
memoryStats, memoryOK := createResourceStats(metrics, node, podRequest, v1.ResourceMemory, watcher.Memory)
if memoryOK {
memoryScore = memoryStats.computeScore(pl.collector.args.SafeVarianceMargin, pl.collector.args.SafeVarianceSensitivity)
}
klog.V(6).Infof("pod:%s; node:%s; MemoryScore=%f", pod.GetName(), nodeName, memoryScore)
// calculate total score
var totalScore float64 = 0
if memoryOK && cpuOK {
totalScore = math.Min(memoryScore, cpuScore)
} else {
totalScore = math.Max(memoryScore, cpuScore)
}
score = int64(math.Round(totalScore))
klog.V(6).Infof("pod:%s; node:%s; TotalScore=%d", pod.GetName(), nodeName, score)
return score, framework.NewStatus(framework.Success, "")
}