7878import java .util .concurrent .TimeUnit ;
7979import java .util .concurrent .atomic .AtomicBoolean ;
8080import java .util .concurrent .atomic .AtomicReference ;
81+ import java .util .function .Function ;
8182import java .util .logging .Level ;
8283import java .util .logging .Logger ;
8384import javax .annotation .Nullable ;
@@ -108,6 +109,7 @@ public void uncaughtException(Thread t, Throwable e) {
108109 private final ThreadSafeRandom random = ThreadSafeRandomImpl .instance ;
109110 private final XdsClientPoolFactory xdsClientPoolFactory ;
110111 private final @ Nullable Map <String , ?> bootstrapOverride ;
112+ private final @ Nullable Function <String , String > ldsResourceNameResolver ;
111113 private final XdsServingStatusListener listener ;
112114 private final FilterChainSelectorManager filterChainSelectorManager ;
113115 private final AtomicBoolean started = new AtomicBoolean (false );
@@ -139,6 +141,7 @@ public void uncaughtException(Thread t, Throwable e) {
139141 FilterChainSelectorManager filterChainSelectorManager ,
140142 XdsClientPoolFactory xdsClientPoolFactory ,
141143 @ Nullable Map <String , ?> bootstrapOverride ,
144+ @ Nullable Function <String , String > ldsResourceNameResolver ,
142145 FilterRegistry filterRegistry ,
143146 ChannelConfigurator channelConfigurator ) {
144147 this (
@@ -148,6 +151,30 @@ public void uncaughtException(Thread t, Throwable e) {
148151 filterChainSelectorManager ,
149152 xdsClientPoolFactory ,
150153 bootstrapOverride ,
154+ ldsResourceNameResolver ,
155+ filterRegistry ,
156+ SharedResourceHolder .get (GrpcUtil .TIMER_SERVICE ),
157+ channelConfigurator );
158+ sharedTimeService = true ;
159+ }
160+
161+ XdsServerWrapper (
162+ String listenerAddress ,
163+ ServerBuilder <?> delegateBuilder ,
164+ XdsServingStatusListener listener ,
165+ FilterChainSelectorManager filterChainSelectorManager ,
166+ XdsClientPoolFactory xdsClientPoolFactory ,
167+ @ Nullable Map <String , ?> bootstrapOverride ,
168+ FilterRegistry filterRegistry ,
169+ ChannelConfigurator channelConfigurator ) {
170+ this (
171+ listenerAddress ,
172+ delegateBuilder ,
173+ listener ,
174+ filterChainSelectorManager ,
175+ xdsClientPoolFactory ,
176+ bootstrapOverride ,
177+ null ,
151178 filterRegistry ,
152179 SharedResourceHolder .get (GrpcUtil .TIMER_SERVICE ),
153180 channelConfigurator );
@@ -169,8 +196,34 @@ public void uncaughtException(Thread t, Throwable e) {
169196 filterChainSelectorManager ,
170197 xdsClientPoolFactory ,
171198 bootstrapOverride ,
199+ null ,
172200 filterRegistry ,
201+ SharedResourceHolder .get (GrpcUtil .TIMER_SERVICE ),
173202 builder -> { });
203+ sharedTimeService = true ;
204+ }
205+
206+ XdsServerWrapper (
207+ String listenerAddress ,
208+ ServerBuilder <?> delegateBuilder ,
209+ XdsServingStatusListener listener ,
210+ FilterChainSelectorManager filterChainSelectorManager ,
211+ XdsClientPoolFactory xdsClientPoolFactory ,
212+ @ Nullable Map <String , ?> bootstrapOverride ,
213+ @ Nullable Function <String , String > ldsResourceNameResolver ,
214+ FilterRegistry filterRegistry ) {
215+ this (
216+ listenerAddress ,
217+ delegateBuilder ,
218+ listener ,
219+ filterChainSelectorManager ,
220+ xdsClientPoolFactory ,
221+ bootstrapOverride ,
222+ ldsResourceNameResolver ,
223+ filterRegistry ,
224+ SharedResourceHolder .get (GrpcUtil .TIMER_SERVICE ),
225+ builder -> {});
226+ sharedTimeService = true ;
174227 }
175228
176229 @ VisibleForTesting
@@ -190,11 +243,36 @@ public void uncaughtException(Thread t, Throwable e) {
190243 filterChainSelectorManager ,
191244 xdsClientPoolFactory ,
192245 bootstrapOverride ,
246+ null ,
193247 filterRegistry ,
194248 timeService ,
195249 builder -> { });
196250 }
197251
252+ @ VisibleForTesting
253+ XdsServerWrapper (
254+ String listenerAddress ,
255+ ServerBuilder <?> delegateBuilder ,
256+ XdsServingStatusListener listener ,
257+ FilterChainSelectorManager filterChainSelectorManager ,
258+ XdsClientPoolFactory xdsClientPoolFactory ,
259+ @ Nullable Map <String , ?> bootstrapOverride ,
260+ @ Nullable Function <String , String > ldsResourceNameResolver ,
261+ FilterRegistry filterRegistry ,
262+ ScheduledExecutorService timeService ) {
263+ this (
264+ listenerAddress ,
265+ delegateBuilder ,
266+ listener ,
267+ filterChainSelectorManager ,
268+ xdsClientPoolFactory ,
269+ bootstrapOverride ,
270+ ldsResourceNameResolver ,
271+ filterRegistry ,
272+ timeService ,
273+ builder -> {});
274+ }
275+
198276 @ VisibleForTesting
199277 XdsServerWrapper (
200278 String listenerAddress ,
@@ -206,6 +284,31 @@ public void uncaughtException(Thread t, Throwable e) {
206284 FilterRegistry filterRegistry ,
207285 ScheduledExecutorService timeService ,
208286 ChannelConfigurator channelConfigurator ) {
287+ this (
288+ listenerAddress ,
289+ delegateBuilder ,
290+ listener ,
291+ filterChainSelectorManager ,
292+ xdsClientPoolFactory ,
293+ bootstrapOverride ,
294+ null ,
295+ filterRegistry ,
296+ timeService ,
297+ channelConfigurator );
298+ }
299+
300+ @ VisibleForTesting
301+ XdsServerWrapper (
302+ String listenerAddress ,
303+ ServerBuilder <?> delegateBuilder ,
304+ XdsServingStatusListener listener ,
305+ FilterChainSelectorManager filterChainSelectorManager ,
306+ XdsClientPoolFactory xdsClientPoolFactory ,
307+ @ Nullable Map <String , ?> bootstrapOverride ,
308+ @ Nullable Function <String , String > ldsResourceNameResolver ,
309+ FilterRegistry filterRegistry ,
310+ ScheduledExecutorService timeService ,
311+ ChannelConfigurator channelConfigurator ) {
209312 this .listenerAddress = checkNotNull (listenerAddress , "listenerAddress" );
210313 this .delegateBuilder = checkNotNull (delegateBuilder , "delegateBuilder" );
211314 this .delegateBuilder .intercept (new ConfigApplyingInterceptor ());
@@ -214,6 +317,7 @@ public void uncaughtException(Thread t, Throwable e) {
214317 = checkNotNull (filterChainSelectorManager , "filterChainSelectorManager" );
215318 this .xdsClientPoolFactory = checkNotNull (xdsClientPoolFactory , "xdsClientPoolFactory" );
216319 this .bootstrapOverride = bootstrapOverride ;
320+ this .ldsResourceNameResolver = ldsResourceNameResolver ;
217321 this .timeService = checkNotNull (timeService , "timeService" );
218322 this .filterRegistry = checkNotNull (filterRegistry ,"filterRegistry" );
219323 this .delegate = delegateBuilder .build ();
@@ -261,21 +365,28 @@ private void internalStart() {
261365 return ;
262366 }
263367 xdsClient = xdsClientPool .getObject ();
264- String listenerTemplate = xdsClient .getBootstrapInfo ().serverListenerResourceNameTemplate ();
265- if (listenerTemplate == null ) {
266- StatusException statusException =
267- Status .UNAVAILABLE .withDescription (
268- "Can only support xDS v3 with listener resource name template" ).asException ();
269- listener .onNotServing (statusException );
270- initialStartFuture .set (statusException );
271- xdsClient = xdsClientPool .returnObject (xdsClient );
272- return ;
273- }
274- String replacement = listenerAddress ;
275- if (listenerTemplate .startsWith (XDSTP_SCHEME )) {
276- replacement = XdsClient .percentEncodePath (replacement );
368+ String resourceName ;
369+ if (ldsResourceNameResolver != null ) {
370+ resourceName = ldsResourceNameResolver .apply (listenerAddress );
371+ } else {
372+ String listenerTemplate = xdsClient .getBootstrapInfo ().serverListenerResourceNameTemplate ();
373+ if (listenerTemplate == null ) {
374+ StatusException statusException =
375+ Status .UNAVAILABLE
376+ .withDescription ("Can only support xDS v3 with listener resource name template" )
377+ .asException ();
378+ listener .onNotServing (statusException );
379+ initialStartFuture .set (statusException );
380+ xdsClient = xdsClientPool .returnObject (xdsClient );
381+ return ;
382+ }
383+ String replacement = listenerAddress ;
384+ if (listenerTemplate .startsWith (XDSTP_SCHEME )) {
385+ replacement = XdsClient .percentEncodePath (replacement );
386+ }
387+ resourceName = listenerTemplate .replaceAll ("%s" , replacement );
277388 }
278- discoveryState = new DiscoveryState (listenerTemplate . replaceAll ( "%s" , replacement ) );
389+ discoveryState = new DiscoveryState (resourceName );
279390 }
280391
281392 @ Override
0 commit comments