@@ -42,6 +42,7 @@ var _ = Describe("kubebuilder", func() {
42
42
Context ("project version 3" , func () {
43
43
var (
44
44
kbc * utils.TestContext
45
+ sat bool
45
46
)
46
47
47
48
BeforeEach (func () {
@@ -52,6 +53,8 @@ var _ = Describe("kubebuilder", func() {
52
53
53
54
By ("installing the Prometheus operator" )
54
55
Expect (kbc .InstallPrometheusOperManager ()).To (Succeed ())
56
+
57
+ sat = false
55
58
})
56
59
57
60
AfterEach (func () {
@@ -91,7 +94,7 @@ var _ = Describe("kubebuilder", func() {
91
94
kbc .Kubectl .ServiceAccount = "default"
92
95
defer func () { kbc .Kubectl .ServiceAccount = tmp }()
93
96
GenerateV2 (kbc )
94
- Run (kbc )
97
+ Run (kbc , sat )
95
98
})
96
99
})
97
100
@@ -116,7 +119,15 @@ var _ = Describe("kubebuilder", func() {
116
119
}
117
120
118
121
GenerateV3 (kbc , "v1" )
119
- Run (kbc )
122
+
123
+ // only if running on Kubernetes >= 1.24 do we need to generate the ServiceAccount token Secret
124
+ // TODO: Remove this once a better implementation using something like the TokenRequest API
125
+ // is used in the e2e tests
126
+ if srvVer := kbc .K8sVersion .ServerVersion ; srvVer .GetMajorInt () == 1 && srvVer .GetMinorInt () >= 24 {
127
+ sat = true
128
+ }
129
+
130
+ Run (kbc , sat )
120
131
})
121
132
It ("should generate a runnable project with the golang base plugin v3 and kustomize v4-alpha" , func () {
122
133
// Skip if cluster version < 1.16, when v1 CRDs and webhooks did not exist.
@@ -128,7 +139,15 @@ var _ = Describe("kubebuilder", func() {
128
139
}
129
140
130
141
GenerateV3WithKustomizeV2 (kbc , "v1" )
131
- Run (kbc )
142
+
143
+ // only if running on Kubernetes >= 1.24 do we need to generate the ServiceAccount token Secret
144
+ // TODO: Remove this once a better implementation using something like the TokenRequest API
145
+ // is used in the e2e tests
146
+ if srvVer := kbc .K8sVersion .ServerVersion ; srvVer .GetMajorInt () == 1 && srvVer .GetMinorInt () >= 24 {
147
+ sat = true
148
+ }
149
+
150
+ Run (kbc , sat )
132
151
})
133
152
It ("should generate a runnable project with v1beta1 CRDs and Webhooks" , func () {
134
153
// Skip if cluster version < 1.15, when `.spec.preserveUnknownFields` was not a v1beta1 CRD field.
@@ -142,14 +161,14 @@ var _ = Describe("kubebuilder", func() {
142
161
}
143
162
144
163
GenerateV3 (kbc , "v1beta1" )
145
- Run (kbc )
164
+ Run (kbc , sat )
146
165
})
147
166
})
148
167
})
149
168
})
150
169
151
170
// Run runs a set of e2e tests for a scaffolded project defined by a TestContext.
152
- func Run (kbc * utils.TestContext ) {
171
+ func Run (kbc * utils.TestContext , sat bool ) {
153
172
var controllerPodName string
154
173
var err error
155
174
@@ -214,6 +233,10 @@ func Run(kbc *utils.TestContext) {
214
233
fmt .Sprintf ("--serviceaccount=%s:%s" , kbc .Kubectl .Namespace , kbc .Kubectl .ServiceAccount ))
215
234
ExpectWithOffset (1 , err ).NotTo (HaveOccurred ())
216
235
236
+ if sat {
237
+ ServiceAccountToken (kbc )
238
+ }
239
+
217
240
_ = curlMetrics (kbc )
218
241
219
242
By ("validating that cert-manager has provisioned the certificate Secret" )
@@ -324,6 +347,8 @@ func Run(kbc *utils.TestContext) {
324
347
func curlMetrics (kbc * utils.TestContext ) string {
325
348
By ("reading the metrics token" )
326
349
// Filter token query by service account in case more than one exists in a namespace.
350
+ // TODO: Parsing a token this way is not ideal or best practice and should not be used.
351
+ // Instead, a TokenRequest should be created to get a token to use for this step.
327
352
query := fmt .Sprintf (`{.items[?(@.metadata.annotations.kubernetes\.io/service-account\.name=="%s")].data.token}` ,
328
353
kbc .Kubectl .ServiceAccount ,
329
354
)
@@ -335,8 +360,7 @@ func curlMetrics(kbc *utils.TestContext) string {
335
360
336
361
By ("creating a curl pod" )
337
362
cmdOpts := []string {
338
- "run" , "curl" , "--image=curlimages/curl:7.68.0" , "--restart=OnFailure" ,
339
- "--serviceaccount=" + kbc .Kubectl .ServiceAccount , "--" ,
363
+ "run" , "curl" , "--image=curlimages/curl:7.68.0" , "--restart=OnFailure" , "--" ,
340
364
"curl" , "-v" , "-k" , "-H" , fmt .Sprintf (`Authorization: Bearer %s` , token ),
341
365
fmt .Sprintf ("https://e2e-%s-controller-manager-metrics-service.%s.svc:8443/metrics" ,
342
366
kbc .TestSuffix , kbc .Kubectl .Namespace ),
@@ -373,3 +397,44 @@ func curlMetrics(kbc *utils.TestContext) string {
373
397
374
398
return metricsOutput
375
399
}
400
+
401
+ // TODO: Remove this when and other related functions when
402
+ // tests have been changed to use a better implementation.
403
+ // ServiceAccountToken creates the ServiceAccount token Secret.
404
+ // This is to be used when Kubernetes cluster version is >= 1.24.
405
+ // In k8s 1.24+ a ServiceAccount token Secret is no longer
406
+ // automatically generated
407
+ func ServiceAccountToken (kbc * utils.TestContext ) {
408
+ // As of Kubernetes 1.24 a ServiceAccount no longer has a ServiceAccount token
409
+ // secret autogenerated. We have to create it manually here
410
+ By ("Creating the ServiceAccount token" )
411
+ secretFile , err := createServiceAccountToken (kbc .Kubectl .ServiceAccount , kbc .Dir )
412
+ Expect (err ).NotTo (HaveOccurred ())
413
+ Eventually (func () error {
414
+ _ , err = kbc .Kubectl .Apply (true , "-f" , secretFile )
415
+ return err
416
+ }, time .Minute , time .Second ).Should (Succeed ())
417
+ }
418
+
419
+ var saSecretTemplate = `---
420
+ apiVersion: v1
421
+ kind: Secret
422
+ type: kubernetes.io/service-account-token
423
+ metadata:
424
+ name: %s
425
+ annotations:
426
+ kubernetes.io/service-account.name: "%s"
427
+ `
428
+
429
+ // createServiceAccountToken writes a service account token secret to a file.
430
+ // It returns a string to the file or an error if it fails to write the file
431
+ func createServiceAccountToken (name string , dir string ) (string , error ) {
432
+ secretName := name + "-secret"
433
+ fileName := dir + "/" + secretName + ".yaml"
434
+ err := os .WriteFile (fileName , []byte (fmt .Sprintf (saSecretTemplate , secretName , name )), 0777 )
435
+ if err != nil {
436
+ return "" , err
437
+ }
438
+
439
+ return fileName , nil
440
+ }
0 commit comments