Skip to content

Commit da538ee

Browse files
authored
Merge pull request #4825 from camilamacedo86/add-e2e-test
✨ (go/v4): Improved conversion webhook implementation by adding default logic to copy ObjectMeta (name, namespace, labels, etc.). Included example usage for clarity.
2 parents e3982be + 8f391cc commit da538ee

File tree

8 files changed

+88
-19
lines changed

8 files changed

+88
-19
lines changed

docs/book/src/multiversion-tutorial/testdata/project/api/v2/cronjob_conversion.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ func (src *CronJob) ConvertTo(dstRaw conversion.Hub) error {
9191
dst.Status.LastScheduleTime = src.Status.LastScheduleTime
9292

9393
// +kubebuilder:docs-gen:collapse=rote conversion
94+
9495
return nil
9596
}
9697

@@ -141,5 +142,6 @@ func (dst *CronJob) ConvertFrom(srcRaw conversion.Hub) error {
141142
dst.Status.LastScheduleTime = src.Status.LastScheduleTime
142143

143144
// +kubebuilder:docs-gen:collapse=rote conversion
145+
144146
return nil
145147
}

hack/docs/internal/multiversion-tutorial/generate_multiversion.go

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -355,12 +355,22 @@ methods to convert to/from the hub version.
355355
hackutils.CheckError("adding comment to hub v2", err)
356356

357357
err = pluginutil.ReplaceInFile(path,
358-
"// TODO(user): Implement conversion logic from v2 to v1",
358+
`// TODO(user): Implement conversion logic from v2 to v1
359+
// Example: Copying Spec fields
360+
// dst.Spec.Size = src.Spec.Replicas
361+
362+
// Copy ObjectMeta to preserve name, namespace, labels, etc.
363+
dst.ObjectMeta = src.ObjectMeta`,
359364
hubV2CovertTo)
360365
hackutils.CheckError("replace covertTo at hub v2", err)
361366

362367
err = pluginutil.ReplaceInFile(path,
363-
"// TODO(user): Implement conversion logic from v1 to v2",
368+
`// TODO(user): Implement conversion logic from v1 to v2
369+
// Example: Copying Spec fields
370+
// dst.Spec.Replicas = src.Spec.Size
371+
372+
// Copy ObjectMeta to preserve name, namespace, labels, etc.
373+
dst.ObjectMeta = src.ObjectMeta`,
364374
hubV2ConvertFromCode)
365375
hackutils.CheckError("replace covert from at hub v2", err)
366376

