Skip to content

Commit fa246ef

Browse files
xds/resolver: change tests to update all resources (#8539)
Change the tests in xds resolver to update all resources in management server instead of only listener and route resource. This change is being done as part of gRFC [A74 : xDS Config tears](https://github.com/grpc/proposal/blob/master/A74-xds-config-tears.md). This is to make sure the tests pass after the change too. RELEASE NOTES: None
1 parent 3074bcd commit fa246ef

File tree

3 files changed

+156
-60
lines changed

3 files changed

+156
-60
lines changed

internal/xds/resolver/helpers_test.go

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ import (
4040
"google.golang.org/grpc/serviceconfig"
4141
"google.golang.org/grpc/status"
4242

43+
v3clusterpb "github.com/envoyproxy/go-control-plane/envoy/config/cluster/v3"
44+
v3endpointpb "github.com/envoyproxy/go-control-plane/envoy/config/endpoint/v3"
4345
v3listenerpb "github.com/envoyproxy/go-control-plane/envoy/config/listener/v3"
4446
v3routepb "github.com/envoyproxy/go-control-plane/envoy/config/route/v3"
4547
v3discoverypb "github.com/envoyproxy/go-control-plane/envoy/service/discovery/v3"
@@ -60,11 +62,17 @@ const (
6062
defaultTestServiceName = "service-name"
6163
defaultTestRouteConfigName = "route-config-name"
6264
defaultTestClusterName = "cluster-name"
65+
defaultTestEndpointName = "endpoint-name"
66+
defaultTestHostname = "test-host"
6367
)
6468

65-
// This is the expected service config when using default listener and route
66-
// configuration resources from the e2e package using the above resource names.
67-
var wantDefaultServiceConfig = fmt.Sprintf(`{
69+
var defaultTestPort = []uint32{8080}
70+
71+
// wantServiceConfig returns a JSON representation of a service config with
72+
// xds_cluster_manager_experimental LB policy with a child policy of
73+
// cds_experimental for the provided cluster name.
74+
func wantServiceConfig(clusterName string) string {
75+
return fmt.Sprintf(`{
6876
"loadBalancingConfig": [{
6977
"xds_cluster_manager_experimental": {
7078
"children": {
@@ -78,7 +86,8 @@ var wantDefaultServiceConfig = fmt.Sprintf(`{
7886
}
7987
}
8088
}]
81-
}`, defaultTestClusterName, defaultTestClusterName)
89+
}`, clusterName, clusterName)
90+
}
8291

8392
// buildResolverForTarget builds an xDS resolver for the given target. If
8493
// the bootstrap contents are provided, it build the xDS resolver using them
@@ -283,6 +292,21 @@ func configureResourcesOnManagementServer(ctx context.Context, t *testing.T, mgm
283292
}
284293
}
285294

295+
// Updates all the listener, route, cluster and endpoint configuration resources
296+
// on the given management server.
297+
func configureAllResourcesOnManagementServer(ctx context.Context, t *testing.T, mgmtServer *e2e.ManagementServer, nodeID string, listeners []*v3listenerpb.Listener, routes []*v3routepb.RouteConfiguration, clusters []*v3clusterpb.Cluster, endpoints []*v3endpointpb.ClusterLoadAssignment) {
298+
resources := e2e.UpdateOptions{
299+
NodeID: nodeID,
300+
Listeners: listeners,
301+
Routes: routes,
302+
Clusters: clusters,
303+
Endpoints: endpoints,
304+
}
305+
if err := mgmtServer.Update(ctx, resources); err != nil {
306+
t.Fatal(err)
307+
}
308+
}
309+
286310
// waitForResourceNames waits for the wantNames to be pushed on to namesCh.
287311
// Fails the test by calling t.Fatal if the context expires before that.
288312
func waitForResourceNames(ctx context.Context, t *testing.T, namesCh chan []string, wantNames []string) {

internal/xds/resolver/watch_service_test.go

Lines changed: 40 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -49,28 +49,35 @@ func (s) TestServiceWatch_ListenerPointsToNewRouteConfiguration(t *testing.T) {
4949
mgmtServer, lisCh, routeCfgCh, bc := setupManagementServerForTest(t, nodeID)
5050

5151
// Configure resources on the management server.
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)
52+
resources := e2e.DefaultClientResources(e2e.ResourceParams{
53+
DialTarget: defaultTestServiceName,
54+
NodeID: nodeID,
55+
Host: defaultTestHostname,
56+
Port: defaultTestPort[0],
57+
SecLevel: e2e.SecurityLevelNone,
58+
})
59+
if err := mgmtServer.Update(ctx, resources); err != nil {
60+
t.Fatal(err)
61+
}
5562

5663
stateCh, _, _ := buildResolverForTarget(t, resolver.Target{URL: *testutils.MustParseURL("xds:///" + defaultTestServiceName)}, bc)
5764

5865
// Verify initial update from the resolver.
5966
waitForResourceNames(ctx, t, lisCh, []string{defaultTestServiceName})
60-
waitForResourceNames(ctx, t, routeCfgCh, []string{defaultTestRouteConfigName})
61-
verifyUpdateFromResolver(ctx, t, stateCh, wantDefaultServiceConfig)
67+
waitForResourceNames(ctx, t, routeCfgCh, []string{resources.Routes[0].Name})
68+
verifyUpdateFromResolver(ctx, t, stateCh, wantServiceConfig(resources.Clusters[0].Name))
6269

6370
// Update the listener resource to point to a new route configuration name.
6471
// Leave the old route configuration resource unchanged.
6572
newTestRouteConfigName := defaultTestRouteConfigName + "-new"
66-
listeners = []*v3listenerpb.Listener{e2e.DefaultClientListener(defaultTestServiceName, newTestRouteConfigName)}
67-
configureResourcesOnManagementServer(ctx, t, mgmtServer, nodeID, listeners, routes)
73+
resources.Listeners = []*v3listenerpb.Listener{e2e.DefaultClientListener(defaultTestServiceName, newTestRouteConfigName)}
74+
configureResourcesOnManagementServer(ctx, t, mgmtServer, nodeID, resources.Listeners, resources.Routes)
6875

6976
// Verify that the new route configuration resource is requested.
7077
waitForResourceNames(ctx, t, routeCfgCh, []string{newTestRouteConfigName})
7178

7279
// Update the old route configuration resource by adding a new route.
73-
routes[0].VirtualHosts[0].Routes = append(routes[0].VirtualHosts[0].Routes, &v3routepb.Route{
80+
resources.Routes[0].VirtualHosts[0].Routes = append(resources.Routes[0].VirtualHosts[0].Routes, &v3routepb.Route{
7481
Match: &v3routepb.RouteMatch{
7582
PathSpecifier: &v3routepb.RouteMatch_Prefix{Prefix: "/foo/bar"},
7683
CaseSensitive: &wrapperspb.BoolValue{Value: false},
@@ -81,17 +88,17 @@ func (s) TestServiceWatch_ListenerPointsToNewRouteConfiguration(t *testing.T) {
8188
},
8289
},
8390
})
84-
configureResourcesOnManagementServer(ctx, t, mgmtServer, nodeID, listeners, routes)
91+
configureResourcesOnManagementServer(ctx, t, mgmtServer, nodeID, resources.Listeners, resources.Routes)
8592

8693
// Wait for no update from the resolver.
8794
verifyNoUpdateFromResolver(ctx, t, stateCh)
8895

8996
// Update the management server with the new route configuration resource.
90-
routes = append(routes, e2e.DefaultRouteConfig(newTestRouteConfigName, defaultTestServiceName, defaultTestClusterName))
91-
configureResourcesOnManagementServer(ctx, t, mgmtServer, nodeID, listeners, routes)
97+
resources.Routes = append(resources.Routes, e2e.DefaultRouteConfig(newTestRouteConfigName, defaultTestServiceName, resources.Clusters[0].Name))
98+
configureResourcesOnManagementServer(ctx, t, mgmtServer, nodeID, resources.Listeners, resources.Routes)
9299

93100
// Ensure update from the resolver.
94-
verifyUpdateFromResolver(ctx, t, stateCh, wantDefaultServiceConfig)
101+
verifyUpdateFromResolver(ctx, t, stateCh, wantServiceConfig(resources.Clusters[0].Name))
95102
}
96103

97104
// Tests the case where the listener resource changes to contain an inline route
@@ -106,22 +113,28 @@ func (s) TestServiceWatch_ListenerPointsToInlineRouteConfiguration(t *testing.T)
106113
mgmtServer, lisCh, routeCfgCh, bc := setupManagementServerForTest(t, nodeID)
107114

108115
// Configure resources on the management server.
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-
116+
resources := e2e.DefaultClientResources(e2e.ResourceParams{
117+
DialTarget: defaultTestServiceName,
118+
NodeID: nodeID,
119+
Host: defaultTestHostname,
120+
Port: defaultTestPort[0],
121+
SecLevel: e2e.SecurityLevelNone,
122+
})
123+
if err := mgmtServer.Update(ctx, resources); err != nil {
124+
t.Fatal(err)
125+
}
113126
stateCh, _, _ := buildResolverForTarget(t, resolver.Target{URL: *testutils.MustParseURL("xds:///" + defaultTestServiceName)}, bc)
114127

115128
// Verify initial update from the resolver.
116129
waitForResourceNames(ctx, t, lisCh, []string{defaultTestServiceName})
117-
waitForResourceNames(ctx, t, routeCfgCh, []string{defaultTestRouteConfigName})
118-
verifyUpdateFromResolver(ctx, t, stateCh, wantDefaultServiceConfig)
130+
waitForResourceNames(ctx, t, routeCfgCh, []string{resources.Routes[0].Name})
131+
verifyUpdateFromResolver(ctx, t, stateCh, wantServiceConfig(resources.Clusters[0].Name))
119132

120133
// Update listener to contain an inline route configuration.
121134
hcm := testutils.MarshalAny(t, &v3httppb.HttpConnectionManager{
122135
RouteSpecifier: &v3httppb.HttpConnectionManager_RouteConfig{
123136
RouteConfig: &v3routepb.RouteConfiguration{
124-
Name: defaultTestRouteConfigName,
137+
Name: resources.Routes[0].Name,
125138
VirtualHosts: []*v3routepb.VirtualHost{{
126139
Domains: []string{defaultTestServiceName},
127140
Routes: []*v3routepb.Route{{
@@ -130,7 +143,7 @@ func (s) TestServiceWatch_ListenerPointsToInlineRouteConfiguration(t *testing.T)
130143
},
131144
Action: &v3routepb.Route_Route{
132145
Route: &v3routepb.RouteAction{
133-
ClusterSpecifier: &v3routepb.RouteAction_Cluster{Cluster: defaultTestClusterName},
146+
ClusterSpecifier: &v3routepb.RouteAction_Cluster{Cluster: resources.Clusters[0].Name},
134147
},
135148
},
136149
}},
@@ -139,7 +152,7 @@ func (s) TestServiceWatch_ListenerPointsToInlineRouteConfiguration(t *testing.T)
139152
},
140153
HttpFilters: []*v3httppb.HttpFilter{e2e.HTTPFilter("router", &v3routerpb.Router{})},
141154
})
142-
listeners = []*v3listenerpb.Listener{{
155+
resources.Listeners = []*v3listenerpb.Listener{{
143156
Name: defaultTestServiceName,
144157
ApiListener: &v3listenerpb.ApiListener{ApiListener: hcm},
145158
FilterChains: []*v3listenerpb.FilterChain{{
@@ -150,19 +163,19 @@ func (s) TestServiceWatch_ListenerPointsToInlineRouteConfiguration(t *testing.T)
150163
}},
151164
}},
152165
}}
153-
configureResourcesOnManagementServer(ctx, t, mgmtServer, nodeID, listeners, nil)
166+
configureResourcesOnManagementServer(ctx, t, mgmtServer, nodeID, resources.Listeners, nil)
154167

155168
// Verify that the old route configuration is not requested anymore.
156169
waitForResourceNames(ctx, t, routeCfgCh, []string{})
157-
verifyUpdateFromResolver(ctx, t, stateCh, wantDefaultServiceConfig)
170+
verifyUpdateFromResolver(ctx, t, stateCh, wantServiceConfig(resources.Clusters[0].Name))
158171

159172
// Update listener back to contain a route configuration name.
160-
listeners = []*v3listenerpb.Listener{e2e.DefaultClientListener(defaultTestServiceName, defaultTestRouteConfigName)}
161-
configureResourcesOnManagementServer(ctx, t, mgmtServer, nodeID, listeners, routes)
173+
resources.Listeners = []*v3listenerpb.Listener{e2e.DefaultClientListener(defaultTestServiceName, resources.Routes[0].Name)}
174+
configureResourcesOnManagementServer(ctx, t, mgmtServer, nodeID, resources.Listeners, resources.Routes)
162175

163176
// Verify that that route configuration resource is requested.
164-
waitForResourceNames(ctx, t, routeCfgCh, []string{defaultTestRouteConfigName})
177+
waitForResourceNames(ctx, t, routeCfgCh, []string{resources.Routes[0].Name})
165178

166179
// Verify that appropriate SC is pushed on the channel.
167-
verifyUpdateFromResolver(ctx, t, stateCh, wantDefaultServiceConfig)
180+
verifyUpdateFromResolver(ctx, t, stateCh, wantServiceConfig(resources.Clusters[0].Name))
168181
}

0 commit comments

Comments
 (0)