6060import io .grpc .SynchronizationContext ;
6161import io .grpc .internal .ExponentialBackoffPolicy ;
6262import io .grpc .internal .GrpcUtil ;
63- import io .grpc .internal .ObjectPool ;
6463import io .grpc .util .OutlierDetectionLoadBalancer .OutlierDetectionLoadBalancerConfig ;
6564import io .grpc .xds .CdsLoadBalancer2 .ClusterResolverConfig ;
6665import io .grpc .xds .CdsLoadBalancer2 .ClusterResolverConfig .DiscoveryMechanism ;
9291import java .util .HashMap ;
9392import java .util .List ;
9493import java .util .Map ;
94+ import java .util .Objects ;
9595import java .util .concurrent .Executor ;
9696import java .util .stream .Collectors ;
9797import javax .annotation .Nullable ;
@@ -274,7 +274,8 @@ public void basicTest() throws XdsResourceType.ResourceInvalidException {
274274 }
275275
276276 @ 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
278279 public void discoverTopLevelEdsCluster () {
279280 configWatcher .watchCluster (CLUSTER );
280281 CdsUpdate update =
@@ -284,33 +285,26 @@ public void discoverTopLevelEdsCluster() {
284285 xdsClient .deliverCdsUpdate (CLUSTER , update );
285286 assertThat (childBalancers ).hasSize (1 );
286287
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 );
289290
290291 PriorityLbConfig .PriorityChildConfig priorityChildConfig =
291292 getPriorityChildConfig (childBalancers , CLUSTER );
292293 assertThat (getChildProvider (priorityChildConfig .childConfig )
293294 .getPolicyName ()).isEqualTo ("round_robin" );
294295 }
295296
296- private static ClusterImplConfig getClusterImplConfig (List <FakeLoadBalancer > childBalancers ,
297- String cluster ) {
297+ private static Object getConfigOfPriorityGrandChild (List <FakeLoadBalancer > childBalancers ,
298+ String cluster ) {
298299 PriorityLbConfig .PriorityChildConfig priorityChildConfig =
299300 getPriorityChildConfig (childBalancers , cluster );
300301 assertNotNull ("No cluster " + cluster + " in childBalancers" , priorityChildConfig );
301302 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 ;
311304 }
312305
313- private static PriorityLbConfig .PriorityChildConfig getPriorityChildConfig (List <FakeLoadBalancer > childBalancers , String cluster ) {
306+ private static PriorityLbConfig .PriorityChildConfig
307+ getPriorityChildConfig (List <FakeLoadBalancer > childBalancers , String cluster ) {
314308 for (FakeLoadBalancer fakeLB : childBalancers ) {
315309 if (fakeLB .config instanceof PriorityLbConfig ) {
316310 Map <String , PriorityLbConfig .PriorityChildConfig > childConfigs =
@@ -523,17 +517,15 @@ public void aggregateCluster_descendantClustersRevoked() throws IOException {
523517 xdsClient .deliverCdsUpdate (cluster2 , update2 );
524518 xdsClient .createAndDeliverEdsUpdate (update1 .edsServiceName ());
525519
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 );
532524
533525 // Revoke cluster1, should still be able to proceed with cluster2.
534526 xdsClient .deliverResourceNotExist (cluster1 );
535527 assertThat (xdsClient .watchers .keySet ()).containsExactly (CLUSTER , cluster1 , cluster2 );
536- validateClusterImplConfig (getClusterImplConfig (childBalancers , CLUSTER ),
528+ validateClusterImplConfig (getConfigOfPriorityGrandChild (childBalancers , CLUSTER ),
537529 cluster2 , null , DNS_HOST_NAME , LRS_SERVER_INFO , 100L , null , null );
538530 verify (helper , never ()).updateBalancingState (
539531 eq (ConnectivityState .TRANSIENT_FAILURE ), any (SubchannelPicker .class ));
@@ -908,32 +900,95 @@ private static void assertPicker(SubchannelPicker picker, Status expectedStatus,
908900 }
909901 }
910902
903+ // TODO anything calling this needs to be updated to use validateClusterImplConfig
911904 private static void validateDiscoveryMechanism (
912905 DiscoveryMechanism instance , String name ,
913906 @ Nullable String edsServiceName , @ Nullable String dnsHostName ,
914907 @ Nullable ServerInfo lrsServerInfo , @ Nullable Long maxConcurrentRequests ,
915908 @ Nullable UpstreamTlsContext tlsContext , @ Nullable OutlierDetection outlierDetection ) {
916909 assertThat (instance .cluster ).isEqualTo (name );
917910 assertThat (instance .edsServiceName ).isEqualTo (edsServiceName );
918- // assertThat(instance.dnsHostName).isEqualTo(dnsHostName);
911+ assertThat (instance .dnsHostName ).isEqualTo (dnsHostName );
919912 assertThat (instance .lrsServerInfo ).isEqualTo (lrsServerInfo );
920913 assertThat (instance .maxConcurrentRequests ).isEqualTo (maxConcurrentRequests );
921914 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 ;
923967 }
924968
925969 private static void validateClusterImplConfig (
926- ClusterImplConfig instance , String name ,
970+ Object lbConfig , String name ,
927971 @ Nullable String edsServiceName , @ Nullable String dnsHostName ,
928972 @ Nullable ServerInfo lrsServerInfo , @ Nullable Long maxConcurrentRequests ,
929973 @ 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+
930986 assertThat (instance .cluster ).isEqualTo (name );
931987 assertThat (instance .edsServiceName ).isEqualTo (edsServiceName );
932- // assertThat(instance.dnsHostName).isEqualTo(dnsHostName);
933988 assertThat (instance .lrsServerInfo ).isEqualTo (lrsServerInfo );
934989 assertThat (instance .maxConcurrentRequests ).isEqualTo (maxConcurrentRequests );
935990 assertThat (instance .tlsContext ).isEqualTo (tlsContext );
936- // assertThat( instance.outlierDetection).isEqualTo(outlierDetection);
991+ // TODO look in instance.childConfig for dns
937992 }
938993
939994 private final class FakeLoadBalancerProvider extends LoadBalancerProvider {
@@ -1216,8 +1271,23 @@ private List<EquivalentAddressGroup> buildEagsForCluster(
12161271 }
12171272
12181273 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 );
12211291 }
12221292
12231293 @ Override
0 commit comments