@@ -567,3 +567,93 @@ func hostAndPortFromAddress(t *testing.T, addr string) (string, uint32) {
567
567
}
568
568
return host , uint32 (port )
569
569
}
570
+
571
+ func (s ) TestLRSLogicalDNS (t * testing.T ) {
572
+ // Create an xDS management server that serves ADS and LRS requests.
573
+ mgmtServer := e2e .StartManagementServer (t , e2e.ManagementServerOptions {SupportLoadReportingService : true })
574
+
575
+ // Create bootstrap configuration pointing to the above management server.
576
+ nodeID := uuid .New ().String ()
577
+ bc := e2e .DefaultBootstrapContents (t , nodeID , mgmtServer .Address )
578
+ testutils .CreateBootstrapFileForTesting (t , bc )
579
+
580
+ // Create an xDS resolver with the above bootstrap configuration.
581
+ var resolverBuilder resolver.Builder
582
+ var err error
583
+ if newResolver := internal .NewXDSResolverWithConfigForTesting ; newResolver != nil {
584
+ resolverBuilder , err = newResolver .(func ([]byte ) (resolver.Builder , error ))(bc )
585
+ if err != nil {
586
+ t .Fatalf ("Failed to create xDS resolver for testing: %v" , err )
587
+ }
588
+ }
589
+
590
+ // Start a server backend exposing the test service.
591
+ server := stubserver .StartTestService (t , nil )
592
+ defer server .Stop ()
593
+ host , port := hostAndPortFromAddress (t , server .Address )
594
+
595
+ // Configure the xDS management server with default resources. Override the
596
+ // default cluster to include an LRS server config pointing to self.
597
+ const serviceName = "my-test-xds-service"
598
+ resources := e2e .DefaultClientResources (e2e.ResourceParams {
599
+ DialTarget : serviceName ,
600
+ NodeID : nodeID ,
601
+ Host : "localhost" ,
602
+ Port : testutils .ParsePort (t , server .Address ),
603
+ SecLevel : e2e .SecurityLevelNone ,
604
+ })
605
+ resources .Clusters = []* v3clusterpb.Cluster {
606
+ e2e .ClusterResourceWithOptions (e2e.ClusterOptions {
607
+ ClusterName : "cluster-" + serviceName ,
608
+ Type : e2e .ClusterTypeLogicalDNS ,
609
+ DNSHostName : host ,
610
+ DNSPort : port ,
611
+ }),
612
+ }
613
+ resources .Clusters [0 ].LrsServer = & v3corepb.ConfigSource {
614
+ ConfigSourceSpecifier : & v3corepb.ConfigSource_Self {
615
+ Self : & v3corepb.SelfConfigSource {},
616
+ },
617
+ }
618
+ resources .Endpoints = nil
619
+ ctx , cancel := context .WithTimeout (context .Background (), defaultTestTimeout )
620
+ defer cancel ()
621
+ if err := mgmtServer .Update (ctx , resources ); err != nil {
622
+ t .Fatal (err )
623
+ }
624
+
625
+ // Create a ClientConn and make a successful RPC.
626
+ cc , err := grpc .NewClient (fmt .Sprintf ("xds:///%s" , serviceName ), grpc .WithTransportCredentials (insecure .NewCredentials ()), grpc .WithResolvers (resolverBuilder ))
627
+ if err != nil {
628
+ t .Fatalf ("failed to dial local test server: %v" , err )
629
+ }
630
+ defer cc .Close ()
631
+
632
+ client := testgrpc .NewTestServiceClient (cc )
633
+ if _ , err := client .EmptyCall (ctx , & testpb.Empty {}); err != nil {
634
+ t .Fatalf ("rpc EmptyCall() failed: %v" , err )
635
+ }
636
+
637
+ // Ensure that an LRS stream is created.
638
+ if _ , err := mgmtServer .LRSServer .LRSStreamOpenChan .Receive (ctx ); err != nil {
639
+ t .Fatalf ("Failure when waiting for an LRS stream to be opened: %v" , err )
640
+ }
641
+
642
+ // Handle the initial LRS request from the xDS client.
643
+ if _ , err = mgmtServer .LRSServer .LRSRequestChan .Receive (ctx ); err != nil {
644
+ t .Fatalf ("Failure waiting for initial LRS request: %v" , err )
645
+ }
646
+
647
+ resp := fakeserver.Response {
648
+ Resp : & v3lrspb.LoadStatsResponse {
649
+ SendAllClusters : true ,
650
+ LoadReportingInterval : durationpb .New (10 * time .Millisecond ),
651
+ },
652
+ }
653
+ mgmtServer .LRSServer .LRSResponseChan <- & resp
654
+
655
+ // Wait for load to be reported for locality of server 1.
656
+ if err := waitForSuccessfulLoadReport (ctx , mgmtServer .LRSServer , "" ); err != nil {
657
+ t .Fatalf ("Server did not receive load due to error: %v" , err )
658
+ }
659
+ }
0 commit comments