@@ -24,6 +24,7 @@ import (
2424 . "github.com/onsi/ginkgo/v2"
2525 . "github.com/onsi/gomega"
2626 corev1 "k8s.io/api/core/v1"
27+ apierrors "k8s.io/apimachinery/pkg/api/errors"
2728 "k8s.io/apimachinery/pkg/api/meta"
2829 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2930 "k8s.io/apimachinery/pkg/runtime"
@@ -137,3 +138,92 @@ func waitForWorkToBeHandled(workName, workNS string) *fleetv1beta1.Work {
137138 }, eventuallyDuration , eventuallyInterval ).Should (BeTrue ())
138139 return & resultWork
139140}
141+
142+ // verifyConfigMapExists verifies that the configmap exists in member cluster
143+ func verifyConfigMapExists (cm * corev1.ConfigMap , resourceNamespace string ) {
144+ Consistently (func () bool {
145+ var configMap corev1.ConfigMap
146+ err := memberClient .Get (context .Background (), types.NamespacedName {Name : cm .Name , Namespace : resourceNamespace }, & configMap )
147+ return ! apierrors .IsNotFound (err )
148+ }, consistentlyDuration , consistentlyInterval ).Should (BeTrue (), fmt .Sprintf ("ConfigMap %s should not be deleted" , cm .Name ))
149+ }
150+
151+ // verifyConfigmapIsRemoved verifies that the configmap is removed from member cluster
152+ func verifyConfigmapIsRemoved (cm * corev1.ConfigMap , ns string ) {
153+ Eventually (func () bool {
154+ var configMap corev1.ConfigMap
155+ err := memberClient .Get (context .Background (), types.NamespacedName {Name : cm .Name , Namespace : ns }, & configMap )
156+ return apierrors .IsNotFound (err )
157+ }, eventuallyDuration * 5 , eventuallyInterval ).Should (BeTrue (), fmt .Sprintf ("ConfigMap %s should be deleted" , cm .Name ))
158+ }
159+
160+ // verifyWorkIsDeleted verifies that the work is deleted from the hub cluster
161+ func verifyWorkIsDeleted (work * fleetv1beta1.Work ) {
162+ Eventually (func () bool {
163+ var currentWork fleetv1beta1.Work
164+ return apierrors .IsNotFound (hubClient .Get (context .Background (), types.NamespacedName {Name : work .Name , Namespace : memberReservedNSName }, & currentWork ))
165+ }, eventuallyDuration , eventuallyInterval ).Should (BeTrue (), "Work should be deleted" )
166+ }
167+
168+ // verifyAppliedWorkIsDeleted verifies that the applied work is deleted from the hub cluster
169+ func verifyAppliedWorkIsDeleted (name string ) {
170+ Eventually (func () bool {
171+ var currentAppliedWork fleetv1beta1.AppliedWork
172+ return apierrors .IsNotFound (hubClient .Get (context .Background (), types.NamespacedName {Name : name }, & currentAppliedWork ))
173+ }, eventuallyDuration , eventuallyInterval ).Should (BeTrue (), "AppliedWork should be deleted" )
174+ }
175+
176+ // verifyNamespaceIsDeleted verifies that the namespace is deleted from the hub cluster
177+ func verifyNamespaceIsDeleted (nsName string ) {
178+ Eventually (func () bool {
179+ var ns corev1.Namespace
180+ return apierrors .IsNotFound (hubClient .Get (context .Background (), types.NamespacedName {Name : nsName }, & ns ))
181+ }, eventuallyDuration , eventuallyInterval ).Should (BeTrue (), "Namespace should be deleted" )
182+ }
183+
184+ // removeFinalizersFromResource removes the finalizers from the configmap to delete
185+ func removeFinalizersFromResource (cm * corev1.ConfigMap ) {
186+ var configMap corev1.ConfigMap
187+ Expect (memberClient .Get (context .Background (), types.NamespacedName {Name : cm .Name , Namespace : cm .Namespace }, & configMap )).Should (Succeed (), "Failed to get configmap" )
188+ controllerutil .RemoveFinalizer (& configMap , "example.com/finalizer" )
189+ Expect (memberClient .Update (context .Background (), & configMap )).Should (Succeed (), "Failed to remove finalizers from configmap" )
190+ }
191+
192+ func addFinalizerToConfigMap (cm * corev1.ConfigMap ) {
193+ // Add finalizer to the configmap
194+ var configMap corev1.ConfigMap
195+ Expect (memberClient .Get (context .Background (), types.NamespacedName {Name : cm .Name , Namespace : cm .Namespace }, & configMap )).Should (Succeed ())
196+ controllerutil .AddFinalizer (& configMap , "example.com/finalizer" )
197+ Expect (memberClient .Update (context .Background (), & configMap )).Should (Succeed ())
198+ By ("Added finalizer to configmap" )
199+ }
200+
201+ func cleanupResources (cm , cm2 * corev1.ConfigMap , ns * corev1.Namespace , work * fleetv1beta1.Work ) {
202+ // Remove finalizers from the configmap
203+ removeFinalizersFromResource (cm )
204+ removeFinalizersFromResource (cm2 )
205+
206+ // Delete the configmap
207+ Expect (memberClient .Delete (context .Background (), cm )).Should (Succeed ())
208+ Expect (memberClient .Delete (context .Background (), cm2 )).Should (Succeed ())
209+
210+ // Verify the configmap is deleted
211+ verifyConfigmapIsRemoved (cm , cm .Namespace )
212+ verifyConfigmapIsRemoved (cm2 , cm2 .Namespace )
213+
214+ // Delete the namespace
215+ Expect (memberClient .Delete (context .Background (), ns )).Should (Succeed ())
216+ verifyNamespaceIsDeleted (ns .Name )
217+
218+ // Remove finalizers from the applied work. Needed as there
219+ var currentAppliedWork fleetv1beta1.AppliedWork
220+ Expect (memberClient .Get (context .Background (), types.NamespacedName {Name : work .Name }, & currentAppliedWork )).Should (Succeed (), "Failed to get applied work" )
221+ controllerutil .RemoveFinalizer (& currentAppliedWork , metav1 .FinalizerDeleteDependents )
222+ Expect (memberClient .Update (context .Background (), & currentAppliedWork )).Should (Succeed (), "Failed to remove finalizers from applied work" )
223+
224+ // verify the applied work is deleted
225+ verifyAppliedWorkIsDeleted (work .Name )
226+
227+ // verify the work is deleted
228+ verifyWorkIsDeleted (work )
229+ }
0 commit comments