diff --git a/tests/e2e/cleanup_test.go b/tests/e2e/cleanup_test.go index 3173963..7c18136 100644 --- a/tests/e2e/cleanup_test.go +++ b/tests/e2e/cleanup_test.go @@ -31,9 +31,12 @@ var _ = Describe("virtwork cleanup", Label("slow"), func() { }) AfterEach(func() { - // Safety net cleanup - _, _, _, _ = testutil.RunVirtwork("cleanup", + _, stderr, exitCode, err := testutil.RunVirtwork("cleanup", "--namespace", namespace, "--delete-namespace", "--yes") + if err != nil || exitCode != 0 { + GinkgoWriter.Printf("AfterEach cleanup failed (ns=%s exit=%d): err=%v stderr=%s\n", + namespace, exitCode, err, stderr) + } }) It("should delete all managed resources", func() { diff --git a/tests/e2e/e2e_suite_test.go b/tests/e2e/e2e_suite_test.go index 3e75e5c..ffc3b29 100644 --- a/tests/e2e/e2e_suite_test.go +++ b/tests/e2e/e2e_suite_test.go @@ -6,10 +6,14 @@ package e2e_test import ( + "context" + "strings" "testing" + "time" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + corev1 "k8s.io/api/core/v1" "github.com/opdev/virtwork/internal/testutil" ) @@ -26,3 +30,39 @@ var _ = BeforeSuite(func() { Expect(err).NotTo(HaveOccurred(), "Failed to build virtwork binary") GinkgoWriter.Printf("Using virtwork binary: %s\n", path) }) + +var _ = AfterSuite(func() { + c := testutil.MustConnect("") + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute) + defer cancel() + + var nsList corev1.NamespaceList + if err := c.List(ctx, &nsList); err != nil { + GinkgoWriter.Printf("AfterSuite: failed to list namespaces: %v\n", err) + return + } + + var stale []string + for i := range nsList.Items { + name := nsList.Items[i].Name + if strings.HasPrefix(name, "virtwork-test-") && nsList.Items[i].DeletionTimestamp == nil { + stale = append(stale, name) + } + } + + if len(stale) == 0 { + GinkgoWriter.Println("AfterSuite: no stale virtwork-test-* namespaces found") + return + } + + GinkgoWriter.Printf("AfterSuite: sweeping %d stale namespace(s)\n", len(stale)) + for _, name := range stale { + ns := &corev1.Namespace{} + ns.Name = name + if err := c.Delete(ctx, ns); err != nil { + GinkgoWriter.Printf("AfterSuite: failed to delete namespace %s: %v\n", name, err) + } else { + GinkgoWriter.Printf("AfterSuite: deleted namespace %s\n", name) + } + } +}) diff --git a/tests/e2e/fullcycle_test.go b/tests/e2e/fullcycle_test.go index a233111..2b38f6b 100644 --- a/tests/e2e/fullcycle_test.go +++ b/tests/e2e/fullcycle_test.go @@ -26,8 +26,12 @@ var _ = Describe("Full deployment cycle", Label("slow"), func() { }) AfterEach(func() { - _, _, _, _ = testutil.RunVirtwork("cleanup", + _, stderr, exitCode, err := testutil.RunVirtwork("cleanup", "--namespace", namespace, "--delete-namespace", "--yes") + if err != nil || exitCode != 0 { + GinkgoWriter.Printf("AfterEach cleanup failed (ns=%s exit=%d): err=%v stderr=%s\n", + namespace, exitCode, err, stderr) + } }) It("should deploy CPU workload, wait for readiness, and clean up", func() { diff --git a/tests/e2e/run_test.go b/tests/e2e/run_test.go index 7c43623..be4f5ad 100644 --- a/tests/e2e/run_test.go +++ b/tests/e2e/run_test.go @@ -20,9 +20,12 @@ var _ = Describe("virtwork run", Label("slow"), func() { }) AfterEach(func() { - // Force cleanup regardless of test outcome - _, _, _, _ = testutil.RunVirtwork("cleanup", - "--namespace", namespace, "--delete-namespace") + _, stderr, exitCode, err := testutil.RunVirtwork("cleanup", + "--namespace", namespace, "--delete-namespace", "--yes") + if err != nil || exitCode != 0 { + GinkgoWriter.Printf("AfterEach cleanup failed (ns=%s exit=%d): err=%v stderr=%s\n", + namespace, exitCode, err, stderr) + } }) It("should deploy a single CPU workload with --no-wait", func() { diff --git a/tests/e2e/tps_test.go b/tests/e2e/tps_test.go index 09e6833..c092c1e 100644 --- a/tests/e2e/tps_test.go +++ b/tests/e2e/tps_test.go @@ -26,8 +26,12 @@ var _ = Describe("TPS workload", Label("slow"), func() { }) AfterEach(func() { - _, _, _, _ = testutil.RunVirtwork("cleanup", + _, stderr, exitCode, err := testutil.RunVirtwork("cleanup", "--namespace", namespace, "--delete-namespace", "--yes") + if err != nil || exitCode != 0 { + GinkgoWriter.Printf("AfterEach cleanup failed (ns=%s exit=%d): err=%v stderr=%s\n", + namespace, exitCode, err, stderr) + } }) It("should deploy server and client VMs with a service", func() {