From 71355ced993738a4359bbfcb7a78871637678762 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Osipiuk?= <lukaszos@google.com> Date: Thu, 16 Jan 2020 18:40:24 +0100 Subject: [PATCH] Cleanup/Extend tests for SchedulerBasedPredicateChecker Change-Id: I744b22e1f5349e88af5f48f7ff3d371ef427236b --- ...scheduler_based_predicates_checker_test.go | 129 +++++++++++++----- 1 file changed, 92 insertions(+), 37 deletions(-) diff --git a/cluster-autoscaler/simulator/scheduler_based_predicates_checker_test.go b/cluster-autoscaler/simulator/scheduler_based_predicates_checker_test.go index 57b850f9d6..f05a16b8c9 100644 --- a/cluster-autoscaler/simulator/scheduler_based_predicates_checker_test.go +++ b/cluster-autoscaler/simulator/scheduler_based_predicates_checker_test.go @@ -20,58 +20,112 @@ import ( "testing" "time" - apiv1 "k8s.io/api/core/v1" . "k8s.io/autoscaler/cluster-autoscaler/utils/test" - schedulernodeinfo "k8s.io/kubernetes/pkg/scheduler/nodeinfo" "github.com/stretchr/testify/assert" + + apiv1 "k8s.io/api/core/v1" ) -func TestPredicates(t *testing.T) { - p1 := BuildTestPod("p1", 450, 500000) - p2 := BuildTestPod("p2", 600, 500000) - p3 := BuildTestPod("p3", 8000, 0) - p4 := BuildTestPod("p4", 500, 500000) - - ni1 := schedulernodeinfo.NewNodeInfo(p1) - ni2 := schedulernodeinfo.NewNodeInfo() - nodeInfos := map[string]*schedulernodeinfo.NodeInfo{ - "n1": ni1, - "n2": ni2, +func TestCheckPredicate(t *testing.T) { + p450 := BuildTestPod("p450", 450, 500000) + p600 := BuildTestPod("p600", 600, 500000) + p8000 := BuildTestPod("p8000", 8000, 0) + p500 := BuildTestPod("p500", 500, 500000) + + n1000 := BuildTestNode("n1000", 1000, 2000000) + SetNodeReadyState(n1000, true, time.Time{}) + + tests := []struct { + name string + node *apiv1.Node + scheduledPods []*apiv1.Pod + testPod *apiv1.Pod + expectError bool + }{ + { + name: "other pod - insuficient cpu", + node: n1000, + scheduledPods: []*apiv1.Pod{p450}, + testPod: p600, + expectError: true, + }, + { + name: "other pod - ok", + node: n1000, + scheduledPods: []*apiv1.Pod{p450}, + testPod: p500, + expectError: false, + }, + { + name: "empty - insuficient cpu", + node: n1000, + scheduledPods: []*apiv1.Pod{}, + testPod: p8000, + expectError: true, + }, + { + name: "empty - ok", + node: n1000, + scheduledPods: []*apiv1.Pod{}, + testPod: p600, + expectError: false, + }, } - node1 := BuildTestNode("n1", 1000, 2000000) - node2 := BuildTestNode("n2", 1000, 2000000) - SetNodeReadyState(node1, true, time.Time{}) - SetNodeReadyState(node2, true, time.Time{}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + var err error + predicateChecker, err := NewTestPredicateChecker() + clusterSnapshot := NewBasicClusterSnapshot() + err = clusterSnapshot.AddNode(tt.node) + assert.NoError(t, err) + + for _, pod := range tt.scheduledPods { + err = clusterSnapshot.AddPod(pod, tt.node.Name) + assert.NoError(t, err) + } + + predicateError := predicateChecker.CheckPredicates(clusterSnapshot, tt.testPod, FakeNodeInfoForNodeName(tt.node.Name)) + if tt.expectError { + assert.NotNil(t, predicateError) + assert.Equal(t, NotSchedulablePredicateError, predicateError.ErrorType()) + assert.Equal(t, "Insufficient cpu", predicateError.Message()) + assert.Contains(t, predicateError.VerboseMessage(), "Insufficient cpu; predicateName=NodeResourcesFit") + } else { + assert.Nil(t, predicateError) + } + }) + } +} + +func TestFitsAnyNode(t *testing.T) { + p900 := BuildTestPod("p900", 900, 1000) + p1900 := BuildTestPod("p1900", 1900, 1000) + p2100 := BuildTestPod("p2100", 2100, 1000) + + n1000 := BuildTestNode("n1000", 1000, 2000000) + n2000 := BuildTestNode("n2000", 2000, 2000000) - ni1.SetNode(node1) - ni2.SetNode(node2) + clusterSnapshot := NewBasicClusterSnapshot() + _ = clusterSnapshot.AddNode(n1000) + _ = clusterSnapshot.AddNode(n2000) predicateChecker, _ := NewTestPredicateChecker() - r1, err := predicateChecker.FitsAnyNode(nil, p2, nodeInfos) + nodeName, err := predicateChecker.FitsAnyNode(clusterSnapshot, p900, nil) assert.NoError(t, err) - assert.Equal(t, "n2", r1) + assert.True(t, nodeName == "n1000" || nodeName == "n2000") - _, err = predicateChecker.FitsAnyNode(nil, p3, nodeInfos) - assert.Error(t, err) + nodeName, err = predicateChecker.FitsAnyNode(clusterSnapshot, p1900, nil) + assert.NoError(t, err) + assert.Equal(t, "n2000", nodeName) - predicateErr := predicateChecker.CheckPredicates(nil, p2, ni1) - assert.NotNil(t, predicateErr) - assert.Equal(t, "Insufficient cpu", predicateErr.Message()) - assert.Contains(t, predicateErr.VerboseMessage(), "Insufficient cpu; predicateName=NodeResourcesFit") - - assert.NotNil(t, predicateChecker.CheckPredicates(nil, p2, ni1)) - assert.Nil(t, predicateChecker.CheckPredicates(nil, p4, ni1)) - assert.Nil(t, predicateChecker.CheckPredicates(nil, p2, ni2)) - assert.Nil(t, predicateChecker.CheckPredicates(nil, p4, ni2)) - assert.NotNil(t, predicateChecker.CheckPredicates(nil, p3, ni2)) + nodeName, err = predicateChecker.FitsAnyNode(clusterSnapshot, p2100, nil) + assert.Error(t, err) } func TestDebugInfo(t *testing.T) { p1 := BuildTestPod("p1", 0, 0) - - ni1 := schedulernodeinfo.NewNodeInfo() node1 := BuildTestNode("n1", 1000, 2000000) node1.Spec.Taints = []apiv1.Taint{ { @@ -86,11 +140,12 @@ func TestDebugInfo(t *testing.T) { }, } SetNodeReadyState(node1, true, time.Time{}) - ni1.SetNode(node1) predicateChecker, _ := NewTestPredicateChecker() + clusterSnapshot := NewBasicClusterSnapshot() + _ = clusterSnapshot.AddNode(node1) - predicateErr := predicateChecker.CheckPredicates(nil, p1, ni1) + predicateErr := predicateChecker.CheckPredicates(clusterSnapshot, p1, FakeNodeInfoForNodeName("n1")) assert.NotNil(t, predicateErr) assert.Equal(t, "node(s) had taints that the pod didn't tolerate", predicateErr.Message()) assert.Contains(t, predicateErr.VerboseMessage(), "RandomTaint") -- GitLab