Fix tolerations not parsing its options correctly, add tests
Signed-off-by: Zsolt <zsolt.szeberenyi@figured.com>pull/1053/head
							parent
							
								
									a2d5bc7cca
								
							
						
					
					
						commit
						4a226568a0
					
				| @ -0,0 +1,26 @@ | |||||||
|  | package commands | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"testing" | ||||||
|  | 
 | ||||||
|  | 	"github.com/stretchr/testify/require" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func TestCsvToMap(t *testing.T) { | ||||||
|  | 	d := []string{ | ||||||
|  | 		"\"tolerations=key=foo,value=bar;key=foo2,value=bar2\",replicas=1", | ||||||
|  | 		"namespace=default", | ||||||
|  | 	} | ||||||
|  | 	r, err := csvToMap(d) | ||||||
|  | 
 | ||||||
|  | 	require.NoError(t, err) | ||||||
|  | 
 | ||||||
|  | 	require.Contains(t, r, "tolerations") | ||||||
|  | 	require.Equal(t, r["tolerations"], "key=foo,value=bar;key=foo2,value=bar2") | ||||||
|  | 
 | ||||||
|  | 	require.Contains(t, r, "replicas") | ||||||
|  | 	require.Equal(t, r["replicas"], "1") | ||||||
|  | 
 | ||||||
|  | 	require.Contains(t, r, "namespace") | ||||||
|  | 	require.Equal(t, r["namespace"], "default") | ||||||
|  | } | ||||||
| @ -0,0 +1,230 @@ | |||||||
|  | package kubernetes | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"testing" | ||||||
|  | 
 | ||||||
