1
18
19 package resolver_test
20
21 import (
22 "context"
23 "testing"
24
25 "github.com/envoyproxy/go-control-plane/pkg/wellknown"
26 "github.com/google/uuid"
27 "google.golang.org/grpc/internal/testutils"
28 "google.golang.org/grpc/internal/testutils/xds/e2e"
29 "google.golang.org/grpc/resolver"
30 "google.golang.org/protobuf/types/known/wrapperspb"
31
32 v3listenerpb "github.com/envoyproxy/go-control-plane/envoy/config/listener/v3"
33 v3routepb "github.com/envoyproxy/go-control-plane/envoy/config/route/v3"
34 v3routerpb "github.com/envoyproxy/go-control-plane/envoy/extensions/filters/http/router/v3"
35 v3httppb "github.com/envoyproxy/go-control-plane/envoy/extensions/filters/network/http_connection_manager/v3"
36 )
37
38
39
40
41
42
43
44 func (s) TestServiceWatch_ListenerPointsToNewRouteConfiguration(t *testing.T) {
45
46 ctx, cancel := context.WithTimeout(context.Background(), defaultTestTimeout)
47 defer cancel()
48 nodeID := uuid.New().String()
49 mgmtServer, lisCh, routeCfgCh := setupManagementServerForTest(ctx, t, nodeID)
50
51
52 listeners := []*v3listenerpb.Listener{e2e.DefaultClientListener(defaultTestServiceName, defaultTestRouteConfigName)}
53 routes := []*v3routepb.RouteConfiguration{e2e.DefaultRouteConfig(defaultTestRouteConfigName, defaultTestServiceName, defaultTestClusterName)}
54 configureResourcesOnManagementServer(ctx, t, mgmtServer, nodeID, listeners, routes)
55
56 stateCh, _, _ := buildResolverForTarget(t, resolver.Target{URL: *testutils.MustParseURL("xds:///" + defaultTestServiceName)})
57
58
59 waitForResourceNames(ctx, t, lisCh, []string{defaultTestServiceName})
60 waitForResourceNames(ctx, t, routeCfgCh, []string{defaultTestRouteConfigName})
61 verifyUpdateFromResolver(ctx, t, stateCh, wantDefaultServiceConfig)
62
63
64
65 newTestRouteConfigName := defaultTestRouteConfigName + "-new"
66 listeners = []*v3listenerpb.Listener{e2e.DefaultClientListener(defaultTestServiceName, newTestRouteConfigName)}
67 configureResourcesOnManagementServer(ctx, t, mgmtServer, nodeID, listeners, routes)
68
69
70 waitForResourceNames(ctx, t, routeCfgCh, []string{newTestRouteConfigName})
71
72
73 routes[0].VirtualHosts[0].Routes = append(routes[0].VirtualHosts[0].Routes, &v3routepb.Route{
74 Match: &v3routepb.RouteMatch{
75 PathSpecifier: &v3routepb.RouteMatch_Prefix{Prefix: "/foo/bar"},
76 CaseSensitive: &wrapperspb.BoolValue{Value: false},
77 },
78 Action: &v3routepb.Route_Route{
79 Route: &v3routepb.RouteAction{
80 ClusterSpecifier: &v3routepb.RouteAction_Cluster{Cluster: "some-random-cluster"},
81 },
82 },
83 })
84 configureResourcesOnManagementServer(ctx, t, mgmtServer, nodeID, listeners, routes)
85
86
87 verifyNoUpdateFromResolver(ctx, t, stateCh)
88
89
90 routes = append(routes, e2e.DefaultRouteConfig(newTestRouteConfigName, defaultTestServiceName, defaultTestClusterName))
91 configureResourcesOnManagementServer(ctx, t, mgmtServer, nodeID, listeners, routes)
92
93
94 verifyUpdateFromResolver(ctx, t, stateCh, wantDefaultServiceConfig)
95 }
96
97
98
99
100
101 func (s) TestServiceWatch_ListenerPointsToInlineRouteConfiguration(t *testing.T) {
102
103 ctx, cancel := context.WithTimeout(context.Background(), defaultTestTimeout)
104 defer cancel()
105 nodeID := uuid.New().String()
106 mgmtServer, lisCh, routeCfgCh := setupManagementServerForTest(ctx, t, nodeID)
107
108
109 listeners := []*v3listenerpb.Listener{e2e.DefaultClientListener(defaultTestServiceName, defaultTestRouteConfigName)}
110 routes := []*v3routepb.RouteConfiguration{e2e.DefaultRouteConfig(defaultTestRouteConfigName, defaultTestServiceName, defaultTestClusterName)}
111 configureResourcesOnManagementServer(ctx, t, mgmtServer, nodeID, listeners, routes)
112
113 stateCh, _, _ := buildResolverForTarget(t, resolver.Target{URL: *testutils.MustParseURL("xds:///" + defaultTestServiceName)})
114
115
116 waitForResourceNames(ctx, t, lisCh, []string{defaultTestServiceName})
117 waitForResourceNames(ctx, t, routeCfgCh, []string{defaultTestRouteConfigName})
118 verifyUpdateFromResolver(ctx, t, stateCh, wantDefaultServiceConfig)
119
120
121 hcm := testutils.MarshalAny(t, &v3httppb.HttpConnectionManager{
122 RouteSpecifier: &v3httppb.HttpConnectionManager_RouteConfig{
123 RouteConfig: &v3routepb.RouteConfiguration{
124 Name: defaultTestRouteConfigName,
125 VirtualHosts: []*v3routepb.VirtualHost{{
126 Domains: []string{defaultTestServiceName},
127 Routes: []*v3routepb.Route{{
128 Match: &v3routepb.RouteMatch{
129 PathSpecifier: &v3routepb.RouteMatch_Prefix{Prefix: "/"},
130 },
131 Action: &v3routepb.Route_Route{
132 Route: &v3routepb.RouteAction{
133 ClusterSpecifier: &v3routepb.RouteAction_Cluster{Cluster: defaultTestClusterName},
134 },
135 },
136 }},
137 }},
138 },
139 },
140 HttpFilters: []*v3httppb.HttpFilter{e2e.HTTPFilter("router", &v3routerpb.Router{})},
141 })
142 listeners = []*v3listenerpb.Listener{{
143 Name: defaultTestServiceName,
144 ApiListener: &v3listenerpb.ApiListener{ApiListener: hcm},
145 FilterChains: []*v3listenerpb.FilterChain{{
146 Name: "filter-chain-name",
147 Filters: []*v3listenerpb.Filter{{
148 Name: wellknown.HTTPConnectionManager,
149 ConfigType: &v3listenerpb.Filter_TypedConfig{TypedConfig: hcm},
150 }},
151 }},
152 }}
153 configureResourcesOnManagementServer(ctx, t, mgmtServer, nodeID, listeners, nil)
154
155
156 waitForResourceNames(ctx, t, routeCfgCh, []string{})
157 verifyUpdateFromResolver(ctx, t, stateCh, wantDefaultServiceConfig)
158
159
160 listeners = []*v3listenerpb.Listener{e2e.DefaultClientListener(defaultTestServiceName, defaultTestRouteConfigName)}
161 configureResourcesOnManagementServer(ctx, t, mgmtServer, nodeID, listeners, routes)
162
163
164 waitForResourceNames(ctx, t, routeCfgCh, []string{defaultTestRouteConfigName})
165
166
167 verifyUpdateFromResolver(ctx, t, stateCh, wantDefaultServiceConfig)
168 }
169
View as plain text