From 3406c335734792ae4fbf565867511c1056ab3319 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Andr=C3=A9?= Date: Tue, 21 Jul 2026 10:37:49 +0900 Subject: [PATCH] test: reduce possibility of namespace collision in unit tests Replace `GenerateName()` with client-side name generation using `utilrand.String(10)` for test namespaces. When using `GenerateName()`, it generates a new 5-char random suffix and the API server checks if that name exists. Envtest only runs kube-apiserver + etcd so namespaces marked for deletion are never actually cleaned up. On Kubernetes 1.29 (our envtest version, chosen as the minimum for CEL validation), the `RetryGenerateName` feature gate [1] doesn't exist yet (introduced in 1.30), so there are no retries and the collision is a hard failure. By setting Name directly with a locally-generated 10-char random string, we considerably increase the pool of possible names, making collisions practically impossible. [1] https://www.kubernetes.dev/resources/keps/4420/ Closes: #850 --- internal/controllers/floatingip/suite_test.go | 3 ++- internal/controllers/image/suite_test.go | 3 ++- internal/controllers/image/upload_test.go | 3 ++- internal/controllers/router/suite_test.go | 3 ++- internal/controllers/routerinterface/suite_test.go | 3 ++- internal/controllers/subnet/suite_test.go | 3 ++- test/apivalidations/suite_test.go | 4 +++- 7 files changed, 15 insertions(+), 7 deletions(-) diff --git a/internal/controllers/floatingip/suite_test.go b/internal/controllers/floatingip/suite_test.go index f1a7eb8fa..2494c4c0e 100644 --- a/internal/controllers/floatingip/suite_test.go +++ b/internal/controllers/floatingip/suite_test.go @@ -25,6 +25,7 @@ import ( . "github.com/onsi/gomega" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/types" + utilrand "k8s.io/apimachinery/pkg/util/rand" "k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/rest" "sigs.k8s.io/controller-runtime/pkg/client" @@ -82,7 +83,7 @@ var _ = Describe("EnvTest sanity check", func() { It("should be able to create a namespace", func() { ctx := context.TODO() namespace := &corev1.Namespace{} - namespace.SetGenerateName("test-") + namespace.SetName("test-" + utilrand.String(10)) // Create the namespace Expect(k8sClient.Create(ctx, namespace)).To(Succeed(), "create namespace") diff --git a/internal/controllers/image/suite_test.go b/internal/controllers/image/suite_test.go index 4b1fa4de2..5803d580f 100644 --- a/internal/controllers/image/suite_test.go +++ b/internal/controllers/image/suite_test.go @@ -25,6 +25,7 @@ import ( . "github.com/onsi/gomega" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/types" + utilrand "k8s.io/apimachinery/pkg/util/rand" "k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/rest" "sigs.k8s.io/controller-runtime/pkg/client" @@ -82,7 +83,7 @@ var _ = Describe("EnvTest sanity check", func() { It("should be able to create a namespace", func() { ctx := context.TODO() namespace := &corev1.Namespace{} - namespace.SetGenerateName("test-") + namespace.SetName("test-" + utilrand.String(10)) // Create the namespace Expect(k8sClient.Create(ctx, namespace)).To(Succeed(), "create namespace") diff --git a/internal/controllers/image/upload_test.go b/internal/controllers/image/upload_test.go index cfdb2a5f5..3a2f92565 100644 --- a/internal/controllers/image/upload_test.go +++ b/internal/controllers/image/upload_test.go @@ -28,6 +28,7 @@ import ( . "github.com/onsi/gomega" "go.uber.org/mock/gomock" corev1 "k8s.io/api/core/v1" + utilrand "k8s.io/apimachinery/pkg/util/rand" ctrl "sigs.k8s.io/controller-runtime" orcv1alpha1 "github.com/k-orc/openstack-resource-controller/v2/api/v1alpha1" @@ -158,7 +159,7 @@ var _ = Describe("Upload tests", Ordered, func() { // Create the namespace namespace = &corev1.Namespace{} - namespace.SetGenerateName("test-") + namespace.SetName("test-" + utilrand.String(10)) Expect(k8sClient.Create(ctx, namespace)).To(Succeed(), "create namespace") DeferCleanup(func() { Expect(k8sClient.Delete(ctx, namespace)).To(Succeed(), "delete namespace") diff --git a/internal/controllers/router/suite_test.go b/internal/controllers/router/suite_test.go index 02433215f..c04e852fe 100644 --- a/internal/controllers/router/suite_test.go +++ b/internal/controllers/router/suite_test.go @@ -25,6 +25,7 @@ import ( . "github.com/onsi/gomega" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/types" + utilrand "k8s.io/apimachinery/pkg/util/rand" "k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/rest" "sigs.k8s.io/controller-runtime/pkg/client" @@ -82,7 +83,7 @@ var _ = Describe("EnvTest sanity check", func() { It("should be able to create a namespace", func() { ctx := context.TODO() namespace := &corev1.Namespace{} - namespace.SetGenerateName("test-") + namespace.SetName("test-" + utilrand.String(10)) // Create the namespace Expect(k8sClient.Create(ctx, namespace)).To(Succeed(), "create namespace") diff --git a/internal/controllers/routerinterface/suite_test.go b/internal/controllers/routerinterface/suite_test.go index 8c93ac434..3bae8c80e 100644 --- a/internal/controllers/routerinterface/suite_test.go +++ b/internal/controllers/routerinterface/suite_test.go @@ -25,6 +25,7 @@ import ( . "github.com/onsi/gomega" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/types" + utilrand "k8s.io/apimachinery/pkg/util/rand" "k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/rest" "sigs.k8s.io/controller-runtime/pkg/client" @@ -82,7 +83,7 @@ var _ = Describe("EnvTest sanity check", func() { It("should be able to create a namespace", func() { ctx := context.TODO() namespace := &corev1.Namespace{} - namespace.SetGenerateName("test-") + namespace.SetName("test-" + utilrand.String(10)) // Create the namespace Expect(k8sClient.Create(ctx, namespace)).To(Succeed(), "create namespace") diff --git a/internal/controllers/subnet/suite_test.go b/internal/controllers/subnet/suite_test.go index 847b93590..ec8821440 100644 --- a/internal/controllers/subnet/suite_test.go +++ b/internal/controllers/subnet/suite_test.go @@ -25,6 +25,7 @@ import ( . "github.com/onsi/gomega" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/types" + utilrand "k8s.io/apimachinery/pkg/util/rand" "k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/rest" "sigs.k8s.io/controller-runtime/pkg/client" @@ -82,7 +83,7 @@ var _ = Describe("EnvTest sanity check", func() { It("should be able to create a namespace", func() { ctx := context.TODO() namespace := &corev1.Namespace{} - namespace.SetGenerateName("test-") + namespace.SetName("test-" + utilrand.String(10)) // Create the namespace Expect(k8sClient.Create(ctx, namespace)).To(Succeed(), "create namespace") diff --git a/test/apivalidations/suite_test.go b/test/apivalidations/suite_test.go index 595c4a95f..98c037168 100644 --- a/test/apivalidations/suite_test.go +++ b/test/apivalidations/suite_test.go @@ -24,6 +24,8 @@ import ( "testing" "time" + utilrand "k8s.io/apimachinery/pkg/util/rand" + . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" corev1 "k8s.io/api/core/v1" @@ -147,7 +149,7 @@ var _ = BeforeSuite(func() { func createNamespace() *corev1.Namespace { By("Creating namespace") namespace := corev1.Namespace{} - namespace.GenerateName = "test-" + namespace.Name = "test-" + utilrand.String(10) Expect(k8sClient.Create(ctx, &namespace)).To(Succeed(), "Namespace creation should succeed") DeferCleanup(func() { By("Deleting namespace")