Skip to content

Commit 1a4c9a4

Browse files
committed
Remove named return values in reconciler
Fixes a recent regression where we would not return errors from reconcileExists.
1 parent 6ba29ca commit 1a4c9a4

File tree

2 files changed

+40
-26
lines changed

2 files changed

+40
-26
lines changed

pkg/patterns/declarative/reconciler.go

Lines changed: 35 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -137,36 +137,33 @@ func (r *Reconciler) Init(mgr manager.Manager, prototype DeclarativeObject, opts
137137
}
138138

139139
// +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{}
142143

143144
log := log.FromContext(ctx)
144-
defer r.collectMetrics(request, result, err)
145+
defer func() {
146+
r.collectMetrics(request, result, statusInfo.Err)
147+
}()
145148

146149
// Fetch the object
147150
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 {
149152
if apierrors.IsNotFound(err) {
150153
// Object not found, return. Created objects are automatically garbage collected.
151154
// For additional cleanup logic use finalizers.
152-
return reconcile.Result{}, nil
155+
return result, nil
153156
}
154157
// Error reading the object - requeue the request.
155158
log.Error(err, "error reading object")
156-
return reconcile.Result{}, err
159+
statusInfo.Err = err
160+
return result, statusInfo.Err
157161
}
158162

159163
// status.Reconciled should catch all error
160164
defer func() {
161-
// error is data
162-
resultErr, ok := err.(*ErrorResult)
163-
if ok {
164-
result = resultErr.Result
165-
err = resultErr.Err
166-
}
167-
168165
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 {
170167
log.Error(statusErr, "failed to reconcile status")
171168
}
172169
}
@@ -177,32 +174,46 @@ func (r *Reconciler) Reconcile(ctx context.Context, request reconcile.Request) (
177174
if r.options.status != nil {
178175
if err := r.options.status.Preflight(ctx, instance); err != nil {
179176
log.Error(err, "preflight check failed, not reconciling")
180-
return reconcile.Result{}, err
177+
statusInfo.Err = err
178+
return result, statusInfo.Err
181179
}
182180
}
183181

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
188186
}
189187

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)
192196
}
193197

194198
if r.options.status != nil {
195199
if err := r.options.status.BuildStatus(ctx, statusInfo); err != nil {
200+
if statusInfo.Err == nil {
201+
statusInfo.Err = err
202+
}
203+
196204
log.Error(err, "error building status")
197-
return result, err
205+
return result, statusInfo.Err
198206
}
199207
}
200208

201209
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")
203214
}
204215

205-
return result, nil
216+
return result, statusInfo.Err
206217
}
207218

208219
func (r *Reconciler) updateStatus(ctx context.Context, original DeclarativeObject, instance DeclarativeObject) error {

pkg/patterns/declarative/statusinfo.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,11 @@ package declarative
1717
import "sigs.k8s.io/kubebuilder-declarative-pattern/pkg/patterns/declarative/pkg/manifest"
1818

1919
type StatusInfo struct {
20-
Subject DeclarativeObject
21-
Manifest *manifest.Objects
20+
Subject DeclarativeObject
21+
22+
// Manifest contains the set of desired-state for objects that we applied (or tried to).
23+
Manifest *manifest.Objects
24+
2225
LiveObjects LiveObjectReader
2326
KnownError KnownErrorCode
2427
Err error

0 commit comments

Comments
 (0)