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