mirror of https://github.com/status-im/consul.git
docs: developer docs for resource finalizers (#20631)
This commit is contained in:
parent
8425cd0f90
commit
2baf5e78a4
|
@ -477,6 +477,73 @@ func (barInitializer) Initialize(ctx context.Context, rt controller.Runtime) err
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Finalizer
|
||||||
|
|
||||||
|
A finalizer allows a controller to execute teardown logic before a
|
||||||
|
resource is deleted. This can be useful to perform cleanup or block
|
||||||
|
deletion until certain conditions are met.
|
||||||
|
|
||||||
|
Finalizers are encoded as keys within a resource's metadata map. It
|
||||||
|
is the responsibility of each controller that adds a finalizer to a
|
||||||
|
resource to remove the finalizer when it is marked for deletion.
|
||||||
|
Once a resource has no finalizers present, it is deleted by the
|
||||||
|
resource service.
|
||||||
|
|
||||||
|
When the `Delete` endpoint is called on a resource with one or more
|
||||||
|
finalizers, the resource is marked for deletion by adding an immutable
|
||||||
|
`deletionTimestamp` key to the resource's metadata map. The resource is
|
||||||
|
now effectively frozen and will only accept subsequent `Write`s
|
||||||
|
that remove finalizers. `WriteStatus` is still allowed.
|
||||||
|
|
||||||
|
The `resource` package API can be used to manage finalizers and
|
||||||
|
check whether a resource has been marked for deletion. You would
|
||||||
|
typically use this API within the logic of your controller's
|
||||||
|
`Reconcile` method to either put a finalizer in place or perform
|
||||||
|
cleanup and then remove a finalizer. Don't forget to `Write` your
|
||||||
|
changes once you add or remove finalizers.
|
||||||
|
|
||||||
|
```Go
|
||||||
|
package resource
|
||||||
|
|
||||||
|
// IsMarkedForDeletion returns true if a resource has been marked for deletion,
|
||||||
|
// false otherwise.
|
||||||
|
func IsMarkedForDeletion(res *pbresource.Resource) bool { ... }
|
||||||
|
|
||||||
|
// HasFinalizers returns true if a resource has one or more finalizers, false otherwise.
|
||||||
|
func HasFinalizers(res *pbresource.Resource) bool { ... }
|
||||||
|
|
||||||
|
// HasFinalizer returns true if a resource has a given finalizer, false otherwise.
|
||||||
|
func HasFinalizer(res *pbresource.Resource, finalizer string) bool { ... }
|
||||||
|
|
||||||
|
// AddFinalizer adds a finalizer to the given resource.
|
||||||
|
func AddFinalizer(res *pbresource.Resource, finalizer string) { ... }
|
||||||
|
|
||||||
|
// RemoveFinalizer removes a finalizer from the given resource.
|
||||||
|
func RemoveFinalizer(res *pbresource.Resource, finalizer string) { ... }
|
||||||
|
|
||||||
|
// GetFinalizers returns the set of finalizers for the given resource.
|
||||||
|
func GetFinalizers(res *pbresource.Resource) mapset.Set[string] { ... }
|
||||||
|
```
|
||||||
|
|
||||||
|
Example flow in a controller's `Reconcile` method
|
||||||
|
```Go
|
||||||
|
const finalizer = "consul.io/bar-finalizer"
|
||||||
|
|
||||||
|
func (barReconciler) Reconcile(ctx context.Context, rt controller.Runtime, req controller.Request) error {
|
||||||
|
...
|
||||||
|
// Check if resource is marked for deletion. If yes, perform cleanup, remove finalizer, and Write the resource
|
||||||
|
if resource.IsMarkedForDeletion(res) {
|
||||||
|
// Perform some cleanup...
|
||||||
|
return EnsureFinalizerRemoved(ctx, rt, res, finalizer)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if resource has finalizer. If not, add it and Write the resource
|
||||||
|
if err := EnsureHasFinalizer(ctx, rt, res, finalizer); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
## Ownership & Cascading Deletion
|
## Ownership & Cascading Deletion
|
||||||
|
|
||||||
The resource service implements a lightweight `1:N` ownership model where, on
|
The resource service implements a lightweight `1:N` ownership model where, on
|
||||||
|
|
Loading…
Reference in New Issue