func TestFindUnneededNodes(t *testing.T) { p1 := BuildTestPod("p1", 100, 0) p1.Spec.NodeName = "n1" p2 := BuildTestPod("p2", 300, 0) p2.Spec.NodeName = "n2" p2.Annotations = map[string]string{ "kubernetes.io/created-by": "{\"kind\":\"SerializedReference\",\"apiVersion\":\"v1\",\"reference\":{\"kind\":\"ReplicaSet\"}}", } p3 := BuildTestPod("p3", 400, 0) p3.Annotations = map[string]string{ "kubernetes.io/created-by": "{\"kind\":\"SerializedReference\",\"apiVersion\":\"v1\",\"reference\":{\"kind\":\"ReplicaSet\"}}", } p3.Spec.NodeName = "n3" p4 := BuildTestPod("p4", 2000, 0) p4.Annotations = map[string]string{ "kubernetes.io/created-by": "{\"kind\":\"SerializedReference\",\"apiVersion\":\"v1\",\"reference\":{\"kind\":\"ReplicaSet\"}}", } p4.Spec.NodeName = "n4" n1 := BuildTestNode("n1", 1000, 10) n2 := BuildTestNode("n2", 1000, 10) n3 := BuildTestNode("n3", 1000, 10) n4 := BuildTestNode("n4", 10000, 10) result, hints, utilization := FindUnneededNodes([]*kube_api.Node{n1, n2, n3, n4}, map[string]time.Time{}, 0.35, []*kube_api.Pod{p1, p2, p3, p4}, simulator.NewTestPredicateChecker(), make(map[string]string), simulator.NewUsageTracker(), time.Now()) assert.Equal(t, 1, len(result)) addTime, found := result["n2"] assert.True(t, found) assert.Contains(t, hints, p2.Namespace+"/"+p2.Name) assert.Equal(t, 4, len(utilization)) result["n1"] = time.Now() result2, hints, utilization := FindUnneededNodes([]*kube_api.Node{n1, n2, n3, n4}, result, 0.35, []*kube_api.Pod{p1, p2, p3, p4}, simulator.NewTestPredicateChecker(), hints, simulator.NewUsageTracker(), time.Now()) assert.Equal(t, 1, len(result2)) addTime2, found := result2["n2"] assert.True(t, found) assert.Equal(t, addTime, addTime2) assert.Equal(t, 4, len(utilization)) }
func TestBinpackingEstimateWithPorts(t *testing.T) { estimator := NewBinpackingNodeEstimator(simulator.NewTestPredicateChecker()) cpuPerPod := int64(200) memoryPerPod := int64(1000 * 1024 * 1024) pod := &kube_api.Pod{ Spec: kube_api.PodSpec{ Containers: []kube_api.Container{ { Resources: kube_api.ResourceRequirements{ Requests: kube_api.ResourceList{ kube_api.ResourceCPU: *resource.NewMilliQuantity(cpuPerPod, resource.DecimalSI), kube_api.ResourceMemory: *resource.NewQuantity(memoryPerPod, resource.DecimalSI), }, }, Ports: []kube_api.ContainerPort{ { HostPort: 5555, }, }, }, }, }, } pods := make([]*kube_api.Pod, 0) for i := 0; i < 8; i++ { pods = append(pods, pod) } node := &kube_api.Node{ Status: kube_api.NodeStatus{ Capacity: kube_api.ResourceList{ kube_api.ResourceCPU: *resource.NewMilliQuantity(5*cpuPerPod, resource.DecimalSI), kube_api.ResourceMemory: *resource.NewQuantity(5*memoryPerPod, resource.DecimalSI), kube_api.ResourcePods: *resource.NewQuantity(10, resource.DecimalSI), }, }, } node.Status.Allocatable = node.Status.Capacity nodeInfo := schedulercache.NewNodeInfo() nodeInfo.SetNode(node) estimate := estimator.Estimate(pods, nodeInfo) assert.Equal(t, 8, estimate) }
func TestBinpackingEstimate(t *testing.T) { estimator := NewBinpackingNodeEstimator(simulator.NewTestPredicateChecker()) cpuPerPod := int64(350) memoryPerPod := int64(1000 * 1024 * 1024) pod := &apiv1.Pod{ Spec: apiv1.PodSpec{ Containers: []apiv1.Container{ { Resources: apiv1.ResourceRequirements{ Requests: apiv1.ResourceList{ apiv1.ResourceCPU: *resource.NewMilliQuantity(cpuPerPod, resource.DecimalSI), apiv1.ResourceMemory: *resource.NewQuantity(memoryPerPod, resource.DecimalSI), }, }, }, }, }, } pods := make([]*apiv1.Pod, 0) for i := 0; i < 10; i++ { pods = append(pods, pod) } node := &apiv1.Node{ Status: apiv1.NodeStatus{ Capacity: apiv1.ResourceList{ apiv1.ResourceCPU: *resource.NewMilliQuantity(cpuPerPod*3-50, resource.DecimalSI), apiv1.ResourceMemory: *resource.NewQuantity(2*memoryPerPod, resource.DecimalSI), apiv1.ResourcePods: *resource.NewQuantity(10, resource.DecimalSI), }, }, } node.Status.Allocatable = node.Status.Capacity nodeInfo := schedulercache.NewNodeInfo() nodeInfo.SetNode(node) estimate := estimator.Estimate(pods, nodeInfo) assert.Equal(t, 5, estimate) }
func TestFilterOutSchedulable(t *testing.T) { p1 := BuildTestPod("p1", 1500, 200000) p2 := BuildTestPod("p2", 3000, 200000) p3 := BuildTestPod("p3", 100, 200000) unschedulablePods := []*kube_api.Pod{p1, p2, p3} scheduledPod1 := BuildTestPod("s1", 100, 200000) scheduledPod2 := BuildTestPod("s2", 1500, 200000) scheduledPod1.Spec.NodeName = "node1" scheduledPod2.Spec.NodeName = "node1" node := BuildTestNode("node1", 2000, 2000000) predicateChecker := simulator.NewTestPredicateChecker() res := FilterOutSchedulable(unschedulablePods, []*kube_api.Node{node}, []*kube_api.Pod{scheduledPod1}, predicateChecker) assert.Equal(t, 1, len(res)) assert.Equal(t, p2, res[0]) res2 := FilterOutSchedulable(unschedulablePods, []*kube_api.Node{node}, []*kube_api.Pod{scheduledPod1, scheduledPod2}, predicateChecker) assert.Equal(t, 2, len(res2)) assert.Equal(t, p1, res2[0]) assert.Equal(t, p2, res2[1]) }