mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-04 04:08:16 +00:00 
			
		
		
		
	fix(scheduler): skip best-effort pods in BalancedAllocation PreScore
- Refactored `PreScore` method in `balanced_allocation.go` to skip best-effort pods. - Updated unit tests in `balanced_allocation_test.go` to check for the new status codes.
This commit is contained in:
		@@ -63,8 +63,15 @@ func (s *balancedAllocationPreScoreState) Clone() framework.StateData {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// PreScore calculates incoming pod's resource requests and writes them to the cycle state used.
 | 
					// PreScore calculates incoming pod's resource requests and writes them to the cycle state used.
 | 
				
			||||||
func (ba *BalancedAllocation) PreScore(ctx context.Context, cycleState *framework.CycleState, pod *v1.Pod, nodes []*framework.NodeInfo) *framework.Status {
 | 
					func (ba *BalancedAllocation) PreScore(ctx context.Context, cycleState *framework.CycleState, pod *v1.Pod, nodes []*framework.NodeInfo) *framework.Status {
 | 
				
			||||||
 | 
						podRequests := ba.calculatePodResourceRequestList(pod, ba.resources)
 | 
				
			||||||
 | 
						if ba.isBestEffortPod(podRequests) {
 | 
				
			||||||
 | 
							// Skip BalancedAllocation scoring for best-effort pods to
 | 
				
			||||||
 | 
							// prevent a large number of pods from being scheduled to the same node.
 | 
				
			||||||
 | 
							// See https://github.com/kubernetes/kubernetes/issues/129138 for details.
 | 
				
			||||||
 | 
							return framework.NewStatus(framework.Skip)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	state := &balancedAllocationPreScoreState{
 | 
						state := &balancedAllocationPreScoreState{
 | 
				
			||||||
		podRequests: ba.calculatePodResourceRequestList(pod, ba.resources),
 | 
							podRequests: podRequests,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	cycleState.Write(balancedAllocationPreScoreStateKey, state)
 | 
						cycleState.Write(balancedAllocationPreScoreStateKey, state)
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
@@ -93,6 +100,9 @@ func (ba *BalancedAllocation) Score(ctx context.Context, state *framework.CycleS
 | 
				
			|||||||
	s, err := getBalancedAllocationPreScoreState(state)
 | 
						s, err := getBalancedAllocationPreScoreState(state)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		s = &balancedAllocationPreScoreState{podRequests: ba.calculatePodResourceRequestList(pod, ba.resources)}
 | 
							s = &balancedAllocationPreScoreState{podRequests: ba.calculatePodResourceRequestList(pod, ba.resources)}
 | 
				
			||||||
 | 
							if ba.isBestEffortPod(s.podRequests) {
 | 
				
			||||||
 | 
								return 0, nil
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// ba.score favors nodes with balanced resource usage rate.
 | 
						// ba.score favors nodes with balanced resource usage rate.
 | 
				
			||||||
@@ -154,7 +164,6 @@ func balancedResourceScorer(requested, allocable []int64) int64 {
 | 
				
			|||||||
	// Otherwise, set the std to zero is enough.
 | 
						// Otherwise, set the std to zero is enough.
 | 
				
			||||||
	if len(resourceToFractions) == 2 {
 | 
						if len(resourceToFractions) == 2 {
 | 
				
			||||||
		std = math.Abs((resourceToFractions[0] - resourceToFractions[1]) / 2)
 | 
							std = math.Abs((resourceToFractions[0] - resourceToFractions[1]) / 2)
 | 
				
			||||||
 | 
					 | 
				
			||||||
	} else if len(resourceToFractions) > 2 {
 | 
						} else if len(resourceToFractions) > 2 {
 | 
				
			||||||
		mean := totalFraction / float64(len(resourceToFractions))
 | 
							mean := totalFraction / float64(len(resourceToFractions))
 | 
				
			||||||
		var sum float64
 | 
							var sum float64
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -23,7 +23,6 @@ import (
 | 
				
			|||||||
	"github.com/google/go-cmp/cmp"
 | 
						"github.com/google/go-cmp/cmp"
 | 
				
			||||||
	v1 "k8s.io/api/core/v1"
 | 
						v1 "k8s.io/api/core/v1"
 | 
				
			||||||
	"k8s.io/apimachinery/pkg/api/resource"
 | 
						"k8s.io/apimachinery/pkg/api/resource"
 | 
				
			||||||
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
					 | 
				
			||||||
	"k8s.io/klog/v2/ktesting"
 | 
						"k8s.io/klog/v2/ktesting"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/scheduler/apis/config"
 | 
						"k8s.io/kubernetes/pkg/scheduler/apis/config"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/scheduler/backend/cache"
 | 
						"k8s.io/kubernetes/pkg/scheduler/backend/cache"
 | 
				
			||||||
@@ -57,14 +56,6 @@ func TestNodeResourcesBalancedAllocation(t *testing.T) {
 | 
				
			|||||||
		},
 | 
							},
 | 
				
			||||||
		NodeName: "node1",
 | 
							NodeName: "node1",
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	labels1 := map[string]string{
 | 
					 | 
				
			||||||
		"foo": "bar",
 | 
					 | 
				
			||||||
		"baz": "blah",
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	labels2 := map[string]string{
 | 
					 | 
				
			||||||
		"bar": "foo",
 | 
					 | 
				
			||||||
		"baz": "blah",
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	cpuOnly := v1.PodSpec{
 | 
						cpuOnly := v1.PodSpec{
 | 
				
			||||||
		NodeName: "node1",
 | 
							NodeName: "node1",
 | 
				
			||||||
		Containers: []v1.Container{
 | 
							Containers: []v1.Container{
 | 
				
			||||||
@@ -126,22 +117,16 @@ func TestNodeResourcesBalancedAllocation(t *testing.T) {
 | 
				
			|||||||
		name                   string
 | 
							name                   string
 | 
				
			||||||
		args                   config.NodeResourcesBalancedAllocationArgs
 | 
							args                   config.NodeResourcesBalancedAllocationArgs
 | 
				
			||||||
		runPreScore            bool
 | 
							runPreScore            bool
 | 
				
			||||||
 | 
							wantPreScoreStatusCode framework.Code
 | 
				
			||||||
	}{
 | 
						}{
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			// Node1 scores (remaining resources) on 0-MaxNodeScore scale
 | 
								// bestEffort pods, skip in PreScore
 | 
				
			||||||
			// CPU Fraction: 0 / 4000 = 0%
 | 
					 | 
				
			||||||
			// Memory Fraction: 0 / 10000 = 0%
 | 
					 | 
				
			||||||
			// Node1 Score: (1-0) * MaxNodeScore = MaxNodeScore
 | 
					 | 
				
			||||||
			// Node2 scores (remaining resources) on 0-MaxNodeScore scale
 | 
					 | 
				
			||||||
			// CPU Fraction: 0 / 4000 = 0 %
 | 
					 | 
				
			||||||
			// Memory Fraction: 0 / 10000 = 0%
 | 
					 | 
				
			||||||
			// Node2 Score: (1-0) * MaxNodeScore = MaxNodeScore
 | 
					 | 
				
			||||||
			pod:                    st.MakePod().Obj(),
 | 
								pod:                    st.MakePod().Obj(),
 | 
				
			||||||
			nodes:                  []*v1.Node{makeNode("node1", 4000, 10000, nil), makeNode("node2", 4000, 10000, nil)},
 | 
								nodes:                  []*v1.Node{makeNode("node1", 4000, 10000, nil), makeNode("node2", 4000, 10000, nil)},
 | 
				
			||||||
			expectedList: []framework.NodeScore{{Name: "node1", Score: framework.MaxNodeScore}, {Name: "node2", Score: framework.MaxNodeScore}},
 | 
								name:                   "nothing scheduled, nothing requested, skip in PreScore",
 | 
				
			||||||
			name:         "nothing scheduled, nothing requested",
 | 
					 | 
				
			||||||
			args:                   config.NodeResourcesBalancedAllocationArgs{Resources: defaultResourceBalancedAllocationSet},
 | 
								args:                   config.NodeResourcesBalancedAllocationArgs{Resources: defaultResourceBalancedAllocationSet},
 | 
				
			||||||
			runPreScore:            true,
 | 
								runPreScore:            true,
 | 
				
			||||||
 | 
								wantPreScoreStatusCode: framework.Skip,
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			// Node1 scores on 0-MaxNodeScore scale
 | 
								// Node1 scores on 0-MaxNodeScore scale
 | 
				
			||||||
@@ -161,76 +146,6 @@ func TestNodeResourcesBalancedAllocation(t *testing.T) {
 | 
				
			|||||||
			args:         config.NodeResourcesBalancedAllocationArgs{Resources: defaultResourceBalancedAllocationSet},
 | 
								args:         config.NodeResourcesBalancedAllocationArgs{Resources: defaultResourceBalancedAllocationSet},
 | 
				
			||||||
			runPreScore:  true,
 | 
								runPreScore:  true,
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			// Node1 scores on 0-MaxNodeScore scale
 | 
					 | 
				
			||||||
			// CPU Fraction: 0 / 4000= 0%
 | 
					 | 
				
			||||||
			// Memory Fraction: 0 / 10000 = 0%
 | 
					 | 
				
			||||||
			// Node1 std: 0
 | 
					 | 
				
			||||||
			// Node1 Score: (1-0) * MaxNodeScore = MaxNodeScore
 | 
					 | 
				
			||||||
			// Node2 scores on 0-MaxNodeScore scale
 | 
					 | 
				
			||||||
			// CPU Fraction: 0 / 4000= 0%
 | 
					 | 
				
			||||||
			// Memory Fraction: 0 / 10000 = 0%
 | 
					 | 
				
			||||||
			// Node2 std: 0
 | 
					 | 
				
			||||||
			// Node2 Score: (1-0) * MaxNodeScore = MaxNodeScore
 | 
					 | 
				
			||||||
			pod:          st.MakePod().Obj(),
 | 
					 | 
				
			||||||
			nodes:        []*v1.Node{makeNode("node1", 4000, 10000, nil), makeNode("node2", 4000, 10000, nil)},
 | 
					 | 
				
			||||||
			expectedList: []framework.NodeScore{{Name: "node2", Score: framework.MaxNodeScore}, {Name: "node2", Score: framework.MaxNodeScore}},
 | 
					 | 
				
			||||||
			name:         "no resources requested, pods without container scheduled",
 | 
					 | 
				
			||||||
			pods: []*v1.Pod{
 | 
					 | 
				
			||||||
				st.MakePod().Node("node1").Labels(labels2).Obj(),
 | 
					 | 
				
			||||||
				st.MakePod().Node("node1").Labels(labels1).Obj(),
 | 
					 | 
				
			||||||
				st.MakePod().Node("node2").Labels(labels1).Obj(),
 | 
					 | 
				
			||||||
				st.MakePod().Node("node2").Labels(labels1).Obj(),
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
			args:        config.NodeResourcesBalancedAllocationArgs{Resources: defaultResourceBalancedAllocationSet},
 | 
					 | 
				
			||||||
			runPreScore: true,
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			// Node1 scores on 0-MaxNodeScore scale
 | 
					 | 
				
			||||||
			// CPU Fraction: 0 / 250 = 0%
 | 
					 | 
				
			||||||
			// Memory Fraction: 0 / 1000 = 0%
 | 
					 | 
				
			||||||
			// Node1 std: (0 - 0) / 2 = 0
 | 
					 | 
				
			||||||
			// Node1 Score: (1 - 0)*MaxNodeScore = 100
 | 
					 | 
				
			||||||
			// Node2 scores on 0-MaxNodeScore scale
 | 
					 | 
				
			||||||
			// CPU Fraction: 0 / 250 = 0%
 | 
					 | 
				
			||||||
			// Memory Fraction: 0 / 1000 = 0%
 | 
					 | 
				
			||||||
			// Node2 std: (0 - 0) / 2 = 0
 | 
					 | 
				
			||||||
			// Node2 Score: (1 - 0)*MaxNodeScore = 100
 | 
					 | 
				
			||||||
			pod:          st.MakePod().Obj(),
 | 
					 | 
				
			||||||
			nodes:        []*v1.Node{makeNode("node1", 250, 1000*1024*1024, nil), makeNode("node2", 250, 1000*1024*1024, nil)},
 | 
					 | 
				
			||||||
			expectedList: []framework.NodeScore{{Name: "node1", Score: 100}, {Name: "node2", Score: 100}},
 | 
					 | 
				
			||||||
			name:         "no resources requested, pods with container scheduled",
 | 
					 | 
				
			||||||
			pods: []*v1.Pod{
 | 
					 | 
				
			||||||
				st.MakePod().Node("node1").Obj(),
 | 
					 | 
				
			||||||
				st.MakePod().Node("node1").Obj(),
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
			args:        config.NodeResourcesBalancedAllocationArgs{Resources: defaultResourceBalancedAllocationSet},
 | 
					 | 
				
			||||||
			runPreScore: true,
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			// Node1 scores on 0-MaxNodeScore scale
 | 
					 | 
				
			||||||
			// CPU Fraction: 6000 / 10000 = 60%
 | 
					 | 
				
			||||||
			// Memory Fraction: 0 / 20000 = 0%
 | 
					 | 
				
			||||||
			// Node1 std: (0.6 - 0) / 2 = 0.3
 | 
					 | 
				
			||||||
			// Node1 Score: (1 - 0.3)*MaxNodeScore = 70
 | 
					 | 
				
			||||||
			// Node2 scores on 0-MaxNodeScore scale
 | 
					 | 
				
			||||||
			// CPU Fraction: 6000 / 10000 = 60%
 | 
					 | 
				
			||||||
			// Memory Fraction: 5000 / 20000 = 25%
 | 
					 | 
				
			||||||
			// Node2 std: (0.6 - 0.25) / 2 = 0.175
 | 
					 | 
				
			||||||
			// Node2 Score: (1 - 0.175)*MaxNodeScore = 82
 | 
					 | 
				
			||||||
			pod:          st.MakePod().Obj(),
 | 
					 | 
				
			||||||
			nodes:        []*v1.Node{makeNode("node1", 10000, 20000, nil), makeNode("node2", 10000, 20000, nil)},
 | 
					 | 
				
			||||||
			expectedList: []framework.NodeScore{{Name: "node1", Score: 70}, {Name: "node2", Score: 82}},
 | 
					 | 
				
			||||||
			name:         "no resources requested, pods scheduled with resources",
 | 
					 | 
				
			||||||
			pods: []*v1.Pod{
 | 
					 | 
				
			||||||
				{Spec: cpuOnly, ObjectMeta: metav1.ObjectMeta{Labels: labels2}},
 | 
					 | 
				
			||||||
				{Spec: cpuOnly, ObjectMeta: metav1.ObjectMeta{Labels: labels1}},
 | 
					 | 
				
			||||||
				{Spec: cpuOnly2, ObjectMeta: metav1.ObjectMeta{Labels: labels1}},
 | 
					 | 
				
			||||||
				{Spec: cpuAndMemory, ObjectMeta: metav1.ObjectMeta{Labels: labels1}},
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
			args:        config.NodeResourcesBalancedAllocationArgs{Resources: defaultResourceBalancedAllocationSet},
 | 
					 | 
				
			||||||
			runPreScore: true,
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			// Node1 scores on 0-MaxNodeScore scale
 | 
								// Node1 scores on 0-MaxNodeScore scale
 | 
				
			||||||
			// CPU Fraction: 6000 / 10000 = 60%
 | 
								// CPU Fraction: 6000 / 10000 = 60%
 | 
				
			||||||
@@ -298,18 +213,6 @@ func TestNodeResourcesBalancedAllocation(t *testing.T) {
 | 
				
			|||||||
			args:        config.NodeResourcesBalancedAllocationArgs{Resources: defaultResourceBalancedAllocationSet},
 | 
								args:        config.NodeResourcesBalancedAllocationArgs{Resources: defaultResourceBalancedAllocationSet},
 | 
				
			||||||
			runPreScore: true,
 | 
								runPreScore: true,
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			pod:          st.MakePod().Obj(),
 | 
					 | 
				
			||||||
			nodes:        []*v1.Node{makeNode("node1", 0, 0, nil), makeNode("node2", 0, 0, nil)},
 | 
					 | 
				
			||||||
			expectedList: []framework.NodeScore{{Name: "node1", Score: 100}, {Name: "node2", Score: 100}},
 | 
					 | 
				
			||||||
			name:         "zero node resources, pods scheduled with resources",
 | 
					 | 
				
			||||||
			pods: []*v1.Pod{
 | 
					 | 
				
			||||||
				{Spec: cpuOnly},
 | 
					 | 
				
			||||||
				{Spec: cpuAndMemory},
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
			args:        config.NodeResourcesBalancedAllocationArgs{Resources: defaultResourceBalancedAllocationSet},
 | 
					 | 
				
			||||||
			runPreScore: true,
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		// Node1 scores on 0-MaxNodeScore scale
 | 
							// Node1 scores on 0-MaxNodeScore scale
 | 
				
			||||||
		// CPU Fraction: 3000 / 3500 = 85.71%
 | 
							// CPU Fraction: 3000 / 3500 = 85.71%
 | 
				
			||||||
		// Memory Fraction: 5000 / 40000 = 12.5%
 | 
							// Memory Fraction: 5000 / 40000 = 12.5%
 | 
				
			||||||
@@ -342,19 +245,25 @@ func TestNodeResourcesBalancedAllocation(t *testing.T) {
 | 
				
			|||||||
			runPreScore: true,
 | 
								runPreScore: true,
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		// Only one node (node1) has the scalar resource, pod doesn't request the scalar resource and the scalar resource should be skipped for consideration.
 | 
							// Only one node (node1) has the scalar resource, pod doesn't request the scalar resource and the scalar resource should be skipped for consideration.
 | 
				
			||||||
		// Node1: std = 0, score = 100
 | 
							// Node1 scores on 0-MaxNodeScore scale
 | 
				
			||||||
		// Node2: std = 0, score = 100
 | 
							// CPU Fraction: 3000 / 3500 = 85.71%
 | 
				
			||||||
 | 
							// Memory Fraction: 5000 / 40000 = 12.5%
 | 
				
			||||||
 | 
							// Node1 std: (0.8571 - 0.125) / 2 = 0.36605
 | 
				
			||||||
 | 
							// Node1 Score: (1 - 0.22705)*MaxNodeScore = 63
 | 
				
			||||||
 | 
							// Node2 scores on 0-MaxNodeScore scale
 | 
				
			||||||
 | 
							// CPU Fraction: 3000 / 3500 = 85.71%
 | 
				
			||||||
 | 
							// Memory Fraction: 5000 / 40000 = 12.5%
 | 
				
			||||||
 | 
							// Node2 std: (0.8571 - 0.125) / 2 = 0.36605
 | 
				
			||||||
 | 
							// Node2 Score: (1 - 0.22705)*MaxNodeScore = 63
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			pod:          st.MakePod().Obj(),
 | 
								pod:          &v1.Pod{Spec: cpuAndMemory},
 | 
				
			||||||
			nodes:        []*v1.Node{makeNode("node1", 3500, 40000, scalarResource), makeNode("node2", 3500, 40000, nil)},
 | 
								nodes:        []*v1.Node{makeNode("node1", 3500, 40000, scalarResource), makeNode("node2", 3500, 40000, nil)},
 | 
				
			||||||
			expectedList: []framework.NodeScore{{Name: "node1", Score: 100}, {Name: "node2", Score: 100}},
 | 
								expectedList: []framework.NodeScore{{Name: "node1", Score: 63}, {Name: "node2", Score: 63}},
 | 
				
			||||||
			name:         "node without the scalar resource results to a higher score",
 | 
								name:         "node without the scalar resource should skip the scalar resource",
 | 
				
			||||||
			pods: []*v1.Pod{
 | 
								pods:         []*v1.Pod{},
 | 
				
			||||||
				{Spec: cpuOnly},
 | 
					 | 
				
			||||||
				{Spec: cpuOnly2},
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
			args: config.NodeResourcesBalancedAllocationArgs{Resources: []config.ResourceSpec{
 | 
								args: config.NodeResourcesBalancedAllocationArgs{Resources: []config.ResourceSpec{
 | 
				
			||||||
				{Name: string(v1.ResourceCPU), Weight: 1},
 | 
									{Name: string(v1.ResourceCPU), Weight: 1},
 | 
				
			||||||
 | 
									{Name: string(v1.ResourceMemory), Weight: 1},
 | 
				
			||||||
				{Name: "nvidia.com/gpu", Weight: 1},
 | 
									{Name: "nvidia.com/gpu", Weight: 1},
 | 
				
			||||||
			}},
 | 
								}},
 | 
				
			||||||
			runPreScore: true,
 | 
								runPreScore: true,
 | 
				
			||||||
@@ -392,13 +301,17 @@ func TestNodeResourcesBalancedAllocation(t *testing.T) {
 | 
				
			|||||||
			fh, _ := runtime.NewFramework(ctx, nil, nil, runtime.WithSnapshotSharedLister(snapshot))
 | 
								fh, _ := runtime.NewFramework(ctx, nil, nil, runtime.WithSnapshotSharedLister(snapshot))
 | 
				
			||||||
			p, _ := NewBalancedAllocation(ctx, &test.args, fh, feature.Features{})
 | 
								p, _ := NewBalancedAllocation(ctx, &test.args, fh, feature.Features{})
 | 
				
			||||||
			state := framework.NewCycleState()
 | 
								state := framework.NewCycleState()
 | 
				
			||||||
			for i := range test.nodes {
 | 
					 | 
				
			||||||
			if test.runPreScore {
 | 
								if test.runPreScore {
 | 
				
			||||||
				status := p.(framework.PreScorePlugin).PreScore(ctx, state, test.pod, tf.BuildNodeInfos(test.nodes))
 | 
									status := p.(framework.PreScorePlugin).PreScore(ctx, state, test.pod, tf.BuildNodeInfos(test.nodes))
 | 
				
			||||||
					if !status.IsSuccess() {
 | 
									if status.Code() != test.wantPreScoreStatusCode {
 | 
				
			||||||
						t.Errorf("PreScore is expected to return success, but didn't. Got status: %v", status)
 | 
										t.Errorf("unexpected status code, want: %v, got: %v", test.wantPreScoreStatusCode, status.Code())
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									if status.Code() == framework.Skip {
 | 
				
			||||||
 | 
										t.Log("skipping score test as PreScore returned skip")
 | 
				
			||||||
 | 
										return
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
								for i := range test.nodes {
 | 
				
			||||||
				nodeInfo, err := snapshot.Get(test.nodes[i].Name)
 | 
									nodeInfo, err := snapshot.Get(test.nodes[i].Name)
 | 
				
			||||||
				if err != nil {
 | 
									if err != nil {
 | 
				
			||||||
					t.Errorf("failed to get node %q from snapshot: %v", test.nodes[i].Name, err)
 | 
										t.Errorf("failed to get node %q from snapshot: %v", test.nodes[i].Name, err)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -146,3 +146,12 @@ func (r *resourceAllocationScorer) calculatePodResourceRequestList(pod *v1.Pod,
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	return podRequests
 | 
						return podRequests
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (r *resourceAllocationScorer) isBestEffortPod(podRequests []int64) bool {
 | 
				
			||||||
 | 
						for _, request := range podRequests {
 | 
				
			||||||
 | 
							if request != 0 {
 | 
				
			||||||
 | 
								return false
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2939,7 +2939,7 @@ func TestZeroRequest(t *testing.T) {
 | 
				
			|||||||
				{Spec: large1}, {Spec: noResources1},
 | 
									{Spec: large1}, {Spec: noResources1},
 | 
				
			||||||
				{Spec: large2}, {Spec: small2},
 | 
									{Spec: large2}, {Spec: small2},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			expectedScore: 150,
 | 
								expectedScore: 50,
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			pod:   &v1.Pod{Spec: small},
 | 
								pod:   &v1.Pod{Spec: small},
 | 
				
			||||||
@@ -3105,10 +3105,10 @@ func Test_prioritizeNodes(t *testing.T) {
 | 
				
			|||||||
						},
 | 
											},
 | 
				
			||||||
						{
 | 
											{
 | 
				
			||||||
							Name:  "NodeResourcesBalancedAllocation",
 | 
												Name:  "NodeResourcesBalancedAllocation",
 | 
				
			||||||
							Score: 100,
 | 
												Score: 0,
 | 
				
			||||||
						},
 | 
											},
 | 
				
			||||||
					},
 | 
										},
 | 
				
			||||||
					TotalScore: 110,
 | 
										TotalScore: 10,
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					Name: "node2",
 | 
										Name: "node2",
 | 
				
			||||||
@@ -3119,10 +3119,10 @@ func Test_prioritizeNodes(t *testing.T) {
 | 
				
			|||||||
						},
 | 
											},
 | 
				
			||||||
						{
 | 
											{
 | 
				
			||||||
							Name:  "NodeResourcesBalancedAllocation",
 | 
												Name:  "NodeResourcesBalancedAllocation",
 | 
				
			||||||
							Score: 100,
 | 
												Score: 0,
 | 
				
			||||||
						},
 | 
											},
 | 
				
			||||||
					},
 | 
										},
 | 
				
			||||||
					TotalScore: 200,
 | 
										TotalScore: 100,
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
@@ -3172,10 +3172,10 @@ func Test_prioritizeNodes(t *testing.T) {
 | 
				
			|||||||
						},
 | 
											},
 | 
				
			||||||
						{
 | 
											{
 | 
				
			||||||
							Name:  "NodeResourcesBalancedAllocation",
 | 
												Name:  "NodeResourcesBalancedAllocation",
 | 
				
			||||||
							Score: 100,
 | 
												Score: 0,
 | 
				
			||||||
						},
 | 
											},
 | 
				
			||||||
					},
 | 
										},
 | 
				
			||||||
					TotalScore: 420,
 | 
										TotalScore: 320,
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					Name: "node2",
 | 
										Name: "node2",
 | 
				
			||||||
@@ -3190,10 +3190,10 @@ func Test_prioritizeNodes(t *testing.T) {
 | 
				
			|||||||
						},
 | 
											},
 | 
				
			||||||
						{
 | 
											{
 | 
				
			||||||
							Name:  "NodeResourcesBalancedAllocation",
 | 
												Name:  "NodeResourcesBalancedAllocation",
 | 
				
			||||||
							Score: 100,
 | 
												Score: 0,
 | 
				
			||||||
						},
 | 
											},
 | 
				
			||||||
					},
 | 
										},
 | 
				
			||||||
					TotalScore: 330,
 | 
										TotalScore: 230,
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
@@ -3222,10 +3222,10 @@ func Test_prioritizeNodes(t *testing.T) {
 | 
				
			|||||||
						},
 | 
											},
 | 
				
			||||||
						{
 | 
											{
 | 
				
			||||||
							Name:  "NodeResourcesBalancedAllocation",
 | 
												Name:  "NodeResourcesBalancedAllocation",
 | 
				
			||||||
							Score: 100,
 | 
												Score: 0,
 | 
				
			||||||
						},
 | 
											},
 | 
				
			||||||
					},
 | 
										},
 | 
				
			||||||
					TotalScore: 110,
 | 
										TotalScore: 10,
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					Name: "node2",
 | 
										Name: "node2",
 | 
				
			||||||
@@ -3236,10 +3236,10 @@ func Test_prioritizeNodes(t *testing.T) {
 | 
				
			|||||||
						},
 | 
											},
 | 
				
			||||||
						{
 | 
											{
 | 
				
			||||||
							Name:  "NodeResourcesBalancedAllocation",
 | 
												Name:  "NodeResourcesBalancedAllocation",
 | 
				
			||||||
							Score: 100,
 | 
												Score: 0,
 | 
				
			||||||
						},
 | 
											},
 | 
				
			||||||
					},
 | 
										},
 | 
				
			||||||
					TotalScore: 200,
 | 
										TotalScore: 100,
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user