From 94134f47cb8adf776b8a6611ad13def1dba1b224 Mon Sep 17 00:00:00 2001 From: fabian4 Date: Sat, 30 Aug 2025 14:56:37 +0800 Subject: [PATCH] Handle duplicate kinds in listener allowed kinds --- .../controller/state/graph/gateway_listener.go | 13 +++++++++++-- .../state/graph/gateway_listener_test.go | 14 ++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/internal/controller/state/graph/gateway_listener.go b/internal/controller/state/graph/gateway_listener.go index 13b6f4d880..3f6e69587e 100644 --- a/internal/controller/state/graph/gateway_listener.go +++ b/internal/controller/state/graph/gateway_listener.go @@ -287,7 +287,8 @@ func getAndValidateListenerSupportedKinds(listener v1.Listener) ( } if listener.AllowedRoutes != nil && listener.AllowedRoutes.Kinds != nil { - supportedKinds = make([]v1.RouteGroupKind, 0, len(listener.AllowedRoutes.Kinds)) + unique := make(map[string]struct{}) + supportedKinds = make([]v1.RouteGroupKind, 0) for _, kind := range listener.AllowedRoutes.Kinds { if !validProtocolRouteKind(kind) { group := v1.GroupName @@ -298,7 +299,15 @@ func getAndValidateListenerSupportedKinds(listener v1.Listener) ( conds = append(conds, conditions.NewListenerInvalidRouteKinds(msg)...) continue } - supportedKinds = append(supportedKinds, kind) + // Use group/kind as key for uniqueness + key := string(kind.Kind) + if kind.Group != nil { + key = string(*kind.Group) + "/" + key + } + if _, exists := unique[key]; !exists { + unique[key] = struct{}{} + supportedKinds = append(supportedKinds, kind) + } } return conds, supportedKinds } diff --git a/internal/controller/state/graph/gateway_listener_test.go b/internal/controller/state/graph/gateway_listener_test.go index 5dd468c669..0055bbe530 100644 --- a/internal/controller/state/graph/gateway_listener_test.go +++ b/internal/controller/state/graph/gateway_listener_test.go @@ -382,6 +382,20 @@ func TestGetAndValidateListenerSupportedKinds(t *testing.T) { name: "valid and invalid kinds", expected: []v1.RouteGroupKind{HTTPRouteGroupKind}, }, + { + protocol: v1.HTTPProtocolType, + kind: []v1.RouteGroupKind{ + HTTPRouteGroupKind, + GRPCRouteGroupKind, + GRPCRouteGroupKind, + }, + expectErr: false, + name: "handle duplicate kinds", + expected: []v1.RouteGroupKind{ + HTTPRouteGroupKind, + GRPCRouteGroupKind, + }, + }, { protocol: v1.TLSProtocolType, kind: []v1.RouteGroupKind{