diff --git a/internal/framework/status/gateway.go b/internal/framework/status/gateway.go index f91c7f244f..dc13625e33 100644 --- a/internal/framework/status/gateway.go +++ b/internal/framework/status/gateway.go @@ -1,8 +1,6 @@ package status import ( - "sort" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" v1 "sigs.k8s.io/gateway-api/apis/v1" ) @@ -14,19 +12,9 @@ func prepareGatewayStatus( ) v1.GatewayStatus { listenerStatuses := make([]v1.ListenerStatus, 0, len(gatewayStatus.ListenerStatuses)) - // FIXME(pleshakov) Maintain the order from the Gateway resource - // https://github.com/nginxinc/nginx-gateway-fabric/issues/689 - names := make([]string, 0, len(gatewayStatus.ListenerStatuses)) - for name := range gatewayStatus.ListenerStatuses { - names = append(names, name) - } - sort.Strings(names) - - for _, name := range names { - s := gatewayStatus.ListenerStatuses[name] - + for _, s := range gatewayStatus.ListenerStatuses { listenerStatuses = append(listenerStatuses, v1.ListenerStatus{ - Name: v1.SectionName(name), + Name: s.Name, SupportedKinds: s.SupportedKinds, AttachedRoutes: s.AttachedRoutes, Conditions: convertConditions(s.Conditions, gatewayStatus.ObservedGeneration, transitionTime), diff --git a/internal/framework/status/gateway_test.go b/internal/framework/status/gateway_test.go index cff7e509a3..0dfe517f4b 100644 --- a/internal/framework/status/gateway_test.go +++ b/internal/framework/status/gateway_test.go @@ -19,7 +19,8 @@ func TestPrepareGatewayStatus(t *testing.T) { status := GatewayStatus{ Conditions: CreateTestConditions("GatewayTest"), ListenerStatuses: ListenerStatuses{ - "listener": { + { + Name: "listener", AttachedRoutes: 3, Conditions: CreateTestConditions("ListenerTest"), SupportedKinds: []v1.RouteGroupKind{ diff --git a/internal/framework/status/statuses.go b/internal/framework/status/statuses.go index d6761be5e6..92102d6aea 100644 --- a/internal/framework/status/statuses.go +++ b/internal/framework/status/statuses.go @@ -39,8 +39,8 @@ func (n *NginxGatewayStatus) APIGroup() string { return ngfAPI.GroupName } -// ListenerStatuses holds the statuses of listeners where the key is the name of a listener in the Gateway resource. -type ListenerStatuses map[string]ListenerStatus +// ListenerStatuses holds the statuses of listeners. +type ListenerStatuses []ListenerStatus // HTTPRouteStatuses holds the statuses of HTTPRoutes where the key is the namespaced name of an HTTPRoute. type HTTPRouteStatuses map[types.NamespacedName]HTTPRouteStatus @@ -67,6 +67,8 @@ type GatewayStatus struct { // ListenerStatus holds the status-related information about a listener in the Gateway resource. type ListenerStatus struct { + // Name is the name of the Listener that this status corresponds to. + Name v1.SectionName // Conditions is the list of conditions for this listener. Conditions []conditions.Condition // SupportedKinds is the list of SupportedKinds for this listener. diff --git a/internal/framework/status/updater_test.go b/internal/framework/status/updater_test.go index 34d72c7986..d743097c07 100644 --- a/internal/framework/status/updater_test.go +++ b/internal/framework/status/updater_test.go @@ -89,8 +89,9 @@ var _ = Describe("Updater", func() { GatewayStatuses: status.GatewayStatuses{ {Namespace: "test", Name: "gateway"}: { Conditions: status.CreateTestConditions("Test"), - ListenerStatuses: map[string]status.ListenerStatus{ - "http": { + ListenerStatuses: []status.ListenerStatus{ + { + Name: "http", AttachedRoutes: 1, Conditions: status.CreateTestConditions("Test"), SupportedKinds: []v1.RouteGroupKind{{Kind: "HTTPRoute"}}, diff --git a/internal/mode/static/build_statuses.go b/internal/mode/static/build_statuses.go index a5ec222cdd..9527bf145b 100644 --- a/internal/mode/static/build_statuses.go +++ b/internal/mode/static/build_statuses.go @@ -141,10 +141,10 @@ func buildGatewayStatus( } } - listenerStatuses := make(map[string]status.ListenerStatus) + listenerStatuses := make([]status.ListenerStatus, 0, len(gateway.Listeners)) validListenerCount := 0 - for name, l := range gateway.Listeners { + for _, l := range gateway.Listeners { var conds []conditions.Condition if l.Valid { @@ -161,11 +161,12 @@ func buildGatewayStatus( ) } - listenerStatuses[name] = status.ListenerStatus{ + listenerStatuses = append(listenerStatuses, status.ListenerStatus{ + Name: v1.SectionName(l.Name), AttachedRoutes: int32(len(l.Routes)), Conditions: conditions.DeduplicateConditions(conds), SupportedKinds: l.SupportedKinds, - } + }) } gwConds := staticConds.NewDefaultGatewayConditions() diff --git a/internal/mode/static/build_statuses_test.go b/internal/mode/static/build_statuses_test.go index 440cb82f80..c3ee37cfbc 100644 --- a/internal/mode/static/build_statuses_test.go +++ b/internal/mode/static/build_statuses_test.go @@ -126,8 +126,9 @@ func TestBuildStatuses(t *testing.T) { }, Gateway: &graph.Gateway{ Source: gw, - Listeners: map[string]*graph.Listener{ - "listener-80-1": { + Listeners: []*graph.Listener{ + { + Name: "listener-80-1", Valid: true, Routes: map[types.NamespacedName]*graph.Route{ {Namespace: "test", Name: "hr-1"}: {}, @@ -152,8 +153,9 @@ func TestBuildStatuses(t *testing.T) { GatewayStatuses: status.GatewayStatuses{ {Namespace: "test", Name: "gateway"}: { Conditions: staticConds.NewDefaultGatewayConditions(), - ListenerStatuses: map[string]status.ListenerStatus{ - "listener-80-1": { + ListenerStatuses: []status.ListenerStatus{ + { + Name: "listener-80-1", AttachedRoutes: 1, Conditions: staticConds.NewDefaultListenerConditions(), }, @@ -249,8 +251,9 @@ func TestBuildStatusesNginxErr(t *testing.T) { graph := &graph.Graph{ Gateway: &graph.Gateway{ Source: gw, - Listeners: map[string]*graph.Listener{ - "listener-80-1": { + Listeners: []*graph.Listener{ + { + Name: "listener-80-1", Valid: true, Routes: map[types.NamespacedName]*graph.Route{ {Namespace: "test", Name: "hr-1"}: {}, @@ -270,8 +273,9 @@ func TestBuildStatusesNginxErr(t *testing.T) { staticConds.NewGatewayAccepted(), staticConds.NewGatewayNotProgrammedInvalid(staticConds.GatewayMessageFailedNginxReload), }, - ListenerStatuses: map[string]status.ListenerStatus{ - "listener-80-1": { + ListenerStatuses: []status.ListenerStatus{ + { + Name: "listener-80-1", AttachedRoutes: 1, Conditions: []conditions.Condition{ staticConds.NewListenerAccepted(), @@ -424,14 +428,16 @@ func TestBuildGatewayStatuses(t *testing.T) { name: "valid gateway; all valid listeners", gateway: &graph.Gateway{ Source: gw, - Listeners: map[string]*graph.Listener{ - "listener-valid-1": { + Listeners: []*graph.Listener{ + { + Name: "listener-valid-1", Valid: true, Routes: map[types.NamespacedName]*graph.Route{ {Namespace: "test", Name: "hr-1"}: {}, }, }, - "listener-valid-2": { + { + Name: "listener-valid-2", Valid: true, Routes: map[types.NamespacedName]*graph.Route{ {Namespace: "test", Name: "hr-1"}: {}, @@ -443,12 +449,14 @@ func TestBuildGatewayStatuses(t *testing.T) { expected: status.GatewayStatuses{ {Namespace: "test", Name: "gateway"}: { Conditions: staticConds.NewDefaultGatewayConditions(), - ListenerStatuses: map[string]status.ListenerStatus{ - "listener-valid-1": { + ListenerStatuses: []status.ListenerStatus{ + { + Name: "listener-valid-1", AttachedRoutes: 1, Conditions: staticConds.NewDefaultListenerConditions(), }, - "listener-valid-2": { + { + Name: "listener-valid-2", AttachedRoutes: 1, Conditions: staticConds.NewDefaultListenerConditions(), }, @@ -462,14 +470,16 @@ func TestBuildGatewayStatuses(t *testing.T) { name: "valid gateway; some valid listeners", gateway: &graph.Gateway{ Source: gw, - Listeners: map[string]*graph.Listener{ - "listener-valid": { + Listeners: []*graph.Listener{ + { + Name: "listener-valid", Valid: true, Routes: map[types.NamespacedName]*graph.Route{ {Namespace: "test", Name: "hr-1"}: {}, }, }, - "listener-invalid": { + { + Name: "listener-invalid", Valid: false, Conditions: staticConds.NewListenerUnsupportedValue("unsupported value"), }, @@ -482,12 +492,14 @@ func TestBuildGatewayStatuses(t *testing.T) { staticConds.NewGatewayProgrammed(), staticConds.NewGatewayAcceptedListenersNotValid(), }, - ListenerStatuses: map[string]status.ListenerStatus{ - "listener-valid": { + ListenerStatuses: []status.ListenerStatus{ + { + Name: "listener-valid", AttachedRoutes: 1, Conditions: staticConds.NewDefaultListenerConditions(), }, - "listener-invalid": { + { + Name: "listener-invalid", Conditions: staticConds.NewListenerUnsupportedValue("unsupported value"), }, }, @@ -500,12 +512,14 @@ func TestBuildGatewayStatuses(t *testing.T) { name: "valid gateway; no valid listeners", gateway: &graph.Gateway{ Source: gw, - Listeners: map[string]*graph.Listener{ - "listener-invalid-1": { + Listeners: []*graph.Listener{ + { + Name: "listener-invalid-1", Valid: false, Conditions: staticConds.NewListenerUnsupportedProtocol("unsupported protocol"), }, - "listener-invalid-2": { + { + Name: "listener-invalid-2", Valid: false, Conditions: staticConds.NewListenerUnsupportedValue("unsupported value"), }, @@ -515,11 +529,13 @@ func TestBuildGatewayStatuses(t *testing.T) { expected: status.GatewayStatuses{ {Namespace: "test", Name: "gateway"}: { Conditions: staticConds.NewGatewayNotAcceptedListenersNotValid(), - ListenerStatuses: map[string]status.ListenerStatus{ - "listener-invalid-1": { + ListenerStatuses: []status.ListenerStatus{ + { + Name: "listener-invalid-1", Conditions: staticConds.NewListenerUnsupportedProtocol("unsupported protocol"), }, - "listener-invalid-2": { + { + Name: "listener-invalid-2", Conditions: staticConds.NewListenerUnsupportedValue("unsupported value"), }, }, @@ -548,8 +564,9 @@ func TestBuildGatewayStatuses(t *testing.T) { Source: gw, Valid: true, Conditions: staticConds.NewDefaultGatewayConditions(), - Listeners: map[string]*graph.Listener{ - "listener-valid": { + Listeners: []*graph.Listener{ + { + Name: "listener-valid", Valid: true, Routes: map[types.NamespacedName]*graph.Route{ {Namespace: "test", Name: "hr-1"}: {}, @@ -563,8 +580,9 @@ func TestBuildGatewayStatuses(t *testing.T) { staticConds.NewGatewayAccepted(), staticConds.NewGatewayNotProgrammedInvalid(staticConds.GatewayMessageFailedNginxReload), }, - ListenerStatuses: map[string]status.ListenerStatus{ - "listener-valid": { + ListenerStatuses: []status.ListenerStatus{ + { + Name: "listener-valid", AttachedRoutes: 1, Conditions: []conditions.Condition{ staticConds.NewListenerAccepted(), diff --git a/internal/mode/static/state/change_processor_test.go b/internal/mode/static/state/change_processor_test.go index 9456aa6084..31837c7d27 100644 --- a/internal/mode/static/state/change_processor_test.go +++ b/internal/mode/static/state/change_processor_test.go @@ -193,6 +193,16 @@ func createScheme() *runtime.Scheme { return scheme } +func getListenerByName(gw *graph.Gateway, name string) *graph.Listener { + for _, l := range gw.Listeners { + if l.Name == name { + return l + } + } + + return nil +} + var ( cert = []byte(`-----BEGIN CERTIFICATE----- MIIDLjCCAhYCCQDAOF9tLsaXWjANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJV @@ -469,8 +479,9 @@ var _ = Describe("ChangeProcessor", func() { }, Gateway: &graph.Gateway{ Source: gw1, - Listeners: map[string]*graph.Listener{ - "listener-80-1": { + Listeners: []*graph.Listener{ + { + Name: "listener-80-1", Source: gw1.Spec.Listeners[0], Valid: true, Attachable: true, @@ -479,7 +490,8 @@ var _ = Describe("ChangeProcessor", func() { }, SupportedKinds: []v1.RouteGroupKind{{Kind: "HTTPRoute"}}, }, - "listener-443-1": { + { + Name: "listener-443-1", Source: gw1.Spec.Listeners[1], Valid: true, Attachable: true, @@ -575,9 +587,10 @@ var _ = Describe("ChangeProcessor", func() { // No ref grant exists yet for gw1 // so the listener is not valid, but still attachable - expGraph.Gateway.Listeners["listener-443-1"].Valid = false - expGraph.Gateway.Listeners["listener-443-1"].ResolvedSecret = nil - expGraph.Gateway.Listeners["listener-443-1"].Conditions = staticConds.NewListenerRefNotPermitted( + listener443 := getListenerByName(expGraph.Gateway, "listener-443-1") + listener443.Valid = false + listener443.ResolvedSecret = nil + listener443.Conditions = staticConds.NewListenerRefNotPermitted( "Certificate ref to secret cert-ns/different-ns-tls-secret not permitted by any ReferenceGrant", ) @@ -595,8 +608,9 @@ var _ = Describe("ChangeProcessor", func() { Attached: true, } - expGraph.Gateway.Listeners["listener-80-1"].Routes[hr1Name].ParentRefs[0].Attachment = expAttachment80 - expGraph.Gateway.Listeners["listener-443-1"].Routes[hr1Name].ParentRefs[1].Attachment = expAttachment443 + listener80 := getListenerByName(expGraph.Gateway, "listener-80-1") + listener80.Routes[hr1Name].ParentRefs[0].Attachment = expAttachment80 + listener443.Routes[hr1Name].ParentRefs[1].Attachment = expAttachment443 // no ref grant exists yet for hr1 expGraph.Routes[hr1Name].Conditions = []conditions.Condition{ @@ -704,8 +718,11 @@ var _ = Describe("ChangeProcessor", func() { It("returns populated graph", func() { processor.CaptureUpsertChange(hr1Updated) - expGraph.Gateway.Listeners["listener-443-1"].Routes[hr1Name].Source.Generation = hr1Updated.Generation - expGraph.Gateway.Listeners["listener-80-1"].Routes[hr1Name].Source.Generation = hr1Updated.Generation + listener443 := getListenerByName(expGraph.Gateway, "listener-443-1") + listener443.Routes[hr1Name].Source.Generation = hr1Updated.Generation + + listener80 := getListenerByName(expGraph.Gateway, "listener-80-1") + listener80.Routes[hr1Name].Source.Generation = hr1Updated.Generation expGraph.ReferencedSecrets[client.ObjectKeyFromObject(diffNsTLSSecret)] = &graph.Secret{ Source: diffNsTLSSecret, } @@ -847,17 +864,20 @@ var _ = Describe("ChangeProcessor", func() { // gateway 2 takes over; // route 1 has been replaced by route 2 + listener80 := getListenerByName(expGraph.Gateway, "listener-80-1") + listener443 := getListenerByName(expGraph.Gateway, "listener-443-1") + expGraph.Gateway.Source = gw2 - expGraph.Gateway.Listeners["listener-80-1"].Source = gw2.Spec.Listeners[0] - expGraph.Gateway.Listeners["listener-443-1"].Source = gw2.Spec.Listeners[1] - delete(expGraph.Gateway.Listeners["listener-80-1"].Routes, hr1Name) - delete(expGraph.Gateway.Listeners["listener-443-1"].Routes, hr1Name) - expGraph.Gateway.Listeners["listener-80-1"].Routes[hr2Name] = expRouteHR2 - expGraph.Gateway.Listeners["listener-443-1"].Routes[hr2Name] = expRouteHR2 + listener80.Source = gw2.Spec.Listeners[0] + listener443.Source = gw2.Spec.Listeners[1] + delete(listener80.Routes, hr1Name) + delete(listener443.Routes, hr1Name) + listener80.Routes[hr2Name] = expRouteHR2 + listener443.Routes[hr2Name] = expRouteHR2 delete(expGraph.Routes, hr1Name) expGraph.Routes[hr2Name] = expRouteHR2 sameNsTLSSecretRef := helpers.GetPointer(client.ObjectKeyFromObject(sameNsTLSSecret)) - expGraph.Gateway.Listeners["listener-443-1"].ResolvedSecret = sameNsTLSSecretRef + listener443.ResolvedSecret = sameNsTLSSecretRef expGraph.ReferencedSecrets[client.ObjectKeyFromObject(sameNsTLSSecret)] = &graph.Secret{ Source: sameNsTLSSecret, } @@ -876,14 +896,17 @@ var _ = Describe("ChangeProcessor", func() { // gateway 2 still in charge; // no routes remain + listener80 := getListenerByName(expGraph.Gateway, "listener-80-1") + listener443 := getListenerByName(expGraph.Gateway, "listener-443-1") + expGraph.Gateway.Source = gw2 - expGraph.Gateway.Listeners["listener-80-1"].Source = gw2.Spec.Listeners[0] - expGraph.Gateway.Listeners["listener-443-1"].Source = gw2.Spec.Listeners[1] - delete(expGraph.Gateway.Listeners["listener-80-1"].Routes, hr1Name) - delete(expGraph.Gateway.Listeners["listener-443-1"].Routes, hr1Name) + listener80.Source = gw2.Spec.Listeners[0] + listener443.Source = gw2.Spec.Listeners[1] + delete(listener80.Routes, hr1Name) + delete(listener443.Routes, hr1Name) expGraph.Routes = map[types.NamespacedName]*graph.Route{} sameNsTLSSecretRef := helpers.GetPointer(client.ObjectKeyFromObject(sameNsTLSSecret)) - expGraph.Gateway.Listeners["listener-443-1"].ResolvedSecret = sameNsTLSSecretRef + listener443.ResolvedSecret = sameNsTLSSecretRef expGraph.ReferencedSecrets[client.ObjectKeyFromObject(sameNsTLSSecret)] = &graph.Secret{ Source: sameNsTLSSecret, } diff --git a/internal/mode/static/state/dataplane/configuration.go b/internal/mode/static/state/dataplane/configuration.go index 8c4eb4f0b6..dab0323bce 100644 --- a/internal/mode/static/state/dataplane/configuration.go +++ b/internal/mode/static/state/dataplane/configuration.go @@ -52,7 +52,7 @@ func BuildConfiguration( // valid listeners, so that we don't include unused Secrets in the configuration of the data plane. func buildSSLKeyPairs( secrets map[types.NamespacedName]*graph.Secret, - listeners map[string]*graph.Listener, + listeners []*graph.Listener, ) map[SSLKeyPairID]SSLKeyPair { keyPairs := make(map[SSLKeyPairID]SSLKeyPair) @@ -132,7 +132,7 @@ func newBackendGroup(refs []graph.BackendRef, sourceNsName types.NamespacedName, } } -func buildServers(listeners map[string]*graph.Listener) (http, ssl []VirtualServer) { +func buildServers(listeners []*graph.Listener) (http, ssl []VirtualServer) { rulesForProtocol := map[v1.ProtocolType]portPathRules{ v1.HTTPProtocolType: make(portPathRules), v1.HTTPSProtocolType: make(portPathRules), @@ -368,7 +368,7 @@ func (hpr *hostPathRules) maxServerCount() int { func buildUpstreams( ctx context.Context, - listeners map[string]*graph.Listener, + listeners []*graph.Listener, resolver resolver.ServiceResolver, ) []Upstream { // There can be duplicate upstreams if multiple routes reference the same upstream. diff --git a/internal/mode/static/state/dataplane/configuration_test.go b/internal/mode/static/state/dataplane/configuration_test.go index 3759e2ad7c..f23e9ec9f7 100644 --- a/internal/mode/static/state/dataplane/configuration_test.go +++ b/internal/mode/static/state/dataplane/configuration_test.go @@ -440,7 +440,7 @@ func TestBuildConfiguration(t *testing.T) { }, Gateway: &graph.Gateway{ Source: &v1.Gateway{}, - Listeners: map[string]*graph.Listener{}, + Listeners: []*graph.Listener{}, }, Routes: map[types.NamespacedName]*graph.Route{}, }, @@ -459,8 +459,9 @@ func TestBuildConfiguration(t *testing.T) { }, Gateway: &graph.Gateway{ Source: &v1.Gateway{}, - Listeners: map[string]*graph.Listener{ - "listener-80-1": { + Listeners: []*graph.Listener{ + { + Name: "listener-80-1", Source: listener80, Valid: true, Routes: map[types.NamespacedName]*graph.Route{}, @@ -489,15 +490,17 @@ func TestBuildConfiguration(t *testing.T) { }, Gateway: &graph.Gateway{ Source: &v1.Gateway{}, - Listeners: map[string]*graph.Listener{ - "listener-80-1": { + Listeners: []*graph.Listener{ + { + Name: "listener-80-1", Source: listener80, Valid: true, Routes: map[types.NamespacedName]*graph.Route{ client.ObjectKeyFromObject(hr1Invalid): routeHR1Invalid, }, }, - "listener-443-1": { + { + Name: "listener-443-1", Source: listener443, // nil hostname Valid: true, Routes: map[types.NamespacedName]*graph.Route{ @@ -549,14 +552,16 @@ func TestBuildConfiguration(t *testing.T) { }, Gateway: &graph.Gateway{ Source: &v1.Gateway{}, - Listeners: map[string]*graph.Listener{ - "listener-443-1": { + Listeners: []*graph.Listener{ + { + Name: "listener-443-1", Source: listener443, // nil hostname Valid: true, Routes: map[types.NamespacedName]*graph.Route{}, ResolvedSecret: &secret1NsName, }, - "listener-443-with-hostname": { + { + Name: "listener-443-with-hostname", Source: listener443WithHostname, // non-nil hostname Valid: true, Routes: map[types.NamespacedName]*graph.Route{}, @@ -609,8 +614,9 @@ func TestBuildConfiguration(t *testing.T) { }, Gateway: &graph.Gateway{ Source: &v1.Gateway{}, - Listeners: map[string]*graph.Listener{ - "invalid-listener": { + Listeners: []*graph.Listener{ + { + Name: "invalid-listener", Source: invalidListener, Valid: false, ResolvedSecret: &secret1NsName, @@ -640,8 +646,9 @@ func TestBuildConfiguration(t *testing.T) { }, Gateway: &graph.Gateway{ Source: &v1.Gateway{}, - Listeners: map[string]*graph.Listener{ - "listener-80-1": { + Listeners: []*graph.Listener{ + { + Name: "listener-80-1", Source: listener80, Valid: true, Routes: map[types.NamespacedName]*graph.Route{ @@ -710,8 +717,9 @@ func TestBuildConfiguration(t *testing.T) { }, Gateway: &graph.Gateway{ Source: &v1.Gateway{}, - Listeners: map[string]*graph.Listener{ - "listener-443-1": { + Listeners: []*graph.Listener{ + { + Name: "listener-443-1", Source: listener443, Valid: true, Routes: map[types.NamespacedName]*graph.Route{ @@ -720,7 +728,8 @@ func TestBuildConfiguration(t *testing.T) { }, ResolvedSecret: &secret1NsName, }, - "listener-443-with-hostname": { + { + Name: "listener-443-with-hostname", Source: listener443WithHostname, Valid: true, Routes: map[types.NamespacedName]*graph.Route{ @@ -827,8 +836,9 @@ func TestBuildConfiguration(t *testing.T) { }, Gateway: &graph.Gateway{ Source: &v1.Gateway{}, - Listeners: map[string]*graph.Listener{ - "listener-80-1": { + Listeners: []*graph.Listener{ + { + Name: "listener-80-1", Source: listener80, Valid: true, Routes: map[types.NamespacedName]*graph.Route{ @@ -836,7 +846,8 @@ func TestBuildConfiguration(t *testing.T) { {Namespace: "test", Name: "hr-4"}: routeHR4, }, }, - "listener-443-1": { + { + Name: "listener-443-1", Source: listener443, Valid: true, Routes: map[types.NamespacedName]*graph.Route{ @@ -984,22 +995,25 @@ func TestBuildConfiguration(t *testing.T) { }, Gateway: &graph.Gateway{ Source: &v1.Gateway{}, - Listeners: map[string]*graph.Listener{ - "listener-80-1": { + Listeners: []*graph.Listener{ + { + Name: "listener-80-1", Source: listener80, Valid: true, Routes: map[types.NamespacedName]*graph.Route{ {Namespace: "test", Name: "hr-3"}: routeHR3, }, }, - "listener-8080": { + { + Name: "listener-8080", Source: listener8080, Valid: true, Routes: map[types.NamespacedName]*graph.Route{ {Namespace: "test", Name: "hr-8"}: routeHR8, }, }, - "listener-443-1": { + { + Name: "listener-443-1", Source: listener443, Valid: true, Routes: map[types.NamespacedName]*graph.Route{ @@ -1007,7 +1021,8 @@ func TestBuildConfiguration(t *testing.T) { }, ResolvedSecret: &secret1NsName, }, - "listener-8443": { + { + Name: "listener-8443", Source: listener8443, Valid: true, Routes: map[types.NamespacedName]*graph.Route{ @@ -1193,8 +1208,9 @@ func TestBuildConfiguration(t *testing.T) { }, Gateway: &graph.Gateway{ Source: &v1.Gateway{}, - Listeners: map[string]*graph.Listener{ - "listener-80-1": { + Listeners: []*graph.Listener{ + { + Name: "listener-80-1", Source: listener80, Valid: true, Routes: map[types.NamespacedName]*graph.Route{ @@ -1215,8 +1231,9 @@ func TestBuildConfiguration(t *testing.T) { GatewayClass: nil, Gateway: &graph.Gateway{ Source: &v1.Gateway{}, - Listeners: map[string]*graph.Listener{ - "listener-80-1": { + Listeners: []*graph.Listener{ + { + Name: "listener-80-1", Source: listener80, Valid: true, Routes: map[types.NamespacedName]*graph.Route{ @@ -1252,8 +1269,9 @@ func TestBuildConfiguration(t *testing.T) { }, Gateway: &graph.Gateway{ Source: &v1.Gateway{}, - Listeners: map[string]*graph.Listener{ - "listener-80-1": { + Listeners: []*graph.Listener{ + { + Name: "listener-80-1", Source: listener80, Valid: true, Routes: map[types.NamespacedName]*graph.Route{ @@ -1320,15 +1338,17 @@ func TestBuildConfiguration(t *testing.T) { }, Gateway: &graph.Gateway{ Source: &v1.Gateway{}, - Listeners: map[string]*graph.Listener{ - "listener-80-1": { + Listeners: []*graph.Listener{ + { + Name: "listener-80-1", Source: listener80, Valid: true, Routes: map[types.NamespacedName]*graph.Route{ {Namespace: "test", Name: "hr-6"}: routeHR6, }, }, - "listener-443-1": { + { + Name: "listener-443-1", Source: listener443, Valid: true, Routes: map[types.NamespacedName]*graph.Route{ @@ -1419,8 +1439,9 @@ func TestBuildConfiguration(t *testing.T) { }, Gateway: &graph.Gateway{ Source: &v1.Gateway{}, - Listeners: map[string]*graph.Listener{ - "listener-80-1": { + Listeners: []*graph.Listener{ + { + Name: "listener-80-1", Source: listener80, Valid: true, Routes: map[types.NamespacedName]*graph.Route{ @@ -1481,8 +1502,9 @@ func TestBuildConfiguration(t *testing.T) { }, Gateway: &graph.Gateway{ Source: &v1.Gateway{}, - Listeners: map[string]*graph.Listener{ - "listener-443-with-hostname": { + Listeners: []*graph.Listener{ + { + Name: "listener-443-with-hostname", Source: listener443WithHostname, Valid: true, Routes: map[types.NamespacedName]*graph.Route{ @@ -1490,7 +1512,8 @@ func TestBuildConfiguration(t *testing.T) { }, ResolvedSecret: &secret2NsName, }, - "listener-443-1": { + { + Name: "listener-443-1", Source: listener443, Valid: true, Routes: map[types.NamespacedName]*graph.Route{ @@ -1898,20 +1921,24 @@ func TestBuildUpstreams(t *testing.T) { }, } - listeners := map[string]*graph.Listener{ - "invalid-listener": { + listeners := []*graph.Listener{ + { + Name: "invalid-listener", Valid: false, Routes: routesWithNonExistingRefs, // shouldn't be included since listener is invalid }, - "listener-1": { + { + Name: "listener-1", Valid: true, Routes: routes, }, - "listener-2": { + { + Name: "listener-2", Valid: true, Routes: routes2, }, - "listener-3": { + { + Name: "listener-3", Valid: true, Routes: invalidRoutes, // shouldn't be included since routes are invalid }, diff --git a/internal/mode/static/state/graph/gateway.go b/internal/mode/static/state/graph/gateway.go index 1e3ea986f7..79f0ae9df4 100644 --- a/internal/mode/static/state/graph/gateway.go +++ b/internal/mode/static/state/graph/gateway.go @@ -18,7 +18,7 @@ type Gateway struct { // Source is the corresponding Gateway resource. Source *v1.Gateway // Listeners include the listeners of the Gateway. - Listeners map[string]*Listener + Listeners []*Listener // Conditions holds the conditions for the Gateway. Conditions []conditions.Condition // Valid indicates whether the Gateway Spec is valid. diff --git a/internal/mode/static/state/graph/gateway_listener.go b/internal/mode/static/state/graph/gateway_listener.go index 4e6eb02eaa..12c2ade962 100644 --- a/internal/mode/static/state/graph/gateway_listener.go +++ b/internal/mode/static/state/graph/gateway_listener.go @@ -17,6 +17,7 @@ import ( // Listener represents a Listener of the Gateway resource. // For now, we only support HTTP and HTTPS listeners. type Listener struct { + Name string // Source holds the source of the Listener from the Gateway resource. Source v1.Listener // Routes holds the routes attached to the Listener. @@ -44,14 +45,14 @@ func buildListeners( secretResolver *secretResolver, refGrantResolver *referenceGrantResolver, protectedPorts ProtectedPorts, -) map[string]*Listener { - listeners := make(map[string]*Listener) +) []*Listener { + listeners := make([]*Listener, 0, len(gw.Spec.Listeners)) listenerFactory := newListenerConfiguratorFactory(gw, secretResolver, refGrantResolver, protectedPorts) for _, gl := range gw.Spec.Listeners { configurator := listenerFactory.getConfiguratorForListener(gl) - listeners[string(gl.Name)] = configurator.configure(gl) + listeners = append(listeners, configurator.configure(gl)) } return listeners @@ -176,6 +177,7 @@ func (c *listenerConfigurator) configure(listener v1.Listener) *Listener { supportedKinds := getListenerSupportedKinds(listener) l := &Listener{ + Name: string(listener.Name), Source: listener, Conditions: conds, AllowedRouteLabelSelector: allowedRouteSelector, diff --git a/internal/mode/static/state/graph/gateway_test.go b/internal/mode/static/state/graph/gateway_test.go index c378d71180..80b2840b64 100644 --- a/internal/mode/static/state/graph/gateway_test.go +++ b/internal/mode/static/state/graph/gateway_test.go @@ -354,8 +354,9 @@ func TestBuildGateway(t *testing.T) { gatewayClass: validGC, expected: &Gateway{ Source: getLastCreatedGetaway(), - Listeners: map[string]*Listener{ - "foo-80-1": { + Listeners: []*Listener{ + { + Name: "foo-80-1", Source: foo80Listener1, Valid: true, Attachable: true, @@ -364,7 +365,8 @@ func TestBuildGateway(t *testing.T) { {Kind: "HTTPRoute"}, }, }, - "foo-8080": { + { + Name: "foo-8080", Source: foo8080Listener, Valid: true, Attachable: true, @@ -385,8 +387,9 @@ func TestBuildGateway(t *testing.T) { gatewayClass: validGC, expected: &Gateway{ Source: getLastCreatedGetaway(), - Listeners: map[string]*Listener{ - "foo-443-https-1": { + Listeners: []*Listener{ + { + Name: "foo-443-https-1", Source: foo443HTTPSListener1, Valid: true, Attachable: true, @@ -396,7 +399,8 @@ func TestBuildGateway(t *testing.T) { {Kind: "HTTPRoute"}, }, }, - "foo-8443-https": { + { + Name: "foo-8443-https", Source: foo8443HTTPSListener, Valid: true, Attachable: true, @@ -416,8 +420,9 @@ func TestBuildGateway(t *testing.T) { gatewayClass: validGC, expected: &Gateway{ Source: getLastCreatedGetaway(), - Listeners: map[string]*Listener{ - "listener-with-allowed-routes": { + Listeners: []*Listener{ + { + Name: "listener-with-allowed-routes", Source: listenerAllowedRoutes, Valid: true, Attachable: true, @@ -461,8 +466,9 @@ func TestBuildGateway(t *testing.T) { }, expected: &Gateway{ Source: getLastCreatedGetaway(), - Listeners: map[string]*Listener{ - "listener-cross-ns-secret": { + Listeners: []*Listener{ + { + Name: "listener-cross-ns-secret", Source: crossNamespaceSecretListener, Valid: true, Attachable: true, @@ -482,8 +488,9 @@ func TestBuildGateway(t *testing.T) { gatewayClass: validGC, expected: &Gateway{ Source: getLastCreatedGetaway(), - Listeners: map[string]*Listener{ - "listener-cross-ns-secret": { + Listeners: []*Listener{ + { + Name: "listener-cross-ns-secret", Source: crossNamespaceSecretListener, Valid: false, Attachable: true, @@ -505,8 +512,9 @@ func TestBuildGateway(t *testing.T) { gatewayClass: validGC, expected: &Gateway{ Source: getLastCreatedGetaway(), - Listeners: map[string]*Listener{ - "listener-with-invalid-selector": { + Listeners: []*Listener{ + { + Name: "listener-with-invalid-selector", Source: listenerInvalidSelector, Valid: false, Attachable: true, @@ -528,8 +536,9 @@ func TestBuildGateway(t *testing.T) { gatewayClass: validGC, expected: &Gateway{ Source: getLastCreatedGetaway(), - Listeners: map[string]*Listener{ - "invalid-protocol": { + Listeners: []*Listener{ + { + Name: "invalid-protocol", Source: invalidProtocolListener, Valid: false, Attachable: false, @@ -559,8 +568,9 @@ func TestBuildGateway(t *testing.T) { gatewayClass: validGC, expected: &Gateway{ Source: getLastCreatedGetaway(), - Listeners: map[string]*Listener{ - "invalid-port": { + Listeners: []*Listener{ + { + Name: "invalid-port", Source: invalidPortListener, Valid: false, Attachable: true, @@ -572,7 +582,8 @@ func TestBuildGateway(t *testing.T) { {Kind: "HTTPRoute"}, }, }, - "invalid-https-port": { + { + Name: "invalid-https-port", Source: invalidHTTPSPortListener, Valid: false, Attachable: true, @@ -584,7 +595,8 @@ func TestBuildGateway(t *testing.T) { {Kind: "HTTPRoute"}, }, }, - "invalid-protected-port": { + { + Name: "invalid-protected-port", Source: invalidProtectedPortListener, Valid: false, Attachable: true, @@ -608,8 +620,9 @@ func TestBuildGateway(t *testing.T) { gatewayClass: validGC, expected: &Gateway{ Source: getLastCreatedGetaway(), - Listeners: map[string]*Listener{ - "invalid-hostname": { + Listeners: []*Listener{ + { + Name: "invalid-hostname", Source: invalidHostnameListener, Valid: false, Conditions: staticConds.NewListenerUnsupportedValue(invalidHostnameMsg), @@ -618,7 +631,8 @@ func TestBuildGateway(t *testing.T) { {Kind: "HTTPRoute"}, }, }, - "invalid-https-hostname": { + { + Name: "invalid-https-hostname", Source: invalidHTTPSHostnameListener, Valid: false, Conditions: staticConds.NewListenerUnsupportedValue(invalidHostnameMsg), @@ -637,8 +651,9 @@ func TestBuildGateway(t *testing.T) { gatewayClass: validGC, expected: &Gateway{ Source: getLastCreatedGetaway(), - Listeners: map[string]*Listener{ - "invalid-tls-config": { + Listeners: []*Listener{ + { + Name: "invalid-tls-config", Source: invalidTLSConfigListener, Valid: false, Attachable: true, @@ -673,8 +688,9 @@ func TestBuildGateway(t *testing.T) { gatewayClass: validGC, expected: &Gateway{ Source: getLastCreatedGetaway(), - Listeners: map[string]*Listener{ - "foo-80-1": { + Listeners: []*Listener{ + { + Name: "foo-80-1", Source: foo80Listener1, Valid: true, Attachable: true, @@ -683,7 +699,8 @@ func TestBuildGateway(t *testing.T) { {Kind: "HTTPRoute"}, }, }, - "foo-8080": { + { + Name: "foo-8080", Source: foo8080Listener, Valid: true, Attachable: true, @@ -692,7 +709,8 @@ func TestBuildGateway(t *testing.T) { {Kind: "HTTPRoute"}, }, }, - "foo-8081": { + { + Name: "foo-8081", Source: foo8081Listener, Valid: true, Attachable: true, @@ -701,16 +719,8 @@ func TestBuildGateway(t *testing.T) { {Kind: "HTTPRoute"}, }, }, - "bar-80": { - Source: bar80Listener, - Valid: true, - Attachable: true, - Routes: map[types.NamespacedName]*Route{}, - SupportedKinds: []v1.RouteGroupKind{ - {Kind: "HTTPRoute"}, - }, - }, - "foo-443-https-1": { + { + Name: "foo-443-https-1", Source: foo443HTTPSListener1, Valid: true, Attachable: true, @@ -720,7 +730,8 @@ func TestBuildGateway(t *testing.T) { {Kind: "HTTPRoute"}, }, }, - "foo-8443-https": { + { + Name: "foo-8443-https", Source: foo8443HTTPSListener, Valid: true, Attachable: true, @@ -730,7 +741,18 @@ func TestBuildGateway(t *testing.T) { {Kind: "HTTPRoute"}, }, }, - "bar-443-https": { + { + Name: "bar-80", + Source: bar80Listener, + Valid: true, + Attachable: true, + Routes: map[types.NamespacedName]*Route{}, + SupportedKinds: []v1.RouteGroupKind{ + {Kind: "HTTPRoute"}, + }, + }, + { + Name: "bar-443-https", Source: bar443HTTPSListener, Valid: true, Attachable: true, @@ -740,7 +762,8 @@ func TestBuildGateway(t *testing.T) { {Kind: "HTTPRoute"}, }, }, - "bar-8443-https": { + { + Name: "bar-8443-https", Source: bar8443HTTPSListener, Valid: true, Attachable: true, @@ -771,8 +794,9 @@ func TestBuildGateway(t *testing.T) { gatewayClass: validGC, expected: &Gateway{ Source: getLastCreatedGetaway(), - Listeners: map[string]*Listener{ - "foo-80-1": { + Listeners: []*Listener{ + { + Name: "foo-80-1", Source: foo80Listener1, Valid: false, Attachable: true, @@ -782,7 +806,8 @@ func TestBuildGateway(t *testing.T) { {Kind: "HTTPRoute"}, }, }, - "bar-80": { + { + Name: "bar-80", Source: bar80Listener, Valid: false, Attachable: true, @@ -792,7 +817,8 @@ func TestBuildGateway(t *testing.T) { {Kind: "HTTPRoute"}, }, }, - "foo-443": { + { + Name: "foo-443", Source: foo443Listener, Valid: false, Attachable: true, @@ -802,7 +828,8 @@ func TestBuildGateway(t *testing.T) { {Kind: "HTTPRoute"}, }, }, - "foo-80-https": { + { + Name: "foo-80-https", Source: foo80HTTPSListener, Valid: false, Attachable: true, @@ -813,7 +840,8 @@ func TestBuildGateway(t *testing.T) { {Kind: "HTTPRoute"}, }, }, - "foo-443-https-1": { + { + Name: "foo-443-https-1", Source: foo443HTTPSListener1, Valid: false, Attachable: true, @@ -824,7 +852,8 @@ func TestBuildGateway(t *testing.T) { {Kind: "HTTPRoute"}, }, }, - "bar-443-https": { + { + Name: "bar-443-https", Source: bar443HTTPSListener, Valid: false, Attachable: true, diff --git a/internal/mode/static/state/graph/graph_test.go b/internal/mode/static/state/graph/graph_test.go index a1ec837134..cae15a3722 100644 --- a/internal/mode/static/state/graph/graph_test.go +++ b/internal/mode/static/state/graph/graph_test.go @@ -272,8 +272,9 @@ func TestBuildGraph(t *testing.T) { }, Gateway: &Gateway{ Source: gw1, - Listeners: map[string]*Listener{ - "listener-80-1": { + Listeners: []*Listener{ + { + Name: "listener-80-1", Source: gw1.Spec.Listeners[0], Valid: true, Attachable: true, @@ -282,7 +283,8 @@ func TestBuildGraph(t *testing.T) { }, SupportedKinds: []gatewayv1.RouteGroupKind{{Kind: "HTTPRoute"}}, }, - "listener-443-1": { + { + Name: "listener-443-1", Source: gw1.Spec.Listeners[1], Valid: true, Attachable: true, diff --git a/internal/mode/static/state/graph/httproute.go b/internal/mode/static/state/graph/httproute.go index 4f9da0fbc3..65079a0c83 100644 --- a/internal/mode/static/state/graph/httproute.go +++ b/internal/mode/static/state/graph/httproute.go @@ -384,18 +384,17 @@ func tryToAttachRouteToListeners( // findAttachableListeners returns a list of attachable listeners and whether the listener exists for a non-empty // sectionName. -func findAttachableListeners(sectionName string, listeners map[string]*Listener) ([]*Listener, bool) { +func findAttachableListeners(sectionName string, listeners []*Listener) ([]*Listener, bool) { if sectionName != "" { - l, exists := listeners[sectionName] - if !exists { - return nil, false - } - - if l.Attachable { - return []*Listener{l}, true + for _, l := range listeners { + if l.Name == sectionName { + if l.Attachable { + return []*Listener{l}, true + } + return nil, true + } } - - return nil, true + return nil, false } attachableListeners := make([]*Listener, 0, len(listeners)) diff --git a/internal/mode/static/state/graph/httproute_test.go b/internal/mode/static/state/graph/httproute_test.go index b0a87f7e47..c8d7c4d7e0 100644 --- a/internal/mode/static/state/graph/httproute_test.go +++ b/internal/mode/static/state/graph/httproute_test.go @@ -616,6 +616,7 @@ func TestBindRouteToListeners(t *testing.T) { // we create a new listener each time because the function under test can modify it createListener := func(name string) *Listener { return &Listener{ + Name: name, Source: gatewayv1.Listener{ Name: gatewayv1.SectionName(name), Hostname: (*gatewayv1.Hostname)(helpers.GetPointer("foo.example.com")), @@ -790,18 +791,18 @@ func TestBindRouteToListeners(t *testing.T) { }, } - invalidNotAttachableListener := createModifiedListener("", func(l *Listener) { + invalidNotAttachableListener := createModifiedListener("listener-80-1", func(l *Listener) { l.Valid = false l.Attachable = false }) - nonMatchingHostnameListener := createModifiedListener("", func(l *Listener) { + nonMatchingHostnameListener := createModifiedListener("listener-80-1", func(l *Listener) { l.Source.Hostname = helpers.GetPointer[gatewayv1.Hostname]("bar.example.com") }) tests := []struct { route *Route gateway *Gateway - expectedGatewayListeners map[string]*Listener + expectedGatewayListeners []*Listener name string expectedSectionNameRefs []ParentRef expectedConditions []conditions.Condition @@ -811,8 +812,8 @@ func TestBindRouteToListeners(t *testing.T) { gateway: &Gateway{ Source: gw, Valid: true, - Listeners: map[string]*Listener{ - "listener-80-1": createListener("listener-80-1"), + Listeners: []*Listener{ + createListener("listener-80-1"), }, }, expectedSectionNameRefs: []ParentRef{ @@ -827,8 +828,8 @@ func TestBindRouteToListeners(t *testing.T) { }, }, }, - expectedGatewayListeners: map[string]*Listener{ - "listener-80-1": createModifiedListener("listener-80-1", func(l *Listener) { + expectedGatewayListeners: []*Listener{ + createModifiedListener("listener-80-1", func(l *Listener) { l.Routes = map[types.NamespacedName]*Route{ client.ObjectKeyFromObject(hr): getLastNormalRoute(), } @@ -841,8 +842,8 @@ func TestBindRouteToListeners(t *testing.T) { gateway: &Gateway{ Source: gw, Valid: true, - Listeners: map[string]*Listener{ - "listener-80-1": createListener("listener-80-1"), + Listeners: []*Listener{ + createListener("listener-80-1"), }, }, expectedSectionNameRefs: []ParentRef{ @@ -857,8 +858,8 @@ func TestBindRouteToListeners(t *testing.T) { }, }, }, - expectedGatewayListeners: map[string]*Listener{ - "listener-80-1": createModifiedListener("listener-80-1", func(l *Listener) { + expectedGatewayListeners: []*Listener{ + createModifiedListener("listener-80-1", func(l *Listener) { l.Routes = map[types.NamespacedName]*Route{ client.ObjectKeyFromObject(hr): routeWithMissingSectionName, } @@ -871,9 +872,9 @@ func TestBindRouteToListeners(t *testing.T) { gateway: &Gateway{ Source: gw, Valid: true, - Listeners: map[string]*Listener{ - "listener-80": createListener("listener-80"), - "listener-8080": createListener("listener-8080"), + Listeners: []*Listener{ + createListener("listener-80"), + createListener("listener-8080"), }, }, expectedSectionNameRefs: []ParentRef{ @@ -889,13 +890,13 @@ func TestBindRouteToListeners(t *testing.T) { }, }, }, - expectedGatewayListeners: map[string]*Listener{ - "listener-80": createModifiedListener("listener-80", func(l *Listener) { + expectedGatewayListeners: []*Listener{ + createModifiedListener("listener-80", func(l *Listener) { l.Routes = map[types.NamespacedName]*Route{ client.ObjectKeyFromObject(hr): routeWithEmptySectionName, } }), - "listener-8080": createModifiedListener("listener-8080", func(l *Listener) { + createModifiedListener("listener-8080", func(l *Listener) { l.Routes = map[types.NamespacedName]*Route{ client.ObjectKeyFromObject(hr): routeWithEmptySectionName, } @@ -908,8 +909,8 @@ func TestBindRouteToListeners(t *testing.T) { gateway: &Gateway{ Source: gw, Valid: true, - Listeners: map[string]*Listener{ - "listener-80-1": invalidNotAttachableListener, + Listeners: []*Listener{ + invalidNotAttachableListener, }, }, expectedSectionNameRefs: []ParentRef{ @@ -923,8 +924,8 @@ func TestBindRouteToListeners(t *testing.T) { }, }, }, - expectedGatewayListeners: map[string]*Listener{ - "listener-80-1": invalidNotAttachableListener, + expectedGatewayListeners: []*Listener{ + invalidNotAttachableListener, }, name: "empty section name with no valid and attachable listeners", }, @@ -933,8 +934,8 @@ func TestBindRouteToListeners(t *testing.T) { gateway: &Gateway{ Source: gw, Valid: true, - Listeners: map[string]*Listener{ - "listener-80-1": createListener("listener-80-1"), + Listeners: []*Listener{ + createListener("listener-80-1"), }, }, expectedSectionNameRefs: []ParentRef{ @@ -950,8 +951,8 @@ func TestBindRouteToListeners(t *testing.T) { }, }, }, - expectedGatewayListeners: map[string]*Listener{ - "listener-80-1": createListener("listener-80-1"), + expectedGatewayListeners: []*Listener{ + createListener("listener-80-1"), }, name: "port is configured", }, @@ -960,8 +961,8 @@ func TestBindRouteToListeners(t *testing.T) { gateway: &Gateway{ Source: gw, Valid: true, - Listeners: map[string]*Listener{ - "listener-80-1": createListener("listener-80-1"), + Listeners: []*Listener{ + createListener("listener-80-1"), }, }, expectedSectionNameRefs: []ParentRef{ @@ -975,8 +976,8 @@ func TestBindRouteToListeners(t *testing.T) { }, }, }, - expectedGatewayListeners: map[string]*Listener{ - "listener-80-1": createListener("listener-80-1"), + expectedGatewayListeners: []*Listener{ + createListener("listener-80-1"), }, name: "listener doesn't exist", }, @@ -985,8 +986,8 @@ func TestBindRouteToListeners(t *testing.T) { gateway: &Gateway{ Source: gw, Valid: true, - Listeners: map[string]*Listener{ - "listener-80-1": invalidNotAttachableListener, + Listeners: []*Listener{ + invalidNotAttachableListener, }, }, expectedSectionNameRefs: []ParentRef{ @@ -1000,8 +1001,8 @@ func TestBindRouteToListeners(t *testing.T) { }, }, }, - expectedGatewayListeners: map[string]*Listener{ - "listener-80-1": invalidNotAttachableListener, + expectedGatewayListeners: []*Listener{ + invalidNotAttachableListener, }, name: "listener isn't valid and attachable", }, @@ -1010,8 +1011,8 @@ func TestBindRouteToListeners(t *testing.T) { gateway: &Gateway{ Source: gw, Valid: true, - Listeners: map[string]*Listener{ - "listener-80-1": nonMatchingHostnameListener, + Listeners: []*Listener{ + nonMatchingHostnameListener, }, }, expectedSectionNameRefs: []ParentRef{ @@ -1025,8 +1026,8 @@ func TestBindRouteToListeners(t *testing.T) { }, }, }, - expectedGatewayListeners: map[string]*Listener{ - "listener-80-1": nonMatchingHostnameListener, + expectedGatewayListeners: []*Listener{ + nonMatchingHostnameListener, }, name: "no matching listener hostname", }, @@ -1035,8 +1036,8 @@ func TestBindRouteToListeners(t *testing.T) { gateway: &Gateway{ Source: gw, Valid: true, - Listeners: map[string]*Listener{ - "listener-80-1": createListener("listener-80-1"), + Listeners: []*Listener{ + createListener("listener-80-1"), }, }, expectedSectionNameRefs: []ParentRef{ @@ -1050,8 +1051,8 @@ func TestBindRouteToListeners(t *testing.T) { }, }, }, - expectedGatewayListeners: map[string]*Listener{ - "listener-80-1": createListener("listener-80-1"), + expectedGatewayListeners: []*Listener{ + createListener("listener-80-1"), }, name: "gateway is ignored", }, @@ -1060,8 +1061,8 @@ func TestBindRouteToListeners(t *testing.T) { gateway: &Gateway{ Source: gw, Valid: true, - Listeners: map[string]*Listener{ - "listener-80-1": createListener("listener-80-1"), + Listeners: []*Listener{ + createListener("listener-80-1"), }, }, expectedSectionNameRefs: []ParentRef{ @@ -1071,8 +1072,8 @@ func TestBindRouteToListeners(t *testing.T) { Attachment: nil, }, }, - expectedGatewayListeners: map[string]*Listener{ - "listener-80-1": createListener("listener-80-1"), + expectedGatewayListeners: []*Listener{ + createListener("listener-80-1"), }, name: "route isn't valid", }, @@ -1081,8 +1082,8 @@ func TestBindRouteToListeners(t *testing.T) { gateway: &Gateway{ Source: gw, Valid: false, - Listeners: map[string]*Listener{ - "listener-80-1": createListener("listener-80-1"), + Listeners: []*Listener{ + createListener("listener-80-1"), }, }, expectedSectionNameRefs: []ParentRef{ @@ -1096,8 +1097,8 @@ func TestBindRouteToListeners(t *testing.T) { }, }, }, - expectedGatewayListeners: map[string]*Listener{ - "listener-80-1": createListener("listener-80-1"), + expectedGatewayListeners: []*Listener{ + createListener("listener-80-1"), }, name: "invalid gateway", }, @@ -1106,8 +1107,8 @@ func TestBindRouteToListeners(t *testing.T) { gateway: &Gateway{ Source: gw, Valid: true, - Listeners: map[string]*Listener{ - "listener-80-1": createModifiedListener("listener-80-1", func(l *Listener) { + Listeners: []*Listener{ + createModifiedListener("listener-80-1", func(l *Listener) { l.Valid = false }), }, @@ -1124,8 +1125,8 @@ func TestBindRouteToListeners(t *testing.T) { }, }, }, - expectedGatewayListeners: map[string]*Listener{ - "listener-80-1": createModifiedListener("listener-80-1", func(l *Listener) { + expectedGatewayListeners: []*Listener{ + createModifiedListener("listener-80-1", func(l *Listener) { l.Valid = false l.Routes = map[types.NamespacedName]*Route{ client.ObjectKeyFromObject(hr): getLastNormalRoute(), @@ -1140,8 +1141,8 @@ func TestBindRouteToListeners(t *testing.T) { gateway: &Gateway{ Source: gw, Valid: true, - Listeners: map[string]*Listener{ - "listener-80-1": createListener("listener-80-1"), + Listeners: []*Listener{ + createListener("listener-80-1"), }, }, expectedSectionNameRefs: []ParentRef{ @@ -1156,8 +1157,8 @@ func TestBindRouteToListeners(t *testing.T) { }, }, }, - expectedGatewayListeners: map[string]*Listener{ - "listener-80-1": createModifiedListener("listener-80-1", func(l *Listener) { + expectedGatewayListeners: []*Listener{ + createModifiedListener("listener-80-1", func(l *Listener) { l.Routes = map[types.NamespacedName]*Route{ client.ObjectKeyFromObject(hr): invalidAttachableRoute1, } @@ -1170,8 +1171,8 @@ func TestBindRouteToListeners(t *testing.T) { gateway: &Gateway{ Source: gw, Valid: true, - Listeners: map[string]*Listener{ - "listener-80-1": createModifiedListener("listener-80-1", func(l *Listener) { + Listeners: []*Listener{ + createModifiedListener("listener-80-1", func(l *Listener) { l.Valid = false }), }, @@ -1188,8 +1189,8 @@ func TestBindRouteToListeners(t *testing.T) { }, }, }, - expectedGatewayListeners: map[string]*Listener{ - "listener-80-1": createModifiedListener("listener-80-1", func(l *Listener) { + expectedGatewayListeners: []*Listener{ + createModifiedListener("listener-80-1", func(l *Listener) { l.Valid = false l.Routes = map[types.NamespacedName]*Route{ client.ObjectKeyFromObject(hr): invalidAttachableRoute2, @@ -1204,8 +1205,8 @@ func TestBindRouteToListeners(t *testing.T) { gateway: &Gateway{ Source: gw, Valid: true, - Listeners: map[string]*Listener{ - "listener-80-1": createModifiedListener("listener-80-1", func(l *Listener) { + Listeners: []*Listener{ + createModifiedListener("listener-80-1", func(l *Listener) { l.Source.AllowedRoutes = &gatewayv1.AllowedRoutes{ Namespaces: &gatewayv1.RouteNamespaces{ From: helpers.GetPointer(gatewayv1.NamespacesFromSelector), @@ -1227,8 +1228,8 @@ func TestBindRouteToListeners(t *testing.T) { }, }, }, - expectedGatewayListeners: map[string]*Listener{ - "listener-80-1": createModifiedListener("listener-80-1", func(l *Listener) { + expectedGatewayListeners: []*Listener{ + createModifiedListener("listener-80-1", func(l *Listener) { l.Source.AllowedRoutes = &gatewayv1.AllowedRoutes{ Namespaces: &gatewayv1.RouteNamespaces{ From: helpers.GetPointer(gatewayv1.NamespacesFromSelector), @@ -1245,8 +1246,8 @@ func TestBindRouteToListeners(t *testing.T) { gateway: &Gateway{ Source: gw, Valid: true, - Listeners: map[string]*Listener{ - "listener-80-1": createModifiedListener("listener-80-1", func(l *Listener) { + Listeners: []*Listener{ + createModifiedListener("listener-80-1", func(l *Listener) { l.Source.AllowedRoutes = &gatewayv1.AllowedRoutes{ Namespaces: &gatewayv1.RouteNamespaces{ From: helpers.GetPointer(gatewayv1.NamespacesFromSelector), @@ -1269,8 +1270,8 @@ func TestBindRouteToListeners(t *testing.T) { }, }, }, - expectedGatewayListeners: map[string]*Listener{ - "listener-80-1": createModifiedListener("listener-80-1", func(l *Listener) { + expectedGatewayListeners: []*Listener{ + createModifiedListener("listener-80-1", func(l *Listener) { allowedLabels := map[string]string{"app": "allowed"} l.AllowedRouteLabelSelector = labels.SelectorFromSet(allowedLabels) l.Source.AllowedRoutes = &gatewayv1.AllowedRoutes{ @@ -1290,8 +1291,8 @@ func TestBindRouteToListeners(t *testing.T) { gateway: &Gateway{ Source: gwDiffNamespace, Valid: true, - Listeners: map[string]*Listener{ - "listener-80-1": createModifiedListener("listener-80-1", func(l *Listener) { + Listeners: []*Listener{ + createModifiedListener("listener-80-1", func(l *Listener) { l.Source.AllowedRoutes = &gatewayv1.AllowedRoutes{ Namespaces: &gatewayv1.RouteNamespaces{ From: helpers.GetPointer(gatewayv1.NamespacesFromSame), @@ -1311,8 +1312,8 @@ func TestBindRouteToListeners(t *testing.T) { }, }, }, - expectedGatewayListeners: map[string]*Listener{ - "listener-80-1": createModifiedListener("listener-80-1", func(l *Listener) { + expectedGatewayListeners: []*Listener{ + createModifiedListener("listener-80-1", func(l *Listener) { l.Source.AllowedRoutes = &gatewayv1.AllowedRoutes{ Namespaces: &gatewayv1.RouteNamespaces{ From: helpers.GetPointer(gatewayv1.NamespacesFromSame), @@ -1327,8 +1328,8 @@ func TestBindRouteToListeners(t *testing.T) { gateway: &Gateway{ Source: gw, Valid: true, - Listeners: map[string]*Listener{ - "listener-80-1": createModifiedListener("listener-80-1", func(l *Listener) { + Listeners: []*Listener{ + createModifiedListener("listener-80-1", func(l *Listener) { l.Source.AllowedRoutes = &gatewayv1.AllowedRoutes{ Namespaces: &gatewayv1.RouteNamespaces{ From: helpers.GetPointer(gatewayv1.NamespacesFromSame), @@ -1349,8 +1350,8 @@ func TestBindRouteToListeners(t *testing.T) { }, }, }, - expectedGatewayListeners: map[string]*Listener{ - "listener-80-1": createModifiedListener("listener-80-1", func(l *Listener) { + expectedGatewayListeners: []*Listener{ + createModifiedListener("listener-80-1", func(l *Listener) { l.Source.AllowedRoutes = &gatewayv1.AllowedRoutes{ Namespaces: &gatewayv1.RouteNamespaces{ From: helpers.GetPointer(gatewayv1.NamespacesFromSame), @@ -1368,8 +1369,8 @@ func TestBindRouteToListeners(t *testing.T) { gateway: &Gateway{ Source: gwDiffNamespace, Valid: true, - Listeners: map[string]*Listener{ - "listener-80-1": createModifiedListener("listener-80-1", func(l *Listener) { + Listeners: []*Listener{ + createModifiedListener("listener-80-1", func(l *Listener) { l.Source.AllowedRoutes = &gatewayv1.AllowedRoutes{ Namespaces: &gatewayv1.RouteNamespaces{ From: helpers.GetPointer(gatewayv1.NamespacesFromAll), @@ -1390,8 +1391,8 @@ func TestBindRouteToListeners(t *testing.T) { }, }, }, - expectedGatewayListeners: map[string]*Listener{ - "listener-80-1": createModifiedListener("listener-80-1", func(l *Listener) { + expectedGatewayListeners: []*Listener{ + createModifiedListener("listener-80-1", func(l *Listener) { l.Source.AllowedRoutes = &gatewayv1.AllowedRoutes{ Namespaces: &gatewayv1.RouteNamespaces{ From: helpers.GetPointer(gatewayv1.NamespacesFromAll),