pkg/plugins/golang/v4/scaffolds/internal/templates/api/spoke.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,14 @@ func (src *{{ .Resource.Kind }}) ConvertTo(dstRaw conversion.Hub) error {
7979
dst := dstRaw.(*{{ .Resource.ImportAlias }}.{{ .Resource.Kind }})
8080
log.Printf("ConvertTo: Converting {{ .Resource.Kind }} from Spoke version {{ .SpokeVersion }} to Hub version {{ .Resource.Version }};" +
8181
"source: %s/%s, target: %s/%s", src.Namespace, src.Name, dst.Namespace, dst.Name)
82-
82+
8383
// TODO(user): Implement conversion logic from {{ .SpokeVersion }} to {{ .Resource.Version }}
84+
// Example: Copying Spec fields
85+
// dst.Spec.Size = src.Spec.Replicas
86+
87+
// Copy ObjectMeta to preserve name, namespace, labels, etc.
88+
dst.ObjectMeta = src.ObjectMeta
89+
8490
return nil
8591
}
8692
@@ -91,6 +97,12 @@ func (dst *{{ .Resource.Kind }}) ConvertFrom(srcRaw conversion.Hub) error {
9197
"source: %s/%s, target: %s/%s", src.Namespace, src.Name, dst.Namespace, dst.Name)
9298
9399
// TODO(user): Implement conversion logic from {{ .Resource.Version }} to {{ .SpokeVersion }}
100+
// Example: Copying Spec fields
101+
// dst.Spec.Replicas = src.Spec.Size
102+
103+
// Copy ObjectMeta to preserve name, namespace, labels, etc.
104+
dst.ObjectMeta = src.ObjectMeta
105+
94106
return nil
95107
}
96108
`

test/e2e/v4/generate_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -430,13 +430,13 @@ func scaffoldConversionWebhook(kbc *utils.TestContext) {
430430
)).NotTo(HaveOccurred(), "failed to add replicas spec to conversiontest_conversion.go v2")
431431

432432
err = pluginutil.ReplaceInFile(filepath.Join(kbc.Dir, "api/v2/conversiontest_conversion.go"),
433-
"// TODO(user): Implement conversion logic from v1 to v2",
434-
`src.Spec.Size = dst.Spec.Replicas`)
433+
"// dst.Spec.Size = src.Spec.Replicas",
434+
"dst.Spec.Size = src.Spec.Replicas")
435435
Expect(err).NotTo(HaveOccurred(), "failed to implement conversion logic from v1 to v2")
436436

437437
err = pluginutil.ReplaceInFile(filepath.Join(kbc.Dir, "api/v2/conversiontest_conversion.go"),
438-
"// TODO(user): Implement conversion logic from v2 to v1",
439-
`src.Spec.Replicas = dst.Spec.Size`)
438+
"// dst.Spec.Replicas = src.Spec.Size",
439+
"dst.Spec.Replicas = src.Spec.Size")
440440
Expect(err).NotTo(HaveOccurred(), "failed to implement conversion logic from v2 to v1")
441441
}
442442

test/e2e/v4/plugin_cluster_test.go

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -389,26 +389,35 @@ func Run(kbc *utils.TestContext, hasWebhook, isToUseInstaller, isToUseHelmChart,
389389
By("modifying the ConversionTest CR sample to set `size` for conversion testing")
390390
conversionCRFile := filepath.Join("config", "samples",
391391
fmt.Sprintf("%s_v1_conversiontest.yaml", kbc.Group))
392-
conversionCRPath, err := filepath.Abs(filepath.Join(fmt.Sprintf("e2e-%s", kbc.TestSuffix), conversionCRFile))
393-
Expect(err).To(Not(HaveOccurred()))
392+
conversionCRPath := filepath.Join(kbc.Dir, conversionCRFile)
394393

395394
// Edit the file to include `size` in the spec field for v1
396-
f, err := os.OpenFile(conversionCRPath, os.O_APPEND|os.O_WRONLY, 0o644)
397-
Expect(err).To(Not(HaveOccurred()))
398-
defer func() {
399-
err = f.Close()
400-
Expect(err).To(Not(HaveOccurred()))
401-
}()
402-
_, err = f.WriteString("\nspec:\n size: 3")
403-
Expect(err).To(Not(HaveOccurred()))
395+
err = util.ReplaceInFile(conversionCRPath, "# TODO(user): Add fields here", `size: 3`)
396+
Expect(err).NotTo(HaveOccurred(), "failed to replace spec in ConversionTest CR sample")
404397

405398
// Apply the ConversionTest Custom Resource in v1
406399
By("applying the modified ConversionTest CR in v1 for conversion")
407400
_, err = kbc.Kubectl.Apply(true, "-f", conversionCRPath)
408401
Expect(err).NotTo(HaveOccurred(), "failed to apply modified ConversionTest CR")
409402

410-
// TODO: Add validation to check the conversion
411-
// the v2 should have spec.replicas == 3
403+
By("waiting for the ConversionTest CR to appear")
404+
Eventually(func(g Gomega) {
405+
_, err := kbc.Kubectl.Get(true, "conversiontest", "conversiontest-sample")
406+
g.Expect(err).NotTo(HaveOccurred(), "expected the ConversionTest CR to exist")
407+
}, time.Minute, time.Second).Should(Succeed())
408+
409+
By("validating that the converted resource in v2 has replicas == 3")
410+
Eventually(func(g Gomega) {
411+
out, err := kbc.Kubectl.Get(
412+
true,
413+
"conversiontest", "conversiontest-sample",
414+
"-o", "jsonpath={.spec.replicas}",
415+
)
416+
g.Expect(err).NotTo(HaveOccurred(), "failed to get converted resource in v2")
417+
replicas, err := strconv.Atoi(out)
418+
g.Expect(err).NotTo(HaveOccurred(), "replicas field is not an integer")
419+
g.Expect(replicas).To(Equal(3), "expected replicas to be 3 after conversion")
420+
}, time.Minute, time.Second).Should(Succeed())
412421

413422
if hasMetrics {
414423
By("validating conversion metrics to confirm conversion operations")

testdata/project-v4-multigroup/api/example.com/v2/wordpress_conversion.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,12 @@ func (src *Wordpress) ConvertTo(dstRaw conversion.Hub) error {
3131
"source: %s/%s, target: %s/%s", src.Namespace, src.Name, dst.Namespace, dst.Name)
3232

3333
// TODO(user): Implement conversion logic from v2 to v1
34+
// Example: Copying Spec fields
35+
// dst.Spec.Size = src.Spec.Replicas
36+
37+
// Copy ObjectMeta to preserve name, namespace, labels, etc.
38+
dst.ObjectMeta = src.ObjectMeta
39+
3440
return nil
3541
}
3642

@@ -41,5 +47,11 @@ func (dst *Wordpress) ConvertFrom(srcRaw conversion.Hub) error {
4147
"source: %s/%s, target: %s/%s", src.Namespace, src.Name, dst.Namespace, dst.Name)
4248

4349
// TODO(user): Implement conversion logic from v1 to v2
50+
// Example: Copying Spec fields
51+
// dst.Spec.Replicas = src.Spec.Size
52+
53+
// Copy ObjectMeta to preserve name, namespace, labels, etc.
54+
dst.ObjectMeta = src.ObjectMeta
55+
4456
return nil
4557
}

testdata/project-v4-with-plugins/api/v2/wordpress_conversion.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,12 @@ func (src *Wordpress) ConvertTo(dstRaw conversion.Hub) error {
3131
"source: %s/%s, target: %s/%s", src.Namespace, src.Name, dst.Namespace, dst.Name)
3232

3333
// TODO(user): Implement conversion logic from v2 to v1
34+
// Example: Copying Spec fields
35+
// dst.Spec.Size = src.Spec.Replicas
36+
37+
// Copy ObjectMeta to preserve name, namespace, labels, etc.
38+
dst.ObjectMeta = src.ObjectMeta
39+
3440
return nil
3541
}
3642

@@ -41,5 +47,11 @@ func (dst *Wordpress) ConvertFrom(srcRaw conversion.Hub) error {
4147
"source: %s/%s, target: %s/%s", src.Namespace, src.Name, dst.Namespace, dst.Name)
4248

4349
// TODO(user): Implement conversion logic from v1 to v2
50+
// Example: Copying Spec fields
51+
// dst.Spec.Replicas = src.Spec.Size
52+
53+
// Copy ObjectMeta to preserve name, namespace, labels, etc.
54+
dst.ObjectMeta = src.ObjectMeta
55+
4456
return nil
4557
}

testdata/project-v4/api/v2/firstmate_conversion.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,12 @@ func (src *FirstMate) ConvertTo(dstRaw conversion.Hub) error {
3131
"source: %s/%s, target: %s/%s", src.Namespace, src.Name, dst.Namespace, dst.Name)
3232

3333
// TODO(user): Implement conversion logic from v2 to v1
34+
// Example: Copying Spec fields
35+
// dst.Spec.Size = src.Spec.Replicas
36+
37+
// Copy ObjectMeta to preserve name, namespace, labels, etc.
38+
dst.ObjectMeta = src.ObjectMeta
39+
3440
return nil
3541
}
3642

@@ -41,5 +47,11 @@ func (dst *FirstMate) ConvertFrom(srcRaw conversion.Hub) error {
4147
"source: %s/%s, target: %s/%s", src.Namespace, src.Name, dst.Namespace, dst.Name)
4248

4349
// TODO(user): Implement conversion logic from v1 to v2
50+
// Example: Copying Spec fields
51+
// dst.Spec.Replicas = src.Spec.Size
52+
53+
// Copy ObjectMeta to preserve name, namespace, labels, etc.
54+
dst.ObjectMeta = src.ObjectMeta
55+
4456
return nil
4557
}

0 commit comments

Comments
 (0)