Skip to content

Commit ee7e682

Browse files
author
Eric Stroczynski
authored
*: format finalizers correctly
This commit modifies the suggested format for finalizers from <finalizer-name>.<qualified-group> to <qualified-group>/<finalizer-name>, which is the recommended format in k8s docs. This change is not breaking because technically any name format is allowed Signed-off-by: Eric Stroczynski <[email protected]>
1 parent df87e6c commit ee7e682

File tree

19 files changed

+84
-91
lines changed

19 files changed

+84
-91
lines changed
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
entries:
2+
- description: >
3+
Changed the suggested finalizer format to `<qualified-group>/<finalizer-name>`
4+
kind: change
5+
migration:
6+
header: Change your operator's finalizer names
7+
body: >
8+
The finalizer name format suggested by [Kubernetes docs](https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/#finalizers)
9+
is `<qualified-group>/<finalizer-name>`, while the format previously documented by Operator SDK docs was
10+
`<finalizer-name>.<qualified-group>`. If your operator uses any finalizers with names matching the incorrect format,
11+
change them to match the official format.
12+
For example, `finalizer.cache.example.com` should be changed to `cache.example.com/finalizer`.

hack/generate/samples/internal/ansible/constants.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -355,7 +355,7 @@ const taskToDeleteConfigMap = `- name: delete configmap for test
355355

356356
const memcachedWatchCustomizations = `playbook: playbooks/memcached.yml
357357
finalizer:
358-
name: finalizer.cache.example.com
358+
name: cache.example.com/finalizer
359359
role: memfin
360360
blacklist:
361361
- group: ""

internal/ansible/controller/reconcile.go

Lines changed: 16 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import (
3232
"k8s.io/apimachinery/pkg/runtime/schema"
3333
"k8s.io/apimachinery/pkg/types"
3434
"sigs.k8s.io/controller-runtime/pkg/client"
35+
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
3536
logf "sigs.k8s.io/controller-runtime/pkg/log"
3637
"sigs.k8s.io/controller-runtime/pkg/reconcile"
3738

@@ -100,22 +101,21 @@ func (r *AnsibleOperatorReconciler) Reconcile(ctx context.Context, request recon
100101

101102
deleted := u.GetDeletionTimestamp() != nil
102103
finalizer, finalizerExists := r.Runner.GetFinalizer()
103-
pendingFinalizers := u.GetFinalizers()
104-
// If the resource is being deleted we don't want to add the finalizer again
105-
if finalizerExists && !deleted && !contains(pendingFinalizers, finalizer) {
106-
logger.V(1).Info("Adding finalizer to resource", "Finalizer", finalizer)
107-
finalizers := append(pendingFinalizers, finalizer)
108-
u.SetFinalizers(finalizers)
109-
err := r.Client.Update(ctx, u)
110-
if err != nil {
111-
logger.Error(err, "Unable to update cr with finalizer")
112-
return reconcileResult, err
104+
if !controllerutil.ContainsFinalizer(u, finalizer) {
105+
if deleted {
106+
// If the resource is being deleted we don't want to add the finalizer again
107+
logger.Info("Resource is terminated, skipping reconciliation")
108+
return reconcile.Result{}, nil
109+
} else if finalizerExists {
110+
logger.V(1).Info("Adding finalizer to resource", "Finalizer", finalizer)
111+
controllerutil.AddFinalizer(u, finalizer)
112+
err := r.Client.Update(ctx, u)
113+
if err != nil {
114+
logger.Error(err, "Unable to update cr with finalizer")
115+
return reconcileResult, err
116+
}
113117
}
114118
}
115-
if !contains(pendingFinalizers, finalizer) && deleted {
116-
logger.Info("Resource is terminated, skipping reconciliation")
117-
return reconcile.Result{}, nil
118-
}
119119

120120
spec := u.Object["spec"]
121121
_, ok := spec.(map[string]interface{})
@@ -240,22 +240,14 @@ func (r *AnsibleOperatorReconciler) Reconcile(ctx context.Context, request recon
240240
return reconcile.Result{}, err
241241
}
242242

243-
// try to get the updated finalizers
244-
pendingFinalizers = u.GetFinalizers()
245-
246243
// We only want to update the CustomResource once, so we'll track changes
247244
// and do it at the end
248245
runSuccessful := len(failureMessages) == 0
249246

250247
// The finalizer has run successfully, time to remove it
248+
deleted = u.GetDeletionTimestamp() != nil
251249
if deleted && finalizerExists && runSuccessful {
252-
finalizers := []string{}
253-
for _, pendingFinalizer := range pendingFinalizers {
254-
if pendingFinalizer != finalizer {
255-
finalizers = append(finalizers, pendingFinalizer)
256-
}
257-
}
258-
u.SetFinalizers(finalizers)
250+
controllerutil.RemoveFinalizer(u, finalizer)
259251
err := r.Client.Update(ctx, u)
260252
if err != nil {
261253
logger.Error(err, "Failed to remove finalizer")
@@ -419,15 +411,6 @@ func (r *AnsibleOperatorReconciler) markDone(ctx context.Context, nn types.Names
419411
return r.Client.Status().Update(ctx, u)
420412
}
421413

422-
func contains(l []string, s string) bool {
423-
for _, elem := range l {
424-
if elem == s {
425-
return true
426-
}
427-
}
428-
return false
429-
}
430-
431414
// getStatus returns u's "status" block as a status.Status.
432415
func getStatus(u *unstructured.Unstructured) ansiblestatus.Status {
433416
statusInterface := u.Object["status"]

internal/ansible/controller/reconcile_test.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ func TestReconcile(t *testing.T) {
258258
Created: eventapi.EventTime{Time: eventTime},
259259
},
260260
},
261-
Finalizer: "testing.io",
261+
Finalizer: "testing.io/finalizer",
262262
},
263263
Client: fakeclient.NewClientBuilder().WithObjects(&unstructured.Unstructured{
264264
Object: map[string]interface{}{
@@ -292,7 +292,7 @@ func TestReconcile(t *testing.T) {
292292
controller.ReconcilePeriodAnnotation: "3s",
293293
},
294294
"finalizers": []interface{}{
295-
"testing.io",
295+
"testing.io/finalizer",
296296
},
297297
},
298298
"apiVersion": "operator-sdk/v1beta1",
@@ -329,7 +329,7 @@ func TestReconcile(t *testing.T) {
329329
Created: eventapi.EventTime{Time: eventTime},
330330
},
331331
},
332-
Finalizer: "testing.io",
332+
Finalizer: "testing.io/finalizer",
333333
},
334334
Client: fakeclient.NewClientBuilder().WithObjects(&unstructured.Unstructured{
335335
Object: map[string]interface{}{
@@ -366,15 +366,15 @@ func TestReconcile(t *testing.T) {
366366
Created: eventapi.EventTime{Time: eventTime},
367367
},
368368
},
369-
Finalizer: "testing.io",
369+
Finalizer: "testing.io/finalizer",
370370
},
371371
Client: fakeclient.NewClientBuilder().WithObjects(&unstructured.Unstructured{
372372
Object: map[string]interface{}{
373373
"metadata": map[string]interface{}{
374374
"name": "reconcile",
375375
"namespace": "default",
376376
"finalizers": []interface{}{
377-
"testing.io",
377+
"testing.io/finalizer",
378378
},
379379
"deletionTimestamp": eventTime.Format(time.RFC3339),
380380
},

internal/ansible/runner/runner_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ func TestNew(t *testing.T) {
9393
},
9494
playbook: validPlaybook,
9595
finalizer: &watches.Finalizer{
96-
Name: "example.finalizer.com",
96+
Name: "operator.example.com/finalizer",
9797
Playbook: validPlaybook,
9898
},
9999
},
@@ -106,7 +106,7 @@ func TestNew(t *testing.T) {
106106
},
107107
role: validRole,
108108
finalizer: &watches.Finalizer{
109-
Name: "example.finalizer.com",
109+
Name: "operator.example.com/finalizer",
110110
Role: validRole,
111111
},
112112
},
@@ -119,7 +119,7 @@ func TestNew(t *testing.T) {
119119
},
120120
playbook: validPlaybook,
121121
finalizer: &watches.Finalizer{
122-
Name: "example.finalizer.com",
122+
Name: "operator.example.com/finalizer",
123123
Vars: map[string]interface{}{
124124
"state": "absent",
125125
},
@@ -137,7 +137,7 @@ func TestNew(t *testing.T) {
137137
"type": "this",
138138
},
139139
finalizer: &watches.Finalizer{
140-
Name: "example.finalizer.com",
140+
Name: "operator.example.com/finalizer",
141141
Vars: map[string]interface{}{
142142
"state": "absent",
143143
},

internal/ansible/watches/testdata/duplicate_gvk.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@
44
kind: Database
55
playbook: playbook.yaml
66
finalizer:
7-
name: finalizer.app.example.com
7+
name: app.example.com/finalizer
88
vars:
99
sentinel: finalizer_running
1010
- version: v1alpha1
1111
group: app.example.com
1212
kind: Database
1313
playbook: playbook.yaml
1414
finalizer:
15-
name: finalizer.app.example.com
15+
name: app.example.com/finalizer
1616
vars:
1717
sentinel: finalizer_running

internal/ansible/watches/testdata/invalid.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@ version: v1alpha1
44
kind: Database
55
playbook: playbook.yaml
66
finalizer:
7-
name: finalizer.app.example.com
7+
name: app.example.com/finalizer
88
vars:
99
sentinel: finalizer_running

internal/ansible/watches/testdata/invalid_finalizer_no_vars.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@
44
kind: Database
55
playbook: playbook.yaml
66
finalizer:
7-
name: foo.app.example.com
7+
name: foo.app.example.com/finalizer

internal/ansible/watches/testdata/invalid_finalizer_playbook_path.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
kind: Database
55
playbook: playbook.yaml
66
finalizer:
7-
name: finalizer.app.example.com
7+
name: app.example.com/finalizer
88
playbook: playbook.yaml
99
vars:
1010
sentinel: finalizer_running

internal/ansible/watches/testdata/invalid_finalizer_role_path.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
kind: Database
55
playbook: playbook.yaml
66
finalizer:
7-
name: finalizer.app.example.com
7+
name: app.example.com/finalizer
88
role: ansible/role
99
vars:
1010
sentinel: finalizer_running

0 commit comments

Comments
 (0)