diff --git a/tests/framework/resourcemanager.go b/tests/framework/resourcemanager.go index f398e97375..c48c4d40e0 100644 --- a/tests/framework/resourcemanager.go +++ b/tests/framework/resourcemanager.go @@ -29,6 +29,7 @@ import ( "io" "net/http" "reflect" + "slices" "strings" "time" @@ -221,6 +222,45 @@ func (rm *ResourceManager) DeleteNamespace(name string) error { }) } +func (rm *ResourceManager) DeleteNamespaces(names []string) error { + ctx, cancel := context.WithTimeout(context.Background(), rm.TimeoutConfig.DeleteNamespaceTimeout*2) + defer cancel() + + var combinedErrors error + for _, name := range names { + ns := &core.Namespace{ObjectMeta: metav1.ObjectMeta{Name: name}} + + if err := rm.K8sClient.Delete(ctx, ns); err != nil { + if apierrors.IsNotFound(err) { + continue + } + + combinedErrors = errors.Join(combinedErrors, fmt.Errorf("error deleting namespace: %w", err)) + } + } + + err := wait.PollUntilContextCancel( + ctx, + 500*time.Millisecond, + true, /* poll immediately */ + func(ctx context.Context) (bool, error) { + nsList := &core.NamespaceList{} + if err := rm.K8sClient.List(ctx, nsList); err != nil { + return false, nil //nolint:nilerr // retry on error + } + + for _, namespace := range nsList.Items { + if slices.Contains(names, namespace.Name) { + return false, nil + } + } + + return true, nil + }) + + return errors.Join(combinedErrors, err) +} + // DeleteFromFiles deletes Kubernetes resources defined within the provided YAML files. func (rm *ResourceManager) DeleteFromFiles(files []string, namespace string) error { handlerFunc := func(obj unstructured.Unstructured) error { diff --git a/tests/suite/reconfig_test.go b/tests/suite/reconfig_test.go index a28596e5ad..b2f0fee0f2 100644 --- a/tests/suite/reconfig_test.go +++ b/tests/suite/reconfig_test.go @@ -170,16 +170,12 @@ var _ = Describe("Reconfiguration Performance Testing", Ordered, Label("nfr", "r cleanupResources := func() error { var err error - // FIXME (bjee19): https://github.com/nginx/nginx-gateway-fabric/issues/2376 - // Find a way to bulk delete these namespaces. - for i := 1; i <= maxResourceCount; i++ { - nsName := "namespace" + strconv.Itoa(i) - resultError := resourceManager.DeleteNamespace(nsName) - if resultError != nil { - err = resultError - } + namespaces := make([]string, maxResourceCount) + for i := range maxResourceCount { + namespaces[i] = "namespace" + strconv.Itoa(i+1) } + err = resourceManager.DeleteNamespaces(namespaces) Expect(resourceManager.DeleteNamespace(reconfigNamespace.Name)).To(Succeed()) return err @@ -490,7 +486,7 @@ Time To Ready Description: {{ .TimeToReadyDescription }} {{- end }} ### NGINX Error Logs -{{ .NGINXErrorLogs }} +{{ .NGINXErrorLogs -}} ` func writeReconfigResults(dest io.Writer, results reconfigTestResults) error {