Skip to content

Commit bd0628f

Browse files
akutzk8s-ci-robot
authored andcommitted
Support for wrapped RequeueAfterError/interface (#1020)
This patch adds support for wrapped "RequeueAfterError" errors as well as a new interface for supporting custom "RequeueAfterError" errors.
1 parent da61280 commit bd0628f

File tree

3 files changed

+29
-13
lines changed

3 files changed

+29
-13
lines changed

pkg/controller/cluster/cluster_controller.go

+7-7
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ package cluster
1919
import (
2020
"context"
2121

22-
"k8s.io/apimachinery/pkg/api/errors"
22+
"github.com/pkg/errors"
23+
apierrors "k8s.io/apimachinery/pkg/api/errors"
2324
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2425
"k8s.io/apimachinery/pkg/runtime"
2526
"k8s.io/klog"
@@ -77,7 +78,7 @@ func (r *ReconcileCluster) Reconcile(request reconcile.Request) (reconcile.Resul
7778
cluster := &clusterv1alpha1.Cluster{}
7879
err := r.Get(context.Background(), request.NamespacedName, cluster)
7980
if err != nil {
80-
if errors.IsNotFound(err) {
81+
if apierrors.IsNotFound(err) {
8182
// Object not found, return. Created objects are automatically garbage collected.
8283
// For additional cleanup logic use finalizers.
8384
return reconcile.Result{}, nil
@@ -137,11 +138,10 @@ func (r *ReconcileCluster) Reconcile(request reconcile.Request) (reconcile.Resul
137138
}
138139

139140
klog.Infof("reconciling cluster object %v triggers idempotent reconcile.", name)
140-
err = r.actuator.Reconcile(cluster)
141-
if err != nil {
142-
if requeueErr, ok := err.(*controllerError.RequeueAfterError); ok {
143-
klog.Infof("Actuator returned requeue after error: %v", requeueErr)
144-
return reconcile.Result{Requeue: true, RequeueAfter: requeueErr.RequeueAfter}, nil
141+
if err := r.actuator.Reconcile(cluster); err != nil {
142+
if requeueErr, ok := errors.Cause(err).(controllerError.HasRequeueAfterError); ok {
143+
klog.Infof("Actuator returned requeue-after error: %v", requeueErr)
144+
return reconcile.Result{Requeue: true, RequeueAfter: requeueErr.GetRequeueAfter()}, nil
145145
}
146146
klog.Errorf("Error reconciling cluster object %v; %v", name, err)
147147
return reconcile.Result{}, err

pkg/controller/error/requeue_error.go

+15
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,15 @@ import (
2121
"time"
2222
)
2323

24+
// HasRequeueAfterError represents that an actuator managed object should
25+
// be requeued for further processing after the given RequeueAfter time has
26+
// passed.
27+
type HasRequeueAfterError interface {
28+
// GetRequeueAfter gets the duration to wait until the managed object is
29+
// requeued for further processing.
30+
GetRequeueAfter() time.Duration
31+
}
32+
2433
// RequeueAfterError represents that an actuator managed object should be
2534
// requeued for further processing after the given RequeueAfter time has
2635
// passed.
@@ -32,3 +41,9 @@ type RequeueAfterError struct {
3241
func (e *RequeueAfterError) Error() string {
3342
return fmt.Sprintf("requeue in: %s", e.RequeueAfter)
3443
}
44+
45+
// GetRequeueAfter gets the duration to wait until the managed object is
46+
// requeued for further processing.
47+
func (e *RequeueAfterError) GetRequeueAfter() time.Duration {
48+
return e.RequeueAfter
49+
}

pkg/controller/machine/machine_controller.go

+7-6
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"context"
2121
"os"
2222

23+
"github.com/pkg/errors"
2324
corev1 "k8s.io/api/core/v1"
2425
apierrors "k8s.io/apimachinery/pkg/api/errors"
2526
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -169,9 +170,9 @@ func (r *ReconcileMachine) Reconcile(request reconcile.Request) (reconcile.Resul
169170

170171
klog.Infof("Reconciling machine %q triggers delete", name)
171172
if err := r.actuator.Delete(ctx, cluster, m); err != nil {
172-
if requeueErr, ok := err.(*controllerError.RequeueAfterError); ok {
173+
if requeueErr, ok := errors.Cause(err).(controllerError.HasRequeueAfterError); ok {
173174
klog.Infof("Actuator returned requeue-after error: %v", requeueErr)
174-
return reconcile.Result{Requeue: true, RequeueAfter: requeueErr.RequeueAfter}, nil
175+
return reconcile.Result{Requeue: true, RequeueAfter: requeueErr.GetRequeueAfter()}, nil
175176
}
176177

177178
klog.Errorf("Failed to delete machine %q: %v", name, err)
@@ -206,9 +207,9 @@ func (r *ReconcileMachine) Reconcile(request reconcile.Request) (reconcile.Resul
206207
if exist {
207208
klog.Infof("Reconciling machine %q triggers idempotent update", name)
208209
if err := r.actuator.Update(ctx, cluster, m); err != nil {
209-
if requeueErr, ok := err.(*controllerError.RequeueAfterError); ok {
210+
if requeueErr, ok := errors.Cause(err).(controllerError.HasRequeueAfterError); ok {
210211
klog.Infof("Actuator returned requeue-after error: %v", requeueErr)
211-
return reconcile.Result{Requeue: true, RequeueAfter: requeueErr.RequeueAfter}, nil
212+
return reconcile.Result{Requeue: true, RequeueAfter: requeueErr.GetRequeueAfter()}, nil
212213
}
213214

214215
klog.Errorf(`Error updating machine "%s/%s": %v`, m.Namespace, name, err)
@@ -221,9 +222,9 @@ func (r *ReconcileMachine) Reconcile(request reconcile.Request) (reconcile.Resul
221222
// Machine resource created. Machine does not yet exist.
222223
klog.Infof("Reconciling machine object %v triggers idempotent create.", m.ObjectMeta.Name)
223224
if err := r.actuator.Create(ctx, cluster, m); err != nil {
224-
if requeueErr, ok := err.(*controllerError.RequeueAfterError); ok {
225+
if requeueErr, ok := errors.Cause(err).(controllerError.HasRequeueAfterError); ok {
225226
klog.Infof("Actuator returned requeue-after error: %v", requeueErr)
226-
return reconcile.Result{Requeue: true, RequeueAfter: requeueErr.RequeueAfter}, nil
227+
return reconcile.Result{Requeue: true, RequeueAfter: requeueErr.GetRequeueAfter()}, nil
227228
}
228229

229230
klog.Warningf("Failed to create machine %q: %v", name, err)

0 commit comments

Comments
 (0)