Skip to content

Commit 04bf238

Browse files
committed
Migrate to new Kubernetes events API
Replace deprecated record.EventRecorder with events.EventRecorder from k8s.io/client-go/tools/events. Update all controllers, event server, and tests to use the new API signature. Signed-off-by: Adrian Fernandez de la Torre <adri1197@gmail.com>
1 parent 1a222b7 commit 04bf238

10 files changed

Lines changed: 42 additions & 42 deletions

internal/controller/alert_controller.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import (
2020
"context"
2121

2222
corev1 "k8s.io/api/core/v1"
23-
kuberecorder "k8s.io/client-go/tools/record"
23+
"k8s.io/client-go/tools/events"
2424
ctrl "sigs.k8s.io/controller-runtime"
2525
"sigs.k8s.io/controller-runtime/pkg/builder"
2626
"sigs.k8s.io/controller-runtime/pkg/client"
@@ -37,7 +37,7 @@ import (
3737
// AlertReconciler reconciles an Alert object to migrate it to static Alert.
3838
type AlertReconciler struct {
3939
client.Client
40-
kuberecorder.EventRecorder
40+
events.EventRecorder
4141

4242
ControllerName string
4343
}
@@ -88,7 +88,7 @@ func (r *AlertReconciler) Reconcile(ctx context.Context, req ctrl.Request) (resu
8888
controllerutil.RemoveFinalizer(obj, apiv1.NotificationFinalizer)
8989

9090
log.Info("removed finalizer from Alert to migrate to static Alert")
91-
r.Event(obj, corev1.EventTypeNormal, "Migration", "removed finalizer from Alert to migrate to static Alert")
91+
r.Eventf(obj, nil, corev1.EventTypeNormal, "Migration", "", "removed finalizer from Alert to migrate to static Alert")
9292

9393
return
9494
}

internal/controller/provider_controller.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ package controller
1919
import (
2020
"context"
2121

22-
kuberecorder "k8s.io/client-go/tools/record"
22+
"k8s.io/client-go/tools/events"
2323
ctrl "sigs.k8s.io/controller-runtime"
2424
"sigs.k8s.io/controller-runtime/pkg/builder"
2525
"sigs.k8s.io/controller-runtime/pkg/client"
@@ -42,7 +42,7 @@ import (
4242
// Provider.
4343
type ProviderReconciler struct {
4444
client.Client
45-
kuberecorder.EventRecorder
45+
events.EventRecorder
4646

4747
TokenCache *cache.TokenCache
4848
}

internal/controller/receiver_controller.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import (
2525
apierrors "k8s.io/apimachinery/pkg/api/errors"
2626
"k8s.io/apimachinery/pkg/types"
2727
kerrors "k8s.io/apimachinery/pkg/util/errors"
28-
kuberecorder "k8s.io/client-go/tools/record"
28+
"k8s.io/client-go/tools/events"
2929
"k8s.io/client-go/util/workqueue"
3030
ctrl "sigs.k8s.io/controller-runtime"
3131
"sigs.k8s.io/controller-runtime/pkg/builder"
@@ -50,7 +50,7 @@ import (
5050
type ReceiverReconciler struct {
5151
client.Client
5252
helper.Metrics
53-
kuberecorder.EventRecorder
53+
events.EventRecorder
5454

5555
ControllerName string
5656
}
@@ -166,14 +166,14 @@ func (r *ReceiverReconciler) Reconcile(ctx context.Context, req ctrl.Request) (r
166166

167167
// Emit warning event if the reconciliation failed.
168168
if retErr != nil {
169-
r.Event(obj, corev1.EventTypeWarning, meta.FailedReason, retErr.Error())
169+
r.Eventf(obj, nil, corev1.EventTypeWarning, meta.FailedReason, "", retErr.Error())
170170
}
171171

172172
// Log and emit success event.
173173
if retErr == nil && conditions.IsReady(obj) {
174174
msg := fmt.Sprintf("Reconciliation finished, next run in %s", obj.GetInterval().String())
175175
log.Info(msg)
176-
r.Event(obj, corev1.EventTypeNormal, meta.SucceededReason, msg)
176+
r.Eventf(obj, nil, corev1.EventTypeNormal, meta.SucceededReason, "", msg)
177177
}
178178
}()
179179

@@ -215,7 +215,7 @@ func (r *ReceiverReconciler) reconcile(ctx context.Context, obj *apiv1.Receiver)
215215
conditions.MarkStalled(obj, meta.InvalidCELExpressionReason, "%s", errMsg)
216216
obj.Status.ObservedGeneration = obj.Generation
217217
log.Error(err, msg)
218-
r.Event(obj, corev1.EventTypeWarning, meta.InvalidCELExpressionReason, errMsg)
218+
r.Eventf(obj, nil, corev1.EventTypeWarning, meta.InvalidCELExpressionReason, "", errMsg)
219219
return ctrl.Result{}, nil
220220
}
221221
}

internal/controller/receiver_controller_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ import (
3131
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3232
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
3333
"k8s.io/apimachinery/pkg/types"
34-
"k8s.io/client-go/tools/record"
34+
"k8s.io/client-go/tools/events"
3535
ctrl "sigs.k8s.io/controller-runtime"
3636
"sigs.k8s.io/controller-runtime/pkg/client"
3737
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
@@ -75,7 +75,7 @@ func TestReceiverReconciler_deleteBeforeFinalizer(t *testing.T) {
7575

7676
r := &ReceiverReconciler{
7777
Client: k8sClient,
78-
EventRecorder: record.NewFakeRecorder(32),
78+
EventRecorder: events.NewFakeRecorder(32),
7979
}
8080
// NOTE: Only a real API server responds with an error in this scenario.
8181
_, err := r.Reconcile(ctx, ctrl.Request{NamespacedName: client.ObjectKeyFromObject(receiver)})

internal/controller/suite_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,14 +77,14 @@ func TestMain(m *testing.M) {
7777
if err := (&AlertReconciler{
7878
Client: testEnv,
7979
ControllerName: controllerName,
80-
EventRecorder: testEnv.GetEventRecorderFor(controllerName),
80+
EventRecorder: testEnv.GetEventRecorder(controllerName),
8181
}).SetupWithManager(testEnv); err != nil {
8282
panic(fmt.Sprintf("Failed to start AlertReconciler: %v", err))
8383
}
8484

8585
if err := (&ProviderReconciler{
8686
Client: testEnv,
87-
EventRecorder: testEnv.GetEventRecorderFor(controllerName),
87+
EventRecorder: testEnv.GetEventRecorder(controllerName),
8888
}).SetupWithManager(testEnv); err != nil {
8989
panic(fmt.Sprintf("Failed to start ProviderReconciler: %v", err))
9090
}
@@ -93,7 +93,7 @@ func TestMain(m *testing.M) {
9393
Client: testEnv,
9494
Metrics: testMetricsH,
9595
ControllerName: controllerName,
96-
EventRecorder: testEnv.GetEventRecorderFor(controllerName),
96+
EventRecorder: testEnv.GetEventRecorder(controllerName),
9797
}).SetupWithManager(testEnv, ReceiverReconcilerOptions{
9898
RateLimiter: controller.GetDefaultRateLimiter(),
9999
WatchConfigsPredicate: predicate.Not(predicate.Funcs{}),

internal/server/event_handlers.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ func (s *EventServer) handleEvent() func(w http.ResponseWriter, r *http.Request)
9494
dropped, err := s.dispatchNotification(ctx, event, alert)
9595
if err != nil {
9696
alertLogger.Error(err, "failed to dispatch notification")
97-
s.Eventf(alert, corev1.EventTypeWarning, "NotificationDispatchFailed",
97+
s.Eventf(alert, nil, corev1.EventTypeWarning, "NotificationDispatchFailed", "",
9898
"failed to dispatch notification for %s: %s", involvedObjectString(event.InvolvedObject), err)
9999
continue
100100
}
@@ -208,8 +208,8 @@ func (s *EventServer) messageIsIncluded(ctx context.Context, msg string, alert *
208208
}
209209
} else {
210210
log.FromContext(ctx).Error(err, fmt.Sprintf("failed to compile inclusion regex: %s", exp))
211-
s.Eventf(alert, corev1.EventTypeWarning,
212-
"InvalidConfig", "failed to compile inclusion regex: %s", exp)
211+
s.Eventf(alert, nil, corev1.EventTypeWarning,
212+
"InvalidConfig", "", "failed to compile inclusion regex: %s", exp)
213213
}
214214
}
215215
return false
@@ -229,7 +229,7 @@ func (s *EventServer) messageIsExcluded(ctx context.Context, msg string, alert *
229229
}
230230
} else {
231231
log.FromContext(ctx).Error(err, fmt.Sprintf("failed to compile exclusion regex: %s", exp))
232-
s.Eventf(alert, corev1.EventTypeWarning, "InvalidConfig",
232+
s.Eventf(alert, nil, corev1.EventTypeWarning, "InvalidConfig", "",
233233
"failed to compile exclusion regex: %s", exp)
234234
}
235235
}
@@ -263,7 +263,7 @@ func (s *EventServer) dispatchNotification(ctx context.Context,
263263
err = errors.New(maskedErrStr)
264264
}
265265
log.FromContext(ctx).Error(err, "failed to send notification")
266-
s.Eventf(alert, corev1.EventTypeWarning, "NotificationDispatchFailed",
266+
s.Eventf(alert, nil, corev1.EventTypeWarning, "NotificationDispatchFailed", "",
267267
"failed to send notification for %s: %s", involvedObjectString(e.InvolvedObject), err)
268268
}
269269
}(params.sender, *params.event)
@@ -607,7 +607,7 @@ func (s *EventServer) eventMatchesAlertSource(ctx context.Context, event *eventv
607607
Name: event.InvolvedObject.Name,
608608
}, &obj); err != nil {
609609
logger.Error(err, "error getting the involved object")
610-
s.Eventf(alert, corev1.EventTypeWarning, "SourceFetchFailed",
610+
s.Eventf(alert, nil, corev1.EventTypeWarning, "SourceFetchFailed", "",
611611
"error getting source object %s", involvedObjectString(event.InvolvedObject))
612612
return false
613613
}
@@ -617,7 +617,7 @@ func (s *EventServer) eventMatchesAlertSource(ctx context.Context, event *eventv
617617
})
618618
if err != nil {
619619
logger.Error(err, fmt.Sprintf("error using matchLabels from event source %s", crossNSObjectRefString(source)))
620-
s.Eventf(alert, corev1.EventTypeWarning, "InvalidConfig",
620+
s.Eventf(alert, nil, corev1.EventTypeWarning, "InvalidConfig", "",
621621
"error using matchLabels from event source %s", crossNSObjectRefString(source))
622622
return false
623623
}
@@ -704,7 +704,7 @@ func (s *EventServer) combineEventMetadata(ctx context.Context, event *eventv1.E
704704
const msg = "metadata key conflicts detected (please refer to the Alert API docs and Flux RFC 0008 for more information)"
705705
slices.SortFunc(conflictingKeys, func(a, b *keyConflict) int { return strings.Compare(a.Key, b.Key) })
706706
l.Info("warning: "+msg, "conflictingKeys", conflictingKeys)
707-
s.AnnotatedEventf(alert, conflictEventAnnotations, corev1.EventTypeWarning, "MetadataAppendFailed", "%s", msg)
707+
s.Eventf(alert, nil, corev1.EventTypeWarning, "MetadataAppendFailed", "", "%s", msg)
708708
}
709709

710710
if len(metadata) > 0 {

internal/server/event_handlers_test.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ import (
3838
corev1 "k8s.io/api/core/v1"
3939
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
4040
"k8s.io/apimachinery/pkg/runtime"
41-
"k8s.io/client-go/tools/record"
41+
"k8s.io/client-go/tools/events"
4242
fakeclient "sigs.k8s.io/controller-runtime/pkg/client/fake"
4343
"sigs.k8s.io/controller-runtime/pkg/log"
4444

@@ -291,7 +291,7 @@ func TestFilterAlertsForEvent(t *testing.T) {
291291
eventServer := EventServer{
292292
kubeClient: builder.Build(),
293293
logger: log.Log,
294-
EventRecorder: record.NewFakeRecorder(32),
294+
EventRecorder: events.NewFakeRecorder(32),
295295
}
296296

297297
result := eventServer.filterAlertsForEvent(context.TODO(), alerts, testEvent)
@@ -375,7 +375,7 @@ func TestDispatchNotification(t *testing.T) {
375375
eventServer := EventServer{
376376
kubeClient: builder.Build(),
377377
logger: log.Log,
378-
EventRecorder: record.NewFakeRecorder(32),
378+
EventRecorder: events.NewFakeRecorder(32),
379379
}
380380

381381
_, err := eventServer.dispatchNotification(context.TODO(), testEvent, alert)
@@ -557,7 +557,7 @@ func TestGetNotificationParams(t *testing.T) {
557557
kubeClient: builder.Build(),
558558
logger: log.Log,
559559
noCrossNamespaceRefs: tt.noCrossNSRefs,
560-
EventRecorder: record.NewFakeRecorder(32),
560+
EventRecorder: events.NewFakeRecorder(32),
561561
}
562562

563563
params, dropped, err := eventServer.getNotificationParams(context.TODO(), event, alert)
@@ -1343,7 +1343,7 @@ func TestEventMatchesAlert(t *testing.T) {
13431343
eventServer := EventServer{
13441344
kubeClient: builder.Build(),
13451345
logger: log.Log,
1346-
EventRecorder: record.NewFakeRecorder(32),
1346+
EventRecorder: events.NewFakeRecorder(32),
13471347
}
13481348
alert := &apiv1beta3.Alert{
13491349
ObjectMeta: metav1.ObjectMeta{
@@ -1415,7 +1415,7 @@ func TestCombineEventMetadata(t *testing.T) {
14151415
expectedMetadata: map[string]string{
14161416
"summary": "alertSummary",
14171417
},
1418-
conflictEvent: "Warning MetadataAppendFailed metadata key conflicts detected (please refer to the Alert API docs and Flux RFC 0008 for more information) map[summary:involved object annotations, Alert object .spec.summary]",
1418+
conflictEvent: "Warning MetadataAppendFailed metadata key conflicts detected (please refer to the Alert API docs and Flux RFC 0008 for more information)",
14191419
},
14201420
"alert event metadata is overriden by summary": {
14211421
event: eventv1.Event{},
@@ -1430,7 +1430,7 @@ func TestCombineEventMetadata(t *testing.T) {
14301430
expectedMetadata: map[string]string{
14311431
"summary": "alertSummary",
14321432
},
1433-
conflictEvent: "Warning MetadataAppendFailed metadata key conflicts detected (please refer to the Alert API docs and Flux RFC 0008 for more information) map[summary:Alert object .spec.eventMetadata, Alert object .spec.summary]",
1433+
conflictEvent: "Warning MetadataAppendFailed metadata key conflicts detected (please refer to the Alert API docs and Flux RFC 0008 for more information)",
14341434
},
14351435
"summary is overriden by controller metadata": {
14361436
event: eventv1.Event{
@@ -1446,7 +1446,7 @@ func TestCombineEventMetadata(t *testing.T) {
14461446
expectedMetadata: map[string]string{
14471447
"summary": "controllerSummary",
14481448
},
1449-
conflictEvent: "Warning MetadataAppendFailed metadata key conflicts detected (please refer to the Alert API docs and Flux RFC 0008 for more information) map[summary:Alert object .spec.summary, involved object controller metadata]",
1449+
conflictEvent: "Warning MetadataAppendFailed metadata key conflicts detected (please refer to the Alert API docs and Flux RFC 0008 for more information)",
14501450
},
14511451
"precedence order in RFC 0008 is honered": {
14521452
event: eventv1.Event{
@@ -1476,13 +1476,13 @@ func TestCombineEventMetadata(t *testing.T) {
14761476
"alertMetadataOverridenByController": "controllerMetadataValue2",
14771477
"controllerMetadata": "controllerMetadataValue3",
14781478
},
1479-
conflictEvent: "Warning MetadataAppendFailed metadata key conflicts detected (please refer to the Alert API docs and Flux RFC 0008 for more information) map[alertMetadataOverridenByController:Alert object .spec.eventMetadata, involved object controller metadata objectMetadataOverridenByAlert:involved object annotations, Alert object .spec.eventMetadata objectMetadataOverridenByController:involved object annotations, involved object controller metadata]",
1479+
conflictEvent: "Warning MetadataAppendFailed metadata key conflicts detected (please refer to the Alert API docs and Flux RFC 0008 for more information)",
14801480
},
14811481
} {
14821482
t.Run(name, func(t *testing.T) {
14831483
g := NewGomegaWithT(t)
14841484

1485-
eventRecorder := record.NewFakeRecorder(1)
1485+
eventRecorder := events.NewFakeRecorder(1)
14861486
s := &EventServer{
14871487
logger: log.Log,
14881488
EventRecorder: eventRecorder,

internal/server/event_server.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ import (
3333
"github.com/sethvargo/go-limiter/httplimit"
3434
"github.com/slok/go-http-metrics/middleware"
3535
"github.com/slok/go-http-metrics/middleware/std"
36-
kuberecorder "k8s.io/client-go/tools/record"
36+
"k8s.io/client-go/tools/events"
3737
"sigs.k8s.io/controller-runtime/pkg/client"
3838
"sigs.k8s.io/controller-runtime/pkg/log"
3939

@@ -55,12 +55,12 @@ type EventServer struct {
5555
noCrossNamespaceRefs bool
5656
exportHTTPPathMetrics bool
5757
tokenCache *cache.TokenCache
58-
kuberecorder.EventRecorder
58+
events.EventRecorder
5959
}
6060

6161
// NewEventServer returns an HTTP server that handles events
6262
func NewEventServer(port string, logger logr.Logger, kubeClient client.Client,
63-
eventRecorder kuberecorder.EventRecorder, noCrossNamespaceRefs bool,
63+
eventRecorder events.EventRecorder, noCrossNamespaceRefs bool,
6464
exportHTTPPathMetrics bool, tokenCache *cache.TokenCache) *EventServer {
6565
return &EventServer{
6666
port: port,

internal/server/event_server_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ import (
4040
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
4141
"k8s.io/apimachinery/pkg/runtime"
4242
yamlutil "k8s.io/apimachinery/pkg/util/yaml"
43-
"k8s.io/client-go/tools/record"
43+
"k8s.io/client-go/tools/events"
4444
fakeclient "sigs.k8s.io/controller-runtime/pkg/client/fake"
4545
log "sigs.k8s.io/controller-runtime/pkg/log"
4646

@@ -137,7 +137,7 @@ func TestEventServer(t *testing.T) {
137137
t.Fatalf("failed to create memory storage")
138138
}
139139
eventServer := NewEventServer("127.0.0.1:"+eventServerPort,
140-
log.Log, kclient, record.NewFakeRecorder(32), true, true, nil)
140+
log.Log, kclient, events.NewFakeRecorder(32), true, true, nil)
141141
stopCh := make(chan struct{})
142142
go eventServer.ListenAndServe(stopCh, eventMdlw, store)
143143
defer close(stopCh)

main.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ func main() {
235235

236236
if err = (&controller.ProviderReconciler{
237237
Client: mgr.GetClient(),
238-
EventRecorder: mgr.GetEventRecorderFor(controllerName),
238+
EventRecorder: mgr.GetEventRecorder(controllerName),
239239
TokenCache: tokenCache,
240240
}).SetupWithManager(mgr); err != nil {
241241
setupLog.Error(err, "unable to create controller", "controller", "Provider")
@@ -245,7 +245,7 @@ func main() {
245245
if err = (&controller.AlertReconciler{
246246
Client: mgr.GetClient(),
247247
ControllerName: controllerName,
248-
EventRecorder: mgr.GetEventRecorderFor(controllerName),
248+
EventRecorder: mgr.GetEventRecorder(controllerName),
249249
}).SetupWithManager(mgr); err != nil {
250250
setupLog.Error(err, "unable to create controller", "controller", "Alert")
251251
os.Exit(1)
@@ -255,7 +255,7 @@ func main() {
255255
Client: mgr.GetClient(),
256256
ControllerName: controllerName,
257257
Metrics: metricsH,
258-
EventRecorder: mgr.GetEventRecorderFor(controllerName),
258+
EventRecorder: mgr.GetEventRecorder(controllerName),
259259
}).SetupWithManager(mgr, controller.ReceiverReconcilerOptions{
260260
RateLimiter: runtimeCtrl.GetRateLimiter(rateLimiterOptions),
261261
WatchConfigs: watchConfigs,
@@ -282,7 +282,7 @@ func main() {
282282
Registry: ctrlmetrics.Registry,
283283
}),
284284
})
285-
eventServer := server.NewEventServer(eventsAddr, ctrl.Log, mgr.GetClient(), mgr.GetEventRecorderFor(controllerName), aclOptions.NoCrossNamespaceRefs, exportHTTPPathMetrics, tokenCache)
285+
eventServer := server.NewEventServer(eventsAddr, ctrl.Log, mgr.GetClient(), mgr.GetEventRecorder(controllerName), aclOptions.NoCrossNamespaceRefs, exportHTTPPathMetrics, tokenCache)
286286
go eventServer.ListenAndServe(ctx.Done(), eventMdlw, store)
287287

288288
setupLog.Info("starting webhook receiver server", "addr", receiverAddr)

0 commit comments

Comments
 (0)