diff --git a/xds/src/main/java/io/grpc/xds/XdsConfig.java b/xds/src/main/java/io/grpc/xds/XdsConfig.java index a7f6e720609..999ee0d4b0c 100644 --- a/xds/src/main/java/io/grpc/xds/XdsConfig.java +++ b/xds/src/main/java/io/grpc/xds/XdsConfig.java @@ -35,20 +35,23 @@ final class XdsConfig { private final LdsUpdate listener; private final RdsUpdate route; + private final VirtualHost virtualHost; private final ImmutableMap> clusters; private final int hashCode; - XdsConfig(LdsUpdate listener, RdsUpdate route, Map> clusters) { - this(listener, route, ImmutableMap.copyOf(clusters)); + XdsConfig(LdsUpdate listener, RdsUpdate route, Map> clusters, + VirtualHost virtualHost) { + this(listener, route, virtualHost, ImmutableMap.copyOf(clusters)); } - public XdsConfig(LdsUpdate listener, RdsUpdate route, ImmutableMap> clusters) { + public XdsConfig(LdsUpdate listener, RdsUpdate route, VirtualHost virtualHost, + ImmutableMap> clusters) { this.listener = listener; this.route = route; + this.virtualHost = virtualHost; this.clusters = clusters; - hashCode = Objects.hash(listener, route, clusters); + hashCode = Objects.hash(listener, route, virtualHost, clusters); } @Override @@ -60,7 +63,8 @@ public boolean equals(Object obj) { XdsConfig o = (XdsConfig) obj; return hashCode() == o.hashCode() && Objects.equals(listener, o.listener) - && Objects.equals(route, o.route) && Objects.equals(clusters, o.clusters); + && Objects.equals(route, o.route) && Objects.equals(virtualHost, o.virtualHost) + && Objects.equals(clusters, o.clusters); } @Override @@ -71,9 +75,12 @@ public int hashCode() { @Override public String toString() { StringBuilder builder = new StringBuilder(); - builder.append("XdsConfig{listener=").append(listener) - .append(", route=").append(route) - .append(", clusters=").append(clusters).append("}"); + builder.append("XdsConfig{") + .append("\n listener=").append(listener) + .append(",\n route=").append(route) + .append(",\n virtualHost=").append(virtualHost) + .append(",\n clusters=").append(clusters) + .append("\n}"); return builder.toString(); } @@ -85,6 +92,10 @@ public RdsUpdate getRoute() { return route; } + public VirtualHost getVirtualHost() { + return virtualHost; + } + public ImmutableMap> getClusters() { return clusters; } @@ -144,6 +155,7 @@ static final class XdsConfigBuilder { private LdsUpdate listener; private RdsUpdate route; private Map> clusters = new HashMap<>(); + private VirtualHost virtualHost; XdsConfigBuilder setListener(LdsUpdate listener) { this.listener = checkNotNull(listener, "listener"); @@ -162,10 +174,15 @@ XdsConfigBuilder addCluster(String name, StatusOr clusterConfi return this; } + XdsConfigBuilder setVirtualHost(VirtualHost virtualHost) { + this.virtualHost = checkNotNull(virtualHost, "virtualHost"); + return this; + } + XdsConfig build() { checkNotNull(listener, "listener"); checkNotNull(route, "route"); - return new XdsConfig(listener, route, clusters); + return new XdsConfig(listener, route, clusters, virtualHost); } } diff --git a/xds/src/main/java/io/grpc/xds/XdsDependencyManager.java b/xds/src/main/java/io/grpc/xds/XdsDependencyManager.java index ca58d6fd491..e0339b6b99a 100644 --- a/xds/src/main/java/io/grpc/xds/XdsDependencyManager.java +++ b/xds/src/main/java/io/grpc/xds/XdsDependencyManager.java @@ -262,10 +262,15 @@ private XdsConfig buildConfig() { // Iterate watchers and build the XdsConfig // Will only be 1 listener and 1 route resource + VirtualHost activeVirtualHost = getActiveVirtualHost(); for (XdsWatcherBase xdsWatcherBase : resourceWatchers.get(XdsListenerResource.getInstance()).watchers.values()) { XdsListenerResource.LdsUpdate ldsUpdate = ((LdsWatcher) xdsWatcherBase).getData().getValue(); builder.setListener(ldsUpdate); + if (activeVirtualHost == null) { + activeVirtualHost = RoutingUtils.findVirtualHostForHostName( + ldsUpdate.httpConnectionManager().virtualHosts(), dataPlaneAuthority); + } if (ldsUpdate.httpConnectionManager() != null && ldsUpdate.httpConnectionManager().virtualHosts() != null) { @@ -278,6 +283,8 @@ private XdsConfig buildConfig() { .map(watcher -> (RdsWatcher) watcher) .forEach(watcher -> builder.setRoute(watcher.getData().getValue())); + builder.setVirtualHost(activeVirtualHost); + Map> edsWatchers = resourceWatchers.get(ENDPOINT_RESOURCE).watchers; Map> cdsWatchers = diff --git a/xds/src/test/java/io/grpc/xds/XdsDependencyManagerTest.java b/xds/src/test/java/io/grpc/xds/XdsDependencyManagerTest.java index 0ecc7d4bd1d..675428d0b22 100644 --- a/xds/src/test/java/io/grpc/xds/XdsDependencyManagerTest.java +++ b/xds/src/test/java/io/grpc/xds/XdsDependencyManagerTest.java @@ -564,7 +564,6 @@ private static class TestWatcher implements XdsDependencyManager.XdsConfigWatche @Override public void onUpdate(XdsConfig config) { - System.out.println("\nConfig changed: " + config + "\n----------------------------\n"); log.fine("Config changed: " + config); lastConfig = config; numUpdates++; diff --git a/xds/src/test/java/io/grpc/xds/XdsTestUtils.java b/xds/src/test/java/io/grpc/xds/XdsTestUtils.java index dace216483e..7f5ec0b27c6 100644 --- a/xds/src/test/java/io/grpc/xds/XdsTestUtils.java +++ b/xds/src/test/java/io/grpc/xds/XdsTestUtils.java @@ -250,6 +250,10 @@ static XdsConfig getDefaultXdsConfig(String serverHostName) XdsRouteConfigureResource.RdsUpdate rdsUpdate = XdsRouteConfigureResource.getInstance().doParse(args, routeConfiguration); + // Take advantage of knowing that there is only 1 virtual host in the route configuration + assertThat(rdsUpdate.virtualHosts).hasSize(1); + VirtualHost virtualHost = rdsUpdate.virtualHosts.get(0); + // Need to create endpoints to create locality endpoints map to create edsUpdate Map lbEndpointsMap = new HashMap<>(); LbEndpoint lbEndpoint = @@ -267,8 +271,10 @@ static XdsConfig getDefaultXdsConfig(String serverHostName) XdsConfig.XdsClusterConfig clusterConfig = new XdsConfig.XdsClusterConfig( CLUSTER_NAME, cdsUpdate, StatusOr.fromValue(edsUpdate)); - builder.setListener(ldsUpdate) + builder + .setListener(ldsUpdate) .setRoute(rdsUpdate) + .setVirtualHost(virtualHost) .addCluster(CLUSTER_NAME, StatusOr.fromValue(clusterConfig)); return builder.build(); @@ -328,7 +334,7 @@ static void addEdsClusters(Map clusterMap, Map } static Listener buildInlineClientListener(String rdsName, String clusterName, String serverName) { - HttpFilter + HttpFilter httpFilter = HttpFilter.newBuilder() .setName(serverName) .setTypedConfig(Any.pack(Router.newBuilder().build()))