Skip to content

Commit 2484830

Browse files
WIP: unit tests
Signed-off-by: Rashmi Gottipati <[email protected]>
1 parent 5e5ea56 commit 2484830

File tree

3 files changed

+107
-9
lines changed

3 files changed

+107
-9
lines changed

pkg/finalizer/finalizer.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,9 @@ import (
2121
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
2222
)
2323

24-
func NewFinalizers() (Finalizers, error) {
25-
return finalizers(map[string]Finalizer{}), nil
24+
// NewFinalizers returns the Finalizers interface
25+
func NewFinalizers() Finalizers {
26+
return finalizers(map[string]Finalizer{})
2627
}
2728

2829
func (f finalizers) Register(key string, finalizer Finalizer) error {
@@ -36,13 +37,13 @@ func (f finalizers) Register(key string, finalizer Finalizer) error {
3637
func (f finalizers) Finalize(ctx context.Context, obj client.Object) (bool, error) {
3738
needsUpdate := false
3839
for key, finalizer := range f {
39-
if obj.GetDeletionTimestamp() == nil && !controllerutil.ContainsFinalizer(obj, key) {
40+
if obj.GetDeletionTimestamp().IsZero() && !controllerutil.ContainsFinalizer(obj, key) {
4041
controllerutil.AddFinalizer(obj, key)
4142
needsUpdate = true
4243
} else if obj.GetDeletionTimestamp() != nil && controllerutil.ContainsFinalizer(obj, key) {
43-
_, err := finalizer.Finalize(ctx, obj)
44+
needsUpdate, err := finalizer.Finalize(ctx, obj)
4445
if err != nil {
45-
return true, fmt.Errorf("finalize failed for key %q: %v", key, err)
46+
return needsUpdate, fmt.Errorf("finalize failed for key %q: %v", key, err)
4647
}
4748
controllerutil.RemoveFinalizer(obj, key)
4849
needsUpdate = true

pkg/finalizer/finalizer_test.go

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
package finalizer
2+
3+
import (
4+
"context"
5+
"testing"
6+
7+
. "github.com/onsi/ginkgo"
8+
. "github.com/onsi/gomega"
9+
corev1 "k8s.io/api/core/v1"
10+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
11+
"sigs.k8s.io/controller-runtime/pkg/client"
12+
"sigs.k8s.io/controller-runtime/pkg/envtest/printer"
13+
)
14+
15+
type mockFinalizer struct{}
16+
17+
func (f mockFinalizer) Finalize(context.Context, client.Object) (needsUpdate bool, err error) {
18+
return true, nil
19+
}
20+
func TestFinalizer(t *testing.T) {
21+
RegisterFailHandler(Fail)
22+
suiteName := "Finalizer Suite"
23+
RunSpecsWithDefaultAndCustomReporters(t, suiteName, []Reporter{printer.NewlineReporter{}, printer.NewProwReporter(suiteName)})
24+
}
25+
26+
var _ = Describe("TestFinalizer", func() {
27+
var err error
28+
var pod *corev1.Pod
29+
var finalizers Finalizers
30+
var f mockFinalizer
31+
BeforeEach(func() {
32+
pod = &corev1.Pod{
33+
ObjectMeta: metav1.ObjectMeta{
34+
Finalizers: []string{"finalizers.sigs.k8s.io/testfinalizer"},
35+
},
36+
}
37+
Expect(pod).NotTo(BeNil())
38+
39+
finalizers = NewFinalizers()
40+
Expect(finalizers).NotTo(BeNil())
41+
42+
f := mockFinalizer{}
43+
Expect(f).NotTo(BeNil())
44+
45+
})
46+
Describe("Finalizer helper library", func() {
47+
It("Register should successfully register a finalizer", func() {
48+
err = finalizers.Register("finalizers.sigs.k8s.io/testfinalizer", f)
49+
Expect(err).To(BeNil())
50+
})
51+
52+
It("Register should return an error when it is called twice with the same key", func() {
53+
err = finalizers.Register("finalizers.sigs.k8s.io/testfinalizer", f)
54+
Expect(err).To(BeNil())
55+
56+
// calling Register again with the same key should return an error
57+
err = finalizers.Register("finalizers.sigs.k8s.io/testfinalizer", f)
58+
Expect(err).NotTo(BeNil())
59+
Expect(err.Error()).To(ContainSubstring("already registered"))
60+
61+
})
62+
63+
It("Finalize should return no error and indicate false for needsUpdate if a finalizer is not registered", func() {
64+
ret, err := finalizers.Finalize(context.TODO(), pod)
65+
Expect(err).To(BeNil())
66+
Expect(ret).To(BeFalse())
67+
})
68+
69+
It("Finalize should return no error when deletion timestamp is not nil and the finalizer exists", func() {
70+
now := metav1.Now()
71+
pod.DeletionTimestamp = &now
72+
73+
err = finalizers.Register("finalizers.sigs.k8s.io/testfinalizer", f)
74+
Expect(err).To(BeNil())
75+
76+
_, err := finalizers.Finalize(context.TODO(), pod)
77+
Expect(err).To(BeNil())
78+
})
79+
80+
It("Finalize should return no error when deletion timestamp is nil and finalizer does not exist", func() {
81+
err = finalizers.Register("finalizers.sigs.k8s.io/testfinalizer", f)
82+
Expect(err).To(BeNil())
83+
84+
pod.DeletionTimestamp = nil
85+
pod.Finalizers = []string{}
86+
87+
ret, err := finalizers.Finalize(context.TODO(), pod)
88+
Expect(err).To(BeNil())
89+
Expect(ret).To(BeTrue())
90+
})
91+
})
92+
})

pkg/finalizer/types.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,21 +19,26 @@ import (
1919
"sigs.k8s.io/controller-runtime/pkg/client"
2020
)
2121

22+
// Registerer holds Register that will check if a key is already registered
23+
// and error out and it does; and if not registered, it will add the finalizer
24+
// to the finalizers map as the value for the provided key
2225
type Registerer interface {
2326
Register(key string, f Finalizer) error
2427
}
2528

29+
// Finalizer holds Finalize that will add/remove a finalizer based on the
30+
// deletion timestamp being set and return an indication of whether the
31+
// obj needs an update or not
2632
type Finalizer interface {
2733
Finalize(context.Context, client.Object) (needsUpdate bool, err error)
2834
}
2935

3036
type finalizers map[string]Finalizer
3137

38+
// Finalizers implements Registerer and Finalizer to finalize all registered
39+
// finalizers if the provided object has a deletion timestamp or set all
40+
// registered finalizers if it does not
3241
type Finalizers interface {
33-
// implements Registerer and Finalizer to finalize
34-
// all registered finalizers if the provided object
35-
// has a deletion timestamp or set all registered
36-
// finalizers if it doesn't
3742
Registerer
3843
Finalizer
3944
}

0 commit comments

Comments
 (0)