diff --git a/test/e2e/apimachinery/namespace.go b/test/e2e/apimachinery/namespace.go index 586ee5948b8..2ed50829fb8 100644 --- a/test/e2e/apimachinery/namespace.go +++ b/test/e2e/apimachinery/namespace.go @@ -30,6 +30,7 @@ import ( "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/intstr" + utilrand "k8s.io/apimachinery/pkg/util/rand" "k8s.io/apimachinery/pkg/util/uuid" "k8s.io/apimachinery/pkg/util/wait" clientscheme "k8s.io/client-go/kubernetes/scheme" @@ -381,6 +382,69 @@ var _ = SIGDescribe("Namespaces [Serial]", func() { framework.ExpectEqual(updatedNamespace.ObjectMeta.Labels[ns], "updated", "Failed to update namespace %q. Current Labels: %#v", ns, updatedNamespace.Labels) framework.Logf("Namespace %q now has labels, %#v", ns, updatedNamespace.Labels) }) + + ginkgo.It("should apply a finalizer to a Namespace", func() { + + fakeFinalizer := v1.FinalizerName("e2e.example.com/fakeFinalizer") + var updatedNamespace *v1.Namespace + nsName := "e2e-ns-" + utilrand.String(5) + + ginkgo.By(fmt.Sprintf("Creating namespace %q", nsName)) + testNamespace, err := f.CreateNamespace(nsName, nil) + framework.ExpectNoError(err, "failed creating Namespace") + ns := testNamespace.ObjectMeta.Name + nsClient := f.ClientSet.CoreV1().Namespaces() + framework.Logf("Namespace %q has %#v", testNamespace.Name, testNamespace.Spec.Finalizers) + + ginkgo.By(fmt.Sprintf("Adding e2e finalizer to namespace %q", ns)) + err = retry.RetryOnConflict(retry.DefaultRetry, func() error { + updateNamespace, err := nsClient.Get(context.TODO(), ns, metav1.GetOptions{}) + framework.ExpectNoError(err, "Unable to get Namespace %q", ns) + + updateNamespace.Spec.Finalizers = append(updateNamespace.Spec.Finalizers, fakeFinalizer) + updatedNamespace, err = nsClient.Finalize(context.TODO(), updateNamespace, metav1.UpdateOptions{}) + return err + }) + framework.ExpectNoError(err, "failed to add finalizer to the namespace: %q", ns) + + var foundFinalizer bool + for _, item := range updatedNamespace.Spec.Finalizers { + if item == fakeFinalizer { + foundFinalizer = true + break + } + } + framework.ExpectEqual(foundFinalizer, true, "Finalizer %q was not found. Namespace %q has %#v", fakeFinalizer, updatedNamespace.Spec.Finalizers) + framework.Logf("Namespace %q has %#v", updatedNamespace.Name, updatedNamespace.Spec.Finalizers) + + ginkgo.By(fmt.Sprintf("Removing e2e finalizer from namespace %q", ns)) + err = retry.RetryOnConflict(retry.DefaultRetry, func() error { + updatedNamespace, err = nsClient.Get(context.TODO(), ns, metav1.GetOptions{}) + framework.ExpectNoError(err, "Unable to get namespace %q", ns) + + var finalizerList []v1.FinalizerName + for _, item := range updatedNamespace.Spec.Finalizers { + if item != fakeFinalizer { + finalizerList = append(finalizerList, item) + } + } + updatedNamespace.Spec.Finalizers = finalizerList + updatedNamespace, err = nsClient.Finalize(context.TODO(), updatedNamespace, metav1.UpdateOptions{}) + return err + }) + framework.ExpectNoError(err, "failed to remove finalizer from namespace: %q", ns) + + foundFinalizer = false + for _, item := range updatedNamespace.Spec.Finalizers { + if item == fakeFinalizer { + foundFinalizer = true + break + } + } + framework.ExpectEqual(foundFinalizer, false, "Finalizer %q was found. Namespace %q has %#v", fakeFinalizer, updatedNamespace.Spec.Finalizers) + framework.Logf("Namespace %q has %#v", updatedNamespace.Name, updatedNamespace.Spec.Finalizers) + }) + }) func unstructuredToNamespace(obj *unstructured.Unstructured) (*v1.Namespace, error) {