13
13
import io .envoyproxy .envoy .api .v2 .auth .Secret ;
14
14
import io .envoyproxy .envoy .api .v2 .core .Node ;
15
15
import java .util .Collections ;
16
+ import java .util .HashMap ;
16
17
import java .util .LinkedList ;
17
18
import java .util .Map ;
18
19
import java .util .UUID ;
@@ -165,25 +166,35 @@ public void successfullyWatchAllResourceTypesWithSetBeforeWatchWithRequestVersio
165
166
166
167
cache .setSnapshot (SingleNodeGroup .GROUP , SNAPSHOT1 );
167
168
168
- Map <String , WatchAndTracker > watches = Resources .TYPE_URLS .stream ()
169
- .collect (Collectors .toMap (
170
- typeUrl -> typeUrl ,
171
- typeUrl -> {
172
- ResponseTracker responseTracker = new ResponseTracker ();
173
-
174
- Watch watch = cache .createWatch (
175
- ADS ,
176
- DiscoveryRequest .newBuilder ()
177
- .setNode (Node .getDefaultInstance ())
178
- .setTypeUrl (typeUrl )
179
- .setVersionInfo (SNAPSHOT1 .version (typeUrl ))
180
- .addAllResourceNames (SNAPSHOT1 .resources (typeUrl ).keySet ())
181
- .build (),
182
- SNAPSHOT2 .resources (typeUrl ).keySet (),
183
- responseTracker );
184
-
185
- return new WatchAndTracker (watch , responseTracker );
186
- }));
169
+ ResponseOrderTracker responseOrderTracker = new ResponseOrderTracker ();
170
+
171
+ HashMap <String , WatchAndTracker > watches = new HashMap <>();
172
+
173
+ for (int i = 0 ; i < 2 ; ++i ) {
174
+ watches .putAll (Resources .TYPE_URLS .stream ()
175
+ .collect (Collectors .toMap (
176
+ typeUrl -> typeUrl ,
177
+ typeUrl -> {
178
+ ResponseTracker responseTracker = new ResponseTracker ();
179
+
180
+ Watch watch = cache .createWatch (
181
+ ADS ,
182
+ DiscoveryRequest .newBuilder ()
183
+ .setNode (Node .getDefaultInstance ())
184
+ .setTypeUrl (typeUrl )
185
+ .setVersionInfo (SNAPSHOT1 .version (typeUrl ))
186
+ .addAllResourceNames (SNAPSHOT1 .resources (typeUrl ).keySet ())
187
+ .build (),
188
+ SNAPSHOT2 .resources (typeUrl ).keySet (),
189
+ r -> {
190
+ responseTracker .accept (r );
191
+ responseOrderTracker .accept (r );
192
+ });
193
+
194
+ return new WatchAndTracker (watch , responseTracker );
195
+ }))
196
+ );
197
+ }
187
198
188
199
// The request version matches the current snapshot version, so the watches shouldn't receive any responses.
189
200
for (String typeUrl : Resources .TYPE_URLS ) {
@@ -195,6 +206,12 @@ public void successfullyWatchAllResourceTypesWithSetBeforeWatchWithRequestVersio
195
206
for (String typeUrl : Resources .TYPE_URLS ) {
196
207
assertThatWatchReceivesSnapshot (watches .get (typeUrl ), SNAPSHOT2 );
197
208
}
209
+
210
+ // Verify that CDS and LDS always get triggered before EDS and RDS respectively.
211
+ assertThat (responseOrderTracker .responseTypes ).containsExactly (Resources .CLUSTER_TYPE_URL ,
212
+ Resources .CLUSTER_TYPE_URL , Resources .ENDPOINT_TYPE_URL , Resources .ENDPOINT_TYPE_URL ,
213
+ Resources .LISTENER_TYPE_URL , Resources .LISTENER_TYPE_URL , Resources .ROUTE_TYPE_URL ,
214
+ Resources .ROUTE_TYPE_URL , Resources .SECRET_TYPE_URL , Resources .SECRET_TYPE_URL );
198
215
}
199
216
200
217
@ Test
@@ -457,6 +474,16 @@ private static class ResponseTracker implements Consumer<Response> {
457
474
public void accept (Response response ) {
458
475
responses .add (response );
459
476
}
477
+
478
+ }
479
+
480
+ private static class ResponseOrderTracker implements Consumer <Response > {
481
+
482
+ private final LinkedList <String > responseTypes = new LinkedList <>();
483
+
484
+ @ Override public void accept (Response response ) {
485
+ responseTypes .add (response .request ().getTypeUrl ());
486
+ }
460
487
}
461
488
462
489
private static class SingleNodeGroup implements NodeGroup <String > {
0 commit comments