github.com/olli-ai/jx/v2@v2.0.400-0.20210921045218-14731b4dd448/pkg/cmd/upgrade/upgrade_ingress_test.go (about) 1 // +build unit 2 3 package upgrade_test 4 5 import ( 6 "io/ioutil" 7 "path/filepath" 8 "testing" 9 10 "github.com/olli-ai/jx/v2/pkg/cmd/opts/upgrade" 11 12 "github.com/olli-ai/jx/v2/pkg/kube/services" 13 14 "github.com/ghodss/yaml" 15 "github.com/olli-ai/jx/v2/pkg/cmd/opts" 16 "github.com/olli-ai/jx/v2/pkg/kube" 17 "github.com/stretchr/testify/assert" 18 v1 "k8s.io/api/core/v1" 19 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 20 testclient "k8s.io/client-go/kubernetes/fake" 21 ) 22 23 type TestOptions struct { 24 upgrade.UpgradeIngressOptions 25 Service *v1.Service 26 } 27 28 func (o *TestOptions) Setup() { 29 o.UpgradeIngressOptions = upgrade.UpgradeIngressOptions{ 30 CommonOptions: &opts.CommonOptions{}, 31 IngressConfig: kube.IngressConfig{ 32 Issuer: "letsencrypt-prod", 33 }, 34 TargetNamespaces: []string{"test"}, 35 } 36 o.SetKubeClient(testclient.NewSimpleClientset()) 37 38 o.Service = &v1.Service{ 39 ObjectMeta: metav1.ObjectMeta{ 40 Name: "foo", 41 }, 42 Spec: v1.ServiceSpec{}, 43 } 44 45 o.Service.Annotations = map[string]string{} 46 o.Service.Annotations[services.ExposeAnnotation] = "true" 47 } 48 49 func TestAnnotateNoExisting(t *testing.T) { 50 t.Parallel() 51 o := TestOptions{} 52 o.Setup() 53 54 client, err := o.KubeClient() 55 assert.NoError(t, err) 56 _, err = client.CoreV1().Services("test").Create(o.Service) 57 assert.NoError(t, err) 58 59 err = o.CleanServiceAnnotations() 60 assert.NoError(t, err) 61 62 _, err = o.AnnotateExposedServicesWithCertManager() 63 assert.NoError(t, err) 64 65 rs, err := client.CoreV1().Services("test").Get("foo", metav1.GetOptions{}) 66 ingressAnnotations := rs.Annotations[services.ExposeIngressAnnotation] 67 68 assert.Equal(t, "certmanager.k8s.io/issuer: letsencrypt-prod", ingressAnnotations) 69 assert.NoError(t, err) 70 } 71 72 func TestAnnotateWithExistingAnnotations(t *testing.T) { 73 74 o := TestOptions{} 75 o.Setup() 76 77 o.Service.Annotations[services.ExposeIngressAnnotation] = "foo: bar\nkubernetes.io/ingress.class: nginx\nnginx.ingress.kubernetes.io/proxy-body-size: 500m" 78 79 client, err := o.KubeClient() 80 assert.NoError(t, err) 81 82 _, err = client.CoreV1().Services("test").Create(o.Service) 83 assert.NoError(t, err) 84 85 err = o.CleanServiceAnnotations() 86 assert.NoError(t, err) 87 88 _, err = o.AnnotateExposedServicesWithCertManager() 89 assert.NoError(t, err) 90 91 rs, err := client.CoreV1().Services("test").Get("foo", metav1.GetOptions{}) 92 ingressAnnotations := rs.Annotations[services.ExposeIngressAnnotation] 93 94 assert.Equal(t, "foo: bar\nkubernetes.io/ingress.class: nginx\nnginx.ingress.kubernetes.io/proxy-body-size: 500m\ncertmanager.k8s.io/issuer: letsencrypt-prod", ingressAnnotations) 95 assert.NoError(t, err) 96 } 97 98 func TestAnnotateWithExistingCertManagerAnnotation(t *testing.T) { 99 t.Parallel() 100 o := TestOptions{} 101 o.Setup() 102 103 o.Service.Annotations[services.ExposeIngressAnnotation] = services.CertManagerAnnotation + ": letsencrypt-staging" 104 105 client, err := o.KubeClient() 106 assert.NoError(t, err) 107 108 _, err = client.CoreV1().Services("test").Create(o.Service) 109 assert.NoError(t, err) 110 111 err = o.CleanServiceAnnotations() 112 assert.NoError(t, err) 113 114 _, err = o.AnnotateExposedServicesWithCertManager() 115 assert.NoError(t, err) 116 117 rs, err := client.CoreV1().Services("test").Get("foo", metav1.GetOptions{}) 118 ingressAnnotations := rs.Annotations[services.ExposeIngressAnnotation] 119 120 assert.Equal(t, "certmanager.k8s.io/issuer: letsencrypt-prod", ingressAnnotations) 121 assert.NoError(t, err) 122 } 123 124 func TestCleanExistingExposecontrollerReources(t *testing.T) { 125 t.Parallel() 126 o := TestOptions{} 127 o.Setup() 128 129 cm := v1.ConfigMap{ 130 ObjectMeta: metav1.ObjectMeta{ 131 Name: "exposecontroller", 132 }, 133 } 134 client, err := o.KubeClient() 135 assert.NoError(t, err) 136 137 _, err = client.CoreV1().ConfigMaps("test").Create(&cm) 138 assert.NoError(t, err) 139 o.CleanExposecontrollerReources("test") 140 141 _, err = client.CoreV1().ConfigMaps("test").Get("exposecontroller", metav1.GetOptions{}) 142 assert.Error(t, err) 143 } 144 145 func TestCleanServiceAnnotations(t *testing.T) { 146 t.Parallel() 147 o := TestOptions{} 148 o.Setup() 149 150 o.Service.Annotations[services.ExposeURLAnnotation] = "http://foo.bar" 151 152 client, err := o.KubeClient() 153 assert.NoError(t, err) 154 155 _, err = client.CoreV1().Services("test").Create(o.Service) 156 assert.NoError(t, err) 157 158 err = o.CleanServiceAnnotations() 159 assert.NoError(t, err) 160 161 rs, err := client.CoreV1().Services("test").Get("foo", metav1.GetOptions{}) 162 163 assert.Empty(t, rs.Annotations[services.ExposeURLAnnotation]) 164 assert.NoError(t, err) 165 } 166 167 func TestRealJenkinsService(t *testing.T) { 168 t.Parallel() 169 filename := filepath.Join(".", "test_data", "upgrade_ingress", "service.yaml") 170 serviceYaml, err := ioutil.ReadFile(filename) 171 assert.NoError(t, err) 172 173 var svc *v1.Service 174 err = yaml.Unmarshal(serviceYaml, &svc) 175 assert.NoError(t, err) 176 177 o := TestOptions{} 178 o.Setup() 179 180 o.Service = svc 181 182 client, err := o.KubeClient() 183 assert.NoError(t, err) 184 185 _, err = client.CoreV1().Services("test").Create(o.Service) 186 assert.NoError(t, err) 187 188 err = o.CleanServiceAnnotations() 189 assert.NoError(t, err) 190 191 _, err = o.AnnotateExposedServicesWithCertManager() 192 assert.NoError(t, err) 193 194 rs, err := client.CoreV1().Services("test").Get("jenkins", metav1.GetOptions{}) 195 ingressAnnotations := rs.Annotations[services.ExposeIngressAnnotation] 196 197 assert.Equal(t, "kubernetes.io/ingress.class: nginx\nnginx.ingress.kubernetes.io/proxy-body-size: 500m\ncertmanager.k8s.io/issuer: letsencrypt-prod", ingressAnnotations) 198 assert.NoError(t, err) 199 } 200 201 func TestReturnUserNameIfPicked_notPicked(t *testing.T) { 202 t.Parallel() 203 organisation := "MyOrg" 204 username := "MyUser" 205 206 actual := upgrade.ReturnUserNameIfPicked(organisation, username) 207 expected := "" 208 assert.Equal(t, expected, actual, "Username should be empty an organization was picked") 209 } 210 211 func TestReturnUserNameIfPicked_wasPicked(t *testing.T) { 212 t.Parallel() 213 organisation := "" 214 username := "MyUser" 215 216 actual := upgrade.ReturnUserNameIfPicked(organisation, username) 217 expected := username 218 assert.Equal(t, expected, actual, "Username should be returned as no organization was picked") 219 }