Support GRPC routes
Co-authored-by: Romain <rtribotte@users.noreply.github.com>
This commit is contained in:
parent
6b3167d03e
commit
5ed972ccd8
15 changed files with 18758 additions and 10695 deletions
227
pkg/provider/kubernetes/gateway/grpcroute_test.go
Normal file
227
pkg/provider/kubernetes/gateway/grpcroute_test.go
Normal file
|
@ -0,0 +1,227 @@
|
|||
package gateway
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"k8s.io/utils/ptr"
|
||||
gatev1 "sigs.k8s.io/gateway-api/apis/v1"
|
||||
)
|
||||
|
||||
func Test_buildGRPCMatchRule(t *testing.T) {
|
||||
testCases := []struct {
|
||||
desc string
|
||||
match gatev1.GRPCRouteMatch
|
||||
hostnames []gatev1.Hostname
|
||||
expectedRule string
|
||||
expectedPriority int
|
||||
expectedError bool
|
||||
}{
|
||||
{
|
||||
desc: "Empty rule and matches",
|
||||
expectedRule: "PathPrefix(`/`)",
|
||||
expectedPriority: 15,
|
||||
},
|
||||
{
|
||||
desc: "One Host rule without match",
|
||||
hostnames: []gatev1.Hostname{"foo.com"},
|
||||
expectedRule: "Host(`foo.com`) && PathPrefix(`/`)",
|
||||
expectedPriority: 22,
|
||||
},
|
||||
{
|
||||
desc: "One GRPCRouteMatch with no GRPCHeaderMatch",
|
||||
match: gatev1.GRPCRouteMatch{
|
||||
Method: &gatev1.GRPCMethodMatch{
|
||||
Type: ptr.To(gatev1.GRPCMethodMatchExact),
|
||||
Service: ptr.To("foo"),
|
||||
Method: ptr.To("bar"),
|
||||
},
|
||||
},
|
||||
expectedRule: "PathRegexp(`/foo/bar`)",
|
||||
expectedPriority: 22,
|
||||
},
|
||||
{
|
||||
desc: "One GRPCRouteMatch with one GRPCHeaderMatch",
|
||||
match: gatev1.GRPCRouteMatch{
|
||||
Method: &gatev1.GRPCMethodMatch{
|
||||
Type: ptr.To(gatev1.GRPCMethodMatchExact),
|
||||
Service: ptr.To("foo"),
|
||||
Method: ptr.To("bar"),
|
||||
},
|
||||
Headers: []gatev1.GRPCHeaderMatch{
|
||||
{
|
||||
Type: ptr.To(gatev1.HeaderMatchExact),
|
||||
Name: "foo",
|
||||
Value: "bar",
|
||||
},
|
||||
},
|
||||
},
|
||||
expectedRule: "PathRegexp(`/foo/bar`) && Header(`foo`,`bar`)",
|
||||
expectedPriority: 45,
|
||||
},
|
||||
{
|
||||
desc: "One GRPCRouteMatch with one GRPCHeaderMatch and one Host",
|
||||
hostnames: []gatev1.Hostname{"foo.com"},
|
||||
match: gatev1.GRPCRouteMatch{
|
||||
Method: &gatev1.GRPCMethodMatch{
|
||||
Type: ptr.To(gatev1.GRPCMethodMatchExact),
|
||||
Service: ptr.To("foo"),
|
||||
Method: ptr.To("bar"),
|
||||
},
|
||||
Headers: []gatev1.GRPCHeaderMatch{
|
||||
{
|
||||
Type: ptr.To(gatev1.HeaderMatchExact),
|
||||
Name: "foo",
|
||||
Value: "bar",
|
||||
},
|
||||
},
|
||||
},
|
||||
expectedRule: "Host(`foo.com`) && PathRegexp(`/foo/bar`) && Header(`foo`,`bar`)",
|
||||
expectedPriority: 52,
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range testCases {
|
||||
t.Run(test.desc, func(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
rule, priority := buildGRPCMatchRule(test.hostnames, test.match)
|
||||
assert.Equal(t, test.expectedRule, rule)
|
||||
assert.Equal(t, test.expectedPriority, priority)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func Test_buildGRPCMethodRule(t *testing.T) {
|
||||
testCases := []struct {
|
||||
desc string
|
||||
method *gatev1.GRPCMethodMatch
|
||||
expectedRule string
|
||||
}{
|
||||
{
|
||||
desc: "Empty",
|
||||
expectedRule: "PathPrefix(`/`)",
|
||||
},
|
||||
{
|
||||
desc: "Exact service matching",
|
||||
method: &gatev1.GRPCMethodMatch{
|
||||
Type: ptr.To(gatev1.GRPCMethodMatchExact),
|
||||
Service: ptr.To("foo"),
|
||||
},
|
||||
expectedRule: "PathRegexp(`/foo/[^/]+`)",
|
||||
},
|
||||
{
|
||||
desc: "Exact method matching",
|
||||
method: &gatev1.GRPCMethodMatch{
|
||||
Type: ptr.To(gatev1.GRPCMethodMatchExact),
|
||||
Method: ptr.To("bar"),
|
||||
},
|
||||
expectedRule: "PathRegexp(`/[^/]+/bar`)",
|
||||
},
|
||||
{
|
||||
desc: "Exact service and method matching",
|
||||
method: &gatev1.GRPCMethodMatch{
|
||||
Type: ptr.To(gatev1.GRPCMethodMatchExact),
|
||||
Service: ptr.To("foo"),
|
||||
Method: ptr.To("bar"),
|
||||
},
|
||||
expectedRule: "PathRegexp(`/foo/bar`)",
|
||||
},
|
||||
{
|
||||
desc: "Regexp service matching",
|
||||
method: &gatev1.GRPCMethodMatch{
|
||||
Type: ptr.To(gatev1.GRPCMethodMatchRegularExpression),
|
||||
Service: ptr.To("[^1-9/]"),
|
||||
},
|
||||
expectedRule: "PathRegexp(`/[^1-9/]/[^/]+`)",
|
||||
},
|
||||
{
|
||||
desc: "Regexp method matching",
|
||||
method: &gatev1.GRPCMethodMatch{
|
||||
Type: ptr.To(gatev1.GRPCMethodMatchRegularExpression),
|
||||
Method: ptr.To("[^1-9/]"),
|
||||
},
|
||||
expectedRule: "PathRegexp(`/[^/]+/[^1-9/]`)",
|
||||
},
|
||||
{
|
||||
desc: "Regexp service and method matching",
|
||||
method: &gatev1.GRPCMethodMatch{
|
||||
Type: ptr.To(gatev1.GRPCMethodMatchRegularExpression),
|
||||
Service: ptr.To("[^1-9/]"),
|
||||
Method: ptr.To("[^1-9/]"),
|
||||
},
|
||||
expectedRule: "PathRegexp(`/[^1-9/]/[^1-9/]`)",
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range testCases {
|
||||
t.Run(test.desc, func(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
rule := buildGRPCMethodRule(test.method)
|
||||
assert.Equal(t, test.expectedRule, rule)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func Test_buildGRPCHeaderRules(t *testing.T) {
|
||||
testCases := []struct {
|
||||
desc string
|
||||
headers []gatev1.GRPCHeaderMatch
|
||||
expectedRules []string
|
||||
}{
|
||||
{
|
||||
desc: "Empty",
|
||||
},
|
||||
{
|
||||
desc: "One exact match type",
|
||||
headers: []gatev1.GRPCHeaderMatch{
|
||||
{
|
||||
Type: ptr.To(gatev1.HeaderMatchExact),
|
||||
Name: "foo",
|
||||
Value: "bar",
|
||||
},
|
||||
},
|
||||
expectedRules: []string{"Header(`foo`,`bar`)"},
|
||||
},
|
||||
{
|
||||
desc: "One regexp match type",
|
||||
headers: []gatev1.GRPCHeaderMatch{
|
||||
{
|
||||
Type: ptr.To(gatev1.HeaderMatchRegularExpression),
|
||||
Name: "foo",
|
||||
Value: ".*",
|
||||
},
|
||||
},
|
||||
expectedRules: []string{"HeaderRegexp(`foo`,`.*`)"},
|
||||
},
|
||||
{
|
||||
desc: "One exact and regexp match type",
|
||||
headers: []gatev1.GRPCHeaderMatch{
|
||||
{
|
||||
Type: ptr.To(gatev1.HeaderMatchExact),
|
||||
Name: "foo",
|
||||
Value: "bar",
|
||||
},
|
||||
{
|
||||
Type: ptr.To(gatev1.HeaderMatchRegularExpression),
|
||||
Name: "foo",
|
||||
Value: ".*",
|
||||
},
|
||||
},
|
||||
expectedRules: []string{
|
||||
"Header(`foo`,`bar`)",
|
||||
"HeaderRegexp(`foo`,`.*`)",
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range testCases {
|
||||
t.Run(test.desc, func(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
rule := buildGRPCHeaderRules(test.headers)
|
||||
assert.Equal(t, test.expectedRules, rule)
|
||||
})
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue