@@ -29,6 +29,7 @@ import (
29
29
"io"
30
30
"net/http"
31
31
"reflect"
32
+ "slices"
32
33
"strings"
33
34
"time"
34
35
@@ -221,6 +222,47 @@ func (rm *ResourceManager) DeleteNamespace(name string) error {
221
222
})
222
223
}
223
224
225
+ func (rm * ResourceManager ) DeleteNamespaces (names []string ) error {
226
+ ctx , cancel := context .WithTimeout (context .Background (), rm .TimeoutConfig .DeleteNamespaceTimeout * 2 )
227
+ defer cancel ()
228
+
229
+ var combinedErrors error
230
+ ns := & core.Namespace {}
231
+ for _ , name := range names {
232
+ if err := rm .K8sClient .Get (ctx , types.NamespacedName {Name : name }, ns ); err != nil {
233
+ if apierrors .IsNotFound (err ) {
234
+ continue
235
+ }
236
+ combinedErrors = errors .Join (combinedErrors , fmt .Errorf ("error getting namespace: %w" , err ))
237
+ }
238
+
239
+ if err := rm .K8sClient .Delete (ctx , ns ); err != nil {
240
+ combinedErrors = errors .Join (combinedErrors , fmt .Errorf ("error deleting namespace: %w" , err ))
241
+ }
242
+ }
243
+
244
+ err := wait .PollUntilContextCancel (
245
+ ctx ,
246
+ 500 * time .Millisecond ,
247
+ true , /* poll immediately */
248
+ func (ctx context.Context ) (bool , error ) {
249
+ nsList := & core.NamespaceList {}
250
+ if err := rm .K8sClient .List (ctx , nsList ); err != nil {
251
+ return false , nil //nolint:nilerr // retry on error
252
+ }
253
+
254
+ for _ , namespace := range nsList .Items {
255
+ if slices .Contains (names , namespace .Name ) {
256
+ return false , nil
257
+ }
258
+ }
259
+
260
+ return true , nil
261
+ })
262
+
263
+ return errors .Join (combinedErrors , err )
264
+ }
265
+
224
266
// DeleteFromFiles deletes Kubernetes resources defined within the provided YAML files.
225
267
func (rm * ResourceManager ) DeleteFromFiles (files []string , namespace string ) error {
226
268
handlerFunc := func (obj unstructured.Unstructured ) error {
0 commit comments