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,7 @@ public void uncaughtException(Thread t, Throwable e) {
148151 filterChainSelectorManager ,
149152 xdsClientPoolFactory ,
150153 bootstrapOverride ,
154+ ldsResourceNameResolver ,
151155 filterRegistry ,
152156 SharedResourceHolder .get (GrpcUtil .TIMER_SERVICE ),
153157 channelConfigurator );
@@ -161,6 +165,52 @@ public void uncaughtException(Thread t, Throwable e) {
161165 FilterChainSelectorManager filterChainSelectorManager ,
162166 XdsClientPoolFactory xdsClientPoolFactory ,
163167 @ 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 ,
178+ filterRegistry ,
179+ SharedResourceHolder .get (GrpcUtil .TIMER_SERVICE ),
180+ channelConfigurator );
181+ sharedTimeService = true ;
182+ }
183+
184+ XdsServerWrapper (
185+ String listenerAddress ,
186+ ServerBuilder <?> delegateBuilder ,
187+ XdsServingStatusListener listener ,
188+ FilterChainSelectorManager filterChainSelectorManager ,
189+ XdsClientPoolFactory xdsClientPoolFactory ,
190+ @ Nullable Map <String , ?> bootstrapOverride ,
191+ FilterRegistry filterRegistry ) {
192+ this (
193+ listenerAddress ,
194+ delegateBuilder ,
195+ listener ,
196+ filterChainSelectorManager ,
197+ xdsClientPoolFactory ,
198+ bootstrapOverride ,
199+ null ,
200+ filterRegistry ,
201+ SharedResourceHolder .get (GrpcUtil .TIMER_SERVICE ),
202+ 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 ,
164214 FilterRegistry filterRegistry ) {
165215 this (
166216 listenerAddress ,
@@ -169,8 +219,11 @@ public void uncaughtException(Thread t, Throwable e) {
169219 filterChainSelectorManager ,
170220 xdsClientPoolFactory ,
171221 bootstrapOverride ,
222+ ldsResourceNameResolver ,
172223 filterRegistry ,
224+ SharedResourceHolder .get (GrpcUtil .TIMER_SERVICE ),
173225 builder -> { });
226+ sharedTimeService = true ;
174227 }
175228
176229 @ VisibleForTesting
@@ -190,6 +243,31 @@ public void uncaughtException(Thread t, Throwable e) {
190243 filterChainSelectorManager ,
191244 xdsClientPoolFactory ,
192245 bootstrapOverride ,
246+ null ,
247+ filterRegistry ,
248+ timeService ,
249+ builder -> { });
250+ }
251+
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 ,
193271 filterRegistry ,
194272 timeService ,
195273 builder -> { });
@@ -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