@@ -29,6 +29,7 @@ import (
2929 "io"
3030 "net/http"
3131 "reflect"
32+ "slices"
3233 "strings"
3334 "time"
3435
@@ -221,6 +222,47 @@ func (rm *ResourceManager) DeleteNamespace(name string) error {
221222 })
222223}
223224
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+
224266// DeleteFromFiles deletes Kubernetes resources defined within the provided YAML files.
225267func (rm * ResourceManager ) DeleteFromFiles (files []string , namespace string ) error {
226268 handlerFunc := func (obj unstructured.Unstructured ) error {
0 commit comments