Skip to content

Commit dfa1485

Browse files
committed
update e2e tests to work on k8s 1.24
Signed-off-by: Bryce Palmer <[email protected]>
1 parent 57aed3f commit dfa1485

File tree

1 file changed

+72
-7
lines changed

1 file changed

+72
-7
lines changed

test/e2e/v3/plugin_cluster_test.go

Lines changed: 72 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ var _ = Describe("kubebuilder", func() {
4242
Context("project version 3", func() {
4343
var (
4444
kbc *utils.TestContext
45+
sat bool
4546
)
4647

4748
BeforeEach(func() {
@@ -52,6 +53,8 @@ var _ = Describe("kubebuilder", func() {
5253

5354
By("installing the Prometheus operator")
5455
Expect(kbc.InstallPrometheusOperManager()).To(Succeed())
56+
57+
sat = false
5558
})
5659

5760
AfterEach(func() {
@@ -91,7 +94,7 @@ var _ = Describe("kubebuilder", func() {
9194
kbc.Kubectl.ServiceAccount = "default"
9295
defer func() { kbc.Kubectl.ServiceAccount = tmp }()
9396
GenerateV2(kbc)
94-
Run(kbc)
97+
Run(kbc, sat)
9598
})
9699
})
97100

@@ -116,7 +119,15 @@ var _ = Describe("kubebuilder", func() {
116119
}
117120

118121
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)
120131
})
121132
It("should generate a runnable project with the golang base plugin v3 and kustomize v4-alpha", func() {
122133
// Skip if cluster version < 1.16, when v1 CRDs and webhooks did not exist.
@@ -128,7 +139,15 @@ var _ = Describe("kubebuilder", func() {
128139
}
129140

130141
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)
132151
})
133152
It("should generate a runnable project with v1beta1 CRDs and Webhooks", func() {
134153
// Skip if cluster version < 1.15, when `.spec.preserveUnknownFields` was not a v1beta1 CRD field.
@@ -142,14 +161,14 @@ var _ = Describe("kubebuilder", func() {
142161
}
143162

144163
GenerateV3(kbc, "v1beta1")
145-
Run(kbc)
164+
Run(kbc, sat)
146165
})
147166
})
148167
})
149168
})
150169

151170
// 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) {
153172
var controllerPodName string
154173
var err error
155174

@@ -214,6 +233,10 @@ func Run(kbc *utils.TestContext) {
214233
fmt.Sprintf("--serviceaccount=%s:%s", kbc.Kubectl.Namespace, kbc.Kubectl.ServiceAccount))
215234
ExpectWithOffset(1, err).NotTo(HaveOccurred())
216235

236+
if sat {
237+
ServiceAccountToken(kbc)
238+
}
239+
217240
_ = curlMetrics(kbc)
218241

219242
By("validating that cert-manager has provisioned the certificate Secret")
@@ -324,6 +347,8 @@ func Run(kbc *utils.TestContext) {
324347
func curlMetrics(kbc *utils.TestContext) string {
325348
By("reading the metrics token")
326349
// 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.
327352
query := fmt.Sprintf(`{.items[?(@.metadata.annotations.kubernetes\.io/service-account\.name=="%s")].data.token}`,
328353
kbc.Kubectl.ServiceAccount,
329354
)
@@ -335,8 +360,7 @@ func curlMetrics(kbc *utils.TestContext) string {
335360

336361
By("creating a curl pod")
337362
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", "--",
340364
"curl", "-v", "-k", "-H", fmt.Sprintf(`Authorization: Bearer %s`, token),
341365
fmt.Sprintf("https://e2e-%s-controller-manager-metrics-service.%s.svc:8443/metrics",
342366
kbc.TestSuffix, kbc.Kubectl.Namespace),
@@ -373,3 +397,44 @@ func curlMetrics(kbc *utils.TestContext) string {
373397

374398
return metricsOutput
375399
}
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

Comments
 (0)