@@ -29,7 +29,9 @@ import (
29
29
"k8s.io/apimachinery/pkg/runtime/schema"
30
30
"k8s.io/apimachinery/pkg/util/wait"
31
31
"k8s.io/client-go/tools/record"
32
+ "k8s.io/client-go/util/retry"
32
33
"sigs.k8s.io/controller-runtime/pkg/client"
34
+ "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
33
35
"sigs.k8s.io/controller-runtime/pkg/reconcile"
34
36
35
37
"github.com/operator-framework/operator-sdk/internal/util/diffutil"
@@ -94,38 +96,8 @@ func (r HelmOperatorReconciler) Reconcile(request reconcile.Request) (reconcile.
94
96
status := types .StatusFor (o )
95
97
log = log .WithValues ("release" , manager .ReleaseName ())
96
98
97
- deleted := o .GetDeletionTimestamp () != nil
98
- pendingFinalizers := o .GetFinalizers ()
99
- if ! deleted && ! contains (pendingFinalizers , finalizer ) {
100
- log .V (1 ).Info ("Adding finalizer" , "finalizer" , finalizer )
101
- finalizers := append (pendingFinalizers , finalizer )
102
- o .SetFinalizers (finalizers )
103
- err = r .updateResource (o )
104
-
105
- // Need to requeue because finalizer update does not change metadata.generation
106
- return reconcile.Result {Requeue : true }, err
107
- }
108
-
109
- status .SetCondition (types.HelmAppCondition {
110
- Type : types .ConditionInitialized ,
111
- Status : types .StatusTrue ,
112
- })
113
-
114
- if err := manager .Sync (context .TODO ()); err != nil {
115
- log .Error (err , "Failed to sync release" )
116
- status .SetCondition (types.HelmAppCondition {
117
- Type : types .ConditionIrreconcilable ,
118
- Status : types .StatusTrue ,
119
- Reason : types .ReasonReconcileError ,
120
- Message : err .Error (),
121
- })
122
- _ = r .updateResourceStatus (o , status )
123
- return reconcile.Result {}, err
124
- }
125
- status .RemoveCondition (types .ConditionIrreconcilable )
126
-
127
- if deleted {
128
- if ! contains (pendingFinalizers , finalizer ) {
99
+ if o .GetDeletionTimestamp () != nil {
100
+ if ! contains (o .GetFinalizers (), finalizer ) {
129
101
log .Info ("Resource is terminated, skipping reconciliation" )
130
102
return reconcile.Result {}, nil
131
103
}
@@ -163,13 +135,7 @@ func (r HelmOperatorReconciler) Reconcile(request reconcile.Request) (reconcile.
163
135
return reconcile.Result {}, err
164
136
}
165
137
166
- finalizers := []string {}
167
- for _ , pendingFinalizer := range pendingFinalizers {
168
- if pendingFinalizer != finalizer {
169
- finalizers = append (finalizers , pendingFinalizer )
170
- }
171
- }
172
- o .SetFinalizers (finalizers )
138
+ controllerutil .RemoveFinalizer (o , finalizer )
173
139
if err := r .updateResource (o ); err != nil {
174
140
log .Info ("Failed to remove CR uninstall finalizer" )
175
141
return reconcile.Result {}, err
@@ -187,6 +153,24 @@ func (r HelmOperatorReconciler) Reconcile(request reconcile.Request) (reconcile.
187
153
return reconcile.Result {}, nil
188
154
}
189
155
156
+ status .SetCondition (types.HelmAppCondition {
157
+ Type : types .ConditionInitialized ,
158
+ Status : types .StatusTrue ,
159
+ })
160
+
161
+ if err := manager .Sync (context .TODO ()); err != nil {
162
+ log .Error (err , "Failed to sync release" )
163
+ status .SetCondition (types.HelmAppCondition {
164
+ Type : types .ConditionIrreconcilable ,
165
+ Status : types .StatusTrue ,
166
+ Reason : types .ReasonReconcileError ,
167
+ Message : err .Error (),
168
+ })
169
+ _ = r .updateResourceStatus (o , status )
170
+ return reconcile.Result {}, err
171
+ }
172
+ status .RemoveCondition (types .ConditionIrreconcilable )
173
+
190
174
if ! manager .IsInstalled () {
191
175
for k , v := range r .OverrideValues {
192
176
r .EventRecorder .Eventf (o , "Warning" , "OverrideValuesInUse" ,
@@ -206,6 +190,13 @@ func (r HelmOperatorReconciler) Reconcile(request reconcile.Request) (reconcile.
206
190
}
207
191
status .RemoveCondition (types .ConditionReleaseFailed )
208
192
193
+ log .V (1 ).Info ("Adding finalizer" , "finalizer" , finalizer )
194
+ controllerutil .AddFinalizer (o , finalizer )
195
+ if err := r .updateResource (o ); err != nil {
196
+ log .Info ("Failed to add CR uninstall finalizer" )
197
+ return reconcile.Result {}, err
198
+ }
199
+
209
200
if r .releaseHook != nil {
210
201
if err := r .releaseHook (installedRelease ); err != nil {
211
202
log .Error (err , "Failed to run release hook" )
@@ -236,6 +227,15 @@ func (r HelmOperatorReconciler) Reconcile(request reconcile.Request) (reconcile.
236
227
return reconcile.Result {RequeueAfter : r .ReconcilePeriod }, err
237
228
}
238
229
230
+ if ! contains (o .GetFinalizers (), finalizer ) {
231
+ log .V (1 ).Info ("Adding finalizer" , "finalizer" , finalizer )
232
+ controllerutil .AddFinalizer (o , finalizer )
233
+ if err := r .updateResource (o ); err != nil {
234
+ log .Info ("Failed to add CR uninstall finalizer" )
235
+ return reconcile.Result {}, err
236
+ }
237
+ }
238
+
239
239
if manager .IsUpdateRequired () {
240
240
for k , v := range r .OverrideValues {
241
241
r .EventRecorder .Eventf (o , "Warning" , "OverrideValuesInUse" ,
@@ -343,12 +343,16 @@ func hasHelmUpgradeForceAnnotation(o *unstructured.Unstructured) bool {
343
343
}
344
344
345
345
func (r HelmOperatorReconciler ) updateResource (o runtime.Object ) error {
346
- return r .Client .Update (context .TODO (), o )
346
+ return retry .RetryOnConflict (retry .DefaultBackoff , func () error {
347
+ return r .Client .Update (context .TODO (), o )
348
+ })
347
349
}
348
350
349
351
func (r HelmOperatorReconciler ) updateResourceStatus (o * unstructured.Unstructured , status * types.HelmAppStatus ) error {
350
- o .Object ["status" ] = status
351
- return r .Client .Status ().Update (context .TODO (), o )
352
+ return retry .RetryOnConflict (retry .DefaultBackoff , func () error {
353
+ o .Object ["status" ] = status
354
+ return r .Client .Status ().Update (context .TODO (), o )
355
+ })
352
356
}
353
357
354
358
func (r HelmOperatorReconciler ) waitForDeletion (o runtime.Object ) error {
0 commit comments