@@ -96,7 +96,7 @@ func (r *AnsibleOperatorReconciler) Reconcile(request reconcile.Request) (reconc
96
96
finalizers := append (pendingFinalizers , finalizer )
97
97
u .SetFinalizers (finalizers )
98
98
err := r .Client .Update (context .TODO (), u )
99
- if err != nil {
99
+ if exit , err := determineReturn ( err ); exit {
100
100
return reconcileResult , err
101
101
}
102
102
}
@@ -111,14 +111,14 @@ func (r *AnsibleOperatorReconciler) Reconcile(request reconcile.Request) (reconc
111
111
logger .V (1 ).Info ("Spec was not found" )
112
112
u .Object ["spec" ] = map [string ]interface {}{}
113
113
err = r .Client .Update (context .TODO (), u )
114
- if err != nil {
114
+ if exit , err := determineReturn ( err ); exit {
115
115
return reconcileResult , err
116
116
}
117
117
}
118
118
119
119
if r .ManageStatus {
120
120
err = r .markRunning (u , request .NamespacedName )
121
- if err != nil {
121
+ if exit , err := determineReturn ( err ); exit {
122
122
return reconcileResult , err
123
123
}
124
124
}
@@ -179,6 +179,7 @@ func (r *AnsibleOperatorReconciler) Reconcile(request reconcile.Request) (reconc
179
179
180
180
err = r .APIReader .Get (context .TODO (), request .NamespacedName , u )
181
181
if err != nil {
182
+ log .Error (err , "Unable to get updated object from api" )
182
183
return reconcile.Result {}, err
183
184
}
184
185
@@ -194,16 +195,17 @@ func (r *AnsibleOperatorReconciler) Reconcile(request reconcile.Request) (reconc
194
195
}
195
196
u .SetFinalizers (finalizers )
196
197
err := r .Client .Update (context .TODO (), u )
197
- if err != nil {
198
+ if exit , err := determineReturn ( err ); exit {
198
199
return reconcileResult , err
199
200
}
200
201
return reconcileResult , nil
201
202
}
202
203
if r .ManageStatus {
203
204
err = r .markDone (u , request .NamespacedName , statusEvent , failureMessages )
204
- if err != nil {
205
- logger . Error ( err , "Failed to mark status done" )
205
+ if exit , err := determineReturn ( err ); exit {
206
+ return reconcileResult , err
206
207
}
208
+
207
209
}
208
210
return reconcileResult , err
209
211
}
@@ -235,6 +237,7 @@ func (r *AnsibleOperatorReconciler) markRunning(u *unstructured.Unstructured, na
235
237
if err != nil {
236
238
return err
237
239
}
240
+
238
241
}
239
242
return nil
240
243
}
@@ -285,3 +288,21 @@ func contains(l []string, s string) bool {
285
288
}
286
289
return false
287
290
}
291
+
292
+ // determineReturn - if the object was updated outside of our controller
293
+ // this means that the current reconcilation is over and we should use the
294
+ // latest version. To do this, we just exit without error because the
295
+ // latest version should be queued for update.
296
+ func determineReturn (err error ) (bool , error ) {
297
+ exit := false
298
+ if err == nil {
299
+ return exit , err
300
+ }
301
+ exit = true
302
+
303
+ if apierrors .IsConflict (err ) {
304
+ log .V (1 ).Info ("Conflict found during an update re-running reconcilation" )
305
+ return exit , nil
306
+ }
307
+ return exit , err
308
+ }
0 commit comments