func getAllowedKinds()

in pkg/providers/gateway/translation/gateway.go [155:208]


func getAllowedKinds(listener gatewayv1beta1.Listener) ([]gatewayv1beta1.RouteGroupKind, error) {
	var expectedKinds []gatewayv1beta1.RouteGroupKind
	group := gatewayv1beta1.Group(gatewayv1beta1.GroupName)

	var kind gatewayv1beta1.Kind
	switch listener.Protocol {
	case gatewayv1beta1.HTTPProtocolType, gatewayv1beta1.HTTPSProtocolType:
		kind = types.KindHTTPRoute
	case gatewayv1beta1.TLSProtocolType:
		kind = types.KindTLSRoute
	case gatewayv1beta1.TCPProtocolType:
		kind = types.KindTCPRoute
	case gatewayv1beta1.UDPProtocolType:
		kind = types.KindUDPRoute
	default:
		// TODO: If an implementation does not support or recognize this resource type,
		// it MUST set the “ResolvedRefs” condition to False for this Listener with
		// the “InvalidRouteKinds” reason.
		return nil, errors.New("unknown protocol " + string(listener.Protocol))
	}

	expectedKinds = []gatewayv1beta1.RouteGroupKind{
		{
			Group: &group,
			Kind:  kind,
		},
	}

	if listener.AllowedRoutes == nil || len(listener.AllowedRoutes.Kinds) == 0 {
		return expectedKinds, nil
	}

	uniqueAllowedKinds := make(map[gatewayv1beta1.Kind]struct{})
	var allowedKinds []gatewayv1beta1.RouteGroupKind

	for _, kind := range listener.AllowedRoutes.Kinds {
		expected := false
		for _, expectedKind := range expectedKinds {
			if kind.Kind == expectedKind.Kind &&
				kind.Group != nil && *kind.Group == *expectedKind.Group {
				expected = true
				break
			}
		}
		if expected {
			if _, ok := uniqueAllowedKinds[kind.Kind]; !ok {
				uniqueAllowedKinds[kind.Kind] = struct{}{}
				allowedKinds = append(allowedKinds, kind)
			}
		}
	}

	return allowedKinds, nil
}