Skip to content

Commit 5b44251

Browse files
authored
Merge pull request #4177 from zac-nixon/main
[bug fix] HandleReconcileError not detecting wrapped errors
2 parents 66c541d + 2173d58 commit 5b44251

File tree

2 files changed

+70
-7
lines changed

2 files changed

+70
-7
lines changed

pkg/runtime/reconcile.go

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,26 +3,41 @@ package runtime
33
import (
44
"github.com/go-logr/logr"
55
"github.com/pkg/errors"
6+
errmetrics "sigs.k8s.io/aws-load-balancer-controller/pkg/error"
67
ctrl "sigs.k8s.io/controller-runtime"
78
)
89

910
// HandleReconcileError will handle errors from reconcile handlers, which respects runtime errors.
10-
func HandleReconcileError(err error, log logr.Logger) (ctrl.Result, error) {
11-
if err == nil {
11+
func HandleReconcileError(inputErr error, log logr.Logger) (ctrl.Result, error) {
12+
resolvedErr := handleNestedError(inputErr)
13+
if resolvedErr == nil {
1214
return ctrl.Result{}, nil
1315
}
1416

1517
var requeueNeededAfter *RequeueNeededAfter
16-
if errors.As(err, &requeueNeededAfter) {
18+
if errors.As(resolvedErr, &requeueNeededAfter) {
1719
log.V(1).Info("requeue after", "duration", requeueNeededAfter.Duration(), "reason", requeueNeededAfter.Reason())
1820
return ctrl.Result{RequeueAfter: requeueNeededAfter.Duration()}, nil
1921
}
2022

2123
var requeueNeeded *RequeueNeeded
22-
if errors.As(err, &requeueNeeded) {
24+
if errors.As(resolvedErr, &requeueNeeded) {
2325
log.V(1).Info("requeue", "reason", requeueNeeded.Reason())
2426
return ctrl.Result{Requeue: true}, nil
2527
}
2628

27-
return ctrl.Result{}, err
29+
return ctrl.Result{}, inputErr
30+
}
31+
32+
func handleNestedError(err error) error {
33+
if err == nil {
34+
return nil
35+
}
36+
37+
var wrappedError *errmetrics.ErrorWithMetrics
38+
if errors.As(err, &wrappedError) {
39+
return wrappedError.Err
40+
}
41+
42+
return err
2843
}

pkg/runtime/reconcile_test.go

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package runtime
22

33
import (
4+
errmetrics "sigs.k8s.io/aws-load-balancer-controller/pkg/error"
45
"testing"
56
"time"
67

@@ -15,6 +16,12 @@ func TestHandleReconcileError(t *testing.T) {
1516
type args struct {
1617
err error
1718
}
19+
20+
otherErrType := errors.New("some error")
21+
wrappedOtherErrorType := &errmetrics.ErrorWithMetrics{
22+
Err: otherErrType,
23+
ResourceType: "foo",
24+
}
1825
tests := []struct {
1926
name string
2027
args args
@@ -29,6 +36,14 @@ func TestHandleReconcileError(t *testing.T) {
2936
want: ctrl.Result{},
3037
wantErr: nil,
3138
},
39+
{
40+
name: "input err is nil",
41+
args: args{
42+
err: &errmetrics.ErrorWithMetrics{},
43+
},
44+
want: ctrl.Result{},
45+
wantErr: nil,
46+
},
3247
{
3348
name: "input err is RequeueNeededAfter",
3449
args: args{
@@ -49,20 +64,53 @@ func TestHandleReconcileError(t *testing.T) {
4964
},
5065
wantErr: nil,
5166
},
67+
{
68+
name: "input err is ErrorWithMetrics and is RequeueNeededAfter",
69+
args: args{
70+
err: &errmetrics.ErrorWithMetrics{
71+
Err: NewRequeueNeededAfter("some error", 3*time.Second),
72+
},
73+
},
74+
want: ctrl.Result{
75+
RequeueAfter: 3 * time.Second,
76+
},
77+
wantErr: nil,
78+
},
79+
{
80+
name: "input err is ErrorWithMetrics and is RequeueNeeded",
81+
args: args{
82+
err: &errmetrics.ErrorWithMetrics{
83+
Err: NewRequeueNeeded("some error"),
84+
},
85+
},
86+
want: ctrl.Result{
87+
Requeue: true,
88+
},
89+
wantErr: nil,
90+
},
5291
{
5392
name: "input err is other error type",
5493
args: args{
55-
err: errors.New("some error"),
94+
err: otherErrType,
95+
},
96+
want: ctrl.Result{},
97+
wantErr: otherErrType,
98+
},
99+
{
100+
name: "input err is ErrorWithMetrics with other error type",
101+
args: args{
102+
err: wrappedOtherErrorType,
56103
},
57104
want: ctrl.Result{},
58-
wantErr: errors.New("some error"),
105+
wantErr: wrappedOtherErrorType,
59106
},
60107
}
61108
for _, tt := range tests {
62109
t.Run(tt.name, func(t *testing.T) {
63110
got, err := HandleReconcileError(tt.args.err, logr.New(&log.NullLogSink{}))
64111
if tt.wantErr != nil {
65112
assert.EqualError(t, err, tt.wantErr.Error())
113+
assert.Equal(t, err, tt.wantErr)
66114
} else {
67115
assert.NoError(t, err)
68116
assert.Equal(t, tt.want, got)

0 commit comments

Comments
 (0)