192 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			192 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Go
		
	
	
	
/*
 | 
						|
Copyright 2016 The Kubernetes Authors.
 | 
						|
 | 
						|
Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
you may not use this file except in compliance with the License.
 | 
						|
You may obtain a copy of the License at
 | 
						|
 | 
						|
    http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
 | 
						|
Unless required by applicable law or agreed to in writing, software
 | 
						|
distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
See the License for the specific language governing permissions and
 | 
						|
limitations under the License.
 | 
						|
*/
 | 
						|
 | 
						|
// This code is directly lifted from the Kubernetes codebase.
 | 
						|
// For reference:
 | 
						|
// https://github.com/kubernetes/kubernetes/blob/release-1.23/staging/src/k8s.io/kubectl/pkg/cmd/taint/utils_test.go#L372-L533
 | 
						|
 | 
						|
package lifted
 | 
						|
 | 
						|
import (
 | 
						|
	"reflect"
 | 
						|
	"testing"
 | 
						|
 | 
						|
	corev1 "k8s.io/api/core/v1"
 | 
						|
)
 | 
						|
 | 
						|
func TestParseTaints(t *testing.T) {
 | 
						|
	cases := []struct {
 | 
						|
		name                   string
 | 
						|
		spec                   []string
 | 
						|
		expectedTaints         []corev1.Taint
 | 
						|
		expectedTaintsToRemove []corev1.Taint
 | 
						|
		expectedErr            bool
 | 
						|
	}{
 | 
						|
		{
 | 
						|
			name:        "invalid spec format",
 | 
						|
			spec:        []string{""},
 | 
						|
			expectedErr: true,
 | 
						|
		},
 | 
						|
		{
 | 
						|
			name:        "invalid spec format",
 | 
						|
			spec:        []string{"foo=abc"},
 | 
						|
			expectedErr: true,
 | 
						|
		},
 | 
						|
		{
 | 
						|
			name:        "invalid spec format",
 | 
						|
			spec:        []string{"foo=abc=xyz:NoSchedule"},
 | 
						|
			expectedErr: true,
 | 
						|
		},
 | 
						|
		{
 | 
						|
			name:        "invalid spec format",
 | 
						|
			spec:        []string{"foo=abc:xyz:NoSchedule"},
 | 
						|
			expectedErr: true,
 | 
						|
		},
 | 
						|
		{
 | 
						|
			name:        "invalid spec format for adding taint",
 | 
						|
			spec:        []string{"foo"},
 | 
						|
			expectedErr: true,
 | 
						|
		},
 | 
						|
		{
 | 
						|
			name:        "invalid spec effect for adding taint",
 | 
						|
			spec:        []string{"foo=abc:invalid_effect"},
 | 
						|
			expectedErr: true,
 | 
						|
		},
 | 
						|
		{
 | 
						|
			name:        "invalid spec effect for deleting taint",
 | 
						|
			spec:        []string{"foo:invalid_effect-"},
 | 
						|
			expectedErr: true,
 | 
						|
		},
 | 
						|
		{
 | 
						|
			name: "add new taints",
 | 
						|
			spec: []string{"foo=abc:NoSchedule", "bar=abc:NoSchedule", "baz:NoSchedule", "qux:NoSchedule", "foobar=:NoSchedule"},
 | 
						|
			expectedTaints: []corev1.Taint{
 | 
						|
				{
 | 
						|
					Key:    "foo",
 | 
						|
					Value:  "abc",
 | 
						|
					Effect: corev1.TaintEffectNoSchedule,
 | 
						|
				},
 | 
						|
				{
 | 
						|
					Key:    "bar",
 | 
						|
					Value:  "abc",
 | 
						|
					Effect: corev1.TaintEffectNoSchedule,
 | 
						|
				},
 | 
						|
				{
 | 
						|
					Key:    "baz",
 | 
						|
					Value:  "",
 | 
						|
					Effect: corev1.TaintEffectNoSchedule,
 | 
						|
				},
 | 
						|
				{
 | 
						|
					Key:    "qux",
 | 
						|
					Value:  "",
 | 
						|
					Effect: corev1.TaintEffectNoSchedule,
 | 
						|
				},
 | 
						|
				{
 | 
						|
					Key:    "foobar",
 | 
						|
					Value:  "",
 | 
						|
					Effect: corev1.TaintEffectNoSchedule,
 | 
						|
				},
 | 
						|
			},
 | 
						|
			expectedErr: false,
 | 
						|
		},
 | 
						|
		{
 | 
						|
			name: "delete taints",
 | 
						|
			spec: []string{"foo:NoSchedule-", "bar:NoSchedule-", "qux=:NoSchedule-", "dedicated-"},
 | 
						|
			expectedTaintsToRemove: []corev1.Taint{
 | 
						|
				{
 | 
						|
					Key:    "foo",
 | 
						|
					Effect: corev1.TaintEffectNoSchedule,
 | 
						|
				},
 | 
						|
				{
 | 
						|
					Key:    "bar",
 | 
						|
					Effect: corev1.TaintEffectNoSchedule,
 | 
						|
				},
 | 
						|
				{
 | 
						|
					Key:    "qux",
 | 
						|
					Effect: corev1.TaintEffectNoSchedule,
 | 
						|
				},
 | 
						|
				{
 | 
						|
					Key: "dedicated",
 | 
						|
				},
 | 
						|
			},
 | 
						|
			expectedErr: false,
 | 
						|
		},
 | 
						|
		{
 | 
						|
			name: "add taints and delete taints",
 | 
						|
			spec: []string{"foo=abc:NoSchedule", "bar=abc:NoSchedule", "baz:NoSchedule", "qux:NoSchedule", "foobar=:NoSchedule", "foo:NoSchedule-", "bar:NoSchedule-", "baz=:NoSchedule-"},
 | 
						|
			expectedTaints: []corev1.Taint{
 | 
						|
				{
 | 
						|
					Key:    "foo",
 | 
						|
					Value:  "abc",
 | 
						|
					Effect: corev1.TaintEffectNoSchedule,
 | 
						|
				},
 | 
						|
				{
 | 
						|
					Key:    "bar",
 | 
						|
					Value:  "abc",
 | 
						|
					Effect: corev1.TaintEffectNoSchedule,
 | 
						|
				},
 | 
						|
				{
 | 
						|
					Key:    "baz",
 | 
						|
					Value:  "",
 | 
						|
					Effect: corev1.TaintEffectNoSchedule,
 | 
						|
				},
 | 
						|
				{
 | 
						|
					Key:    "qux",
 | 
						|
					Value:  "",
 | 
						|
					Effect: corev1.TaintEffectNoSchedule,
 | 
						|
				},
 | 
						|
				{
 | 
						|
					Key:    "foobar",
 | 
						|
					Value:  "",
 | 
						|
					Effect: corev1.TaintEffectNoSchedule,
 | 
						|
				},
 | 
						|
			},
 | 
						|
			expectedTaintsToRemove: []corev1.Taint{
 | 
						|
				{
 | 
						|
					Key:    "foo",
 | 
						|
					Effect: corev1.TaintEffectNoSchedule,
 | 
						|
				},
 | 
						|
				{
 | 
						|
					Key:    "bar",
 | 
						|
					Effect: corev1.TaintEffectNoSchedule,
 | 
						|
				},
 | 
						|
				{
 | 
						|
					Key:    "baz",
 | 
						|
					Value:  "",
 | 
						|
					Effect: corev1.TaintEffectNoSchedule,
 | 
						|
				},
 | 
						|
			},
 | 
						|
			expectedErr: false,
 | 
						|
		},
 | 
						|
	}
 | 
						|
 | 
						|
	for _, c := range cases {
 | 
						|
		taints, taintsToRemove, err := ParseTaints(c.spec)
 | 
						|
		if c.expectedErr && err == nil {
 | 
						|
			t.Errorf("[%s] expected error for spec %s, but got nothing", c.name, c.spec)
 | 
						|
		}
 | 
						|
		if !c.expectedErr && err != nil {
 | 
						|
			t.Errorf("[%s] expected no error for spec %s, but got: %v", c.name, c.spec, err)
 | 
						|
		}
 | 
						|
		if !reflect.DeepEqual(c.expectedTaints, taints) {
 | 
						|
			t.Errorf("[%s] expected returen taints as %v, but got: %v", c.name, c.expectedTaints, taints)
 | 
						|
		}
 | 
						|
		if !reflect.DeepEqual(c.expectedTaintsToRemove, taintsToRemove) {
 | 
						|
			t.Errorf("[%s] expected return taints to be removed as %v, but got: %v", c.name, c.expectedTaintsToRemove, taintsToRemove)
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |