/
counting_finalizer.go
57 lines (47 loc) · 1.38 KB
/
counting_finalizer.go
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
package countingfinalizer
import (
"fmt"
"strconv"
"strings"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
)
// Decrement accepts an Object and decrements (or removes) the provided finalizer.
func Decrement(o client.Object, prefix string) {
i := get(o, prefix)
if i < 0 {
return
}
if i <= 1 {
controllerutil.RemoveFinalizer(o, fmt.Sprintf("%s%d", prefix, i))
return
}
controllerutil.RemoveFinalizer(o, fmt.Sprintf("%s%d", prefix, i))
controllerutil.AddFinalizer(o, fmt.Sprintf("%s%d", prefix, i-1))
}
// Increment accepts an Object and increments (or adds) the provided finalizer.
func Increment(o client.Object, prefix string) {
i := get(o, prefix)
if i < 0 {
controllerutil.AddFinalizer(o, fmt.Sprintf("%s%d", prefix, 1))
return
}
controllerutil.RemoveFinalizer(o, fmt.Sprintf("%s%d", prefix, i))
controllerutil.AddFinalizer(o, fmt.Sprintf("%s%d", prefix, i+1))
}
// get checks an Object that the provided counting finalizer is present and returns its value.
func get(o client.Object, prefix string) int {
finalizers := o.GetFinalizers()
for _, finalizer := range finalizers {
if strings.HasPrefix(finalizer, prefix) {
value := strings.TrimPrefix(finalizer, prefix)
i, err := strconv.Atoi(value)
if err != nil {
// Apparently not out finalizer.
continue
}
return i
}
}
return -1
}