Skip to content

Commit

Permalink
Add virtual host to XdsConfig as per spec
Browse files Browse the repository at this point in the history
  • Loading branch information
larry-safran committed Jan 21, 2025
1 parent f99fc56 commit 482cd9d
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 13 deletions.
37 changes: 27 additions & 10 deletions xds/src/main/java/io/grpc/xds/XdsConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,20 +35,23 @@
final class XdsConfig {
private final LdsUpdate listener;
private final RdsUpdate route;
private final VirtualHost virtualHost;
private final ImmutableMap<String, StatusOr<XdsClusterConfig>> clusters;
private final int hashCode;

XdsConfig(LdsUpdate listener, RdsUpdate route, Map<String, StatusOr<XdsClusterConfig>> clusters) {
this(listener, route, ImmutableMap.copyOf(clusters));
XdsConfig(LdsUpdate listener, RdsUpdate route, Map<String, StatusOr<XdsClusterConfig>> clusters,
VirtualHost virtualHost) {
this(listener, route, virtualHost, ImmutableMap.copyOf(clusters));
}

public XdsConfig(LdsUpdate listener, RdsUpdate route, ImmutableMap<String,
StatusOr<XdsClusterConfig>> clusters) {
public XdsConfig(LdsUpdate listener, RdsUpdate route, VirtualHost virtualHost,
ImmutableMap<String, StatusOr<XdsClusterConfig>> 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
Expand All @@ -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
Expand All @@ -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();
}

Expand All @@ -85,6 +92,10 @@ public RdsUpdate getRoute() {
return route;
}

public VirtualHost getVirtualHost() {
return virtualHost;
}

public ImmutableMap<String, StatusOr<XdsClusterConfig>> getClusters() {
return clusters;
}
Expand Down Expand Up @@ -144,6 +155,7 @@ static final class XdsConfigBuilder {
private LdsUpdate listener;
private RdsUpdate route;
private Map<String, StatusOr<XdsClusterConfig>> clusters = new HashMap<>();
private VirtualHost virtualHost;

XdsConfigBuilder setListener(LdsUpdate listener) {
this.listener = checkNotNull(listener, "listener");
Expand All @@ -162,10 +174,15 @@ XdsConfigBuilder addCluster(String name, StatusOr<XdsClusterConfig> 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);
}
}

Expand Down
7 changes: 7 additions & 0 deletions xds/src/main/java/io/grpc/xds/XdsDependencyManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -278,6 +283,8 @@ private XdsConfig buildConfig() {
.map(watcher -> (RdsWatcher) watcher)
.forEach(watcher -> builder.setRoute(watcher.getData().getValue()));

builder.setVirtualHost(activeVirtualHost);

Map<String, ? extends XdsWatcherBase<?>> edsWatchers =
resourceWatchers.get(ENDPOINT_RESOURCE).watchers;
Map<String, ? extends XdsWatcherBase<?>> cdsWatchers =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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++;
Expand Down
10 changes: 8 additions & 2 deletions xds/src/test/java/io/grpc/xds/XdsTestUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -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<Locality, LocalityLbEndpoints> lbEndpointsMap = new HashMap<>();
LbEndpoint lbEndpoint =
Expand All @@ -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();
Expand Down Expand Up @@ -328,7 +334,7 @@ static void addEdsClusters(Map<String, Message> clusterMap, Map<String, Message>
}

static Listener buildInlineClientListener(String rdsName, String clusterName, String serverName) {
HttpFilter
HttpFilter
httpFilter = HttpFilter.newBuilder()
.setName(serverName)
.setTypedConfig(Any.pack(Router.newBuilder().build()))
Expand Down

0 comments on commit 482cd9d

Please sign in to comment.