pkg/k8s/finalizer.go (57 lines of code) (raw):
// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License"). You may
// not use this file except in compliance with the License. A copy of the
// License is located at
//
// http://aws.amazon.com/apache2.0/
//
// or in the "license" file accompanying this file. This file is distributed
// on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
// express or implied. See the License for the specific language governing
// permissions and limitations under the License.
package k8s
import (
"context"
"github.com/go-logr/logr"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
)
type FinalizerManager interface {
AddFinalizers(ctx context.Context, object client.Object, finalizers ...string) error
RemoveFinalizers(ctx context.Context, object client.Object, finalizers ...string) error
}
func NewDefaultFinalizerManager(k8sClient client.Client, log logr.Logger) FinalizerManager {
return &defaultFinalizerManager{
k8sClient: k8sClient,
log: log,
}
}
type defaultFinalizerManager struct {
k8sClient client.Client
log logr.Logger
}
func (m *defaultFinalizerManager) AddFinalizers(ctx context.Context, obj client.Object, finalizers ...string) error {
if err := m.k8sClient.Get(ctx, client.ObjectKeyFromObject(obj), obj); err != nil {
return err
}
oldObj := obj.DeepCopyObject().(client.Object)
needsUpdate := false
for _, finalizer := range finalizers {
if !controllerutil.ContainsFinalizer(obj, finalizer) {
m.log.Info("adding finalizer", "object", obj.GetObjectKind().GroupVersionKind().Kind, "name", obj.GetName(), "finalizer", finalizer)
controllerutil.AddFinalizer(obj, finalizer)
needsUpdate = true
}
}
if !needsUpdate {
return nil
}
return m.k8sClient.Patch(ctx, obj, client.MergeFromWithOptions(oldObj, client.MergeFromWithOptimisticLock{}))
}
func (m *defaultFinalizerManager) RemoveFinalizers(ctx context.Context, obj client.Object, finalizers ...string) error {
if err := m.k8sClient.Get(ctx, client.ObjectKeyFromObject(obj), obj); err != nil {
return err
}
oldObj := obj.DeepCopyObject().(client.Object)
needsUpdate := false
for _, finalizer := range finalizers {
if controllerutil.ContainsFinalizer(obj, finalizer) {
m.log.Info("removing finalizer", "object", obj.GetObjectKind().GroupVersionKind().Kind, "name", obj.GetName(), "finalizer", finalizer)
controllerutil.RemoveFinalizer(obj, finalizer)
needsUpdate = true
}
}
if !needsUpdate {
return nil
}
return m.k8sClient.Patch(ctx, obj, client.MergeFromWithOptions(oldObj, client.MergeFromWithOptimisticLock{}))
}