Skip to content

Commit 898d0b9

Browse files
authored
Merge pull request #4571 from vishwas121/main
Add k8s event for TGB failures
2 parents 91a7977 + 4cd3c6d commit 898d0b9

File tree

3 files changed

+130
-0
lines changed

3 files changed

+130
-0
lines changed

controllers/elbv2/targetgroupbinding_controller.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ func (r *targetGroupBindingReconciler) reconcileTargetGroupBinding(ctx context.C
141141
}
142142
r.metricsCollector.ObserveControllerReconcileLatency(controllerName, "reconcile_targetgroupbinding", tgbResourceFn)
143143
if err != nil {
144+
r.eventRecorder.Event(tgb, corev1.EventTypeWarning, k8s.TargetGroupBindingEventReasonFailedReconcile, fmt.Sprintf("Failed reconcile due to %v", err))
144145
return ctrlerrors.NewErrorWithMetrics(controllerName, "reconcile_targetgroupbinding_error", err, r.metricsCollector)
145146
}
146147

@@ -156,6 +157,7 @@ func (r *targetGroupBindingReconciler) reconcileTargetGroupBinding(ctx context.C
156157
}
157158
r.metricsCollector.ObserveControllerReconcileLatency(controllerName, "update_status", updateTargetGroupBindingStatusFn)
158159
if err != nil {
160+
r.eventRecorder.Event(tgb, corev1.EventTypeWarning, k8s.TargetGroupBindingEventReasonFailedUpdateStatus, fmt.Sprintf("Failed update status due to %v", err))
159161
return ctrlerrors.NewErrorWithMetrics(controllerName, "update_status_error", err, r.metricsCollector)
160162
}
161163

