finalizer.go 2.03 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package controller_common

import (
	"context"

	"sigs.k8s.io/controller-runtime/pkg/client"
	"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
	"sigs.k8s.io/controller-runtime/pkg/log"
)

const (
	finalizerName = "nvidia.com/finalizer"
)

func AddFinalizer(obj client.Object) {
	controllerutil.AddFinalizer(obj, finalizerName)
}

func RemoveFinalizer(obj client.Object) {
	controllerutil.RemoveFinalizer(obj, finalizerName)
}

func ContainsFinalizer(obj client.Object) bool {
	return controllerutil.ContainsFinalizer(obj, finalizerName)
}

type Finalizer[T client.Object] interface {
	FinalizeResource(ctx context.Context, obj T) error
}

func HandleFinalizer[T client.Object](ctx context.Context, obj T, writer client.Writer, finalizer Finalizer[T]) (bool, error) {
	logger := log.FromContext(ctx)
	// Check if the CR is being deleted
	if obj.GetDeletionTimestamp().IsZero() {
		// object is not being deleted, add the finalizer if it doesn't exist
		if !ContainsFinalizer(obj) {
			logger.Info("Adding finalizer to object", "resourceVersion", obj.GetResourceVersion())
			AddFinalizer(obj)
			err := writer.Update(ctx, obj)
			if err != nil {
				logger.Error(err, "Failed to add finalizer")
				return false, err
			}
			logger.Info("Finalizer added to object", "resourceVersion", obj.GetResourceVersion())
		}
	} else {
		// object is being deleted, if the finalizer exists, call the finalizer and remove the finalizer
		if ContainsFinalizer(obj) {
			logger.Info("Calling finalizer", "resourceVersion", obj.GetResourceVersion())
			err := finalizer.FinalizeResource(ctx, obj)
			if err != nil {
				logger.Error(err, "Failed to call finalizer")
				return false, err
			}
			logger.Info("Removing finalizer from object", "resourceVersion", obj.GetResourceVersion())
			RemoveFinalizer(obj)
			err = writer.Update(ctx, obj)
			if err != nil {
				logger.Error(err, "Failed to remove finalizer")
				return false, err
			}
			logger.Info("Finalizer removed from object", "resourceVersion", obj.GetResourceVersion())
			return true, nil
		}
	}
	return false, nil
}