Add a controller option to specify a custom finalizer name. (#1230)

This commit is contained in:
Markus Thömmes 2020-04-22 23:55:40 +02:00 committed by GitHub
parent edb546bf7a
commit 6103dd9b71
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 66 additions and 45 deletions

View File

@ -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

View File

@ -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)
}

View File

@ -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

View File

@ -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)
}

View File

@ -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

View File

@ -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)
}
`

View File

@ -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