github.com/jenkins-x/jx/v2@v2.1.155/pkg/kube/jx_install_config_test.go (about) 1 // +build unit 2 3 package kube_test 4 5 import ( 6 "errors" 7 "testing" 8 9 "github.com/jenkins-x/jx/v2/pkg/kube" 10 "github.com/jenkins-x/jx/v2/pkg/util" 11 "github.com/stretchr/testify/assert" 12 13 v1 "k8s.io/api/core/v1" 14 meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" 15 "k8s.io/apimachinery/pkg/runtime" 16 mock "k8s.io/client-go/kubernetes/fake" 17 k8sTesting "k8s.io/client-go/testing" 18 ) 19 20 func buildConfigMap(jxInstallConfig *kube.JXInstallConfig, ns string) *v1.ConfigMap { 21 config := util.ToStringMapStringFromStruct(jxInstallConfig) 22 cm := &v1.ConfigMap{ 23 Data: config, 24 ObjectMeta: meta_v1.ObjectMeta{ 25 Name: kube.ConfigMapNameJXInstallConfig, 26 Namespace: ns, 27 }, 28 } 29 return cm 30 } 31 32 func TestToStringMapStringFromStructJXInstallConfig(t *testing.T) { 33 t.Parallel() 34 jxInstallConfig := &kube.JXInstallConfig{ 35 Server: "derek.zoolander.reallygoodlooking.com", 36 CA: []byte{0x49, 0x43, 0x41, 0x54}, 37 } 38 39 m := util.ToStringMapStringFromStruct(jxInstallConfig) 40 41 assert.Equal(t, 3, len(m)) 42 assert.Equal(t, "derek.zoolander.reallygoodlooking.com", m["server"]) 43 assert.Equal(t, "ICAT", m["ca.crt"]) 44 } 45 46 func TestSaveAsConfigMapExistingCM(t *testing.T) { 47 t.Parallel() 48 ns := "my-namespace" 49 jxInstallConfig := &kube.JXInstallConfig{ 50 Server: "derek.zoolander.reallygoodlooking.com", 51 CA: []byte{0x49, 0x43, 0x41, 0x54}, 52 } 53 54 // Build a config map from our JXInstallConfig struct and a ns string 55 cm := buildConfigMap(jxInstallConfig, ns) 56 57 // Setup mock Kubernetes client api (pass objects to set as existing resources) 58 kubernetesInterface := mock.NewSimpleClientset(cm) 59 60 // Run our method 61 _, err := kube.SaveAsConfigMap(kubernetesInterface, kube.ConfigMapNameJXInstallConfig, ns, jxInstallConfig) 62 63 // Get Kubernetes client api actions 64 actions := kubernetesInterface.Actions() 65 66 assert.NoError(t, err) 67 assert.Equal(t, 2, len(actions)) 68 assert.Equal(t, "get", actions[0].GetVerb()) 69 assert.Equal(t, ns, actions[0].GetNamespace()) 70 assert.Equal(t, "update", actions[1].GetVerb()) 71 assert.Equal(t, ns, actions[1].GetNamespace()) 72 } 73 74 func TestSaveAsConfigMapNoCM(t *testing.T) { 75 t.Parallel() 76 ns := "my-namespace" 77 jxInstallConfig := &kube.JXInstallConfig{ 78 Server: "derek.zoolander.reallygoodlooking.com", 79 CA: []byte{0x49, 0x43, 0x41, 0x54}, 80 } 81 82 kubernetesInterface := mock.NewSimpleClientset() 83 84 _, err := kube.SaveAsConfigMap(kubernetesInterface, kube.ConfigMapNameJXInstallConfig, ns, jxInstallConfig) 85 86 actions := kubernetesInterface.Actions() 87 88 assert.NoError(t, err) 89 assert.Equal(t, 2, len(actions)) 90 assert.Equal(t, "get", actions[0].GetVerb()) 91 assert.Equal(t, ns, actions[0].GetNamespace()) 92 assert.Equal(t, "create", actions[1].GetVerb()) 93 assert.Equal(t, ns, actions[1].GetNamespace()) 94 } 95 96 func TestSaveAsConfigMapCreateError(t *testing.T) { 97 t.Parallel() 98 ns := "my-namespace" 99 100 jxInstallConfig := &kube.JXInstallConfig{ 101 Server: "derek.zoolander.reallygoodlooking.com", 102 CA: []byte{0x49, 0x43, 0x41, 0x54}, 103 } 104 105 kubernetesInterface := mock.NewSimpleClientset() 106 107 // Note Using AddReactor will not work here as reactors are already registered through NewSimpleClientset() 108 // Prepend reactor to catch action and perform custom logic. In this case return an error on configmap create. 109 kubernetesInterface.PrependReactor("create", "configmaps", func(action k8sTesting.Action) (handled bool, ret runtime.Object, err error) { 110 return true, nil, errors.New("KABOOM") 111 }) 112 113 _, err := kube.SaveAsConfigMap(kubernetesInterface, kube.ConfigMapNameJXInstallConfig, ns, jxInstallConfig) 114 115 actions := kubernetesInterface.Actions() 116 117 assert.Error(t, err) 118 assert.Equal(t, 2, len(actions)) 119 assert.Equal(t, "get", actions[0].GetVerb()) 120 assert.Equal(t, ns, actions[0].GetNamespace()) 121 assert.Equal(t, "create", actions[1].GetVerb()) 122 assert.Equal(t, ns, actions[1].GetNamespace()) 123 } 124 125 func TestSaveAsConfigMapUpdateError(t *testing.T) { 126 t.Parallel() 127 ns := "my-namespace" 128 129 jxInstallConfig := &kube.JXInstallConfig{ 130 Server: "derek.zoolander.reallygoodlooking.com", 131 CA: []byte{0x49, 0x43, 0x41, 0x54}, 132 } 133 134 cm := buildConfigMap(jxInstallConfig, ns) 135 136 kubernetesInterface := mock.NewSimpleClientset(cm) 137 138 kubernetesInterface.PrependReactor("update", "configmaps", func(action k8sTesting.Action) (handled bool, ret runtime.Object, err error) { 139 return true, nil, errors.New("KABOOM") 140 }) 141 142 _, err := kube.SaveAsConfigMap(kubernetesInterface, kube.ConfigMapNameJXInstallConfig, ns, jxInstallConfig) 143 144 actions := kubernetesInterface.Actions() 145 146 assert.Error(t, err) 147 assert.Equal(t, 2, len(actions)) 148 assert.Equal(t, "get", actions[0].GetVerb()) 149 assert.Equal(t, ns, actions[0].GetNamespace()) 150 assert.Equal(t, "update", actions[1].GetVerb()) 151 assert.Equal(t, ns, actions[1].GetNamespace()) 152 }