Skip to content

Commit 13cc9b5

Browse files
author
Shawn Hurley
committed
pkg/ansible/controller: Update api reader to use client
* Handle case when CR is changed while we are working on it. To handle this we will return and just re-run the reconcile this should be fine due to eventually consistent model.
1 parent 37d4faa commit 13cc9b5

File tree

2 files changed

+33
-10
lines changed

2 files changed

+33
-10
lines changed

Diff for: pkg/ansible/controller/controller.go

+6-4
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,10 @@ func Add(mgr manager.Manager, options Options) *controller.Controller {
5656
options.EventHandlers = []events.EventHandler{}
5757
}
5858
eventHandlers := append(options.EventHandlers, events.NewLoggingEventHandler(options.LoggingLevel))
59+
apiReader, err := client.New(mgr.GetConfig(), client.Options{})
60+
if err != nil {
61+
log.Error(err, "Unable to get new api client")
62+
}
5963

6064
aor := &AnsibleOperatorReconciler{
6165
// The default client will use the DelegatingReader for reads
@@ -65,9 +69,7 @@ func Add(mgr manager.Manager, options Options) *controller.Controller {
6569
Writer: mgr.GetClient(),
6670
StatusClient: mgr.GetClient(),
6771
},
68-
// This works because unstrucutred calls will go to the
69-
// API by default.
70-
APIReader: mgr.GetClient(),
72+
APIReader: apiReader,
7173
GVK: options.GVK,
7274
Runner: options.Runner,
7375
EventHandlers: eventHandlers,
@@ -76,7 +78,7 @@ func Add(mgr manager.Manager, options Options) *controller.Controller {
7678
}
7779

7880
scheme := mgr.GetScheme()
79-
_, err := scheme.New(options.GVK)
81+
_, err = scheme.New(options.GVK)
8082
if runtime.IsNotRegisteredError(err) {
8183
// Register the GVK with the schema
8284
scheme.AddKnownTypeWithName(options.GVK, &unstructured.Unstructured{})

Diff for: pkg/ansible/controller/reconcile.go

+27-6
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ func (r *AnsibleOperatorReconciler) Reconcile(request reconcile.Request) (reconc
9696
finalizers := append(pendingFinalizers, finalizer)
9797
u.SetFinalizers(finalizers)
9898
err := r.Client.Update(context.TODO(), u)
99-
if err != nil {
99+
if exit, err := determineReturn(err); exit {
100100
return reconcileResult, err
101101
}
102102
}
@@ -111,14 +111,14 @@ func (r *AnsibleOperatorReconciler) Reconcile(request reconcile.Request) (reconc
111111
logger.V(1).Info("Spec was not found")
112112
u.Object["spec"] = map[string]interface{}{}
113113
err = r.Client.Update(context.TODO(), u)
114-
if err != nil {
114+
if exit, err := determineReturn(err); exit {
115115
return reconcileResult, err
116116
}
117117
}
118118

119119
if r.ManageStatus {
120120
err = r.markRunning(u, request.NamespacedName)
121-
if err != nil {
121+
if exit, err := determineReturn(err); exit {
122122
return reconcileResult, err
123123
}
124124
}
@@ -179,6 +179,7 @@ func (r *AnsibleOperatorReconciler) Reconcile(request reconcile.Request) (reconc
179179

180180
err = r.APIReader.Get(context.TODO(), request.NamespacedName, u)
181181
if err != nil {
182+
log.Error(err, "Unable to get updated object from api")
182183
return reconcile.Result{}, err
183184
}
184185

@@ -194,16 +195,17 @@ func (r *AnsibleOperatorReconciler) Reconcile(request reconcile.Request) (reconc
194195
}
195196
u.SetFinalizers(finalizers)
196197
err := r.Client.Update(context.TODO(), u)
197-
if err != nil {
198+
if exit, err := determineReturn(err); exit {
198199
return reconcileResult, err
199200
}
200201
return reconcileResult, nil
201202
}
202203
if r.ManageStatus {
203204
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
206207
}
208+
207209
}
208210
return reconcileResult, err
209211
}
@@ -235,6 +237,7 @@ func (r *AnsibleOperatorReconciler) markRunning(u *unstructured.Unstructured, na
235237
if err != nil {
236238
return err
237239
}
240+
238241
}
239242
return nil
240243
}
@@ -285,3 +288,21 @@ func contains(l []string, s string) bool {
285288
}
286289
return false
287290
}
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

Comments
 (0)