Skip to content

Commit

Permalink
xds: refactor usage of Node in Bootstrap to EnvoyProtoData.Node
Browse files Browse the repository at this point in the history
In preparation for xds-v3 support.
  • Loading branch information
dapengzhang0 authored and dfawley committed Jan 15, 2021
1 parent 68d8b16 commit 4aa2957
Show file tree
Hide file tree
Showing 17 changed files with 520 additions and 155 deletions.
69 changes: 9 additions & 60 deletions xds/src/main/java/io/grpc/xds/Bootstrapper.java
Expand Up @@ -17,17 +17,13 @@
package io.grpc.xds;

import com.google.common.annotations.VisibleForTesting;
import com.google.protobuf.ListValue;
import com.google.protobuf.NullValue;
import com.google.protobuf.Struct;
import com.google.protobuf.Value;
import io.envoyproxy.envoy.api.v2.core.Locality;
import io.envoyproxy.envoy.api.v2.core.Node;
import io.grpc.Internal;
import io.grpc.internal.GrpcUtil;
import io.grpc.internal.GrpcUtil.GrpcBuildVersion;
import io.grpc.internal.JsonParser;
import io.grpc.internal.JsonUtil;
import io.grpc.xds.EnvoyProtoData.Locality;
import io.grpc.xds.EnvoyProtoData.Node;
import io.grpc.xds.XdsLogger.XdsLogLevel;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
Expand Down Expand Up @@ -133,34 +129,24 @@ static BootstrapInfo parseConfig(String rawData) throws IOException {
}
Map<String, ?> metadata = JsonUtil.getObject(rawNode, "metadata");
if (metadata != null) {
Struct.Builder structBuilder = Struct.newBuilder();
for (Map.Entry<String, ?> entry : metadata.entrySet()) {
logger.log(
XdsLogLevel.INFO,
"Node metadata field {0}: {1}", entry.getKey(), entry.getValue());
structBuilder.putFields(entry.getKey(), convertToValue(entry.getValue()));
}
nodeBuilder.setMetadata(structBuilder);
nodeBuilder.setMetadata(metadata);
}
Map<String, ?> rawLocality = JsonUtil.getObject(rawNode, "locality");
if (rawLocality != null) {
Locality.Builder localityBuilder = Locality.newBuilder();
if (rawLocality.containsKey("region")) {
String region = JsonUtil.getString(rawLocality, "region");
String region = JsonUtil.getString(rawLocality, "region");
String zone = JsonUtil.getString(rawLocality, "zone");
String subZone = JsonUtil.getString(rawLocality, "sub_zone");
if (region != null) {
logger.log(XdsLogLevel.INFO, "Locality region: {0}", region);
localityBuilder.setRegion(region);
}
if (rawLocality.containsKey("zone")) {
String zone = JsonUtil.getString(rawLocality, "zone");
logger.log(XdsLogLevel.INFO, "Locality zone: {0}", zone);
localityBuilder.setZone(zone);
}
if (rawLocality.containsKey("sub_zone")) {
String subZone = JsonUtil.getString(rawLocality, "sub_zone");
logger.log(XdsLogLevel.INFO, "Locality sub_zone: {0}", subZone);
localityBuilder.setSubZone(subZone);
}
nodeBuilder.setLocality(localityBuilder);
Locality locality = new Locality(region, zone, subZone);
nodeBuilder.setLocality(locality);
}
}
GrpcBuildVersion buildVersion = GrpcUtil.getGrpcBuildVersion();
Expand All @@ -173,43 +159,6 @@ static BootstrapInfo parseConfig(String rawData) throws IOException {
return new BootstrapInfo(servers, nodeBuilder.build());
}

/**
* Converts Java representation of the given JSON value to protobuf's {@link
* com.google.protobuf.Value} representation.
*
* <p>The given {@code rawObject} must be a valid JSON value in Java representation, which is
* either a {@code Map<String, ?>}, {@code List<?>}, {@code String}, {@code Double},
* {@code Boolean}, or {@code null}.
*/
private static Value convertToValue(Object rawObject) {
Value.Builder valueBuilder = Value.newBuilder();
if (rawObject == null) {
valueBuilder.setNullValue(NullValue.NULL_VALUE);
} else if (rawObject instanceof Double) {
valueBuilder.setNumberValue((Double) rawObject);
} else if (rawObject instanceof String) {
valueBuilder.setStringValue((String) rawObject);
} else if (rawObject instanceof Boolean) {
valueBuilder.setBoolValue((Boolean) rawObject);
} else if (rawObject instanceof Map) {
Struct.Builder structBuilder = Struct.newBuilder();
@SuppressWarnings("unchecked")
Map<String, ?> map = (Map<String, ?>) rawObject;
for (Map.Entry<String, ?> entry : map.entrySet()) {
structBuilder.putFields(entry.getKey(), convertToValue(entry.getValue()));
}
valueBuilder.setStructValue(structBuilder);
} else if (rawObject instanceof List) {
ListValue.Builder listBuilder = ListValue.newBuilder();
List<?> list = (List<?>) rawObject;
for (Object obj : list) {
listBuilder.addValues(convertToValue(obj));
}
valueBuilder.setListValue(listBuilder);
}
return valueBuilder.build();
}

/**
* Data class containing channel credentials configurations for xDS protocol communication.
*/
Expand Down
2 changes: 1 addition & 1 deletion xds/src/main/java/io/grpc/xds/EdsLoadBalancer.java
Expand Up @@ -22,7 +22,6 @@
import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import io.envoyproxy.envoy.api.v2.core.Node;
import io.grpc.Attributes;
import io.grpc.InternalLogId;
import io.grpc.LoadBalancer;
Expand All @@ -38,6 +37,7 @@
import io.grpc.xds.EnvoyProtoData.DropOverload;
import io.grpc.xds.EnvoyProtoData.Locality;
import io.grpc.xds.EnvoyProtoData.LocalityLbEndpoints;
import io.grpc.xds.EnvoyProtoData.Node;
import io.grpc.xds.LocalityStore.LocalityStoreFactory;
import io.grpc.xds.XdsClient.EndpointUpdate;
import io.grpc.xds.XdsClient.EndpointWatcher;
Expand Down

0 comments on commit 4aa2957

Please sign in to comment.