|  | 	"github.com/docker/buildx/driver" | ||||||
|  | 	"github.com/docker/buildx/driver/bkimage" | ||||||
|  | 	"github.com/stretchr/testify/require" | ||||||
|  | 	v1 "k8s.io/api/core/v1" | ||||||
|  | 	"k8s.io/client-go/rest" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type mockKubeClientConfig struct { | ||||||
|  | 	clientConfig *rest.Config | ||||||
|  | 	namespace    string | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (r *mockKubeClientConfig) ClientConfig() (*rest.Config, error) { | ||||||
|  | 	return r.clientConfig, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (r *mockKubeClientConfig) Namespace() (string, bool, error) { | ||||||
|  | 	return r.namespace, true, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func TestFactory_processDriverOpts(t *testing.T) { | ||||||
|  | 	kcc := mockKubeClientConfig{ | ||||||
|  | 		clientConfig: &rest.Config{}, | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	cfg := driver.InitConfig{ | ||||||
|  | 		Name:             "buildx_buildkit_test", | ||||||
|  | 		KubeClientConfig: &kcc, | ||||||
|  | 	} | ||||||
|  | 	f := factory{} | ||||||
|  | 
 | ||||||
|  | 	t.Run( | ||||||
|  | 		"ValidOptions", func(t *testing.T) { | ||||||
|  | 			cfg.DriverOpts = map[string]string{ | ||||||
|  | 				"namespace":       "test-ns", | ||||||
|  | 				"image":           "test:latest", | ||||||
|  | 				"replicas":        "2", | ||||||
|  | 				"requests.cpu":    "100m", | ||||||
|  | 				"requests.memory": "32Mi", | ||||||
|  | 				"limits.cpu":      "200m", | ||||||
|  | 				"limits.memory":   "64Mi", | ||||||
|  | 				"rootless":        "true", | ||||||
|  | 				"nodeselector":    "selector1=value1,selector2=value2", | ||||||
|  | 				"tolerations":     "key=tolerationKey1,value=tolerationValue1,operator=Equal,effect=NoSchedule,tolerationSeconds=60;key=tolerationKey2,operator=Exists", | ||||||
|  | 				"loadbalance":     "random", | ||||||
|  | 				"qemu.install":    "true", | ||||||
|  | 				"qemu.image":      "qemu:latest", | ||||||
|  | 			} | ||||||
|  | 			ns := "test" | ||||||
|  | 
 | ||||||
|  | 			r, loadbalance, ns, err := f.processDriverOpts(cfg.Name, ns, cfg) | ||||||
|  | 
 | ||||||
|  | 			nodeSelectors := map[string]string{ | ||||||
|  | 				"selector1": "value1", | ||||||
|  | 				"selector2": "value2", | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			ts := int64(60) | ||||||
|  | 			tolerations := []v1.Toleration{ | ||||||
|  | 				{ | ||||||
|  | 					Key:               "tolerationKey1", | ||||||
|  | 					Operator:          v1.TolerationOpEqual, | ||||||
|  | 					Value:             "tolerationValue1", | ||||||
|  | 					Effect:            v1.TaintEffectNoSchedule, | ||||||
|  | 					TolerationSeconds: &ts, | ||||||
|  | 				}, | ||||||
|  | 				{ | ||||||
|  | 					Key:      "tolerationKey2", | ||||||
|  | 					Operator: v1.TolerationOpExists, | ||||||
|  | 				}, | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			require.NoError(t, err) | ||||||
|  | 
 | ||||||
|  | 			require.Equal(t, "test-ns", ns) | ||||||
|  | 			require.Equal(t, "test:latest", r.Image) | ||||||
|  | 			require.Equal(t, 2, r.Replicas) | ||||||
|  | 			require.Equal(t, "100m", r.RequestsCPU) | ||||||
|  | 			require.Equal(t, "32Mi", r.RequestsMemory) | ||||||
|  | 			require.Equal(t, "200m", r.LimitsCPU) | ||||||
|  | 			require.Equal(t, "64Mi", r.LimitsMemory) | ||||||
|  | 			require.True(t, r.Rootless) | ||||||
|  | 			require.Equal(t, nodeSelectors, r.NodeSelector) | ||||||
|  | 			require.Equal(t, tolerations, r.Tolerations) | ||||||
|  | 			require.Equal(t, LoadbalanceRandom, loadbalance) | ||||||
|  | 			require.True(t, r.Qemu.Install) | ||||||
|  | 			require.Equal(t, "qemu:latest", r.Qemu.Image) | ||||||
|  | 		}, | ||||||
|  | 	) | ||||||
|  | 
 | ||||||
|  | 	t.Run( | ||||||
|  | 		"NoOptions", func(t *testing.T) { | ||||||
|  | 			cfg.DriverOpts = map[string]string{} | ||||||
|  | 
 | ||||||
|  | 			r, loadbalance, ns, err := f.processDriverOpts(cfg.Name, "test", cfg) | ||||||
|  | 
 | ||||||
|  | 			require.NoError(t, err) | ||||||
|  | 
 | ||||||
|  | 			require.Equal(t, "test", ns) | ||||||
|  | 			require.Equal(t, bkimage.DefaultImage, r.Image) | ||||||
|  | 			require.Equal(t, 1, r.Replicas) | ||||||
|  | 			require.Equal(t, "", r.RequestsCPU) | ||||||
|  | 			require.Equal(t, "", r.RequestsMemory) | ||||||
|  | 			require.Equal(t, "", r.LimitsCPU) | ||||||
|  | 			require.Equal(t, "", r.LimitsMemory) | ||||||
|  | 			require.False(t, r.Rootless) | ||||||
|  | 			require.Empty(t, r.NodeSelector) | ||||||
|  | 			require.Empty(t, r.Tolerations) | ||||||
|  | 			require.Equal(t, LoadbalanceSticky, loadbalance) | ||||||
|  | 			require.False(t, r.Qemu.Install) | ||||||
|  | 			require.Equal(t, bkimage.QemuImage, r.Qemu.Image) | ||||||
|  | 		}, | ||||||
|  | 	) | ||||||
|  | 
 | ||||||
|  | 	t.Run( | ||||||
|  | 		"RootlessOverride", func(t *testing.T) { | ||||||
|  | 			cfg.DriverOpts = map[string]string{ | ||||||
|  | 				"rootless":    "true", | ||||||
|  | 				"loadbalance": "sticky", | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			r, loadbalance, ns, err := f.processDriverOpts(cfg.Name, "test", cfg) | ||||||
|  | 
 | ||||||
|  | 			require.NoError(t, err) | ||||||
|  | 
 | ||||||
|  | 			require.Equal(t, "test", ns) | ||||||
|  | 			require.Equal(t, bkimage.DefaultRootlessImage, r.Image) | ||||||
|  | 			require.Equal(t, 1, r.Replicas) | ||||||
|  | 			require.Equal(t, "", r.RequestsCPU) | ||||||
|  | 			require.Equal(t, "", r.RequestsMemory) | ||||||
|  | 			require.Equal(t, "", r.LimitsCPU) | ||||||
|  | 			require.Equal(t, "", r.LimitsMemory) | ||||||
|  | 			require.True(t, r.Rootless) | ||||||
|  | 			require.Empty(t, r.NodeSelector) | ||||||
|  | 			require.Empty(t, r.Tolerations) | ||||||
|  | 			require.Equal(t, LoadbalanceSticky, loadbalance) | ||||||
|  | 			require.False(t, r.Qemu.Install) | ||||||
|  | 			require.Equal(t, bkimage.QemuImage, r.Qemu.Image) | ||||||
|  | 		}, | ||||||
|  | 	) | ||||||
|  | 
 | ||||||
|  | 	t.Run( | ||||||
|  | 		"InvalidReplicas", func(t *testing.T) { | ||||||
|  | 			cfg.DriverOpts = map[string]string{ | ||||||
|  | 				"replicas": "invalid", | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			_, _, _, err := f.processDriverOpts(cfg.Name, "test", cfg) | ||||||
|  | 
 | ||||||
|  | 			require.Error(t, err) | ||||||
|  | 		}, | ||||||
|  | 	) | ||||||
|  | 
 | ||||||
|  | 	t.Run( | ||||||
|  | 		"InvalidRootless", func(t *testing.T) { | ||||||
|  | 			cfg.DriverOpts = map[string]string{ | ||||||
|  | 				"rootless": "invalid", | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			_, _, _, err := f.processDriverOpts(cfg.Name, "test", cfg) | ||||||
|  | 
 | ||||||
|  | 			require.Error(t, err) | ||||||
|  | 		}, | ||||||
|  | 	) | ||||||
|  | 
 | ||||||
|  | 	t.Run( | ||||||
|  | 		"InvalidTolerationKeyword", func(t *testing.T) { | ||||||
|  | 			cfg.DriverOpts = map[string]string{ | ||||||
|  | 				"tolerations": "key=foo,value=bar,invalid=foo2", | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			_, _, _, err := f.processDriverOpts(cfg.Name, "test", cfg) | ||||||
|  | 
 | ||||||
|  | 			require.Error(t, err) | ||||||
|  | 		}, | ||||||
|  | 	) | ||||||
|  | 
 | ||||||
|  | 	t.Run( | ||||||
|  | 		"InvalidTolerationSeconds", func(t *testing.T) { | ||||||
|  | 			cfg.DriverOpts = map[string]string{ | ||||||
|  | 				"tolerations": "key=foo,value=bar,tolerationSeconds=invalid", | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			_, _, _, err := f.processDriverOpts(cfg.Name, "test", cfg) | ||||||
|  | 
 | ||||||
|  | 			require.Error(t, err) | ||||||
|  | 		}, | ||||||
|  | 	) | ||||||
|  | 
 | ||||||
|  | 	t.Run( | ||||||
|  | 		"InvalidLoadBalance", func(t *testing.T) { | ||||||
|  | 			cfg.DriverOpts = map[string]string{ | ||||||
|  | 				"loadbalance": "invalid", | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			_, _, _, err := f.processDriverOpts(cfg.Name, "test", cfg) | ||||||
|  | 
 | ||||||
|  | 			require.Error(t, err) | ||||||
|  | 		}, | ||||||
|  | 	) | ||||||
|  | 
 | ||||||
|  | 	t.Run( | ||||||
|  | 		"InvalidQemuInstall", func(t *testing.T) { | ||||||
|  | 			cfg.DriverOpts = map[string]string{ | ||||||
|  | 				"qemu.install": "invalid", | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			_, _, _, err := f.processDriverOpts(cfg.Name, "test", cfg) | ||||||
|  | 
 | ||||||
|  | 			require.Error(t, err) | ||||||
|  | 		}, | ||||||
|  | 	) | ||||||
|  | 
 | ||||||
|  | 	t.Run( | ||||||
|  | 		"InvalidOption", func(t *testing.T) { | ||||||
|  | 			cfg.DriverOpts = map[string]string{ | ||||||
|  | 				"invalid": "foo", | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			_, _, _, err := f.processDriverOpts(cfg.Name, "test", cfg) | ||||||
|  | 
 | ||||||
|  | 			require.Error(t, err) | ||||||
|  | 		}, | ||||||
|  | 	) | ||||||
|  | } | ||||||
					Loading…
					
					
				
		Reference in New Issue
	
	 Zsolt
						Zsolt