From d7e961eeaffb133e7dbb9f588c9540f497de2c93 Mon Sep 17 00:00:00 2001 From: Jake Date: Tue, 15 Nov 2022 17:49:00 +0000 Subject: [PATCH] temp-fix: disable dynamic controller during deletion of promise - temporary fix until https://github.com/kubernetes-sigs/controller-runtime/issues/1884 is resolved once resolved, delete dynamic controller rather than disable Co-authored-by: Abby Bangser --- controllers/dynamic_resource_request_controller.go | 9 ++++++++- controllers/promise_controller.go | 14 ++++++++++++-- controllers/suite_test.go | 1 + main.go | 1 + 4 files changed, 22 insertions(+), 3 deletions(-) diff --git a/controllers/dynamic_resource_request_controller.go b/controllers/dynamic_resource_request_controller.go index b3190974..93baf6a7 100644 --- a/controllers/dynamic_resource_request_controller.go +++ b/controllers/dynamic_resource_request_controller.go @@ -58,14 +58,21 @@ type dynamicResourceRequestController struct { xaasRequestPipeline []string log logr.Logger finalizers []string + uid string + enabled *bool } //+kubebuilder:rbac:groups="",resources=pods,verbs=create;list;watch;delete //+kubebuilder:rbac:groups="",resources=serviceaccounts,verbs=create func (r *dynamicResourceRequestController) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { - logger := r.log.WithValues(r.promiseIdentifier, req.NamespacedName) + if !*r.enabled { + //temporary fix until https://github.com/kubernetes-sigs/controller-runtime/issues/1884 is resolved + //once resolved, this won't be necessary since the dynamic controller will be deleted + return ctrl.Result{}, nil + } + logger := r.log.WithValues("uid", r.uid, r.promiseIdentifier, req.NamespacedName) resourceRequestIdentifier := fmt.Sprintf("%s-%s-%s", r.promiseIdentifier, req.Namespace, req.Name) unstructuredCRD := &unstructured.Unstructured{} diff --git a/controllers/promise_controller.go b/controllers/promise_controller.go index 35bb4031..b96a0122 100644 --- a/controllers/promise_controller.go +++ b/controllers/promise_controller.go @@ -54,6 +54,7 @@ type PromiseReconciler struct { ApiextensionsClient *clientset.Clientset Log logr.Logger Manager ctrl.Manager + DynamicControllers map[string]*bool } const ( @@ -308,7 +309,10 @@ func (r *PromiseReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct unstructuredCRD := &unstructured.Unstructured{} unstructuredCRD.SetGroupVersionKind(crdToCreateGvk) - //delete dyanmic controller before CRD + //temporary fix until https://github.com/kubernetes-sigs/controller-runtime/issues/1884 is resolved + //once resolved, delete dynamic controller rather than disable + enabled := true + r.DynamicControllers[string(promise.GetUID())] = &enabled dynamicResourceRequestController := &dynamicResourceRequestController{ client: r.Manager.GetClient(), scheme: r.Manager.GetScheme(), @@ -317,6 +321,8 @@ func (r *PromiseReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct promiseClusterSelector: promise.Spec.ClusterSelector, xaasRequestPipeline: promise.Spec.XaasRequestPipeline, log: r.Log, + uid: getShortUuid(), + enabled: &enabled, } ctrl.NewControllerManagedBy(r.Manager). @@ -345,7 +351,11 @@ func (r *PromiseReconciler) deletePromise(ctx context.Context, promise *v1alpha1 return ctrl.Result{RequeueAfter: fastRequeue}, err } - //delete dynamic controller + //temporary fix until https://github.com/kubernetes-sigs/controller-runtime/issues/1884 is resolved + //once resolved, delete dynamic controller rather than disable + if enabled, exists := r.DynamicControllers[string(promise.GetUID())]; exists { + *enabled = false + } if controllerutil.ContainsFinalizer(promise, clusterSelectorsConfigMapCleanupFinalizer) { logger.Info("deleting resources associated with finalizer", "finalizer", clusterSelectorsConfigMapCleanupFinalizer) diff --git a/controllers/suite_test.go b/controllers/suite_test.go index f099e62d..84692a4a 100644 --- a/controllers/suite_test.go +++ b/controllers/suite_test.go @@ -81,6 +81,7 @@ var _ = BeforeSuite(func() { ApiextensionsClient: apiextensionClient, Client: k8sManager.GetClient(), Log: ctrl.Log.WithName("controllers").WithName("PromiseReconciler"), + DynamicControllers: map[string]*bool{}, }).SetupWithManager(k8sManager) Expect(err).ToNot(HaveOccurred()) diff --git a/main.go b/main.go index 1b1f880c..f1d3ac6f 100644 --- a/main.go +++ b/main.go @@ -92,6 +92,7 @@ func main() { Client: mgr.GetClient(), Log: ctrl.Log.WithName("controllers").WithName("Promise"), Manager: mgr, + DynamicControllers: map[string]*bool{}, }).SetupWithManager(mgr); err != nil { setupLog.Error(err, "unable to create controller", "controller", "Promise") os.Exit(1)