diff --git a/pkg/controller/controller_utils_test.go b/pkg/controller/controller_utils_test.go index bd82e48e70..0b3842c538 100644 --- a/pkg/controller/controller_utils_test.go +++ b/pkg/controller/controller_utils_test.go @@ -753,7 +753,7 @@ func TestAddOrUpdateTaintOnNode(t *testing.T) { {Key: "key1", Value: "value1", Effect: "NoSchedule"}, {Key: "key2", Value: "value2", Effect: "NoExecute"}, }, - requestCount: 3, + requestCount: 2, }, { name: "add taint to node without taints", diff --git a/pkg/util/taints/BUILD b/pkg/util/taints/BUILD index b4a657494c..754a714ae7 100644 --- a/pkg/util/taints/BUILD +++ b/pkg/util/taints/BUILD @@ -26,6 +26,7 @@ go_test( deps = [ "//pkg/api:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library", + "//vendor/k8s.io/api/core/v1:go_default_library", ], ) diff --git a/pkg/util/taints/taints.go b/pkg/util/taints/taints.go index 1822b2ec62..570724d34d 100644 --- a/pkg/util/taints/taints.go +++ b/pkg/util/taints/taints.go @@ -271,7 +271,7 @@ func AddOrUpdateTaint(node *v1.Node, taint *v1.Taint) (*v1.Node, bool, error) { updated := false for i := range nodeTaints { if taint.MatchTaint(&nodeTaints[i]) { - if helper.Semantic.DeepEqual(taint, nodeTaints[i]) { + if helper.Semantic.DeepEqual(*taint, nodeTaints[i]) { return newNode, false, nil } newTaints = append(newTaints, *taint) diff --git a/pkg/util/taints/taints_test.go b/pkg/util/taints/taints_test.go index 7ea7d791ca..e27e6ad37a 100644 --- a/pkg/util/taints/taints_test.go +++ b/pkg/util/taints/taints_test.go @@ -21,6 +21,7 @@ import ( "strings" "testing" + "k8s.io/api/core/v1" "k8s.io/kubernetes/pkg/api" "github.com/spf13/pflag" @@ -74,3 +75,39 @@ func TestTaintsVar(t *testing.T) { } } + +func TestAddOrUpdateTaint(t *testing.T) { + node := &v1.Node{} + + taint := &v1.Taint{ + Key: "foo", + Value: "bar", + Effect: v1.TaintEffectNoSchedule, + } + + checkResult := func(testCaseName string, newNode *v1.Node, expectedTaint *v1.Taint, result, expectedResult bool, err error) { + if err != nil { + t.Errorf("[%s] should not raise error but got %v", testCaseName, err) + } + if result != expectedResult { + t.Errorf("[%s] should return %t, but got: %t", testCaseName, expectedResult, result) + } + if len(newNode.Spec.Taints) != 1 || !reflect.DeepEqual(newNode.Spec.Taints[0], *expectedTaint) { + t.Errorf("[%s] node should only have one taint: %v, but got: %v", testCaseName, *expectedTaint, newNode.Spec.Taints) + } + } + + // Add a new Taint. + newNode, result, err := AddOrUpdateTaint(node, taint) + checkResult("Add New Taint", newNode, taint, result, true, err) + + // Update a Taint. + taint.Value = "bar_1" + newNode, result, err = AddOrUpdateTaint(node, taint) + checkResult("Update Taint", newNode, taint, result, true, err) + + // Add a duplicate Taint. + node = newNode + newNode, result, err = AddOrUpdateTaint(node, taint) + checkResult("Add Duplicate Taint", newNode, taint, result, false, err) +}