@@ -2,23 +2,22 @@ package test
2
2
3
3
import (
4
4
"context"
5
- "encoding/json"
6
5
"fmt"
7
- "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
8
6
"sync"
9
7
"time"
10
8
9
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
10
+ "sigs.k8s.io/controller-runtime/pkg/client/apiutil"
11
+ "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
12
+
11
13
"github.com/awslabs/operatorpkg/object"
12
14
"github.com/awslabs/operatorpkg/singleton"
13
15
"github.com/awslabs/operatorpkg/status"
14
16
. "github.com/onsi/ginkgo/v2"
15
17
. "github.com/onsi/gomega"
16
18
"github.com/onsi/gomega/types"
17
19
"github.com/samber/lo"
18
- v1 "k8s.io/api/core/v1"
19
20
"k8s.io/apimachinery/pkg/api/errors"
20
- "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
21
- "k8s.io/apimachinery/pkg/runtime"
22
21
"sigs.k8s.io/controller-runtime/pkg/client"
23
22
"sigs.k8s.io/controller-runtime/pkg/reconcile"
24
23
)
@@ -166,35 +165,44 @@ func ExpectDeleted(ctx context.Context, c client.Client, objects ...client.Objec
166
165
}
167
166
}
168
167
168
+ // ExpectCleanedUp waits to cleanup all items passed through objectLists
169
169
func ExpectCleanedUp (ctx context.Context , c client.Client , objectLists ... client.ObjectList ) {
170
+ expectCleanedUp (ctx , c , false , objectLists ... )
171
+ }
172
+
173
+ // ExpectForceCleanedUp waits to cleanup all items passed through objectLists
174
+ // It forcefully removes any finalizers from all of these objects to unblock delete
175
+ func ExpectForceCleanedUp (ctx context.Context , c client.Client , objectLists ... client.ObjectList ) {
176
+ expectCleanedUp (ctx , c , true , objectLists ... )
177
+ }
178
+
179
+ func expectCleanedUp (ctx context.Context , c client.Client , force bool , objectLists ... client.ObjectList ) {
170
180
wg := sync.WaitGroup {}
171
- namespaces := & v1.NamespaceList {}
172
- Expect (c .List (ctx , namespaces )).To (Succeed ())
173
181
for _ , objectList := range objectLists {
174
- for _ , namespace := range namespaces .Items {
175
- wg .Add (1 )
176
- go func (objectList client.ObjectList , namespace string ) {
177
- defer GinkgoRecover ()
178
- defer wg .Done ()
179
-
180
- unstructuredList := & unstructured.UnstructuredList {}
181
- unstructuredList .UnmarshalJSON (lo .Must (json .Marshal (objectList )))
182
- unstructuredList .SetAPIVersion (object .GVK (objectList ).GroupVersion ().String ())
183
- unstructuredList .SetKind (object .GVK (objectList ).Kind )
184
-
185
- Expect (c .List (ctx , unstructuredList )).To (Succeed ())
186
- unstructuredList .EachListItem (func (o runtime.Object ) error {
187
- o .(client.Object ).SetFinalizers ([]string {})
188
- if err := c .Update (ctx , o .(client.Object )); err != nil {
189
- return err
182
+ wg .Add (1 )
183
+ go func (objectList client.ObjectList ) {
184
+ defer GinkgoRecover ()
185
+ defer wg .Done ()
186
+
187
+ Eventually (func (g Gomega ) {
188
+ metaList := & metav1.PartialObjectMetadataList {}
189
+ metaList .SetGroupVersionKind (lo .Must (apiutil .GVKForObject (objectList , c .Scheme ())))
190
+ g .Expect (c .List (ctx , metaList )).To (Succeed ())
191
+
192
+ for _ , item := range metaList .Items {
193
+ if force {
194
+ stored := item .DeepCopy ()
195
+ item .SetFinalizers ([]string {})
196
+ g .Expect (c .Patch (ctx , & item , client .MergeFrom (stored ))).To (Succeed ())
190
197
}
191
- if err := c . Delete ( ctx , o .(client. Object )); err != nil {
192
- return err
198
+ if item . GetDeletionTimestamp (). IsZero () {
199
+ g . Expect ( client . IgnoreNotFound ( c . Delete ( ctx , & item , client . PropagationPolicy ( metav1 . DeletePropagationForeground ), & client. DeleteOptions { GracePeriodSeconds : lo . ToPtr ( int64 ( 0 ))}))). To ( Succeed ())
193
200
}
194
- return nil
195
- })
196
- }(objectList , namespace .Name )
197
- }
201
+ }
202
+ g .Expect (c .List (ctx , metaList , client .Limit (1 ))).To (Succeed ())
203
+ g .Expect (metaList .Items ).To (HaveLen (0 ))
204
+ }).Should (Succeed ())
205
+ }(objectList )
198
206
}
199
207
wg .Wait ()
200
208
}
0 commit comments