@@ -137,36 +137,33 @@ func (r *Reconciler) Init(mgr manager.Manager, prototype DeclarativeObject, opts
137
137
}
138
138
139
139
// +rbac:groups=apps,resources=deployments,verbs=get;list;watch;create;update;patch;delete
140
- func (r * Reconciler ) Reconcile (ctx context.Context , request reconcile.Request ) (result reconcile.Result , err error ) {
141
- var objects * manifest.Objects
140
+ func (r * Reconciler ) Reconcile (ctx context.Context , request reconcile.Request ) (reconcile.Result , error ) {
141
+ var result reconcile.Result
142
+ statusInfo := & StatusInfo {}
142
143
143
144
log := log .FromContext (ctx )
144
- defer r .collectMetrics (request , result , err )
145
+ defer func () {
146
+ r .collectMetrics (request , result , statusInfo .Err )
147
+ }()
145
148
146
149
// Fetch the object
147
150
instance := r .prototype .DeepCopyObject ().(DeclarativeObject )
148
- if err = r .client .Get (ctx , request .NamespacedName , instance ); err != nil {
151
+ if err : = r .client .Get (ctx , request .NamespacedName , instance ); err != nil {
149
152
if apierrors .IsNotFound (err ) {
150
153
// Object not found, return. Created objects are automatically garbage collected.
151
154
// For additional cleanup logic use finalizers.
152
- return reconcile. Result {} , nil
155
+ return result , nil
153
156
}
154
157
// Error reading the object - requeue the request.
155
158
log .Error (err , "error reading object" )
156
- return reconcile.Result {}, err
159
+ statusInfo .Err = err
160
+ return result , statusInfo .Err
157
161
}
158
162
159
163
// status.Reconciled should catch all error
160
164
defer func () {
161
- // error is data
162
- resultErr , ok := err .(* ErrorResult )
163
- if ok {
164
- result = resultErr .Result
165
- err = resultErr .Err
166
- }
167
-
168
165
if r .options .status != nil {
169
- if statusErr := r .options .status .Reconciled (ctx , instance , objects , err ); statusErr != nil {
166
+ if statusErr := r .options .status .Reconciled (ctx , instance , statusInfo . Manifest , statusInfo . Err ); statusErr != nil {
170
167
log .Error (statusErr , "failed to reconcile status" )
171
168
}
172
169
}
@@ -177,32 +174,46 @@ func (r *Reconciler) Reconcile(ctx context.Context, request reconcile.Request) (
177
174
if r .options .status != nil {
178
175
if err := r .options .status .Preflight (ctx , instance ); err != nil {
179
176
log .Error (err , "preflight check failed, not reconciling" )
180
- return reconcile.Result {}, err
177
+ statusInfo .Err = err
178
+ return result , statusInfo .Err
181
179
}
182
180
}
183
181
184
- statusInfo , err := r . reconcileExists ( ctx , request . NamespacedName , instance )
185
- objects = statusInfo . Manifest // for the defer block
186
- if err != nil {
187
- statusInfo .Err = err
182
+ var reconcileErr error
183
+ statusInfo , reconcileErr = r . reconcileExists ( ctx , request . NamespacedName , instance )
184
+ if reconcileErr != nil {
185
+ statusInfo .Err = reconcileErr
188
186
}
189
187
190
- if err != nil {
191
- r .recorder .Eventf (instance , "Warning" , "InternalError" , "internal error: %v" , err )
188
+ // Unpack ErrorResult (for example a retry)
189
+ if errorResult , ok := statusInfo .Err .(* ErrorResult ); ok {
190
+ result = errorResult .Result
191
+ statusInfo .Err = errorResult .Err
192
+ }
193
+
194
+ if statusInfo .Err != nil {
195
+ r .recorder .Eventf (instance , "Warning" , "InternalError" , "internal error: %v" , statusInfo .Err )
192
196
}
193
197
194
198
if r .options .status != nil {
195
199
if err := r .options .status .BuildStatus (ctx , statusInfo ); err != nil {
200
+ if statusInfo .Err == nil {
201
+ statusInfo .Err = err
202
+ }
203
+
196
204
log .Error (err , "error building status" )
197
- return result , err
205
+ return result , statusInfo . Err
198
206
}
199
207
}
200
208
201
209
if err := r .updateStatus (ctx , original , instance ); err != nil {
202
- return result , err
210
+ if statusInfo .Err == nil {
211
+ statusInfo .Err = err
212
+ }
213
+ log .Error (err , "error updating status" )
203
214
}
204
215
205
- return result , nil
216
+ return result , statusInfo . Err
206
217
}
207
218
208
219
func (r * Reconciler ) updateStatus (ctx context.Context , original DeclarativeObject , instance DeclarativeObject ) error {
0 commit comments