Skip to content

Commit 7a50e0f

Browse files
committed
xds: update isolatedResourceUpdates test to directly send unsolicited ADS response
Add sendDiscoveryResponse to XdsTestControlPlaneService and update isolatedResourceUpdates test in XdsClientFederationTest to directly send an unsolicited cross-authority ADS response on the wire, properly exercising the control plane isolation check in XdsClientImpl. TAG=agy CONV=e27e4459-da3e-4c14-b2a1-2055f0b9b5d1
1 parent aee3ca9 commit 7a50e0f

2 files changed

Lines changed: 39 additions & 10 deletions

File tree

‎xds/src/test/java/io/grpc/xds/XdsClientFederationTest.java‎

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@
2626

2727
import com.google.common.collect.ImmutableList;
2828
import com.google.common.collect.ImmutableMap;
29+
import com.google.protobuf.Any;
2930
import io.envoyproxy.envoy.config.listener.v3.Listener;
31+
import io.envoyproxy.envoy.service.discovery.v3.DiscoveryResponse;
3032
import io.grpc.MetricRecorder;
3133
import io.grpc.Status;
3234
import io.grpc.StatusOr;
@@ -149,22 +151,34 @@ public void isolatedResourceDeletions() {
149151
*/
150152
@Test
151153
public void isolatedResourceUpdates() {
152-
Listener serverListener = ControlPlaneRule.buildServerListener();
153-
Listener clientListener1 = ControlPlaneRule.buildClientListener("test-server");
154-
Listener clientListener2 = ControlPlaneRule.buildClientListener(
155-
"xdstp://server-one/envoy.config.listener.v3.Listener/test-server");
156-
// trafficdirector (top-level server) erroneously sends a listener owned by server-one.
157-
trafficdirector.getService().setXdsConfig(XdsTestControlPlaneService.ADS_TYPE_URL_LDS,
158-
ImmutableMap.of(
159-
serverListener.getName(), serverListener,
160-
clientListener1.getName(), clientListener1,
161-
clientListener2.getName(), clientListener2));
154+
trafficdirector.setLdsConfig(ControlPlaneRule.buildServerListener(),
155+
ControlPlaneRule.buildClientListener("test-server"));
162156

163157
xdsClient.watchXdsResource(XdsListenerResource.getInstance(), "test-server", mockWatcher);
164158
xdsClient.watchXdsResource(XdsListenerResource.getInstance(),
165159
"xdstp://server-one/envoy.config.listener.v3.Listener/test-server", mockDirectPathWatcher);
166160

167161
verify(mockWatcher, timeout(10000)).onResourceChanged(any());
162+
163+
// trafficdirector (top-level server) erroneously sends a response containing both an update
164+
// for test-server and a listener owned by server-one.
165+
Listener alienListener = ControlPlaneRule.buildClientListener(
166+
"xdstp://server-one/envoy.config.listener.v3.Listener/test-server");
167+
Listener updatedClientListener = ControlPlaneRule.buildClientListener("test-server",
168+
"new-route-config.googleapis.com");
169+
DiscoveryResponse rogueResponse = DiscoveryResponse.newBuilder()
170+
.setTypeUrl(XdsTestControlPlaneService.ADS_TYPE_URL_LDS)
171+
.setVersionInfo("rogue-version-1")
172+
.setNonce("rogue-nonce-1")
173+
.addResources(Any.pack(updatedClientListener))
174+
.addResources(Any.pack(alienListener))
175+
.build();
176+
trafficdirector.getService().sendDiscoveryResponse(rogueResponse);
177+
178+
// Confirm that trafficdirector's second response was processed by waiting for mockWatcher
179+
// to receive the updated test-server config.
180+
verify(mockWatcher, timeout(10000).times(2)).onResourceChanged(any());
181+
168182
// mockDirectPathWatcher should not receive the update sent by trafficdirector.
169183
verify(mockDirectPathWatcher, never()).onResourceChanged(any());
170184

‎xds/src/test/java/io/grpc/xds/XdsTestControlPlaneService.java‎

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,21 @@ public void run() {
119119
});
120120
}
121121

122+
/**
123+
* Directly sends the given DiscoveryResponse to all active subscribers of the response's type.
124+
*/
125+
public void sendDiscoveryResponse(DiscoveryResponse response) {
126+
syncContext.execute(new Runnable() {
127+
@Override
128+
public void run() {
129+
for (StreamObserver<DiscoveryResponse> observer :
130+
subscribers.get(response.getTypeUrl()).keySet()) {
131+
observer.onNext(response);
132+
}
133+
}
134+
});
135+
}
136+
122137
ImmutableMap<String, Message> getCurrentConfig(String type) {
123138
HashMap<String, Message> hashMap = xdsResources.get(type);
124139
return (hashMap != null) ? ImmutableMap.copyOf(hashMap) : ImmutableMap.of();

0 commit comments

Comments
 (0)