60
60
import io .grpc .SynchronizationContext ;
61
61
import io .grpc .internal .ExponentialBackoffPolicy ;
62
62
import io .grpc .internal .GrpcUtil ;
63
- import io .grpc .internal .ObjectPool ;
64
63
import io .grpc .util .OutlierDetectionLoadBalancer .OutlierDetectionLoadBalancerConfig ;
65
64
import io .grpc .xds .CdsLoadBalancer2 .ClusterResolverConfig ;
66
65
import io .grpc .xds .CdsLoadBalancer2 .ClusterResolverConfig .DiscoveryMechanism ;
92
91
import java .util .HashMap ;
93
92
import java .util .List ;
94
93
import java .util .Map ;
94
+ import java .util .Objects ;
95
95
import java .util .concurrent .Executor ;
96
96
import java .util .stream .Collectors ;
97
97
import javax .annotation .Nullable ;
@@ -274,7 +274,8 @@ public void basicTest() throws XdsResourceType.ResourceInvalidException {
274
274
}
275
275
276
276
@ Test
277
- //TODO: Code looks broken creating a second LB instead of updating the existing one or shutting it down
277
+ //TODO: Code looks broken creating a second LB instead of updating the existing one or shutting
278
+ // it down
278
279
public void discoverTopLevelEdsCluster () {
279
280
configWatcher .watchCluster (CLUSTER );
280
281
CdsUpdate update =
@@ -284,33 +285,26 @@ public void discoverTopLevelEdsCluster() {
284
285
xdsClient .deliverCdsUpdate (CLUSTER , update );
285
286
assertThat (childBalancers ).hasSize (1 );
286
287
287
- validateClusterImplConfig (getClusterImplConfig (childBalancers , CLUSTER ), CLUSTER , EDS_SERVICE_NAME ,
288
- null , LRS_SERVER_INFO , 100L , upstreamTlsContext , outlierDetection );
288
+ validateClusterImplConfig (getConfigOfPriorityGrandChild (childBalancers , CLUSTER ), CLUSTER ,
289
+ EDS_SERVICE_NAME , null , LRS_SERVER_INFO , 100L , upstreamTlsContext , outlierDetection );
289
290
290
291
PriorityLbConfig .PriorityChildConfig priorityChildConfig =
291
292
getPriorityChildConfig (childBalancers , CLUSTER );
292
293
assertThat (getChildProvider (priorityChildConfig .childConfig )
293
294
.getPolicyName ()).isEqualTo ("round_robin" );
294
295
}
295
296
296
- private static ClusterImplConfig getClusterImplConfig (List <FakeLoadBalancer > childBalancers ,
297
- String cluster ) {
297
+ private static Object getConfigOfPriorityGrandChild (List <FakeLoadBalancer > childBalancers ,
298
+ String cluster ) {
298
299
PriorityLbConfig .PriorityChildConfig priorityChildConfig =
299
300
getPriorityChildConfig (childBalancers , cluster );
300
301
assertNotNull ("No cluster " + cluster + " in childBalancers" , priorityChildConfig );
301
302
Object clusterImplConfig = getChildConfig (priorityChildConfig .childConfig );
302
- if (clusterImplConfig instanceof ClusterImplConfig ) {
303
- return (ClusterImplConfig ) clusterImplConfig ;
304
- }
305
- if (clusterImplConfig instanceof OutlierDetectionLoadBalancerConfig ) {
306
- clusterImplConfig = getChildConfig (((OutlierDetectionLoadBalancerConfig ) clusterImplConfig ).childConfig );
307
- }
308
-
309
- assertThat (clusterImplConfig ).isInstanceOf (ClusterImplConfig .class );
310
- return (ClusterImplConfig ) clusterImplConfig ;
303
+ return clusterImplConfig ;
311
304
}
312
305
313
- private static PriorityLbConfig .PriorityChildConfig getPriorityChildConfig (List <FakeLoadBalancer > childBalancers , String cluster ) {
306
+ private static PriorityLbConfig .PriorityChildConfig
307
+ getPriorityChildConfig (List <FakeLoadBalancer > childBalancers , String cluster ) {
314
308
for (FakeLoadBalancer fakeLB : childBalancers ) {
315
309
if (fakeLB .config instanceof PriorityLbConfig ) {
316
310
Map <String , PriorityLbConfig .PriorityChildConfig > childConfigs =
@@ -523,17 +517,15 @@ public void aggregateCluster_descendantClustersRevoked() throws IOException {
523
517
xdsClient .deliverCdsUpdate (cluster2 , update2 );
524
518
xdsClient .createAndDeliverEdsUpdate (update1 .edsServiceName ());
525
519
526
- validateClusterImplConfig (getClusterImplConfig (childBalancers , cluster1 ), cluster1 ,
527
- EDS_SERVICE_NAME , null , LRS_SERVER_INFO , 200L ,
528
- upstreamTlsContext , outlierDetection );
529
- validateClusterImplConfig (getClusterImplConfig (childBalancers , cluster2 ), cluster2 ,
530
- null , DNS_HOST_NAME , LRS_SERVER_INFO , 100L , null ,
531
- null );
520
+ validateClusterImplConfig (getConfigOfPriorityGrandChild (childBalancers , cluster1 ), cluster1 ,
521
+ EDS_SERVICE_NAME , null , LRS_SERVER_INFO , 200L , upstreamTlsContext , outlierDetection );
522
+ validateClusterImplConfig (getConfigOfPriorityGrandChild (childBalancers , cluster2 ), cluster2 ,
523
+ null , DNS_HOST_NAME , LRS_SERVER_INFO , 100L , null , null );
532
524
533
525
// Revoke cluster1, should still be able to proceed with cluster2.
534
526
xdsClient .deliverResourceNotExist (cluster1 );
535
527
assertThat (xdsClient .watchers .keySet ()).containsExactly (CLUSTER , cluster1 , cluster2 );
536
- validateClusterImplConfig (getClusterImplConfig (childBalancers , CLUSTER ),
528
+ validateClusterImplConfig (getConfigOfPriorityGrandChild (childBalancers , CLUSTER ),
537
529
cluster2 , null , DNS_HOST_NAME , LRS_SERVER_INFO , 100L , null , null );
538
530
verify (helper , never ()).updateBalancingState (
539
531
eq (ConnectivityState .TRANSIENT_FAILURE ), any (SubchannelPicker .class ));
@@ -908,32 +900,95 @@ private static void assertPicker(SubchannelPicker picker, Status expectedStatus,
908
900
}
909
901
}
910
902
903
+ // TODO anything calling this needs to be updated to use validateClusterImplConfig
911
904
private static void validateDiscoveryMechanism (
912
905
DiscoveryMechanism instance , String name ,
913
906
@ Nullable String edsServiceName , @ Nullable String dnsHostName ,
914
907
@ Nullable ServerInfo lrsServerInfo , @ Nullable Long maxConcurrentRequests ,
915
908
@ Nullable UpstreamTlsContext tlsContext , @ Nullable OutlierDetection outlierDetection ) {
916
909
assertThat (instance .cluster ).isEqualTo (name );
917
910
assertThat (instance .edsServiceName ).isEqualTo (edsServiceName );
918
- // assertThat(instance.dnsHostName).isEqualTo(dnsHostName);
911
+ assertThat (instance .dnsHostName ).isEqualTo (dnsHostName );
919
912
assertThat (instance .lrsServerInfo ).isEqualTo (lrsServerInfo );
920
913
assertThat (instance .maxConcurrentRequests ).isEqualTo (maxConcurrentRequests );
921
914
assertThat (instance .tlsContext ).isEqualTo (tlsContext );
922
- // assertThat(instance.outlierDetection).isEqualTo(outlierDetection);
915
+ assertThat (instance .outlierDetection ).isEqualTo (outlierDetection );
916
+ }
917
+
918
+ private static boolean outlierDetectionEquals (OutlierDetection outlierDetection ,
919
+ OutlierDetectionLoadBalancerConfig oDLbConfig ) {
920
+ if (outlierDetection == null || oDLbConfig == null ) {
921
+ return true ;
922
+ }
923
+
924
+ OutlierDetectionLoadBalancerConfig defaultConfig =
925
+ new OutlierDetectionLoadBalancerConfig .Builder ().build ();
926
+ // split out for readability and debugging
927
+ Long expectedBaseEjectionTimeNanos = outlierDetection .baseEjectionTimeNanos () == null
928
+ ? outlierDetection .baseEjectionTimeNanos ()
929
+ : defaultConfig .baseEjectionTimeNanos ;
930
+
931
+ Long expectedIntervalNanos = outlierDetection .intervalNanos () == null
932
+ ? outlierDetection .intervalNanos ()
933
+ : defaultConfig .intervalNanos ;
934
+
935
+ OutlierDetectionLoadBalancerConfig .FailurePercentageEjection expectedFailurePercentageEjection =
936
+ outlierDetection .failurePercentageEjection () == null
937
+ ? outlierDetection .failurePercentageEjection ()
938
+ : defaultConfig .failurePercentageEjection ;
939
+
940
+ OutlierDetectionLoadBalancerConfig .SuccessRateEjection expectedSuccessRateEjection =
941
+ outlierDetection .successRateEjection () == null
942
+ ? outlierDetection .successRateEjection ()
943
+ : defaultConfig .successRateEjection ;
944
+
945
+ Long expectedMaxEjectionTimeNanos = outlierDetection .maxEjectionTimeNanos () == null
946
+ ? outlierDetection .maxEjectionTimeNanos ()
947
+ : defaultConfig .maxEjectionTimeNanos ;
948
+
949
+ Integer expectedMaxEjectionPercent = outlierDetection .maxEjectionPercent () == null
950
+ ? outlierDetection .maxEjectionPercent ()
951
+ : defaultConfig .maxEjectionPercent ;
952
+
953
+ boolean baseEjNanosEqual =
954
+ Objects .equals (expectedBaseEjectionTimeNanos , oDLbConfig .baseEjectionTimeNanos );
955
+ boolean intervalNanosEqual = Objects .equals (expectedIntervalNanos , oDLbConfig .intervalNanos );
956
+ boolean failurePctEqual = Objects .equals (expectedFailurePercentageEjection ,
957
+ oDLbConfig .failurePercentageEjection );
958
+ boolean successRateEjectEqual =
959
+ Objects .equals (expectedSuccessRateEjection , oDLbConfig .successRateEjection );
960
+ boolean maxEjectTimeEqual =
961
+ Objects .equals (expectedMaxEjectionTimeNanos , oDLbConfig .maxEjectionTimeNanos );
962
+ boolean maxEjectPctEqual =
963
+ Objects .equals (expectedMaxEjectionPercent , oDLbConfig .maxEjectionPercent );
964
+
965
+ return baseEjNanosEqual && intervalNanosEqual && failurePctEqual && successRateEjectEqual
966
+ && maxEjectTimeEqual && maxEjectPctEqual ;
923
967
}
924
968
925
969
private static void validateClusterImplConfig (
926
- ClusterImplConfig instance , String name ,
970
+ Object lbConfig , String name ,
927
971
@ Nullable String edsServiceName , @ Nullable String dnsHostName ,
928
972
@ Nullable ServerInfo lrsServerInfo , @ Nullable Long maxConcurrentRequests ,
929
973
@ Nullable UpstreamTlsContext tlsContext , @ Nullable OutlierDetection outlierDetection ) {
974
+ ClusterImplConfig instance ;
975
+
976
+ if (lbConfig instanceof OutlierDetectionLoadBalancerConfig ) {
977
+ instance = (ClusterImplConfig )
978
+ getChildConfig (((OutlierDetectionLoadBalancerConfig ) lbConfig ).childConfig );
979
+ assertThat (outlierDetectionEquals (outlierDetection ,
980
+ (OutlierDetectionLoadBalancerConfig ) lbConfig )).isTrue ();
981
+
982
+ } else {
983
+ instance = (ClusterImplConfig ) lbConfig ;
984
+ }
985
+
930
986
assertThat (instance .cluster ).isEqualTo (name );
931
987
assertThat (instance .edsServiceName ).isEqualTo (edsServiceName );
932
- // assertThat(instance.dnsHostName).isEqualTo(dnsHostName);
933
988
assertThat (instance .lrsServerInfo ).isEqualTo (lrsServerInfo );
934
989
assertThat (instance .maxConcurrentRequests ).isEqualTo (maxConcurrentRequests );
935
990
assertThat (instance .tlsContext ).isEqualTo (tlsContext );
936
- // assertThat( instance.outlierDetection).isEqualTo(outlierDetection);
991
+ // TODO look in instance.childConfig for dns
937
992
}
938
993
939
994
private final class FakeLoadBalancerProvider extends LoadBalancerProvider {
@@ -1216,8 +1271,23 @@ private List<EquivalentAddressGroup> buildEagsForCluster(
1216
1271
}
1217
1272
1218
1273
private Object buildLbConfig (XdsConfig xdsConfig ) {
1219
- // TODO build it for real
1220
- return new CdsConfig (CLUSTER );
1274
+ ImmutableMap <String , StatusOr <XdsConfig .XdsClusterConfig >> clusters = xdsConfig .getClusters ();
1275
+ if (clusters == null || clusters .isEmpty ()) {
1276
+ return null ;
1277
+ }
1278
+
1279
+ // find the aggregate in xdsConfig.getClusters()
1280
+ for (Map .Entry <String , StatusOr <XdsConfig .XdsClusterConfig >> entry : clusters .entrySet ()) {
1281
+ CdsUpdate .ClusterType clusterType =
1282
+ entry .getValue ().getValue ().getClusterResource ().clusterType ();
1283
+ if (clusterType == CdsUpdate .ClusterType .AGGREGATE ) {
1284
+ return new CdsConfig (entry .getKey ());
1285
+ }
1286
+ }
1287
+
1288
+ // If no aggregate grab the first leaf cluster
1289
+ String clusterName = clusters .keySet ().stream ().findFirst ().get ();
1290
+ return new CdsConfig (clusterName );
1221
1291
}
1222
1292
1223
1293
@ Override
0 commit comments