mirror of https://github.com/knative/pkg.git
Add a controller option to specify a custom finalizer name. (#1230)
This commit is contained in:
parent
edb546bf7a
commit
6103dd9b71
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
`
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue