Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions xds/src/main/java/io/grpc/xds/MessagePrinter.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@
import io.envoyproxy.envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager;
import io.envoyproxy.envoy.extensions.load_balancing_policies.round_robin.v3.RoundRobin;
import io.envoyproxy.envoy.extensions.load_balancing_policies.wrr_locality.v3.WrrLocality;
import io.envoyproxy.envoy.extensions.transport_sockets.http_11_proxy.v3.Http11ProxyUpstreamTransport;
import io.envoyproxy.envoy.extensions.transport_sockets.raw_buffer.v3.RawBuffer;
import io.envoyproxy.envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext;
import io.envoyproxy.envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext;
import io.envoyproxy.envoy.service.discovery.v3.Resource;
Expand Down Expand Up @@ -72,8 +74,12 @@ private static JsonFormat.Printer newPrinter() {
.add(ClusterConfig.getDescriptor())
.add(ClusterLoadAssignment.getDescriptor())
.add(WrrLocality.getDescriptor())
.add(TypedStruct.getDescriptor())
.add(RoundRobin.getDescriptor());
.add(RoundRobin.getDescriptor())
// Transports
.add(Http11ProxyUpstreamTransport.getDescriptor())
.add(RawBuffer.getDescriptor())
// Always last, guarding the semicolon.
.add(TypedStruct.getDescriptor());
try {
@SuppressWarnings("unchecked")
Class<? extends Message> routeLookupClusterSpecifierClass =
Expand Down
33 changes: 26 additions & 7 deletions xds/src/main/java/io/grpc/xds/XdsClusterResource.java
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
import io.envoyproxy.envoy.extensions.transport_sockets.http_11_proxy.v3.Http11ProxyUpstreamTransport;
import io.envoyproxy.envoy.extensions.transport_sockets.tls.v3.CertificateValidationContext;
import io.envoyproxy.envoy.extensions.transport_sockets.tls.v3.CommonTlsContext;
import io.grpc.InternalLogId;
import io.grpc.LoadBalancerRegistry;
import io.grpc.NameResolver;
import io.grpc.internal.GrpcUtil;
Expand All @@ -50,6 +51,8 @@
import io.grpc.xds.XdsClusterResource.CdsUpdate;
import io.grpc.xds.client.BackendMetricPropagation;
import io.grpc.xds.client.XdsClient.ResourceUpdate;
import io.grpc.xds.client.XdsLogger;
import io.grpc.xds.client.XdsLogger.XdsLogLevel;
import io.grpc.xds.client.XdsResourceType;
import io.grpc.xds.internal.security.CommonTlsContextUtil;
import java.util.List;
Expand Down Expand Up @@ -83,8 +86,12 @@ class XdsClusterResource extends XdsResourceType<CdsUpdate> {
static final String TRANSPORT_SOCKET_NAME_HTTP11_PROXY =
"type.googleapis.com/envoy.extensions.transport_sockets.http_11_proxy.v3"
+ ".Http11ProxyUpstreamTransport";
static final String TRANSPORT_SOCKET_NAME_RAW_BUFFER =
"type.googleapis.com/envoy.extensions.transport_sockets.raw_buffer.v3.RawBuffer";
private final LoadBalancerRegistry loadBalancerRegistry
= LoadBalancerRegistry.getDefaultRegistry();
private static final XdsLogger logger = XdsLogger.withLogId(
InternalLogId.allocate("xds-cluster-resource", "sergiitk"));

private static final XdsClusterResource instance = new XdsClusterResource();

Expand Down Expand Up @@ -260,15 +267,27 @@ private static StructOrError<CdsUpdate.Builder> parseNonAggregateCluster(
boolean hasTransportSocket = cluster.hasTransportSocket();
TransportSocket transportSocket = cluster.getTransportSocket();

if (hasTransportSocket && !TRANSPORT_SOCKET_NAME_TLS.equals(transportSocket.getName())
&& !(isEnabledXdsHttpConnect
&& TRANSPORT_SOCKET_NAME_HTTP11_PROXY.equals(transportSocket.getName()))) {
return StructOrError.fromError(
"transport-socket with name " + transportSocket.getName() + " not supported.");

String transportSocketName = hasTransportSocket ? transportSocket.getName() : "<invalid>";
boolean socketIsTls = transportSocketName.equals(TRANSPORT_SOCKET_NAME_TLS);
boolean socketIsH1Proxy = transportSocketName.equals(TRANSPORT_SOCKET_NAME_HTTP11_PROXY);
boolean socketIsH1ProxyAndSupported = isEnabledXdsHttpConnect && socketIsH1Proxy;

if (hasTransportSocket && !(socketIsTls || socketIsH1ProxyAndSupported)) {
String errMsg = "transport-socket with name " + transportSocketName + " not supported";

@SuppressWarnings("AlreadyChecked") // todo remove
String extraErrorMsg = errMsg
+ ", socketIsTls=" + socketIsTls
+ ", socketIsH1Proxy=" + socketIsH1Proxy
+ ", isEnabledXdsHttpConnect=" + isEnabledXdsHttpConnect
+ ", socketIsH1ProxyAndSupported=" + socketIsH1ProxyAndSupported + ".";
logger.log(XdsLogLevel.ERROR, extraErrorMsg);

return StructOrError.fromError(errMsg + ".");
}

if (hasTransportSocket && isEnabledXdsHttpConnect
&& TRANSPORT_SOCKET_NAME_HTTP11_PROXY.equals(transportSocket.getName())) {
if (hasTransportSocket && socketIsH1ProxyAndSupported) {
isHttp11ProxyAvailable = true;
try {
Http11ProxyUpstreamTransport wrappedTransportSocket = transportSocket
Expand Down
46 changes: 46 additions & 0 deletions xds/src/test/java/io/grpc/xds/GrpcXdsClientImplDataTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import static com.google.common.truth.Truth.assertThat;
import static io.envoyproxy.envoy.config.route.v3.RouteAction.ClusterSpecifierCase.CLUSTER_SPECIFIER_PLUGIN;
import static io.grpc.xds.XdsClusterResource.TRANSPORT_SOCKET_NAME_HTTP11_PROXY;
import static io.grpc.xds.XdsClusterResource.TRANSPORT_SOCKET_NAME_RAW_BUFFER;
import static io.grpc.xds.XdsEndpointResource.GRPC_EXPERIMENTAL_XDS_DUALSTACK_ENDPOINTS;
import static org.junit.Assert.assertThrows;
import static org.junit.Assert.fail;
Expand Down Expand Up @@ -97,6 +98,7 @@
import io.envoyproxy.envoy.extensions.load_balancing_policies.client_side_weighted_round_robin.v3.ClientSideWeightedRoundRobin;
import io.envoyproxy.envoy.extensions.load_balancing_policies.wrr_locality.v3.WrrLocality;
import io.envoyproxy.envoy.extensions.transport_sockets.http_11_proxy.v3.Http11ProxyUpstreamTransport;
import io.envoyproxy.envoy.extensions.transport_sockets.raw_buffer.v3.RawBuffer;
import io.envoyproxy.envoy.extensions.transport_sockets.tls.v3.CertificateProviderPluginInstance;
import io.envoyproxy.envoy.extensions.transport_sockets.tls.v3.CertificateValidationContext;
import io.envoyproxy.envoy.extensions.transport_sockets.tls.v3.CommonTlsContext;
Expand Down Expand Up @@ -2639,6 +2641,50 @@ public void parseNonAggregateCluster_withHttp11ProxyTransportSocket() throws Exc
assertThat(result.isHttp11ProxyAvailable()).isTrue();
}

/**
* Http11ProxyUpstreamTransport with transport_socket=RawBuffer must behave the same as
* when transport_socket is unset.
*/
@Test
public void parseNonAggregateCluster_withHttp11ProxyTransportSocket_rawBuffer() throws Exception {
XdsClusterResource.isEnabledXdsHttpConnect = true;

// Nested transport_socket (Http11ProxyUpstreamTransport.transport_socket).
TransportSocket transportSocketRawBuffer = TransportSocket.newBuilder()
.setName(TRANSPORT_SOCKET_NAME_RAW_BUFFER)
.setTypedConfig(Any.pack(RawBuffer.getDefaultInstance()))
.build();

Http11ProxyUpstreamTransport http11ProxyUpstreamTransport =
Http11ProxyUpstreamTransport.newBuilder()
.setTransportSocket(transportSocketRawBuffer)
.build();

TransportSocket transportSocket = TransportSocket.newBuilder()
.setName(TRANSPORT_SOCKET_NAME_HTTP11_PROXY)
.setTypedConfig(Any.pack(http11ProxyUpstreamTransport))
.build();

Cluster cluster = Cluster.newBuilder()
.setName("cluster-http11-proxy.googleapis.com")
.setType(DiscoveryType.EDS)
.setEdsClusterConfig(
EdsClusterConfig.newBuilder()
.setEdsConfig(
ConfigSource.newBuilder().setAds(AggregatedConfigSource.getDefaultInstance()))
.setServiceName("service-http11-proxy.googleapis.com"))
.setLbPolicy(LbPolicy.ROUND_ROBIN)
.setTransportSocket(transportSocket)
.build();

CdsUpdate result =
XdsClusterResource.processCluster(cluster, null, LRS_SERVER_INFO,
LoadBalancerRegistry.getDefaultRegistry());

assertThat(result).isNotNull();
assertThat(result.isHttp11ProxyAvailable()).isTrue();
}

@Test
public void processCluster_parsesOrcaLrsPropagationMetrics() throws ResourceInvalidException {
LoadStatsManager2.isEnabledOrcaLrsPropagation = true;
Expand Down
1 change: 1 addition & 0 deletions xds/third_party/envoy/import.sh
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,7 @@ envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.proto
envoy/extensions/load_balancing_policies/round_robin/v3/round_robin.proto
envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.proto
envoy/extensions/transport_sockets/http_11_proxy/v3/upstream_http_11_connect.proto
envoy/extensions/transport_sockets/raw_buffer/v3/raw_buffer.proto
envoy/extensions/transport_sockets/tls/v3/cert.proto
envoy/extensions/transport_sockets/tls/v3/common.proto
envoy/extensions/transport_sockets/tls/v3/secret.proto
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
syntax = "proto3";

package envoy.extensions.transport_sockets.raw_buffer.v3;

import "udpa/annotations/status.proto";
import "udpa/annotations/versioning.proto";

option java_package = "io.envoyproxy.envoy.extensions.transport_sockets.raw_buffer.v3";
option java_outer_classname = "RawBufferProto";
option java_multiple_files = true;
option go_package = "github.com/envoyproxy/go-control-plane/envoy/extensions/transport_sockets/raw_buffer/v3;raw_bufferv3";
option (udpa.annotations.file_status).package_version_status = ACTIVE;

// [#protodoc-title: Raw Buffer]
// [#extension: envoy.transport_sockets.raw_buffer]

// Configuration for raw buffer transport socket.
message RawBuffer {
option (udpa.annotations.versioning).previous_message_type =
"envoy.config.transport_socket.raw_buffer.v2.RawBuffer";
}