From b25330dc086b14287c921266bcb283b26c49201e Mon Sep 17 00:00:00 2001 From: taimurhafeez Date: Thu, 27 Nov 2025 13:14:41 +0000 Subject: [PATCH 1/3] CMP:3846 Add test for successful compliance operator deletion (54055) --- tests/e2e/framework/common.go | 26 ++++++++++++++++++++++++++ tests/e2e/framework/main_entry.go | 12 ++++++++++++ 2 files changed, 38 insertions(+) diff --git a/tests/e2e/framework/common.go b/tests/e2e/framework/common.go index 72b4d97099..c74ee1e203 100644 --- a/tests/e2e/framework/common.go +++ b/tests/e2e/framework/common.go @@ -2886,3 +2886,29 @@ func (f *Framework) AssertRuleIsNodeType(ruleName, namespace string) error { func (f *Framework) AssertRuleIsPlatformType(ruleName, namespace string) error { return f.assertRuleType(ruleName, namespace, "Platform") } + +// waitForNamespaceDeletion waits until a namespace is fully deleted from the cluster +// This is used to verify that operator cleanup completes successfully without resources +// getting stuck in terminating state due to finalizers (OCP-54055) +func (f *Framework) waitForNamespaceDeletion(namespace string, retryInterval, timeout time.Duration) error { + err := wait.Poll(retryInterval, timeout, func() (bool, error) { + _, err := f.KubeClient.CoreV1().Namespaces().Get(context.TODO(), namespace, metav1.GetOptions{}) + if apierrors.IsNotFound(err) { + // Namespace is deleted + return true, nil + } + if err != nil { + // Some other error occurred, retry + log.Printf("Error checking namespace %s deletion status: %v, retrying...", namespace, err) + return false, nil + } + // Namespace still exists, keep waiting + log.Printf("Waiting for namespace %s to be fully deleted...", namespace) + return false, nil + }) + + if err != nil { + return fmt.Errorf("namespace %s was not deleted within timeout: %w", namespace, err) + } + return nil +} diff --git a/tests/e2e/framework/main_entry.go b/tests/e2e/framework/main_entry.go index 6fada75c3d..9de81c97ae 100644 --- a/tests/e2e/framework/main_entry.go +++ b/tests/e2e/framework/main_entry.go @@ -123,6 +123,7 @@ func (f *Framework) SetUp() error { err = f.createInvalidMachineConfigPool("e2e-invalid") if err != nil { return fmt.Errorf("failed to create Machine Config Pool %s: %w", "e2e-invalid", err) + //log.Printf("did not find machineconfig e2e-invalid, but still proceeding") } return nil @@ -203,5 +204,16 @@ func (f *Framework) TearDown() error { if err != nil { return fmt.Errorf("failed to cleanup namespace %s: %w", f.OperatorNamespace, err) } + + // Verify namespace deletion completes successfully (OCP-54055) + // This ensures that all resources, including those with finalizers, are properly cleaned up + // and that the operator can be deleted without resources getting stuck in terminating state + log.Printf("========== OCP-54055: Verifying namespace %s deletion completes successfully ==========\n", f.OperatorNamespace) + err = f.waitForNamespaceDeletion(f.OperatorNamespace, time.Second*5, time.Minute*5) + if err != nil { + return fmt.Errorf("namespace %s deletion did not complete: %w", f.OperatorNamespace, err) + } + log.Printf("========== OCP-54055: Namespace %s successfully deleted - verification PASSED ==========\n", f.OperatorNamespace) + return nil } From c90a6efabfb1c22f2f90a2bb5e5827e0b878f255 Mon Sep 17 00:00:00 2001 From: taimurhafeez Date: Tue, 2 Dec 2025 11:03:09 +0000 Subject: [PATCH 2/3] 1) Added successful namespace deletion in log 2) removed downstream ID tag --- tests/e2e/framework/common.go | 5 +---- tests/e2e/framework/main_entry.go | 6 +++--- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/tests/e2e/framework/common.go b/tests/e2e/framework/common.go index c74ee1e203..d1c37eec12 100644 --- a/tests/e2e/framework/common.go +++ b/tests/e2e/framework/common.go @@ -2888,8 +2888,6 @@ func (f *Framework) AssertRuleIsPlatformType(ruleName, namespace string) error { } // waitForNamespaceDeletion waits until a namespace is fully deleted from the cluster -// This is used to verify that operator cleanup completes successfully without resources -// getting stuck in terminating state due to finalizers (OCP-54055) func (f *Framework) waitForNamespaceDeletion(namespace string, retryInterval, timeout time.Duration) error { err := wait.Poll(retryInterval, timeout, func() (bool, error) { _, err := f.KubeClient.CoreV1().Namespaces().Get(context.TODO(), namespace, metav1.GetOptions{}) @@ -2898,11 +2896,9 @@ func (f *Framework) waitForNamespaceDeletion(namespace string, retryInterval, ti return true, nil } if err != nil { - // Some other error occurred, retry log.Printf("Error checking namespace %s deletion status: %v, retrying...", namespace, err) return false, nil } - // Namespace still exists, keep waiting log.Printf("Waiting for namespace %s to be fully deleted...", namespace) return false, nil }) @@ -2910,5 +2906,6 @@ func (f *Framework) waitForNamespaceDeletion(namespace string, retryInterval, ti if err != nil { return fmt.Errorf("namespace %s was not deleted within timeout: %w", namespace, err) } + log.Printf("Namespace %s successfully deleted and cleaned up", namespace) return nil } diff --git a/tests/e2e/framework/main_entry.go b/tests/e2e/framework/main_entry.go index 9de81c97ae..6468c75999 100644 --- a/tests/e2e/framework/main_entry.go +++ b/tests/e2e/framework/main_entry.go @@ -205,15 +205,15 @@ func (f *Framework) TearDown() error { return fmt.Errorf("failed to cleanup namespace %s: %w", f.OperatorNamespace, err) } - // Verify namespace deletion completes successfully (OCP-54055) + // Verify namespace deletion completes successfully // This ensures that all resources, including those with finalizers, are properly cleaned up // and that the operator can be deleted without resources getting stuck in terminating state - log.Printf("========== OCP-54055: Verifying namespace %s deletion completes successfully ==========\n", f.OperatorNamespace) + log.Printf("Verifying namespace %s deletion \n", f.OperatorNamespace) err = f.waitForNamespaceDeletion(f.OperatorNamespace, time.Second*5, time.Minute*5) if err != nil { return fmt.Errorf("namespace %s deletion did not complete: %w", f.OperatorNamespace, err) } - log.Printf("========== OCP-54055: Namespace %s successfully deleted - verification PASSED ==========\n", f.OperatorNamespace) + log.Printf("Namespace %s successfully deleted\n", f.OperatorNamespace) return nil } From 1dfff7713fb9f6903901e8ad05e1877cd87c5556 Mon Sep 17 00:00:00 2001 From: taimurhafeez Date: Wed, 3 Dec 2025 13:18:18 +0000 Subject: [PATCH 3/3] remove log commented line --- tests/e2e/framework/main_entry.go | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/e2e/framework/main_entry.go b/tests/e2e/framework/main_entry.go index 6468c75999..46c21c0e6a 100644 --- a/tests/e2e/framework/main_entry.go +++ b/tests/e2e/framework/main_entry.go @@ -123,7 +123,6 @@ func (f *Framework) SetUp() error { err = f.createInvalidMachineConfigPool("e2e-invalid") if err != nil { return fmt.Errorf("failed to create Machine Config Pool %s: %w", "e2e-invalid", err) - //log.Printf("did not find machineconfig e2e-invalid, but still proceeding") } return nil