From 6103dd9b71311a75982dc89bf682ee852673d70e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20Th=C3=B6mmes?= Date: Wed, 22 Apr 2020 23:55:40 +0200 Subject: [PATCH] Add a controller option to specify a custom finalizer name. (#1230) --- .../customresourcedefinition/controller.go | 12 ++++++--- .../customresourcedefinition/reconciler.go | 26 +++++++++--------- .../core/v1/namespace/controller.go | 12 ++++++--- .../core/v1/namespace/reconciler.go | 26 +++++++++--------- .../generators/reconciler_controller.go | 4 +++ .../generators/reconciler_reconciler.go | 27 ++++++++++--------- controller/options.go | 4 +++ 7 files changed, 66 insertions(+), 45 deletions(-) diff --git a/client/injection/apiextensions/reconciler/apiextensions/v1beta1/customresourcedefinition/controller.go b/client/injection/apiextensions/reconciler/apiextensions/v1beta1/customresourcedefinition/controller.go index 4bf7f27a3..f59e81462 100644 --- a/client/injection/apiextensions/reconciler/apiextensions/v1beta1/customresourcedefinition/controller.go +++ b/client/injection/apiextensions/reconciler/apiextensions/v1beta1/customresourcedefinition/controller.go @@ -74,10 +74,11 @@ func NewImpl(ctx context.Context, r Interface, optionsFns ...controller.OptionsF } rec := &reconcilerImpl{ - Client: apiextensionsclient.Get(ctx), - Lister: customresourcedefinitionInformer.Lister(), - Recorder: recorder, - reconciler: r, + Client: apiextensionsclient.Get(ctx), + Lister: customresourcedefinitionInformer.Lister(), + Recorder: recorder, + reconciler: r, + finalizerName: defaultFinalizerName, } impl := controller.NewImpl(rec, logger, defaultQueueName) @@ -87,6 +88,9 @@ func NewImpl(ctx context.Context, r Interface, optionsFns ...controller.OptionsF if opts.ConfigStore != nil { rec.configStore = opts.ConfigStore } + if opts.FinalizerName != "" { + rec.finalizerName = opts.FinalizerName + } } return impl diff --git a/client/injection/apiextensions/reconciler/apiextensions/v1beta1/customresourcedefinition/reconciler.go b/client/injection/apiextensions/reconciler/apiextensions/v1beta1/customresourcedefinition/reconciler.go index 3e59a33c0..0f5c2d3d5 100644 --- a/client/injection/apiextensions/reconciler/apiextensions/v1beta1/customresourcedefinition/reconciler.go +++ b/client/injection/apiextensions/reconciler/apiextensions/v1beta1/customresourcedefinition/reconciler.go @@ -81,6 +81,9 @@ type reconcilerImpl struct { // reconciler is the implementation of the business logic of the resource. reconciler Interface + + // finalizerName is the name of the finalizer to reconcile. + finalizerName string } // Check that our Reconciler implements controller.Reconciler @@ -231,9 +234,8 @@ func (r *reconcilerImpl) updateStatus(existing *v1beta1.CustomResourceDefinition // updateFinalizersFiltered will update the Finalizers of the resource. // TODO: this method could be generic and sync all finalizers. For now it only -// updates defaultFinalizerName. +// updates defaultFinalizerName or its override. func (r *reconcilerImpl) updateFinalizersFiltered(ctx context.Context, resource *v1beta1.CustomResourceDefinition) (*v1beta1.CustomResourceDefinition, error) { - finalizerName := defaultFinalizerName getter := r.Lister @@ -251,20 +253,20 @@ func (r *reconcilerImpl) updateFinalizersFiltered(ctx context.Context, resource existingFinalizers := sets.NewString(existing.Finalizers...) desiredFinalizers := sets.NewString(resource.Finalizers...) - if desiredFinalizers.Has(finalizerName) { - if existingFinalizers.Has(finalizerName) { + if desiredFinalizers.Has(r.finalizerName) { + if existingFinalizers.Has(r.finalizerName) { // Nothing to do. return resource, nil } // Add the finalizer. - finalizers = append(existing.Finalizers, finalizerName) + finalizers = append(existing.Finalizers, r.finalizerName) } else { - if !existingFinalizers.Has(finalizerName) { + if !existingFinalizers.Has(r.finalizerName) { // Nothing to do. return resource, nil } // Remove the finalizer. - existingFinalizers.Delete(finalizerName) + existingFinalizers.Delete(r.finalizerName) finalizers = existingFinalizers.List() } @@ -302,12 +304,12 @@ func (r *reconcilerImpl) setFinalizerIfFinalizer(ctx context.Context, resource * // If this resource is not being deleted, mark the finalizer. if resource.GetDeletionTimestamp().IsZero() { - finalizers.Insert(defaultFinalizerName) + finalizers.Insert(r.finalizerName) } resource.Finalizers = finalizers.List() - // Synchronize the finalizers filtered by defaultFinalizerName. + // Synchronize the finalizers filtered by r.finalizerName. return r.updateFinalizersFiltered(ctx, resource) } @@ -325,15 +327,15 @@ func (r *reconcilerImpl) clearFinalizer(ctx context.Context, resource *v1beta1.C var event *reconciler.ReconcilerEvent if reconciler.EventAs(reconcileEvent, &event) { if event.EventType == v1.EventTypeNormal { - finalizers.Delete(defaultFinalizerName) + finalizers.Delete(r.finalizerName) } } } else { - finalizers.Delete(defaultFinalizerName) + finalizers.Delete(r.finalizerName) } resource.Finalizers = finalizers.List() - // Synchronize the finalizers filtered by defaultFinalizerName. + // Synchronize the finalizers filtered by r.finalizerName. return r.updateFinalizersFiltered(ctx, resource) } diff --git a/client/injection/kube/reconciler/core/v1/namespace/controller.go b/client/injection/kube/reconciler/core/v1/namespace/controller.go index facba9cf4..046acc8ec 100644 --- a/client/injection/kube/reconciler/core/v1/namespace/controller.go +++ b/client/injection/kube/reconciler/core/v1/namespace/controller.go @@ -72,10 +72,11 @@ func NewImpl(ctx context.Context, r Interface, optionsFns ...controller.OptionsF } rec := &reconcilerImpl{ - Client: client.Get(ctx), - Lister: namespaceInformer.Lister(), - Recorder: recorder, - reconciler: r, + Client: client.Get(ctx), + Lister: namespaceInformer.Lister(), + Recorder: recorder, + reconciler: r, + finalizerName: defaultFinalizerName, } impl := controller.NewImpl(rec, logger, defaultQueueName) @@ -85,6 +86,9 @@ func NewImpl(ctx context.Context, r Interface, optionsFns ...controller.OptionsF if opts.ConfigStore != nil { rec.configStore = opts.ConfigStore } + if opts.FinalizerName != "" { + rec.finalizerName = opts.FinalizerName + } } return impl diff --git a/client/injection/kube/reconciler/core/v1/namespace/reconciler.go b/client/injection/kube/reconciler/core/v1/namespace/reconciler.go index f25dd65cf..979e5f0f4 100644 --- a/client/injection/kube/reconciler/core/v1/namespace/reconciler.go +++ b/client/injection/kube/reconciler/core/v1/namespace/reconciler.go @@ -80,6 +80,9 @@ type reconcilerImpl struct { // reconciler is the implementation of the business logic of the resource. reconciler Interface + + // finalizerName is the name of the finalizer to reconcile. + finalizerName string } // Check that our Reconciler implements controller.Reconciler @@ -230,9 +233,8 @@ func (r *reconcilerImpl) updateStatus(existing *v1.Namespace, desired *v1.Namesp // updateFinalizersFiltered will update the Finalizers of the resource. // TODO: this method could be generic and sync all finalizers. For now it only -// updates defaultFinalizerName. +// updates defaultFinalizerName or its override. func (r *reconcilerImpl) updateFinalizersFiltered(ctx context.Context, resource *v1.Namespace) (*v1.Namespace, error) { - finalizerName := defaultFinalizerName getter := r.Lister @@ -250,20 +252,20 @@ func (r *reconcilerImpl) updateFinalizersFiltered(ctx context.Context, resource existingFinalizers := sets.NewString(existing.Finalizers...) desiredFinalizers := sets.NewString(resource.Finalizers...) - if desiredFinalizers.Has(finalizerName) { - if existingFinalizers.Has(finalizerName) { + if desiredFinalizers.Has(r.finalizerName) { + if existingFinalizers.Has(r.finalizerName) { // Nothing to do. return resource, nil } // Add the finalizer. - finalizers = append(existing.Finalizers, finalizerName) + finalizers = append(existing.Finalizers, r.finalizerName) } else { - if !existingFinalizers.Has(finalizerName) { + if !existingFinalizers.Has(r.finalizerName) { // Nothing to do. return resource, nil } // Remove the finalizer. - existingFinalizers.Delete(finalizerName) + existingFinalizers.Delete(r.finalizerName) finalizers = existingFinalizers.List() } @@ -301,12 +303,12 @@ func (r *reconcilerImpl) setFinalizerIfFinalizer(ctx context.Context, resource * // If this resource is not being deleted, mark the finalizer. if resource.GetDeletionTimestamp().IsZero() { - finalizers.Insert(defaultFinalizerName) + finalizers.Insert(r.finalizerName) } resource.Finalizers = finalizers.List() - // Synchronize the finalizers filtered by defaultFinalizerName. + // Synchronize the finalizers filtered by r.finalizerName. return r.updateFinalizersFiltered(ctx, resource) } @@ -324,15 +326,15 @@ func (r *reconcilerImpl) clearFinalizer(ctx context.Context, resource *v1.Namesp var event *reconciler.ReconcilerEvent if reconciler.EventAs(reconcileEvent, &event) { if event.EventType == v1.EventTypeNormal { - finalizers.Delete(defaultFinalizerName) + finalizers.Delete(r.finalizerName) } } } else { - finalizers.Delete(defaultFinalizerName) + finalizers.Delete(r.finalizerName) } resource.Finalizers = finalizers.List() - // Synchronize the finalizers filtered by defaultFinalizerName. + // Synchronize the finalizers filtered by r.finalizerName. return r.updateFinalizersFiltered(ctx, resource) } diff --git a/codegen/cmd/injection-gen/generators/reconciler_controller.go b/codegen/cmd/injection-gen/generators/reconciler_controller.go index a41e3a1e2..ab4f420ed 100644 --- a/codegen/cmd/injection-gen/generators/reconciler_controller.go +++ b/codegen/cmd/injection-gen/generators/reconciler_controller.go @@ -198,6 +198,7 @@ func NewImpl(ctx {{.contextContext|raw}}, r Interface{{if .hasClass}}, classValu Lister: {{.type|lowercaseSingular}}Informer.Lister(), Recorder: recorder, reconciler: r, + finalizerName: defaultFinalizerName, {{if .hasClass}}classValue: classValue,{{end}} } impl := {{.controllerNewImpl|raw}}(rec, logger, defaultQueueName) @@ -208,6 +209,9 @@ func NewImpl(ctx {{.contextContext|raw}}, r Interface{{if .hasClass}}, classValu if opts.ConfigStore != nil { rec.configStore = opts.ConfigStore } + if opts.FinalizerName != "" { + rec.finalizerName = opts.FinalizerName + } } return impl diff --git a/codegen/cmd/injection-gen/generators/reconciler_reconciler.go b/codegen/cmd/injection-gen/generators/reconciler_reconciler.go index 45cd1c6de..68e2c0ef0 100644 --- a/codegen/cmd/injection-gen/generators/reconciler_reconciler.go +++ b/codegen/cmd/injection-gen/generators/reconciler_reconciler.go @@ -199,6 +199,9 @@ type reconcilerImpl struct { // reconciler is the implementation of the business logic of the resource. reconciler Interface + // finalizerName is the name of the finalizer to reconcile. + finalizerName string + {{if .hasClass}} // classValue is the resource annotation[{{ .class }}] instance value this reconciler instance filters on. classValue string @@ -381,10 +384,8 @@ func (r *reconcilerImpl) updateStatus(existing *{{.type|raw}}, desired *{{.type| var reconcilerFinalizerFactory = ` // updateFinalizersFiltered will update the Finalizers of the resource. // TODO: this method could be generic and sync all finalizers. For now it only -// updates defaultFinalizerName. +// updates defaultFinalizerName or its override. func (r *reconcilerImpl) updateFinalizersFiltered(ctx {{.contextContext|raw}}, resource *{{.type|raw}}) (*{{.type|raw}}, error) { - finalizerName := defaultFinalizerName - {{if .nonNamespaced}} getter := r.Lister {{else}} @@ -404,20 +405,20 @@ func (r *reconcilerImpl) updateFinalizersFiltered(ctx {{.contextContext|raw}}, r existingFinalizers := {{.setsNewString|raw}}(existing.Finalizers...) desiredFinalizers := {{.setsNewString|raw}}(resource.Finalizers...) - if desiredFinalizers.Has(finalizerName) { - if existingFinalizers.Has(finalizerName) { + if desiredFinalizers.Has(r.finalizerName) { + if existingFinalizers.Has(r.finalizerName) { // Nothing to do. return resource, nil } // Add the finalizer. - finalizers = append(existing.Finalizers, finalizerName) + finalizers = append(existing.Finalizers, r.finalizerName) } else { - if !existingFinalizers.Has(finalizerName) { + if !existingFinalizers.Has(r.finalizerName) { // Nothing to do. return resource, nil } // Remove the finalizer. - existingFinalizers.Delete(finalizerName) + existingFinalizers.Delete(r.finalizerName) finalizers = existingFinalizers.List() } @@ -458,12 +459,12 @@ func (r *reconcilerImpl) setFinalizerIfFinalizer(ctx {{.contextContext|raw}}, re // If this resource is not being deleted, mark the finalizer. if resource.GetDeletionTimestamp().IsZero() { - finalizers.Insert(defaultFinalizerName) + finalizers.Insert(r.finalizerName) } resource.Finalizers = finalizers.List() - // Synchronize the finalizers filtered by defaultFinalizerName. + // Synchronize the finalizers filtered by r.finalizerName. return r.updateFinalizersFiltered(ctx, resource) } @@ -481,16 +482,16 @@ func (r *reconcilerImpl) clearFinalizer(ctx {{.contextContext|raw}}, resource *{ var event *{{.reconcilerReconcilerEvent|raw}} if reconciler.EventAs(reconcileEvent, &event) { if event.EventType == {{.corev1EventTypeNormal|raw}} { - finalizers.Delete(defaultFinalizerName) + finalizers.Delete(r.finalizerName) } } } else { - finalizers.Delete(defaultFinalizerName) + finalizers.Delete(r.finalizerName) } resource.Finalizers = finalizers.List() - // Synchronize the finalizers filtered by defaultFinalizerName. + // Synchronize the finalizers filtered by r.finalizerName. return r.updateFinalizersFiltered(ctx, resource) } ` diff --git a/controller/options.go b/controller/options.go index 81c857464..5b7b8a405 100644 --- a/controller/options.go +++ b/controller/options.go @@ -23,6 +23,10 @@ import "knative.dev/pkg/reconciler" type Options struct { // ConfigStore is used to attach the frozen configuration to the context. ConfigStore reconciler.ConfigStore + + // FinalizerName is the name of the finalizer this reconciler uses. This + // overrides a default finalizer name assigned by the generator if needed. + FinalizerName string } // OptionsFn is a callback method signature that accepts an Impl and returns