controllers/elbv2/targetgroupbinding_controller_test.go

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,3 +132,130 @@ func TestTargetGroupBindingReconciler_Delete_Stuck(t *testing.T) {
132132
assert.Equal(t, "cleanup failed due to AWS error", condition.Message)
133133
}
134134
}
135+
136+
func TestTargetGroupBindingReconciler_Reconcile_FailedReconcile(t *testing.T) {
137+
scheme := runtime.NewScheme()
138+
clientgoscheme.AddToScheme(scheme)
139+
elbv2api.AddToScheme(scheme)
140+
141+
tgb := &elbv2api.TargetGroupBinding{
142+
ObjectMeta: metav1.ObjectMeta{
143+
Name: "test-tgb",
144+
Namespace: "default",
145+
},
146+
Spec: elbv2api.TargetGroupBindingSpec{
147+
TargetGroupARN: "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/test/123",
148+
},
149+
}
150+
151+
k8sClient := testclient.NewClientBuilder().WithScheme(scheme).WithStatusSubresource(tgb).WithRuntimeObjects(tgb).Build()
152+
153+
// Setup Mocks
154+
ctrl := gomock.NewController(t)
155+
defer ctrl.Finish()
156+
157+
mockFinalizerManager := k8s.NewMockFinalizerManager(ctrl)
158+
mockFinalizerManager.EXPECT().AddFinalizers(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil)
159+
160+
mockResMgr := targetgroupbinding.NewMockResourceManager(ctrl)
161+
mockResMgr.EXPECT().Reconcile(gomock.Any(), gomock.Any()).Return(false, errors.New("target group not found"))
162+
163+
fakeRecorder := record.NewFakeRecorder(10)
164+
165+
reconciler := &targetGroupBindingReconciler{
166+
k8sClient: k8sClient,
167+
eventRecorder: fakeRecorder,
168+
finalizerManager: mockFinalizerManager,
169+
tgbResourceManager: mockResMgr,
170+
deferredTargetGroupBindingReconciler: &mockDeferredReconciler{},
171+
logger: log.Log.WithName("controllers").WithName("TargetGroupBinding"),
172+
metricsCollector: &mockMetricCollector{},
173+
reconcileCounters: metricsutil.NewReconcileCounters(),
174+
}
175+
176+
req := reconcile.Request{
177+
NamespacedName: client.ObjectKey{
178+
Namespace: "default",
179+
Name: "test-tgb",
180+
},
181+
}
182+
183+
// EXECUTE
184+
_, err := reconciler.Reconcile(context.Background(), req)
185+
186+
// VERIFY
187+
assert.Error(t, err)
188+
assert.Contains(t, err.Error(), "target group not found")
189+
190+
// Verify FailedReconcile event was emitted
191+
select {
192+
case event := <-fakeRecorder.Events:
193+
assert.Contains(t, event, "FailedReconcile")
194+
assert.Contains(t, event, "target group not found")
195+
default:
196+
t.Fatal("expected FailedReconcile event but none was emitted")
197+
}
198+
}
199+
200+
func TestTargetGroupBindingReconciler_Reconcile_Success(t *testing.T) {
201+
scheme := runtime.NewScheme()
202+
clientgoscheme.AddToScheme(scheme)
203+
elbv2api.AddToScheme(scheme)
204+
205+
tgb := &elbv2api.TargetGroupBinding{
206+
ObjectMeta: metav1.ObjectMeta{
207+
Name: "test-tgb",
208+
Namespace: "default",
209+
},
210+
Spec: elbv2api.TargetGroupBindingSpec{
211+
TargetGroupARN: "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/test/123",
212+
},
213+
}
214+
215+
k8sClient := testclient.NewClientBuilder().WithScheme(scheme).WithStatusSubresource(tgb).WithRuntimeObjects(tgb).Build()
216+
217+
// Setup Mocks
218+
ctrl := gomock.NewController(t)
219+
defer ctrl.Finish()
220+
221+
mockFinalizerManager := k8s.NewMockFinalizerManager(ctrl)
222+
mockFinalizerManager.EXPECT().AddFinalizers(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil)
223+
224+
mockResMgr := targetgroupbinding.NewMockResourceManager(ctrl)
225+
mockResMgr.EXPECT().Reconcile(gomock.Any(), gomock.Any()).Return(false, nil)
226+
227+
fakeRecorder := record.NewFakeRecorder(10)
228+
229+
reconciler := &targetGroupBindingReconciler{
230+
k8sClient: k8sClient,
231+
eventRecorder: fakeRecorder,
232+
finalizerManager: mockFinalizerManager,
233+
tgbResourceManager: mockResMgr,
234+
deferredTargetGroupBindingReconciler: &mockDeferredReconciler{},
235+
logger: log.Log.WithName("controllers").WithName("TargetGroupBinding"),
236+
metricsCollector: &mockMetricCollector{},
237+
reconcileCounters: metricsutil.NewReconcileCounters(),
238+
}
239+
240+
req := reconcile.Request{
241+
NamespacedName: client.ObjectKey{
242+
Namespace: "default",
243+
Name: "test-tgb",
244+
},
245+
}
246+
247+
// EXECUTE
248+
_, err := reconciler.Reconcile(context.Background(), req)
249+
250+
// VERIFY
251+
assert.NoError(t, err)
252+
253+
// Verify SuccessfullyReconciled event was emitted
254+
select {
255+
case event := <-fakeRecorder.Events:
256+
assert.Contains(t, event, "SuccessfullyReconciled")
257+
assert.Contains(t, event, "Successfully reconciled")
258+
default:
259+
t.Fatal("expected SuccessfullyReconciled event but none was emitted")
260+
}
261+
}

pkg/k8s/events.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ const (
2727
TargetGroupBindingEventReasonFailedCleanup = "FailedCleanup"
2828
TargetGroupBindingEventReasonFailedNetworkReconcile = "FailedNetworkReconcile"
2929
TargetGroupBindingEventReasonBackendNotFound = "BackendNotFound"
30+
TargetGroupBindingEventReasonFailedReconcile = "FailedReconcile"
3031
TargetGroupBindingEventReasonSuccessfullyReconciled = "SuccessfullyReconciled"
3132

3233
// Gateway events

0 commit comments

Comments
 (0)