diff --git a/internal/server/event_handlers.go b/internal/server/event_handlers.go index 4738db29a..0b178370b 100644 --- a/internal/server/event_handlers.go +++ b/internal/server/event_handlers.go @@ -316,9 +316,10 @@ func (s *EventServer) getNotificationParams(ctx context.Context, event *eventv1. return nil, droppedProviders{}, nil } - // Skip if the event has commit status update metadata but the provider is not a git provider. - // Git providers (github, gitlab, etc.) are the ones that set commit statuses. - if !isCommitStatusProvider(provider.Spec.Type) && isCommitStatusUpdate(event) { + // Skip if the event has commit status update metadata but the provider is not a git provider + // or a generic provider. Git providers (github, gitlab, etc.) are the ones that set commit + // statuses. Generic providers forward commit status events as-is to the configured webhook. + if !isCommitStatusProvider(provider.Spec.Type) && !isGenericProvider(provider.Spec.Type) && isCommitStatusUpdate(event) { return nil, droppedProviders{}, nil } diff --git a/internal/server/event_handlers_test.go b/internal/server/event_handlers_test.go index 1ee207b93..e60071432 100644 --- a/internal/server/event_handlers_test.go +++ b/internal/server/event_handlers_test.go @@ -427,17 +427,20 @@ func TestGetNotificationParams(t *testing.T) { providerSuspended bool providerServiceAccount string secretNamespace string + secretData map[string][]byte noCrossNSRefs bool enableObjLevelWI bool eventMetadata map[string]string wantErr bool wantDroppedCommitStatus bool + wantParams bool }{ { name: "event src and alert in diff NS", alertNamespace: "bar-ns", providerNamespace: "bar-ns", secretNamespace: "bar-ns", + wantParams: true, }, { name: "event src and alert in diff NS with no cross NS refs", @@ -464,6 +467,7 @@ func TestGetNotificationParams(t *testing.T) { { name: "alert with summary, no event metadata", alertSummary: "some summary text", + wantParams: true, }, { name: "alert with summary, with event metadata", @@ -472,6 +476,7 @@ func TestGetNotificationParams(t *testing.T) { "foo": "bar", "summary": "baz", }, + wantParams: true, }, { name: "alert with event metadata", @@ -479,6 +484,7 @@ func TestGetNotificationParams(t *testing.T) { "aaa": "bbb", "ccc": "ddd", }, + wantParams: true, }, { name: "object level workload identity feature gate disabled", @@ -490,7 +496,7 @@ func TestGetNotificationParams(t *testing.T) { name: "object level workload identity feature gate enabled", providerServiceAccount: "foo", enableObjLevelWI: true, - wantErr: false, + wantParams: true, }, { name: "commit status provider drops event without commit key", @@ -503,7 +509,24 @@ func TestGetNotificationParams(t *testing.T) { eventMetadata: map[string]string{ "kustomize.toolkit.fluxcd.io/" + eventv1.MetaCommitStatusKey: eventv1.MetaCommitStatusUpdateValue, }, - wantErr: true, // proceeds past the guard and fails on notifier creation + wantErr: true, + }, + { + name: "generic provider does not drop commit status update event", + providerType: apiv1beta3.GenericProvider, + eventMetadata: map[string]string{ + "kustomize.toolkit.fluxcd.io/" + eventv1.MetaCommitStatusKey: eventv1.MetaCommitStatusUpdateValue, + }, + wantParams: true, + }, + { + name: "generic-hmac provider does not drop commit status update event", + providerType: apiv1beta3.GenericHMACProvider, + secretData: map[string][]byte{"token": []byte("test-hmac-key")}, + eventMetadata: map[string]string{ + "kustomize.toolkit.fluxcd.io/" + eventv1.MetaCommitStatusKey: eventv1.MetaCommitStatusUpdateValue, + }, + wantParams: true, }, } @@ -538,6 +561,9 @@ func TestGetNotificationParams(t *testing.T) { if tt.secretNamespace != "" { secret.Namespace = tt.secretNamespace } + if tt.secretData != nil { + secret.Data = tt.secretData + } if tt.eventMetadata != nil { event.Metadata = tt.eventMetadata } @@ -561,8 +587,9 @@ func TestGetNotificationParams(t *testing.T) { } params, dropped, err := eventServer.getNotificationParams(context.TODO(), event, alert) - g.Expect(err != nil).To(Equal(tt.wantErr)) + g.Expect(err != nil).To(Equal(tt.wantErr), "unexpected error: %v", err) g.Expect(dropped.commitStatus).To(Equal(tt.wantDroppedCommitStatus)) + g.Expect(params != nil).To(Equal(tt.wantParams), "unexpected params: %v", params) if tt.alertSummary != "" { g.Expect(params.event.Metadata["summary"]).To(Equal(tt.alertSummary)) } diff --git a/internal/server/provider_commit_status.go b/internal/server/provider_commit_status.go index 984ff8211..2b70ab184 100644 --- a/internal/server/provider_commit_status.go +++ b/internal/server/provider_commit_status.go @@ -89,6 +89,11 @@ func newCommitStatus(ctx context.Context, expr string, notification *eventv1.Eve return result, nil } +// isGenericProvider returns true if the provider type is a generic provider. +func isGenericProvider(providerType string) bool { + return providerType == apiv1beta3.GenericProvider || providerType == apiv1beta3.GenericHMACProvider +} + // isCommitStatusProvider returns true if the provider type is a Git provider. func isCommitStatusProvider(providerType string) bool { gitProviderTypes := []string{