Skip to content

Commit 860c901

Browse files
committed
fix: prevent nil pointer panic in EventEmitter
Add nil check for Kubernetes client in EmitMessage to prevent panic when client is uninitialized. This fixes a crash that occurs during error handling in GitLab provider when 401 errors are encountered. The EventEmitter now gracefully handles three nil scenarios: - nil repo: skips event creation, continues logging - nil logger: skips logging, continues event creation - nil client: skips event creation, continues logging Added comprehensive test coverage for nil client scenario to match existing tests for nil repo and nil logger cases. Fixes crash: runtime error: invalid memory address or nil pointer dereference at pkg/events/emit.go:36 Jira: https://issues.redhat.com/browse/SRVKP-8910 Assisted-by: Claude-Sonnet-4.5 (via Claude Code) Signed-off-by: Chmouel Boudjnah <chmouel@redhat.com>
1 parent b4d37f6 commit 860c901

File tree

2 files changed

+28
-3
lines changed

2 files changed

+28
-3
lines changed

pkg/events/emit.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ func (e *EventEmitter) SetLogger(logger *zap.SugaredLogger) {
3131
}
3232

3333
func (e *EventEmitter) EmitMessage(repo *v1alpha1.Repository, loggerLevel zapcore.Level, reason, message string) {
34-
if repo != nil {
34+
if repo != nil && e.client != nil {
3535
event := makeEvent(repo, loggerLevel, reason, message)
3636
if _, err := e.client.CoreV1().Events(event.Namespace).Create(context.Background(), event, metav1.CreateOptions{}); err != nil {
3737
if e.logger != nil {

pkg/events/emit_test.go

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"gotest.tools/v3/assert"
1414
v1 "k8s.io/api/core/v1"
1515
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
16+
"k8s.io/client-go/kubernetes"
1617
rtesting "knative.dev/pkg/reconciler/testing"
1718
)
1819

@@ -28,6 +29,7 @@ func TestEventEmitter_EmitMessage(t *testing.T) {
2829
expectEvent bool
2930
expectedType string
3031
useNilLogger bool
32+
useNilClient bool
3133
}{
3234
{
3335
name: "repo exists",
@@ -82,6 +84,21 @@ func TestEventEmitter_EmitMessage(t *testing.T) {
8284
expectedType: v1.EventTypeWarning,
8385
useNilLogger: true,
8486
},
87+
{
88+
name: "nil client doesn't cause panic",
89+
repo: &v1alpha1.Repository{
90+
ObjectMeta: metav1.ObjectMeta{
91+
Name: "test-repo",
92+
Namespace: "test-ns",
93+
},
94+
Spec: v1alpha1.RepositorySpec{},
95+
},
96+
message: "info-message",
97+
logLevel: zap.InfoLevel,
98+
expectEvent: false,
99+
expectedType: v1.EventTypeNormal,
100+
useNilClient: true,
101+
},
85102
}
86103

87104
for _, tt := range tests {
@@ -97,8 +114,16 @@ func TestEventEmitter_EmitMessage(t *testing.T) {
97114
logger = fakelogger
98115
}
99116

100-
// emit event - this should not panic even with nil logger
101-
NewEventEmitter(stdata.Kube, logger).EmitMessage(tt.repo, tt.logLevel, tt.reason, tt.message)
117+
// Use nil client for specific test case
118+
var client kubernetes.Interface
119+
if tt.useNilClient {
120+
client = nil
121+
} else {
122+
client = stdata.Kube
123+
}
124+
125+
// emit event - this should not panic even with nil logger or nil client
126+
NewEventEmitter(client, logger).EmitMessage(tt.repo, tt.logLevel, tt.reason, tt.message)
102127

103128
if tt.expectEvent {
104129
events, err := stdata.Kube.CoreV1().Events(tt.repo.Namespace).List(context.Background(), metav1.ListOptions{})

0 commit comments

Comments
 (0)