Skip to content

Commit 4afa9c7

Browse files
authored
Merge pull request #237 from a-hilaly/static-finalizer
remove UUID-based finalizers in favor of static string
2 parents 26fe7c1 + 6381194 commit 4afa9c7

File tree

4 files changed

+19
-96
lines changed

4 files changed

+19
-96
lines changed

api/v1alpha1/zz_generated.deepcopy.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/controller/instance/controller_reconcile.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -394,7 +394,7 @@ func (igr *instanceGraphReconciler) finalizeDeletion(ctx context.Context) error
394394

395395
// Remove finalizer from instance
396396
instance := igr.runtime.GetInstance()
397-
patched, err := igr.setUnmanaged(ctx, instance, instance.GetUID())
397+
patched, err := igr.setUnmanaged(ctx, instance)
398398
if err != nil {
399399
return fmt.Errorf("failed to remove instance finalizer: %w", err)
400400
}
@@ -405,14 +405,14 @@ func (igr *instanceGraphReconciler) finalizeDeletion(ctx context.Context) error
405405

406406
// setManaged ensures the instance has the necessary finalizer and labels.
407407
func (igr *instanceGraphReconciler) setManaged(ctx context.Context, obj *unstructured.Unstructured, uid types.UID) (*unstructured.Unstructured, error) {
408-
if exist, _ := metadata.HasInstanceFinalizerUnstructured(obj, uid); exist {
408+
if exist, _ := metadata.HasInstanceFinalizerUnstructured(obj); exist {
409409
return obj, nil
410410
}
411411

412412
igr.log.V(1).Info("Setting managed state", "name", obj.GetName(), "namespace", obj.GetNamespace())
413413

414414
copy := obj.DeepCopy()
415-
if err := metadata.SetInstanceFinalizerUnstructured(copy, uid); err != nil {
415+
if err := metadata.SetInstanceFinalizerUnstructured(copy); err != nil {
416416
return nil, fmt.Errorf("failed to set finalizer: %w", err)
417417
}
418418

@@ -429,15 +429,15 @@ func (igr *instanceGraphReconciler) setManaged(ctx context.Context, obj *unstruc
429429
}
430430

431431
// setUnmanaged removes the finalizer from the instance.
432-
func (igr *instanceGraphReconciler) setUnmanaged(ctx context.Context, obj *unstructured.Unstructured, uid types.UID) (*unstructured.Unstructured, error) {
433-
if exist, _ := metadata.HasInstanceFinalizerUnstructured(obj, uid); !exist {
432+
func (igr *instanceGraphReconciler) setUnmanaged(ctx context.Context, obj *unstructured.Unstructured) (*unstructured.Unstructured, error) {
433+
if exist, _ := metadata.HasInstanceFinalizerUnstructured(obj); !exist {
434434
return obj, nil
435435
}
436436

437437
igr.log.V(1).Info("Removing managed state", "name", obj.GetName(), "namespace", obj.GetNamespace())
438438

439439
copy := obj.DeepCopy()
440-
if err := metadata.RemoveInstanceFinalizerUnstructured(copy, uid); err != nil {
440+
if err := metadata.RemoveInstanceFinalizerUnstructured(copy); err != nil {
441441
return nil, fmt.Errorf("failed to remove finalizer: %w", err)
442442
}
443443

pkg/metadata/finalizers.go

Lines changed: 7 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import (
1818

1919
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2020
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
21-
"k8s.io/apimachinery/pkg/types"
2221

2322
"github.com/kro-run/kro/api/v1alpha1"
2423
)
@@ -42,36 +41,15 @@ func HasResourceGraphDefinitionFinalizer(obj metav1.Object) bool {
4241
return containsString(obj.GetFinalizers(), kroFinalizer)
4342
}
4443

45-
// SetInstanceFinalizer adds an instance-specific finalizer to the object.
46-
func SetInstanceFinalizer(obj metav1.Object, uid types.UID) {
47-
finalizerName := getInstanceFinalizerName(uid)
48-
if !HasInstanceFinalizer(obj, uid) {
49-
obj.SetFinalizers(append(obj.GetFinalizers(), finalizerName))
50-
}
51-
}
52-
53-
// RemoveInstanceFinalizer removes an instance-specific finalizer from the object.
54-
func RemoveInstanceFinalizer(obj metav1.Object, uid types.UID) {
55-
finalizerName := getInstanceFinalizerName(uid)
56-
obj.SetFinalizers(removeString(obj.GetFinalizers(), finalizerName))
57-
}
58-
59-
// HasInstanceFinalizer checks if the object has an instance-specific finalizer.
60-
func HasInstanceFinalizer(obj metav1.Object, uid types.UID) bool {
61-
finalizerName := getInstanceFinalizerName(uid)
62-
return containsString(obj.GetFinalizers(), finalizerName)
63-
}
64-
6544
// SetInstanceFinalizerUnstructured adds an instance-specific finalizer to an unstructured object.
66-
func SetInstanceFinalizerUnstructured(obj *unstructured.Unstructured, uid types.UID) error {
67-
finalizerName := getInstanceFinalizerName(uid)
45+
func SetInstanceFinalizerUnstructured(obj *unstructured.Unstructured) error {
6846
finalizers, found, err := unstructured.NestedStringSlice(obj.Object, "metadata", "finalizers")
6947
if err != nil {
7048
return fmt.Errorf("error getting finalizers: %w", err)
7149
}
7250

73-
if !found || !containsString(finalizers, finalizerName) {
74-
finalizers = append(finalizers, finalizerName)
51+
if !found || !containsString(finalizers, kroFinalizer) {
52+
finalizers = append(finalizers, kroFinalizer)
7553
if err := unstructured.SetNestedStringSlice(obj.Object, finalizers, "metadata", "finalizers"); err != nil {
7654
return fmt.Errorf("error setting finalizers: %w", err)
7755
}
@@ -80,15 +58,14 @@ func SetInstanceFinalizerUnstructured(obj *unstructured.Unstructured, uid types.
8058
}
8159

8260
// RemoveInstanceFinalizerUnstructured removes an instance-specific finalizer from an unstructured object.
83-
func RemoveInstanceFinalizerUnstructured(obj *unstructured.Unstructured, uid types.UID) error {
84-
finalizerName := getInstanceFinalizerName(uid)
61+
func RemoveInstanceFinalizerUnstructured(obj *unstructured.Unstructured) error {
8562
finalizers, found, err := unstructured.NestedStringSlice(obj.Object, "metadata", "finalizers")
8663
if err != nil {
8764
return fmt.Errorf("error getting finalizers: %w", err)
8865
}
8966

9067
if found {
91-
finalizers = removeString(finalizers, finalizerName)
68+
finalizers = removeString(finalizers, kroFinalizer)
9269
if err := unstructured.SetNestedStringSlice(obj.Object, finalizers, "metadata", "finalizers"); err != nil {
9370
return fmt.Errorf("error setting finalizers: %w", err)
9471
}
@@ -97,8 +74,7 @@ func RemoveInstanceFinalizerUnstructured(obj *unstructured.Unstructured, uid typ
9774
}
9875

9976
// HasInstanceFinalizerUnstructured checks if an unstructured object has an instance-specific finalizer.
100-
func HasInstanceFinalizerUnstructured(obj *unstructured.Unstructured, uid types.UID) (bool, error) {
101-
finalizerName := getInstanceFinalizerName(uid)
77+
func HasInstanceFinalizerUnstructured(obj *unstructured.Unstructured) (bool, error) {
10278
finalizers, found, err := unstructured.NestedStringSlice(obj.Object, "metadata", "finalizers")
10379
if err != nil {
10480
return false, fmt.Errorf("error getting finalizers: %w", err)
@@ -108,15 +84,11 @@ func HasInstanceFinalizerUnstructured(obj *unstructured.Unstructured, uid types.
10884
return false, nil
10985
}
11086

111-
return containsString(finalizers, finalizerName), nil
87+
return containsString(finalizers, kroFinalizer), nil
11288
}
11389

11490
// Helper functions
11591

116-
func getInstanceFinalizerName(uid types.UID) string {
117-
return fmt.Sprintf("%s.%s", string(uid), kroFinalizer)
118-
}
119-
12092
func containsString(slice []string, s string) bool {
12193
for _, item := range slice {
12294
if item == s {

pkg/metadata/finalizers_test.go

Lines changed: 5 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import (
1919
"github.com/stretchr/testify/assert"
2020
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2121
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
22-
"k8s.io/apimachinery/pkg/types"
2322
)
2423

2524
func TestResourceGraphDefinitionFinalizer(t *testing.T) {
@@ -68,60 +67,12 @@ func TestResourceGraphDefinitionFinalizer(t *testing.T) {
6867
}
6968
}
7069

71-
func TestInstanceFinalizer(t *testing.T) {
72-
uid := types.UID("test-uid")
73-
cases := []struct {
74-
name string
75-
initialObject metav1.Object
76-
operation func(metav1.Object, types.UID)
77-
check func(metav1.Object, types.UID) bool
78-
expected bool
79-
}{
80-
{
81-
name: "Set instance finalizer on objet w/o finalizers",
82-
initialObject: &metav1.ObjectMeta{},
83-
operation: SetInstanceFinalizer,
84-
check: HasInstanceFinalizer,
85-
expected: true,
86-
},
87-
{
88-
name: "Set instanc finalizer on object w/ existing finalizers",
89-
initialObject: &metav1.ObjectMeta{Finalizers: []string{"some-other-finalizer"}},
90-
operation: SetInstanceFinalizer,
91-
check: HasInstanceFinalizer,
92-
expected: true,
93-
},
94-
{
95-
name: "Remove instance finalizer from object that has it",
96-
initialObject: &metav1.ObjectMeta{Finalizers: []string{getInstanceFinalizerName(uid)}},
97-
operation: RemoveInstanceFinalizer,
98-
check: HasInstanceFinalizer,
99-
expected: false,
100-
},
101-
{
102-
name: "Try to remove instance finalizer when its not present",
103-
initialObject: &metav1.ObjectMeta{Finalizers: []string{"some-other-finalizer"}},
104-
operation: RemoveInstanceFinalizer,
105-
check: HasInstanceFinalizer,
106-
expected: false,
107-
},
108-
}
109-
110-
for _, tc := range cases {
111-
t.Run(tc.name, func(t *testing.T) {
112-
tc.operation(tc.initialObject, uid)
113-
assert.Equal(t, tc.expected, tc.check(tc.initialObject, uid))
114-
})
115-
}
116-
}
117-
11870
func TestInstanceFinalizerUnstructured(t *testing.T) {
119-
uid := types.UID("test-uid")
12071
cases := []struct {
12172
name string
12273
initialObject *unstructured.Unstructured
123-
operation func(*unstructured.Unstructured, types.UID) error
124-
check func(*unstructured.Unstructured, types.UID) (bool, error)
74+
operation func(*unstructured.Unstructured) error
75+
check func(*unstructured.Unstructured) (bool, error)
12576
expected bool
12677
expectError bool
12778
}{
@@ -154,7 +105,7 @@ func TestInstanceFinalizerUnstructured(t *testing.T) {
154105
initialObject: &unstructured.Unstructured{
155106
Object: map[string]interface{}{
156107
"metadata": map[string]interface{}{
157-
"finalizers": []interface{}{getInstanceFinalizerName(uid)},
108+
"finalizers": []interface{}{kroFinalizer},
158109
},
159110
},
160111
},
@@ -179,12 +130,12 @@ func TestInstanceFinalizerUnstructured(t *testing.T) {
179130

180131
for _, tc := range cases {
181132
t.Run(tc.name, func(t *testing.T) {
182-
err := tc.operation(tc.initialObject, uid)
133+
err := tc.operation(tc.initialObject)
183134
if tc.expectError {
184135
assert.Error(t, err)
185136
} else {
186137
assert.NoError(t, err)
187-
hasF, err := tc.check(tc.initialObject, uid)
138+
hasF, err := tc.check(tc.initialObject)
188139
assert.NoError(t, err)
189140
assert.Equal(t, tc.expected, hasF)
190141
}

0 commit comments

Comments
 (0)