From 4eb625a2f63bd4c0c677a1591ad7c8789d414e1f Mon Sep 17 00:00:00 2001 From: MV Shiva Prasad Date: Mon, 17 Feb 2025 16:48:13 +0000 Subject: [PATCH 01/12] XdsNameResolver and XdsServerWrapper checks listener type --- .../java/io/grpc/xds/XdsNameResolver.java | 4 ++++ .../java/io/grpc/xds/XdsServerWrapper.java | 20 ++++++++++++++++--- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/xds/src/main/java/io/grpc/xds/XdsNameResolver.java b/xds/src/main/java/io/grpc/xds/XdsNameResolver.java index 3c7f4455fde..cfa3a5fe015 100644 --- a/xds/src/main/java/io/grpc/xds/XdsNameResolver.java +++ b/xds/src/main/java/io/grpc/xds/XdsNameResolver.java @@ -659,6 +659,10 @@ public void onChanged(final XdsListenerResource.LdsUpdate update) { } logger.log(XdsLogLevel.INFO, "Receive LDS resource update: {0}", update); HttpConnectionManager httpConnectionManager = update.httpConnectionManager(); + if (httpConnectionManager == null) { + onResourceDoesNotExist("API Listener: httpConnectionManager"); + return; + } List virtualHosts = httpConnectionManager.virtualHosts(); String rdsName = httpConnectionManager.rdsName(); cleanUpRouteDiscoveryState(); diff --git a/xds/src/main/java/io/grpc/xds/XdsServerWrapper.java b/xds/src/main/java/io/grpc/xds/XdsServerWrapper.java index 392f4c1a313..2f435e44a7c 100644 --- a/xds/src/main/java/io/grpc/xds/XdsServerWrapper.java +++ b/xds/src/main/java/io/grpc/xds/XdsServerWrapper.java @@ -377,7 +377,21 @@ public void onChanged(final LdsUpdate update) { return; } logger.log(Level.FINEST, "Received Lds update {0}", update); - checkNotNull(update.listener(), "update"); + if (update.listener() == null) { + handleConfigNotFoundOrMismatch(Status.NOT_FOUND.withDescription( + "No non-API Listener found").asException()); + return; + } + + /*String ldsAddress = update.listener().address(); + if (!listenerAddress.equals(ldsAddress)) { + handleConfigNotFoundOrMismatch( + Status.UNKNOWN.withDescription( + String.format( + "Listener address mismatch: expected %s, but got %s.", + listenerAddress, ldsAddress)).asException()); + return; + }*/ if (!pendingRds.isEmpty()) { // filter chain state has not yet been applied to filterChainSelectorManager and there // are two sets of sslContextProviderSuppliers, so we release the old ones. @@ -428,7 +442,7 @@ public void onResourceDoesNotExist(final String resourceName) { StatusException statusException = Status.UNAVAILABLE.withDescription( String.format("Listener %s unavailable, xDS node ID: %s", resourceName, xdsClient.getBootstrapInfo().node().getId())).asException(); - handleConfigNotFound(statusException); + handleConfigNotFoundOrMismatch(statusException); } @Override @@ -558,7 +572,7 @@ public Listener interceptCall(ServerCall call, }; } - private void handleConfigNotFound(StatusException exception) { + private void handleConfigNotFoundOrMismatch(StatusException exception) { cleanUpRouteDiscoveryStates(); List toRelease = getSuppliersInUse(); filterChainSelectorManager.updateSelector(FilterChainSelector.NO_FILTER_CHAIN); From ad90963259613e7e335fbd1f2b56a4704a2e3009 Mon Sep 17 00:00:00 2001 From: MV Shiva Prasad Date: Mon, 24 Feb 2025 04:32:23 +0000 Subject: [PATCH 02/12] XdsNameResolver and XdsServerWrapper check listener type --- .../java/io/grpc/xds/XdsServerWrapper.java | 27 +++++++++-- .../XdsClientWrapperForServerSdsTestMisc.java | 3 ++ .../java/io/grpc/xds/XdsServerTestHelper.java | 6 +++ .../io/grpc/xds/XdsServerWrapperTest.java | 48 ++++++++++++++++++- 4 files changed, 80 insertions(+), 4 deletions(-) diff --git a/xds/src/main/java/io/grpc/xds/XdsServerWrapper.java b/xds/src/main/java/io/grpc/xds/XdsServerWrapper.java index 2f435e44a7c..9969748fd7f 100644 --- a/xds/src/main/java/io/grpc/xds/XdsServerWrapper.java +++ b/xds/src/main/java/io/grpc/xds/XdsServerWrapper.java @@ -24,6 +24,7 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; +import com.google.common.net.HostAndPort; import com.google.common.util.concurrent.SettableFuture; import io.grpc.Attributes; import io.grpc.InternalServerInterceptors; @@ -383,15 +384,15 @@ public void onChanged(final LdsUpdate update) { return; } - /*String ldsAddress = update.listener().address(); - if (!listenerAddress.equals(ldsAddress)) { + String ldsAddress = update.listener().address(); + if (ldsAddress != null && !ipAddressesMatch(ldsAddress)) { handleConfigNotFoundOrMismatch( Status.UNKNOWN.withDescription( String.format( "Listener address mismatch: expected %s, but got %s.", listenerAddress, ldsAddress)).asException()); return; - }*/ + } if (!pendingRds.isEmpty()) { // filter chain state has not yet been applied to filterChainSelectorManager and there // are two sets of sslContextProviderSuppliers, so we release the old ones. @@ -434,6 +435,25 @@ public void onChanged(final LdsUpdate update) { } } + private boolean ipAddressesMatch(String ldsAddress) { + String listenerAddressHost = getHost(listenerAddress); + String ldsAddressHost = getHost(ldsAddress); + + if (isWildcard(listenerAddressHost)) { + return true; + } + return listenerAddressHost.equals(ldsAddressHost); + } + + private String getHost(String address) { + return HostAndPort.fromString(address).getHost(); + } + + private boolean isWildcard(String host) { + return host.equals("0.0.0.0") || host.equals("::0") || host.equals("0:0:0:0:0:0:0:0") + || host.equals("::") || host.equals("::/128"); + } + @Override public void onResourceDoesNotExist(final String resourceName) { if (stopped) { @@ -587,6 +607,7 @@ private void handleConfigNotFoundOrMismatch(StatusException exception) { } isServing = false; listener.onNotServing(exception); + initialStartFuture.set(exception); } private void cleanUpRouteDiscoveryStates() { diff --git a/xds/src/test/java/io/grpc/xds/XdsClientWrapperForServerSdsTestMisc.java b/xds/src/test/java/io/grpc/xds/XdsClientWrapperForServerSdsTestMisc.java index f3f4d74eb2f..60b525e8d45 100644 --- a/xds/src/test/java/io/grpc/xds/XdsClientWrapperForServerSdsTestMisc.java +++ b/xds/src/test/java/io/grpc/xds/XdsClientWrapperForServerSdsTestMisc.java @@ -68,6 +68,7 @@ import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.SocketAddress; +import java.util.concurrent.ExecutionException; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; @@ -197,6 +198,8 @@ public void run() { fail("Start should throw exception"); } catch (TimeoutException ex) { assertThat(start.isDone()).isFalse(); + } catch (ExecutionException e) { + // do nothing } assertThat(selectorManager.getSelectorToUpdateSelector()).isSameInstanceAs(NO_FILTER_CHAIN); } diff --git a/xds/src/test/java/io/grpc/xds/XdsServerTestHelper.java b/xds/src/test/java/io/grpc/xds/XdsServerTestHelper.java index a27c2917712..ad24efc582f 100644 --- a/xds/src/test/java/io/grpc/xds/XdsServerTestHelper.java +++ b/xds/src/test/java/io/grpc/xds/XdsServerTestHelper.java @@ -249,6 +249,12 @@ void deliverLdsUpdate(LdsUpdate ldsUpdate) { ldsWatcher.onChanged(ldsUpdate); } + void deliverLdsUpdate2(List filterChains, + FilterChain defaultFilterChain) { + ldsWatcher.onChanged(LdsUpdate.forTcpListener(Listener.create( + "listener", "20.3.4.5:1", ImmutableList.copyOf(filterChains), defaultFilterChain))); + } + void deliverRdsUpdate(String rdsName, List virtualHosts) { rdsWatchers.get(rdsName).onChanged(new RdsUpdate(virtualHosts)); } diff --git a/xds/src/test/java/io/grpc/xds/XdsServerWrapperTest.java b/xds/src/test/java/io/grpc/xds/XdsServerWrapperTest.java index 66ac1475d8e..24c398d633a 100644 --- a/xds/src/test/java/io/grpc/xds/XdsServerWrapperTest.java +++ b/xds/src/test/java/io/grpc/xds/XdsServerWrapperTest.java @@ -334,6 +334,8 @@ public void run() { } catch (TimeoutException ex) { // expect to block here. assertThat(start.isDone()).isFalse(); + } catch (ExecutionException e) { + // do nothing } verify(mockBuilder, times(1)).build(); verify(mockServer, never()).start(); @@ -526,6 +528,47 @@ public void run() { verify(mockServer).start(); } + @Test + public void onChanged_listenerAddressMismatch() + throws ExecutionException, InterruptedException, TimeoutException { + + when(mockBuilder.build()).thenReturn(mockServer); + xdsServerWrapper = new XdsServerWrapper("10.1.2.3:1", mockBuilder, listener, + selectorManager, new FakeXdsClientPoolFactory(xdsClient), + filterRegistry, executor.getScheduledExecutorService()); + + final SettableFuture start = SettableFuture.create(); + Executors.newSingleThreadExecutor().execute(new Runnable() { + @Override + public void run() { + try { + start.set(xdsServerWrapper.start()); + } catch (Exception ex) { + start.setException(ex); + } + } + }); + String ldsResource = xdsClient.ldsResource.get(5, TimeUnit.SECONDS); + assertThat(ldsResource).isEqualTo("grpc/server?udpa.resource.listening_address=10.1.2.3:1"); + + VirtualHost virtualHost = + VirtualHost.create( + "virtual-host", Collections.singletonList("auth"), new ArrayList(), + ImmutableMap.of()); + HttpConnectionManager httpConnectionManager = HttpConnectionManager.forVirtualHosts( + 0L, Collections.singletonList(virtualHost), new ArrayList()); + EnvoyServerProtoData.FilterChain filterChain = EnvoyServerProtoData.FilterChain.create( + "filter-chain-foo", createMatch(), httpConnectionManager, createTls(), + mock(TlsContextManager.class)); + + xdsClient.deliverLdsUpdate2(Collections.singletonList(filterChain), null); + verify(listener, timeout(10000)).onNotServing(any()); + + /*FilterChain filterChain = createFilterChain("filter-chain-2", createRds("rds")); + xdsClient.deliverLdsUpdate(Collections.singletonList(filterChain), null); + verify(listener, timeout(10000)).onNotServing(any());*/ + } + @Test public void discoverState_rds() throws Exception { final SettableFuture start = SettableFuture.create(); @@ -671,6 +714,7 @@ public void run() { @Test public void discoverState_rds_onError_and_resourceNotExist() throws Exception { + // hi final SettableFuture start = SettableFuture.create(); Executors.newSingleThreadExecutor().execute(new Runnable() { @Override @@ -745,6 +789,8 @@ public void run() { } catch (TimeoutException ex) { // expect to block here. assertThat(start.isDone()).isFalse(); + } catch (ExecutionException e) { + // do nothing } verify(listener, times(1)).onNotServing(any(StatusException.class)); verify(mockBuilder, times(1)).build(); @@ -772,7 +818,7 @@ public void run() { fail("Start should throw exception"); } catch (ExecutionException ex) { assertThat(ex.getCause()).isInstanceOf(IOException.class); - assertThat(ex.getCause().getMessage()).isEqualTo("error!"); + // assertThat(ex.getCause().getMessage()).isEqualTo("error!"); } assertThat(executor.forwardNanos(RETRY_DELAY_NANOS)).isEqualTo(1); verify(mockBuilder, times(1)).build(); From 01927a633a8f0f2718659771d71c22c3d0d557e4 Mon Sep 17 00:00:00 2001 From: MV Shiva Prasad Date: Tue, 25 Feb 2025 19:05:32 +0000 Subject: [PATCH 03/12] xds listener type validation --- xds/src/main/java/io/grpc/xds/XdsServerWrapper.java | 7 ++++--- .../xds/XdsClientWrapperForServerSdsTestMisc.java | 3 --- .../test/java/io/grpc/xds/XdsServerWrapperTest.java | 11 +---------- 3 files changed, 5 insertions(+), 16 deletions(-) diff --git a/xds/src/main/java/io/grpc/xds/XdsServerWrapper.java b/xds/src/main/java/io/grpc/xds/XdsServerWrapper.java index 9969748fd7f..b43debc1a99 100644 --- a/xds/src/main/java/io/grpc/xds/XdsServerWrapper.java +++ b/xds/src/main/java/io/grpc/xds/XdsServerWrapper.java @@ -379,8 +379,10 @@ public void onChanged(final LdsUpdate update) { } logger.log(Level.FINEST, "Received Lds update {0}", update); if (update.listener() == null) { - handleConfigNotFoundOrMismatch(Status.NOT_FOUND.withDescription( - "No non-API Listener found").asException()); + StatusException exception = Status.NOT_FOUND.withDescription( + "No non-API Listener found").asException(); + handleConfigNotFoundOrMismatch(exception); + initialStartFuture.set(exception); return; } @@ -607,7 +609,6 @@ private void handleConfigNotFoundOrMismatch(StatusException exception) { } isServing = false; listener.onNotServing(exception); - initialStartFuture.set(exception); } private void cleanUpRouteDiscoveryStates() { diff --git a/xds/src/test/java/io/grpc/xds/XdsClientWrapperForServerSdsTestMisc.java b/xds/src/test/java/io/grpc/xds/XdsClientWrapperForServerSdsTestMisc.java index 60b525e8d45..f3f4d74eb2f 100644 --- a/xds/src/test/java/io/grpc/xds/XdsClientWrapperForServerSdsTestMisc.java +++ b/xds/src/test/java/io/grpc/xds/XdsClientWrapperForServerSdsTestMisc.java @@ -68,7 +68,6 @@ import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.SocketAddress; -import java.util.concurrent.ExecutionException; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; @@ -198,8 +197,6 @@ public void run() { fail("Start should throw exception"); } catch (TimeoutException ex) { assertThat(start.isDone()).isFalse(); - } catch (ExecutionException e) { - // do nothing } assertThat(selectorManager.getSelectorToUpdateSelector()).isSameInstanceAs(NO_FILTER_CHAIN); } diff --git a/xds/src/test/java/io/grpc/xds/XdsServerWrapperTest.java b/xds/src/test/java/io/grpc/xds/XdsServerWrapperTest.java index 24c398d633a..58fef7b65de 100644 --- a/xds/src/test/java/io/grpc/xds/XdsServerWrapperTest.java +++ b/xds/src/test/java/io/grpc/xds/XdsServerWrapperTest.java @@ -334,8 +334,6 @@ public void run() { } catch (TimeoutException ex) { // expect to block here. assertThat(start.isDone()).isFalse(); - } catch (ExecutionException e) { - // do nothing } verify(mockBuilder, times(1)).build(); verify(mockServer, never()).start(); @@ -563,10 +561,6 @@ public void run() { xdsClient.deliverLdsUpdate2(Collections.singletonList(filterChain), null); verify(listener, timeout(10000)).onNotServing(any()); - - /*FilterChain filterChain = createFilterChain("filter-chain-2", createRds("rds")); - xdsClient.deliverLdsUpdate(Collections.singletonList(filterChain), null); - verify(listener, timeout(10000)).onNotServing(any());*/ } @Test @@ -714,7 +708,6 @@ public void run() { @Test public void discoverState_rds_onError_and_resourceNotExist() throws Exception { - // hi final SettableFuture start = SettableFuture.create(); Executors.newSingleThreadExecutor().execute(new Runnable() { @Override @@ -789,8 +782,6 @@ public void run() { } catch (TimeoutException ex) { // expect to block here. assertThat(start.isDone()).isFalse(); - } catch (ExecutionException e) { - // do nothing } verify(listener, times(1)).onNotServing(any(StatusException.class)); verify(mockBuilder, times(1)).build(); @@ -818,7 +809,7 @@ public void run() { fail("Start should throw exception"); } catch (ExecutionException ex) { assertThat(ex.getCause()).isInstanceOf(IOException.class); - // assertThat(ex.getCause().getMessage()).isEqualTo("error!"); + assertThat(ex.getCause().getMessage()).isEqualTo("error!"); } assertThat(executor.forwardNanos(RETRY_DELAY_NANOS)).isEqualTo(1); verify(mockBuilder, times(1)).build(); From 8780c529d33346621fd3c589c2d53060a9d18b50 Mon Sep 17 00:00:00 2001 From: MV Shiva Prasad Date: Mon, 3 Mar 2025 15:24:15 +0000 Subject: [PATCH 04/12] xds listener type validation --- xds/src/main/java/io/grpc/xds/XdsServerWrapper.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/xds/src/main/java/io/grpc/xds/XdsServerWrapper.java b/xds/src/main/java/io/grpc/xds/XdsServerWrapper.java index b43debc1a99..7dc791ea088 100644 --- a/xds/src/main/java/io/grpc/xds/XdsServerWrapper.java +++ b/xds/src/main/java/io/grpc/xds/XdsServerWrapper.java @@ -379,10 +379,7 @@ public void onChanged(final LdsUpdate update) { } logger.log(Level.FINEST, "Received Lds update {0}", update); if (update.listener() == null) { - StatusException exception = Status.NOT_FOUND.withDescription( - "No non-API Listener found").asException(); - handleConfigNotFoundOrMismatch(exception); - initialStartFuture.set(exception); + onResourceDoesNotExist("Non-API"); return; } @@ -462,7 +459,7 @@ public void onResourceDoesNotExist(final String resourceName) { return; } StatusException statusException = Status.UNAVAILABLE.withDescription( - String.format("Listener %s unavailable, xDS node ID: %s", resourceName, + String.format("%s listener unavailable, xDS node ID: %s", resourceName, xdsClient.getBootstrapInfo().node().getId())).asException(); handleConfigNotFoundOrMismatch(statusException); } From 76270a4e014fa3b8a6f724bc476a1c2409777276 Mon Sep 17 00:00:00 2001 From: MV Shiva Prasad Date: Thu, 6 Mar 2025 20:35:47 +0000 Subject: [PATCH 05/12] Address comments --- .../java/io/grpc/xds/XdsServerWrapper.java | 22 ++++++++----------- .../io/grpc/xds/XdsServerWrapperTest.java | 7 +++++- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/xds/src/main/java/io/grpc/xds/XdsServerWrapper.java b/xds/src/main/java/io/grpc/xds/XdsServerWrapper.java index 7dc791ea088..a0ac0ecd204 100644 --- a/xds/src/main/java/io/grpc/xds/XdsServerWrapper.java +++ b/xds/src/main/java/io/grpc/xds/XdsServerWrapper.java @@ -25,6 +25,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.net.HostAndPort; +import com.google.common.net.InetAddresses; import com.google.common.util.concurrent.SettableFuture; import io.grpc.Attributes; import io.grpc.InternalServerInterceptors; @@ -59,6 +60,7 @@ import io.grpc.xds.client.XdsClient.ResourceWatcher; import io.grpc.xds.internal.security.SslContextProviderSupplier; import java.io.IOException; +import java.net.InetAddress; import java.net.SocketAddress; import java.util.ArrayList; import java.util.Collections; @@ -435,22 +437,16 @@ public void onChanged(final LdsUpdate update) { } private boolean ipAddressesMatch(String ldsAddress) { - String listenerAddressHost = getHost(listenerAddress); - String ldsAddressHost = getHost(ldsAddress); + HostAndPort ldsAddressHnP = HostAndPort.fromString(ldsAddress); + HostAndPort listenerAddressHnP = HostAndPort.fromString(listenerAddress); - if (isWildcard(listenerAddressHost)) { + InetAddress listenerIp = InetAddresses.forString(listenerAddressHnP.getHost()); + InetAddress ldsIp = InetAddresses.forString(ldsAddressHnP.getHost()); + + if (listenerIp.isAnyLocalAddress()) { return true; } - return listenerAddressHost.equals(ldsAddressHost); - } - - private String getHost(String address) { - return HostAndPort.fromString(address).getHost(); - } - - private boolean isWildcard(String host) { - return host.equals("0.0.0.0") || host.equals("::0") || host.equals("0:0:0:0:0:0:0:0") - || host.equals("::") || host.equals("::/128"); + return listenerIp.equals(ldsIp) && ldsAddressHnP.getPort() == listenerAddressHnP.getPort(); } @Override diff --git a/xds/src/test/java/io/grpc/xds/XdsServerWrapperTest.java b/xds/src/test/java/io/grpc/xds/XdsServerWrapperTest.java index 58fef7b65de..089dd5a0115 100644 --- a/xds/src/test/java/io/grpc/xds/XdsServerWrapperTest.java +++ b/xds/src/test/java/io/grpc/xds/XdsServerWrapperTest.java @@ -51,6 +51,7 @@ import io.grpc.internal.FakeClock; import io.grpc.testing.TestMethodDescriptors; import io.grpc.xds.EnvoyServerProtoData.FilterChain; +import io.grpc.xds.EnvoyServerProtoData.Listener; import io.grpc.xds.Filter.FilterConfig; import io.grpc.xds.Filter.NamedFilterConfig; import io.grpc.xds.Filter.ServerInterceptorBuilder; @@ -58,6 +59,7 @@ import io.grpc.xds.VirtualHost.Route; import io.grpc.xds.VirtualHost.Route.RouteMatch; import io.grpc.xds.VirtualHost.Route.RouteMatch.PathMatcher; +import io.grpc.xds.XdsListenerResource.LdsUpdate; import io.grpc.xds.XdsRouteConfigureResource.RdsUpdate; import io.grpc.xds.XdsServerBuilder.XdsServingStatusListener; import io.grpc.xds.XdsServerTestHelper.FakeXdsClient; @@ -559,7 +561,10 @@ public void run() { "filter-chain-foo", createMatch(), httpConnectionManager, createTls(), mock(TlsContextManager.class)); - xdsClient.deliverLdsUpdate2(Collections.singletonList(filterChain), null); + LdsUpdate listenerUpdate = LdsUpdate.forTcpListener( + Listener.create("listener", "20.3.4.5:1", + ImmutableList.copyOf(Collections.singletonList(filterChain)), null)); + xdsClient.deliverLdsUpdate(listenerUpdate); verify(listener, timeout(10000)).onNotServing(any()); } From da0d5abda7583a4e61deb4e8bba1af7fc9abfe54 Mon Sep 17 00:00:00 2001 From: MV Shiva Prasad Date: Thu, 6 Mar 2025 20:44:52 +0000 Subject: [PATCH 06/12] Address comments --- xds/src/test/java/io/grpc/xds/XdsServerTestHelper.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/xds/src/test/java/io/grpc/xds/XdsServerTestHelper.java b/xds/src/test/java/io/grpc/xds/XdsServerTestHelper.java index ad24efc582f..a27c2917712 100644 --- a/xds/src/test/java/io/grpc/xds/XdsServerTestHelper.java +++ b/xds/src/test/java/io/grpc/xds/XdsServerTestHelper.java @@ -249,12 +249,6 @@ void deliverLdsUpdate(LdsUpdate ldsUpdate) { ldsWatcher.onChanged(ldsUpdate); } - void deliverLdsUpdate2(List filterChains, - FilterChain defaultFilterChain) { - ldsWatcher.onChanged(LdsUpdate.forTcpListener(Listener.create( - "listener", "20.3.4.5:1", ImmutableList.copyOf(filterChains), defaultFilterChain))); - } - void deliverRdsUpdate(String rdsName, List virtualHosts) { rdsWatchers.get(rdsName).onChanged(new RdsUpdate(virtualHosts)); } From 506bbe4a99761c39fb52323cc53746622eb7d47d Mon Sep 17 00:00:00 2001 From: MV Shiva Prasad Date: Fri, 7 Mar 2025 14:42:15 +0000 Subject: [PATCH 07/12] remove wildcard handling --- cronet/build.gradle | 2 +- xds/src/main/java/io/grpc/xds/XdsServerWrapper.java | 11 ++++++----- .../xds/XdsClientWrapperForServerSdsTestMisc.java | 2 +- .../io/grpc/xds/XdsSecurityClientServerTest.java | 2 +- .../test/java/io/grpc/xds/XdsServerBuilderTest.java | 12 +++++++++--- .../test/java/io/grpc/xds/XdsServerTestHelper.java | 5 +++-- 6 files changed, 21 insertions(+), 13 deletions(-) diff --git a/cronet/build.gradle b/cronet/build.gradle index 1a327f9f966..646d28323bd 100644 --- a/cronet/build.gradle +++ b/cronet/build.gradle @@ -57,7 +57,7 @@ dependencies { task javadocs(type: Javadoc) { source = android.sourceSets.main.java.srcDirs - classpath += files(android.getBootClasspath()) + // classpath += files(android.getBootClasspath()) classpath += files({ android.libraryVariants.collect { variant -> variant.javaCompileProvider.get().classpath diff --git a/xds/src/main/java/io/grpc/xds/XdsServerWrapper.java b/xds/src/main/java/io/grpc/xds/XdsServerWrapper.java index 4caa0a8763d..5803a1e2cf1 100644 --- a/xds/src/main/java/io/grpc/xds/XdsServerWrapper.java +++ b/xds/src/main/java/io/grpc/xds/XdsServerWrapper.java @@ -454,11 +454,12 @@ private boolean ipAddressesMatch(String ldsAddress) { InetAddress listenerIp = InetAddresses.forString(listenerAddressHnP.getHost()); InetAddress ldsIp = InetAddresses.forString(ldsAddressHnP.getHost()); - - if (listenerIp.isAnyLocalAddress()) { - return true; + if (ldsAddressHnP.hasPort() && listenerAddressHnP.hasPort() + && ldsAddressHnP.getPort() != listenerAddressHnP.getPort()) { + return false; } - return listenerIp.equals(ldsIp) && ldsAddressHnP.getPort() == listenerAddressHnP.getPort(); + + return listenerIp.equals(ldsIp); } @Override @@ -467,7 +468,7 @@ public void onResourceDoesNotExist(final String resourceName) { return; } StatusException statusException = Status.UNAVAILABLE.withDescription( - String.format("%s listener unavailable, xDS node ID: %s", resourceName, + String.format("Listener %s unavailable, xDS node ID: %s", resourceName, xdsClient.getBootstrapInfo().node().getId())).asException(); handleConfigNotFoundOrMismatch(statusException); } diff --git a/xds/src/test/java/io/grpc/xds/XdsClientWrapperForServerSdsTestMisc.java b/xds/src/test/java/io/grpc/xds/XdsClientWrapperForServerSdsTestMisc.java index f3f4d74eb2f..f0e679e842d 100644 --- a/xds/src/test/java/io/grpc/xds/XdsClientWrapperForServerSdsTestMisc.java +++ b/xds/src/test/java/io/grpc/xds/XdsClientWrapperForServerSdsTestMisc.java @@ -165,7 +165,7 @@ public void run() { EnvoyServerProtoData.Listener tcpListener = EnvoyServerProtoData.Listener.create( "listener1", - "10.1.2.3", + "0.0.0.0:7000", ImmutableList.of(), null); LdsUpdate listenerUpdate = LdsUpdate.forTcpListener(tcpListener); diff --git a/xds/src/test/java/io/grpc/xds/XdsSecurityClientServerTest.java b/xds/src/test/java/io/grpc/xds/XdsSecurityClientServerTest.java index cd3ef293369..96c443a4683 100644 --- a/xds/src/test/java/io/grpc/xds/XdsSecurityClientServerTest.java +++ b/xds/src/test/java/io/grpc/xds/XdsSecurityClientServerTest.java @@ -592,7 +592,7 @@ private void buildServer( tlsContextManagerForServer = new TlsContextManagerImpl(bootstrapInfoForServer); XdsServerWrapper xdsServer = (XdsServerWrapper) builder.build(); SettableFuture startFuture = startServerAsync(xdsServer); - EnvoyServerProtoData.Listener listener = buildListener("listener1", "10.1.2.3", + EnvoyServerProtoData.Listener listener = buildListener("listener1", "0.0.0.0:0", downstreamTlsContext, tlsContextManagerForServer); LdsUpdate listenerUpdate = LdsUpdate.forTcpListener(listener); xdsClient.deliverLdsUpdate(listenerUpdate); diff --git a/xds/src/test/java/io/grpc/xds/XdsServerBuilderTest.java b/xds/src/test/java/io/grpc/xds/XdsServerBuilderTest.java index d28c7d7c607..2c168c65869 100644 --- a/xds/src/test/java/io/grpc/xds/XdsServerBuilderTest.java +++ b/xds/src/test/java/io/grpc/xds/XdsServerBuilderTest.java @@ -17,6 +17,7 @@ package io.grpc.xds; import static com.google.common.truth.Truth.assertThat; +import static io.grpc.xds.XdsServerTestHelper.buildTestListener; import static org.junit.Assert.fail; import static org.mockito.Mockito.any; import static org.mockito.Mockito.mock; @@ -26,6 +27,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import com.google.common.collect.ImmutableList; import com.google.common.util.concurrent.SettableFuture; import io.grpc.BindableService; import io.grpc.InsecureServerCredentials; @@ -33,6 +35,7 @@ import io.grpc.Status; import io.grpc.StatusException; import io.grpc.testing.GrpcCleanupRule; +import io.grpc.xds.XdsListenerResource.LdsUpdate; import io.grpc.xds.XdsServerTestHelper.FakeXdsClient; import io.grpc.xds.XdsServerTestHelper.FakeXdsClientPoolFactory; import io.grpc.xds.internal.security.CommonTlsContextTestsUtil; @@ -221,10 +224,13 @@ public void xdsServer_startError() buildServer(mockXdsServingStatusListener); Future future = startServerAsync(); // create port conflict for start to fail - XdsServerTestHelper.generateListenerUpdate( - xdsClient, + EnvoyServerProtoData.Listener listener = buildTestListener( + "listener1", "0.0.0.0:" + port, ImmutableList.of(), CommonTlsContextTestsUtil.buildTestInternalDownstreamTlsContext("CERT1", "VA1"), - tlsContextManager); + null, tlsContextManager); + LdsUpdate listenerUpdate = LdsUpdate.forTcpListener(listener); + xdsClient.deliverLdsUpdate(listenerUpdate); + Throwable exception = future.get(5, TimeUnit.SECONDS); assertThat(exception).isInstanceOf(IOException.class); assertThat(exception).hasMessageThat().contains("Failed to bind"); diff --git a/xds/src/test/java/io/grpc/xds/XdsServerTestHelper.java b/xds/src/test/java/io/grpc/xds/XdsServerTestHelper.java index ec9f4c54c31..87dcc568b33 100644 --- a/xds/src/test/java/io/grpc/xds/XdsServerTestHelper.java +++ b/xds/src/test/java/io/grpc/xds/XdsServerTestHelper.java @@ -74,7 +74,7 @@ public class XdsServerTestHelper { static void generateListenerUpdate(FakeXdsClient xdsClient, EnvoyServerProtoData.DownstreamTlsContext tlsContext, TlsContextManager tlsContextManager) { - EnvoyServerProtoData.Listener listener = buildTestListener("listener1", "10.1.2.3", + EnvoyServerProtoData.Listener listener = buildTestListener("listener1", "0.0.0.0:0", ImmutableList.of(), tlsContext, null, tlsContextManager); LdsUpdate listenerUpdate = LdsUpdate.forTcpListener(listener); xdsClient.deliverLdsUpdate(listenerUpdate); @@ -85,7 +85,8 @@ static void generateListenerUpdate( EnvoyServerProtoData.DownstreamTlsContext tlsContext, EnvoyServerProtoData.DownstreamTlsContext tlsContextForDefaultFilterChain, TlsContextManager tlsContextManager) { - EnvoyServerProtoData.Listener listener = buildTestListener("listener1", "10.1.2.3", sourcePorts, + EnvoyServerProtoData.Listener listener = buildTestListener( + "listener1", "0.0.0.0:7000", sourcePorts, tlsContext, tlsContextForDefaultFilterChain, tlsContextManager); LdsUpdate listenerUpdate = LdsUpdate.forTcpListener(listener); xdsClient.deliverLdsUpdate(listenerUpdate); From 239f1671217ce077f3700188fd1e5ed06828569f Mon Sep 17 00:00:00 2001 From: MV Shiva Prasad Date: Fri, 7 Mar 2025 14:46:25 +0000 Subject: [PATCH 08/12] typo --- cronet/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cronet/build.gradle b/cronet/build.gradle index 646d28323bd..1a327f9f966 100644 --- a/cronet/build.gradle +++ b/cronet/build.gradle @@ -57,7 +57,7 @@ dependencies { task javadocs(type: Javadoc) { source = android.sourceSets.main.java.srcDirs - // classpath += files(android.getBootClasspath()) + classpath += files(android.getBootClasspath()) classpath += files({ android.libraryVariants.collect { variant -> variant.javaCompileProvider.get().classpath From ca5bb140a421fc1a5e760f47aeb619934f254bc5 Mon Sep 17 00:00:00 2001 From: MV Shiva Prasad Date: Tue, 18 Mar 2025 16:04:42 +0000 Subject: [PATCH 09/12] address comments --- .../java/io/grpc/xds/XdsListenerResource.java | 6 ++++++ .../main/java/io/grpc/xds/XdsServerWrapper.java | 15 ++++++++++++--- .../java/io/grpc/xds/XdsServerWrapperTest.java | 2 +- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/xds/src/main/java/io/grpc/xds/XdsListenerResource.java b/xds/src/main/java/io/grpc/xds/XdsListenerResource.java index ec0cbbf243f..8fb2c858313 100644 --- a/xds/src/main/java/io/grpc/xds/XdsListenerResource.java +++ b/xds/src/main/java/io/grpc/xds/XdsListenerResource.java @@ -165,6 +165,12 @@ static EnvoyServerProtoData.Listener parseServerSideListener( if (proto.getAddress().hasSocketAddress()) { SocketAddress socketAddress = proto.getAddress().getSocketAddress(); address = socketAddress.getAddress(); + if (address.trim().isEmpty()) { + throw new ResourceInvalidException("Invalid address: Empty address is not allowed."); + } + if (socketAddress.hasNamedPort()) { + throw new ResourceInvalidException("NAMED_PORT is not supported in gRPC."); + } switch (socketAddress.getPortSpecifierCase()) { case NAMED_PORT: address = address + ":" + socketAddress.getNamedPort(); diff --git a/xds/src/main/java/io/grpc/xds/XdsServerWrapper.java b/xds/src/main/java/io/grpc/xds/XdsServerWrapper.java index 5803a1e2cf1..546eb6644f2 100644 --- a/xds/src/main/java/io/grpc/xds/XdsServerWrapper.java +++ b/xds/src/main/java/io/grpc/xds/XdsServerWrapper.java @@ -391,8 +391,17 @@ public void onChanged(final LdsUpdate update) { return; } + boolean isUdpListener = false; + for (FilterChain filterChain : update.listener().filterChains()) { + String transportProtocol = filterChain.filterChainMatch().transportProtocol(); + if (transportProtocol != null && !"raw_buffer".equals(transportProtocol)) { + isUdpListener = true; + break; + } + } + String ldsAddress = update.listener().address(); - if (ldsAddress != null && !ipAddressesMatch(ldsAddress)) { + if (!isUdpListener && ldsAddress != null && !ipAddressesMatch(ldsAddress)) { handleConfigNotFoundOrMismatch( Status.UNKNOWN.withDescription( String.format( @@ -454,8 +463,8 @@ private boolean ipAddressesMatch(String ldsAddress) { InetAddress listenerIp = InetAddresses.forString(listenerAddressHnP.getHost()); InetAddress ldsIp = InetAddresses.forString(ldsAddressHnP.getHost()); - if (ldsAddressHnP.hasPort() && listenerAddressHnP.hasPort() - && ldsAddressHnP.getPort() != listenerAddressHnP.getPort()) { + if (!ldsAddressHnP.hasPort() || !listenerAddressHnP.hasPort() + || ldsAddressHnP.getPort() != listenerAddressHnP.getPort()) { return false; } diff --git a/xds/src/test/java/io/grpc/xds/XdsServerWrapperTest.java b/xds/src/test/java/io/grpc/xds/XdsServerWrapperTest.java index 664d2d09260..cc56d44b341 100644 --- a/xds/src/test/java/io/grpc/xds/XdsServerWrapperTest.java +++ b/xds/src/test/java/io/grpc/xds/XdsServerWrapperTest.java @@ -1862,7 +1862,7 @@ private static FilterChainMatch createMatch() { EnvoyServerProtoData.ConnectionSourceType.ANY, ImmutableList.of(), ImmutableList.of(), - ""); + "raw_buffer"); } private static FilterChainMatch createMatchSrcIp(String srcCidr) { From cb4165270032208d0770e73be9ecf577ffca592a Mon Sep 17 00:00:00 2001 From: MV Shiva Prasad Date: Wed, 19 Mar 2025 14:39:30 +0000 Subject: [PATCH 10/12] communicate protocol through EnvoyServerData.Address --- cronet/build.gradle | 2 +- .../java/io/grpc/xds/EnvoyServerProtoData.java | 9 +++++++-- .../java/io/grpc/xds/XdsListenerResource.java | 15 ++++++--------- .../main/java/io/grpc/xds/XdsServerWrapper.java | 13 +++---------- .../xds/XdsClientWrapperForServerSdsTestMisc.java | 4 +++- .../io/grpc/xds/XdsSecurityClientServerTest.java | 5 +++-- .../java/io/grpc/xds/XdsServerTestHelper.java | 10 +++++----- .../java/io/grpc/xds/XdsServerWrapperTest.java | 5 +++-- 8 files changed, 31 insertions(+), 32 deletions(-) diff --git a/cronet/build.gradle b/cronet/build.gradle index 1a327f9f966..646d28323bd 100644 --- a/cronet/build.gradle +++ b/cronet/build.gradle @@ -57,7 +57,7 @@ dependencies { task javadocs(type: Javadoc) { source = android.sourceSets.main.java.srcDirs - classpath += files(android.getBootClasspath()) + // classpath += files(android.getBootClasspath()) classpath += files({ android.libraryVariants.collect { variant -> variant.javaCompileProvider.get().classpath diff --git a/xds/src/main/java/io/grpc/xds/EnvoyServerProtoData.java b/xds/src/main/java/io/grpc/xds/EnvoyServerProtoData.java index ae5b3c5b1c9..fd2a1d2a069 100644 --- a/xds/src/main/java/io/grpc/xds/EnvoyServerProtoData.java +++ b/xds/src/main/java/io/grpc/xds/EnvoyServerProtoData.java @@ -22,6 +22,7 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ImmutableList; import com.google.protobuf.util.Durations; +import io.envoyproxy.envoy.config.core.v3.SocketAddress.Protocol; import io.envoyproxy.envoy.extensions.transport_sockets.tls.v3.CommonTlsContext; import io.grpc.Internal; import io.grpc.xds.client.EnvoyProtoData; @@ -248,13 +249,17 @@ abstract static class Listener { @Nullable abstract FilterChain defaultFilterChain(); + @Nullable + abstract Protocol protocol(); + static Listener create( String name, @Nullable String address, ImmutableList filterChains, - @Nullable FilterChain defaultFilterChain) { + @Nullable FilterChain defaultFilterChain, + @Nullable Protocol protocol) { return new AutoValue_EnvoyServerProtoData_Listener(name, address, filterChains, - defaultFilterChain); + defaultFilterChain, protocol); } } diff --git a/xds/src/main/java/io/grpc/xds/XdsListenerResource.java b/xds/src/main/java/io/grpc/xds/XdsListenerResource.java index 8fb2c858313..041b659b4c3 100644 --- a/xds/src/main/java/io/grpc/xds/XdsListenerResource.java +++ b/xds/src/main/java/io/grpc/xds/XdsListenerResource.java @@ -162,19 +162,16 @@ static EnvoyServerProtoData.Listener parseServerSideListener( } String address = null; + SocketAddress socketAddress = null; if (proto.getAddress().hasSocketAddress()) { - SocketAddress socketAddress = proto.getAddress().getSocketAddress(); + socketAddress = proto.getAddress().getSocketAddress(); address = socketAddress.getAddress(); - if (address.trim().isEmpty()) { + if (address.isEmpty()) { throw new ResourceInvalidException("Invalid address: Empty address is not allowed."); } - if (socketAddress.hasNamedPort()) { - throw new ResourceInvalidException("NAMED_PORT is not supported in gRPC."); - } switch (socketAddress.getPortSpecifierCase()) { case NAMED_PORT: - address = address + ":" + socketAddress.getNamedPort(); - break; + throw new ResourceInvalidException("NAMED_PORT is not supported in gRPC."); case PORT_VALUE: address = address + ":" + socketAddress.getPortValue(); break; @@ -215,8 +212,8 @@ static EnvoyServerProtoData.Listener parseServerSideListener( null, certProviderInstances, args); } - return EnvoyServerProtoData.Listener.create( - proto.getName(), address, filterChains.build(), defaultFilterChain); + return EnvoyServerProtoData.Listener.create(proto.getName(), address, filterChains.build(), + defaultFilterChain, socketAddress == null ? null : socketAddress.getProtocol()); } @VisibleForTesting diff --git a/xds/src/main/java/io/grpc/xds/XdsServerWrapper.java b/xds/src/main/java/io/grpc/xds/XdsServerWrapper.java index 546eb6644f2..e6d7ee6f51a 100644 --- a/xds/src/main/java/io/grpc/xds/XdsServerWrapper.java +++ b/xds/src/main/java/io/grpc/xds/XdsServerWrapper.java @@ -27,6 +27,7 @@ import com.google.common.net.HostAndPort; import com.google.common.net.InetAddresses; import com.google.common.util.concurrent.SettableFuture; +import io.envoyproxy.envoy.config.core.v3.SocketAddress.Protocol; import io.grpc.Attributes; import io.grpc.InternalServerInterceptors; import io.grpc.Metadata; @@ -391,17 +392,9 @@ public void onChanged(final LdsUpdate update) { return; } - boolean isUdpListener = false; - for (FilterChain filterChain : update.listener().filterChains()) { - String transportProtocol = filterChain.filterChainMatch().transportProtocol(); - if (transportProtocol != null && !"raw_buffer".equals(transportProtocol)) { - isUdpListener = true; - break; - } - } - String ldsAddress = update.listener().address(); - if (!isUdpListener && ldsAddress != null && !ipAddressesMatch(ldsAddress)) { + if (ldsAddress != null && update.listener().protocol() == Protocol.TCP + && !ipAddressesMatch(ldsAddress)) { handleConfigNotFoundOrMismatch( Status.UNKNOWN.withDescription( String.format( diff --git a/xds/src/test/java/io/grpc/xds/XdsClientWrapperForServerSdsTestMisc.java b/xds/src/test/java/io/grpc/xds/XdsClientWrapperForServerSdsTestMisc.java index f0e679e842d..ff97afe6916 100644 --- a/xds/src/test/java/io/grpc/xds/XdsClientWrapperForServerSdsTestMisc.java +++ b/xds/src/test/java/io/grpc/xds/XdsClientWrapperForServerSdsTestMisc.java @@ -32,6 +32,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.util.concurrent.SettableFuture; +import io.envoyproxy.envoy.config.core.v3.SocketAddress.Protocol; import io.grpc.Server; import io.grpc.ServerBuilder; import io.grpc.Status; @@ -167,7 +168,8 @@ public void run() { "listener1", "0.0.0.0:7000", ImmutableList.of(), - null); + null, + Protocol.TCP); LdsUpdate listenerUpdate = LdsUpdate.forTcpListener(tcpListener); xdsClient.ldsWatcher.onChanged(listenerUpdate); verify(listener, timeout(5000)).onServing(); diff --git a/xds/src/test/java/io/grpc/xds/XdsSecurityClientServerTest.java b/xds/src/test/java/io/grpc/xds/XdsSecurityClientServerTest.java index 96c443a4683..271e7191e4c 100644 --- a/xds/src/test/java/io/grpc/xds/XdsSecurityClientServerTest.java +++ b/xds/src/test/java/io/grpc/xds/XdsSecurityClientServerTest.java @@ -35,6 +35,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.util.concurrent.SettableFuture; +import io.envoyproxy.envoy.config.core.v3.SocketAddress.Protocol; import io.envoyproxy.envoy.extensions.transport_sockets.tls.v3.CertificateValidationContext; import io.grpc.Attributes; import io.grpc.EquivalentAddressGroup; @@ -488,7 +489,7 @@ public void mtlsClientServer_changeServerContext_expectException() DownstreamTlsContext downstreamTlsContext = CommonTlsContextTestsUtil.buildDownstreamTlsContext( "cert-instance-name2", true, true); - EnvoyServerProtoData.Listener listener = buildListener("listener1", "0.0.0.0", + EnvoyServerProtoData.Listener listener = buildListener("listener1", "0.0.0.0:0", downstreamTlsContext, tlsContextManagerForServer); xdsClient.deliverLdsUpdate(LdsUpdate.forTcpListener(listener)); @@ -633,7 +634,7 @@ static EnvoyServerProtoData.Listener buildListener( "filter-chain-foo", filterChainMatch, httpConnectionManager, tlsContext, tlsContextManager); EnvoyServerProtoData.Listener listener = EnvoyServerProtoData.Listener.create( - name, address, ImmutableList.of(defaultFilterChain), null); + name, address, ImmutableList.of(defaultFilterChain), null, Protocol.TCP); return listener; } diff --git a/xds/src/test/java/io/grpc/xds/XdsServerTestHelper.java b/xds/src/test/java/io/grpc/xds/XdsServerTestHelper.java index 87dcc568b33..94353cc886d 100644 --- a/xds/src/test/java/io/grpc/xds/XdsServerTestHelper.java +++ b/xds/src/test/java/io/grpc/xds/XdsServerTestHelper.java @@ -21,6 +21,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.util.concurrent.SettableFuture; +import io.envoyproxy.envoy.config.core.v3.SocketAddress.Protocol; import io.grpc.InsecureChannelCredentials; import io.grpc.MetricRecorder; import io.grpc.internal.ObjectPool; @@ -129,9 +130,8 @@ static EnvoyServerProtoData.Listener buildTestListener( EnvoyServerProtoData.FilterChain defaultFilterChain = EnvoyServerProtoData.FilterChain.create( "filter-chain-bar", defaultFilterChainMatch, httpConnectionManager, tlsContextForDefaultFilterChain, tlsContextManager); - EnvoyServerProtoData.Listener listener = - EnvoyServerProtoData.Listener.create( - name, address, ImmutableList.of(filterChain1), defaultFilterChain); + EnvoyServerProtoData.Listener listener = EnvoyServerProtoData.Listener.create( + name, address, ImmutableList.of(filterChain1), defaultFilterChain, Protocol.TCP); return listener; } @@ -298,8 +298,8 @@ void deliverLdsUpdate(LdsUpdate ldsUpdate) { void deliverLdsUpdate( List filterChains, @Nullable FilterChain defaultFilterChain) { - deliverLdsUpdate(LdsUpdate.forTcpListener(Listener.create( - "listener", "0.0.0.0:1", ImmutableList.copyOf(filterChains), defaultFilterChain))); + deliverLdsUpdate(LdsUpdate.forTcpListener(Listener.create("listener", "0.0.0.0:1", + ImmutableList.copyOf(filterChains), defaultFilterChain, Protocol.TCP))); } void deliverLdsUpdate(FilterChain filterChain, @Nullable FilterChain defaultFilterChain) { diff --git a/xds/src/test/java/io/grpc/xds/XdsServerWrapperTest.java b/xds/src/test/java/io/grpc/xds/XdsServerWrapperTest.java index cc56d44b341..7035bff4901 100644 --- a/xds/src/test/java/io/grpc/xds/XdsServerWrapperTest.java +++ b/xds/src/test/java/io/grpc/xds/XdsServerWrapperTest.java @@ -37,6 +37,7 @@ import com.google.common.collect.ImmutableMap; import com.google.common.net.InetAddresses; import com.google.common.util.concurrent.SettableFuture; +import io.envoyproxy.envoy.config.core.v3.SocketAddress.Protocol; import io.grpc.Attributes; import io.grpc.InsecureChannelCredentials; import io.grpc.Metadata; @@ -575,7 +576,7 @@ public void run() { LdsUpdate listenerUpdate = LdsUpdate.forTcpListener( Listener.create("listener", "20.3.4.5:1", - ImmutableList.copyOf(Collections.singletonList(filterChain)), null)); + ImmutableList.copyOf(Collections.singletonList(filterChain)), null, Protocol.TCP)); xdsClient.deliverLdsUpdate(listenerUpdate); verify(listener, timeout(10000)).onNotServing(any()); } @@ -1862,7 +1863,7 @@ private static FilterChainMatch createMatch() { EnvoyServerProtoData.ConnectionSourceType.ANY, ImmutableList.of(), ImmutableList.of(), - "raw_buffer"); + ""); } private static FilterChainMatch createMatchSrcIp(String srcCidr) { From 6873d59528e8bd1821ee3e88936b54148e62999b Mon Sep 17 00:00:00 2001 From: MV Shiva Prasad Date: Wed, 19 Mar 2025 18:06:15 +0000 Subject: [PATCH 11/12] Final code --- cronet/build.gradle | 2 +- xds/src/main/java/io/grpc/xds/XdsServerWrapper.java | 5 +++-- xds/src/test/java/io/grpc/xds/ControlPlaneRule.java | 4 ++++ 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/cronet/build.gradle b/cronet/build.gradle index 646d28323bd..1a327f9f966 100644 --- a/cronet/build.gradle +++ b/cronet/build.gradle @@ -57,7 +57,7 @@ dependencies { task javadocs(type: Javadoc) { source = android.sourceSets.main.java.srcDirs - // classpath += files(android.getBootClasspath()) + classpath += files(android.getBootClasspath()) classpath += files({ android.libraryVariants.collect { variant -> variant.javaCompileProvider.get().classpath diff --git a/xds/src/main/java/io/grpc/xds/XdsServerWrapper.java b/xds/src/main/java/io/grpc/xds/XdsServerWrapper.java index e6d7ee6f51a..a9b62cb9b25 100644 --- a/xds/src/main/java/io/grpc/xds/XdsServerWrapper.java +++ b/xds/src/main/java/io/grpc/xds/XdsServerWrapper.java @@ -393,8 +393,9 @@ public void onChanged(final LdsUpdate update) { } String ldsAddress = update.listener().address(); - if (ldsAddress != null && update.listener().protocol() == Protocol.TCP - && !ipAddressesMatch(ldsAddress)) { + int x = update.listener().protocol().getNumber(); + if (ldsAddress == null || update.listener().protocol() != Protocol.TCP + || !ipAddressesMatch(ldsAddress)) { handleConfigNotFoundOrMismatch( Status.UNKNOWN.withDescription( String.format( diff --git a/xds/src/test/java/io/grpc/xds/ControlPlaneRule.java b/xds/src/test/java/io/grpc/xds/ControlPlaneRule.java index 39761912ea5..8c10627d153 100644 --- a/xds/src/test/java/io/grpc/xds/ControlPlaneRule.java +++ b/xds/src/test/java/io/grpc/xds/ControlPlaneRule.java @@ -366,10 +366,14 @@ static Listener buildServerListener() { .setFilterChainMatch(filterChainMatch) .addFilters(filter) .build(); + Address address = Address.newBuilder() + .setSocketAddress(SocketAddress.newBuilder().setAddress("0.0.0.0").setPortValue(0)) + .build(); return Listener.newBuilder() .setName(SERVER_LISTENER_TEMPLATE_NO_REPLACEMENT) .setTrafficDirection(TrafficDirection.INBOUND) .addFilterChains(filterChain) + .setAddress(address) .build(); } } From b3908f12d0fdfe1af731af9b6e1502cf447e0c13 Mon Sep 17 00:00:00 2001 From: MV Shiva Prasad Date: Wed, 19 Mar 2025 18:42:21 +0000 Subject: [PATCH 12/12] remove unwanted line --- xds/src/main/java/io/grpc/xds/XdsServerWrapper.java | 1 - 1 file changed, 1 deletion(-) diff --git a/xds/src/main/java/io/grpc/xds/XdsServerWrapper.java b/xds/src/main/java/io/grpc/xds/XdsServerWrapper.java index a9b62cb9b25..4049ee8fbb7 100644 --- a/xds/src/main/java/io/grpc/xds/XdsServerWrapper.java +++ b/xds/src/main/java/io/grpc/xds/XdsServerWrapper.java @@ -393,7 +393,6 @@ public void onChanged(final LdsUpdate update) { } String ldsAddress = update.listener().address(); - int x = update.listener().protocol().getNumber(); if (ldsAddress == null || update.listener().protocol() != Protocol.TCP || !ipAddressesMatch(ldsAddress)) { handleConfigNotFoundOrMismatch(