diff --git a/BUILD b/BUILD
index 0dd4274e90d..a1c6f9eebf6 100644
--- a/BUILD
+++ b/BUILD
@@ -3623,6 +3623,7 @@ grpc_cc_library(
"src/core/ext/xds/xds_http_fault_filter.cc",
"src/core/ext/xds/xds_http_filters.cc",
"src/core/ext/xds/xds_http_rbac_filter.cc",
+ "src/core/ext/xds/xds_lb_policy_registry.cc",
"src/core/ext/xds/xds_listener.cc",
"src/core/ext/xds/xds_resource_type.cc",
"src/core/ext/xds/xds_route_config.cc",
@@ -3648,6 +3649,7 @@ grpc_cc_library(
"src/core/ext/xds/xds_http_fault_filter.h",
"src/core/ext/xds/xds_http_filters.h",
"src/core/ext/xds/xds_http_rbac_filter.h",
+ "src/core/ext/xds/xds_lb_policy_registry.h",
"src/core/ext/xds/xds_listener.h",
"src/core/ext/xds/xds_resource_type.h",
"src/core/ext/xds/xds_resource_type_impl.h",
@@ -3699,6 +3701,8 @@ grpc_cc_library(
"envoy_extensions_filters_http_router_upbdefs",
"envoy_extensions_filters_network_http_connection_manager_upb",
"envoy_extensions_filters_network_http_connection_manager_upbdefs",
+ "envoy_extensions_load_balancing_policies_ring_hash_upb",
+ "envoy_extensions_load_balancing_policies_wrr_locality_upb",
"envoy_extensions_transport_sockets_tls_upb",
"envoy_extensions_transport_sockets_tls_upbdefs",
"envoy_service_discovery_upb",
@@ -3736,6 +3740,7 @@ grpc_cc_library(
"protobuf_any_upb",
"protobuf_duration_upb",
"protobuf_struct_upb",
+ "protobuf_struct_upbdefs",
"protobuf_timestamp_upb",
"protobuf_wrappers_upb",
"ref_counted_ptr",
@@ -6624,6 +6629,16 @@ grpc_upb_proto_reflection_library(
deps = ["@envoy_api//envoy/extensions/filters/http/router/v3:pkg"],
)
+grpc_upb_proto_library(
+ name = "envoy_extensions_load_balancing_policies_ring_hash_upb",
+ deps = ["@envoy_api//envoy/extensions/load_balancing_policies/ring_hash/v3:pkg"],
+)
+
+grpc_upb_proto_library(
+ name = "envoy_extensions_load_balancing_policies_wrr_locality_upb",
+ deps = ["@envoy_api//envoy/extensions/load_balancing_policies/wrr_locality/v3:pkg"],
+)
+
grpc_upb_proto_library(
name = "envoy_extensions_filters_network_http_connection_manager_upb",
deps = ["@envoy_api//envoy/extensions/filters/network/http_connection_manager/v3:pkg"],
diff --git a/CMakeLists.txt b/CMakeLists.txt
index c7ed9c0934c..7f9c1083c70 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -730,6 +730,12 @@ protobuf_generate_grpc_cpp_with_import_path_correction(
protobuf_generate_grpc_cpp_with_import_path_correction(
src/proto/grpc/testing/xds/v3/regex.proto src/proto/grpc/testing/xds/v3/regex.proto
)
+protobuf_generate_grpc_cpp_with_import_path_correction(
+ src/proto/grpc/testing/xds/v3/ring_hash.proto src/proto/grpc/testing/xds/v3/ring_hash.proto
+)
+protobuf_generate_grpc_cpp_with_import_path_correction(
+ src/proto/grpc/testing/xds/v3/round_robin.proto src/proto/grpc/testing/xds/v3/round_robin.proto
+)
protobuf_generate_grpc_cpp_with_import_path_correction(
src/proto/grpc/testing/xds/v3/route.proto src/proto/grpc/testing/xds/v3/route.proto
)
@@ -742,6 +748,15 @@ protobuf_generate_grpc_cpp_with_import_path_correction(
protobuf_generate_grpc_cpp_with_import_path_correction(
src/proto/grpc/testing/xds/v3/tls.proto src/proto/grpc/testing/xds/v3/tls.proto
)
+protobuf_generate_grpc_cpp_with_import_path_correction(
+ src/proto/grpc/testing/xds/v3/typed_struct.proto src/proto/grpc/testing/xds/v3/typed_struct.proto
+)
+protobuf_generate_grpc_cpp_with_import_path_correction(
+ src/proto/grpc/testing/xds/v3/udpa_typed_struct.proto src/proto/grpc/testing/xds/v3/udpa_typed_struct.proto
+)
+protobuf_generate_grpc_cpp_with_import_path_correction(
+ src/proto/grpc/testing/xds/v3/wrr_locality.proto src/proto/grpc/testing/xds/v3/wrr_locality.proto
+)
protobuf_generate_grpc_cpp_with_import_path_correction(
test/core/tsi/alts/fake_handshaker/handshaker.proto test/core/tsi/alts/fake_handshaker/handshaker.proto
)
@@ -1209,6 +1224,7 @@ if(gRPC_BUILD_TESTS)
endif()
add_dependencies(buildtests_cxx xds_interop_client)
add_dependencies(buildtests_cxx xds_interop_server)
+ add_dependencies(buildtests_cxx xds_lb_policy_registry_test)
if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
add_dependencies(buildtests_cxx xds_outlier_detection_end2end_test)
endif()
@@ -1779,6 +1795,8 @@ add_library(grpc
src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.c
src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c
src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c
+ src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.c
+ src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.c
src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c
src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c
src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c
@@ -2004,6 +2022,7 @@ add_library(grpc
src/core/ext/xds/xds_http_fault_filter.cc
src/core/ext/xds/xds_http_filters.cc
src/core/ext/xds/xds_http_rbac_filter.cc
+ src/core/ext/xds/xds_lb_policy_registry.cc
src/core/ext/xds/xds_listener.cc
src/core/ext/xds/xds_resource_type.cc
src/core/ext/xds/xds_route_config.cc
@@ -19047,6 +19066,104 @@ target_link_libraries(xds_interop_server
)
+endif()
+if(gRPC_BUILD_TESTS)
+
+add_executable(xds_lb_policy_registry_test
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/reflection/v1alpha/reflection.pb.cc
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/reflection/v1alpha/reflection.grpc.pb.cc
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/reflection/v1alpha/reflection.pb.h
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/reflection/v1alpha/reflection.grpc.pb.h
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/address.pb.cc
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/address.grpc.pb.cc
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/address.pb.h
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/address.grpc.pb.h
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/base.pb.cc
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/base.grpc.pb.cc
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/base.pb.h
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/base.grpc.pb.h
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/cluster.pb.cc
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/cluster.grpc.pb.cc
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/cluster.pb.h
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/cluster.grpc.pb.h
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/config_source.pb.cc
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/config_source.grpc.pb.cc
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/config_source.pb.h
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/config_source.grpc.pb.h
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/endpoint.pb.cc
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/endpoint.grpc.pb.cc
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/endpoint.pb.h
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/endpoint.grpc.pb.h
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/extension.pb.cc
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/extension.grpc.pb.cc
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/extension.pb.h
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/extension.grpc.pb.h
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/outlier_detection.pb.cc
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/outlier_detection.grpc.pb.cc
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/outlier_detection.pb.h
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/outlier_detection.grpc.pb.h
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/percent.pb.cc
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/percent.grpc.pb.cc
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/percent.pb.h
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/percent.grpc.pb.h
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/ring_hash.pb.cc
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/ring_hash.grpc.pb.cc
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/ring_hash.pb.h
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/ring_hash.grpc.pb.h
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/round_robin.pb.cc
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/round_robin.grpc.pb.cc
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/round_robin.pb.h
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/round_robin.grpc.pb.h
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/typed_struct.pb.cc
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/typed_struct.grpc.pb.cc
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/typed_struct.pb.h
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/typed_struct.grpc.pb.h
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/udpa_typed_struct.pb.cc
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/udpa_typed_struct.grpc.pb.cc
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/udpa_typed_struct.pb.h
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/udpa_typed_struct.grpc.pb.h
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/wrr_locality.pb.cc
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/wrr_locality.grpc.pb.cc
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/wrr_locality.pb.h
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/wrr_locality.grpc.pb.h
+ test/core/xds/xds_lb_policy_registry_test.cc
+ test/cpp/util/cli_call.cc
+ test/cpp/util/cli_credentials.cc
+ test/cpp/util/proto_file_parser.cc
+ test/cpp/util/proto_reflection_descriptor_database.cc
+ test/cpp/util/service_describer.cc
+ third_party/googletest/googletest/src/gtest-all.cc
+ third_party/googletest/googlemock/src/gmock-all.cc
+)
+
+target_include_directories(xds_lb_policy_registry_test
+ PRIVATE
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ ${CMAKE_CURRENT_SOURCE_DIR}/include
+ ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR}
+ ${_gRPC_RE2_INCLUDE_DIR}
+ ${_gRPC_SSL_INCLUDE_DIR}
+ ${_gRPC_UPB_GENERATED_DIR}
+ ${_gRPC_UPB_GRPC_GENERATED_DIR}
+ ${_gRPC_UPB_INCLUDE_DIR}
+ ${_gRPC_XXHASH_INCLUDE_DIR}
+ ${_gRPC_ZLIB_INCLUDE_DIR}
+ third_party/googletest/googletest/include
+ third_party/googletest/googletest
+ third_party/googletest/googlemock/include
+ third_party/googletest/googlemock
+ ${_gRPC_PROTO_GENS_DIR}
+)
+
+target_link_libraries(xds_lb_policy_registry_test
+ ${_gRPC_PROTOBUF_LIBRARIES}
+ ${_gRPC_ALLTARGETS_LIBRARIES}
+ absl::flags
+ grpc++
+ grpc_test_util
+)
+
+
endif()
if(gRPC_BUILD_TESTS)
if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
diff --git a/Makefile b/Makefile
index 9ff5b20bb91..92a7a3714b5 100644
--- a/Makefile
+++ b/Makefile
@@ -1186,6 +1186,8 @@ LIBGRPC_SRC = \
src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.c \
src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c \
src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c \
+ src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.c \
+ src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.c \
src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c \
src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c \
src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c \
@@ -1411,6 +1413,7 @@ LIBGRPC_SRC = \
src/core/ext/xds/xds_http_fault_filter.cc \
src/core/ext/xds/xds_http_filters.cc \
src/core/ext/xds/xds_http_rbac_filter.cc \
+ src/core/ext/xds/xds_lb_policy_registry.cc \
src/core/ext/xds/xds_listener.cc \
src/core/ext/xds/xds_resource_type.cc \
src/core/ext/xds/xds_route_config.cc \
@@ -2896,6 +2899,8 @@ src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c: $
src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.c: $(OPENSSL_DEP)
src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c: $(OPENSSL_DEP)
src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c: $(OPENSSL_DEP)
+src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.c: $(OPENSSL_DEP)
+src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.c: $(OPENSSL_DEP)
src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c: $(OPENSSL_DEP)
src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c: $(OPENSSL_DEP)
src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c: $(OPENSSL_DEP)
@@ -3104,6 +3109,7 @@ src/core/ext/xds/xds_endpoint.cc: $(OPENSSL_DEP)
src/core/ext/xds/xds_http_fault_filter.cc: $(OPENSSL_DEP)
src/core/ext/xds/xds_http_filters.cc: $(OPENSSL_DEP)
src/core/ext/xds/xds_http_rbac_filter.cc: $(OPENSSL_DEP)
+src/core/ext/xds/xds_lb_policy_registry.cc: $(OPENSSL_DEP)
src/core/ext/xds/xds_listener.cc: $(OPENSSL_DEP)
src/core/ext/xds/xds_resource_type.cc: $(OPENSSL_DEP)
src/core/ext/xds/xds_route_config.cc: $(OPENSSL_DEP)
diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml
index dc5543387c8..062433b09af 100644
--- a/build_autogenerated.yaml
+++ b/build_autogenerated.yaml
@@ -487,6 +487,8 @@ libs:
- src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.h
- src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h
- src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h
+ - src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h
+ - src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.h
- src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h
- src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h
- src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h
@@ -715,6 +717,7 @@ libs:
- src/core/ext/xds/xds_http_fault_filter.h
- src/core/ext/xds/xds_http_filters.h
- src/core/ext/xds/xds_http_rbac_filter.h
+ - src/core/ext/xds/xds_lb_policy_registry.h
- src/core/ext/xds/xds_listener.h
- src/core/ext/xds/xds_resource_type.h
- src/core/ext/xds/xds_resource_type_impl.h
@@ -1165,6 +1168,8 @@ libs:
- src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.c
- src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c
- src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c
+ - src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.c
+ - src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.c
- src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c
- src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c
- src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c
@@ -1390,6 +1395,7 @@ libs:
- src/core/ext/xds/xds_http_fault_filter.cc
- src/core/ext/xds/xds_http_filters.cc
- src/core/ext/xds/xds_http_rbac_filter.cc
+ - src/core/ext/xds/xds_lb_policy_registry.cc
- src/core/ext/xds/xds_listener.cc
- src/core/ext/xds/xds_resource_type.cc
- src/core/ext/xds/xds_route_config.cc
@@ -9350,6 +9356,43 @@ targets:
- grpcpp_channelz
- grpc_test_util
- grpc++_test_config
+- name: xds_lb_policy_registry_test
+ gtest: true
+ build: test
+ language: c++
+ headers:
+ - test/cpp/util/cli_call.h
+ - test/cpp/util/cli_credentials.h
+ - test/cpp/util/config_grpc_cli.h
+ - test/cpp/util/proto_file_parser.h
+ - test/cpp/util/proto_reflection_descriptor_database.h
+ - test/cpp/util/service_describer.h
+ src:
+ - src/proto/grpc/reflection/v1alpha/reflection.proto
+ - src/proto/grpc/testing/xds/v3/address.proto
+ - src/proto/grpc/testing/xds/v3/base.proto
+ - src/proto/grpc/testing/xds/v3/cluster.proto
+ - src/proto/grpc/testing/xds/v3/config_source.proto
+ - src/proto/grpc/testing/xds/v3/endpoint.proto
+ - src/proto/grpc/testing/xds/v3/extension.proto
+ - src/proto/grpc/testing/xds/v3/outlier_detection.proto
+ - src/proto/grpc/testing/xds/v3/percent.proto
+ - src/proto/grpc/testing/xds/v3/ring_hash.proto
+ - src/proto/grpc/testing/xds/v3/round_robin.proto
+ - src/proto/grpc/testing/xds/v3/typed_struct.proto
+ - src/proto/grpc/testing/xds/v3/udpa_typed_struct.proto
+ - src/proto/grpc/testing/xds/v3/wrr_locality.proto
+ - test/core/xds/xds_lb_policy_registry_test.cc
+ - test/cpp/util/cli_call.cc
+ - test/cpp/util/cli_credentials.cc
+ - test/cpp/util/proto_file_parser.cc
+ - test/cpp/util/proto_reflection_descriptor_database.cc
+ - test/cpp/util/service_describer.cc
+ deps:
+ - absl/flags:flag
+ - grpc++
+ - grpc_test_util
+ uses_polling: false
- name: xds_outlier_detection_end2end_test
gtest: true
build: test
diff --git a/config.m4 b/config.m4
index 397f6ea78bd..5d3ecbc0bdb 100644
--- a/config.m4
+++ b/config.m4
@@ -208,6 +208,8 @@ if test "$PHP_GRPC" != "no"; then
src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.c \
src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c \
src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c \
+ src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.c \
+ src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.c \
src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c \
src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c \
src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c \
@@ -433,6 +435,7 @@ if test "$PHP_GRPC" != "no"; then
src/core/ext/xds/xds_http_fault_filter.cc \
src/core/ext/xds/xds_http_filters.cc \
src/core/ext/xds/xds_http_rbac_filter.cc \
+ src/core/ext/xds/xds_lb_policy_registry.cc \
src/core/ext/xds/xds_listener.cc \
src/core/ext/xds/xds_resource_type.cc \
src/core/ext/xds/xds_route_config.cc \
@@ -1221,6 +1224,8 @@ if test "$PHP_GRPC" != "no"; then
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3)
+ PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3)
+ PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/service/discovery/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/service/load_stats/v3)
diff --git a/config.w32 b/config.w32
index d56635606a6..a06bb24de93 100644
--- a/config.w32
+++ b/config.w32
@@ -174,6 +174,8 @@ if (PHP_GRPC != "no") {
"src\\core\\ext\\upb-generated\\envoy\\extensions\\filters\\http\\rbac\\v3\\rbac.upb.c " +
"src\\core\\ext\\upb-generated\\envoy\\extensions\\filters\\http\\router\\v3\\router.upb.c " +
"src\\core\\ext\\upb-generated\\envoy\\extensions\\filters\\network\\http_connection_manager\\v3\\http_connection_manager.upb.c " +
+ "src\\core\\ext\\upb-generated\\envoy\\extensions\\load_balancing_policies\\ring_hash\\v3\\ring_hash.upb.c " +
+ "src\\core\\ext\\upb-generated\\envoy\\extensions\\load_balancing_policies\\wrr_locality\\v3\\wrr_locality.upb.c " +
"src\\core\\ext\\upb-generated\\envoy\\extensions\\transport_sockets\\tls\\v3\\cert.upb.c " +
"src\\core\\ext\\upb-generated\\envoy\\extensions\\transport_sockets\\tls\\v3\\common.upb.c " +
"src\\core\\ext\\upb-generated\\envoy\\extensions\\transport_sockets\\tls\\v3\\secret.upb.c " +
@@ -399,6 +401,7 @@ if (PHP_GRPC != "no") {
"src\\core\\ext\\xds\\xds_http_fault_filter.cc " +
"src\\core\\ext\\xds\\xds_http_filters.cc " +
"src\\core\\ext\\xds\\xds_http_rbac_filter.cc " +
+ "src\\core\\ext\\xds\\xds_lb_policy_registry.cc " +
"src\\core\\ext\\xds\\xds_listener.cc " +
"src\\core\\ext\\xds\\xds_resource_type.cc " +
"src\\core\\ext\\xds\\xds_route_config.cc " +
@@ -1251,6 +1254,11 @@ if (PHP_GRPC != "no") {
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\extensions\\filters\\network");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\extensions\\filters\\network\\http_connection_manager");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\extensions\\filters\\network\\http_connection_manager\\v3");
+ FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\extensions\\load_balancing_policies");
+ FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\extensions\\load_balancing_policies\\ring_hash");
+ FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\extensions\\load_balancing_policies\\ring_hash\\v3");
+ FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\extensions\\load_balancing_policies\\wrr_locality");
+ FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\extensions\\load_balancing_policies\\wrr_locality\\v3");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\extensions\\transport_sockets");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\extensions\\transport_sockets\\tls");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\extensions\\transport_sockets\\tls\\v3");
diff --git a/gRPC-C++.podspec b/gRPC-C++.podspec
index dac9ff4e1c4..6c0d7cfd4e6 100644
--- a/gRPC-C++.podspec
+++ b/gRPC-C++.podspec
@@ -411,6 +411,8 @@ Pod::Spec.new do |s|
'src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.h',
'src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h',
'src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h',
+ 'src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h',
+ 'src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.h',
'src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h',
'src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h',
'src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h',
@@ -639,6 +641,7 @@ Pod::Spec.new do |s|
'src/core/ext/xds/xds_http_fault_filter.h',
'src/core/ext/xds/xds_http_filters.h',
'src/core/ext/xds/xds_http_rbac_filter.h',
+ 'src/core/ext/xds/xds_lb_policy_registry.h',
'src/core/ext/xds/xds_listener.h',
'src/core/ext/xds/xds_resource_type.h',
'src/core/ext/xds/xds_resource_type_impl.h',
@@ -1229,6 +1232,8 @@ Pod::Spec.new do |s|
'src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.h',
'src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h',
'src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h',
+ 'src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h',
+ 'src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.h',
'src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h',
'src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h',
'src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h',
@@ -1457,6 +1462,7 @@ Pod::Spec.new do |s|
'src/core/ext/xds/xds_http_fault_filter.h',
'src/core/ext/xds/xds_http_filters.h',
'src/core/ext/xds/xds_http_rbac_filter.h',
+ 'src/core/ext/xds/xds_lb_policy_registry.h',
'src/core/ext/xds/xds_listener.h',
'src/core/ext/xds/xds_resource_type.h',
'src/core/ext/xds/xds_resource_type_impl.h',
diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec
index 9f99667e07b..6afb2a748dc 100644
--- a/gRPC-Core.podspec
+++ b/gRPC-Core.podspec
@@ -519,6 +519,10 @@ Pod::Spec.new do |s|
'src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h',
'src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c',
'src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h',
+ 'src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.c',
+ 'src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h',
+ 'src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.c',
+ 'src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.h',
'src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c',
'src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h',
'src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c',
@@ -972,6 +976,8 @@ Pod::Spec.new do |s|
'src/core/ext/xds/xds_http_filters.h',
'src/core/ext/xds/xds_http_rbac_filter.cc',
'src/core/ext/xds/xds_http_rbac_filter.h',
+ 'src/core/ext/xds/xds_lb_policy_registry.cc',
+ 'src/core/ext/xds/xds_lb_policy_registry.h',
'src/core/ext/xds/xds_listener.cc',
'src/core/ext/xds/xds_listener.h',
'src/core/ext/xds/xds_resource_type.cc',
@@ -1828,6 +1834,8 @@ Pod::Spec.new do |s|
'src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.h',
'src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h',
'src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h',
+ 'src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h',
+ 'src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.h',
'src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h',
'src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h',
'src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h',
@@ -2056,6 +2064,7 @@ Pod::Spec.new do |s|
'src/core/ext/xds/xds_http_fault_filter.h',
'src/core/ext/xds/xds_http_filters.h',
'src/core/ext/xds/xds_http_rbac_filter.h',
+ 'src/core/ext/xds/xds_lb_policy_registry.h',
'src/core/ext/xds/xds_listener.h',
'src/core/ext/xds/xds_resource_type.h',
'src/core/ext/xds/xds_resource_type_impl.h',
diff --git a/grpc.gemspec b/grpc.gemspec
index e694e5409df..5ab7231aede 100644
--- a/grpc.gemspec
+++ b/grpc.gemspec
@@ -432,6 +432,10 @@ Gem::Specification.new do |s|
s.files += %w( src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h )
s.files += %w( src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c )
s.files += %w( src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h )
+ s.files += %w( src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.c )
+ s.files += %w( src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h )
+ s.files += %w( src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.c )
+ s.files += %w( src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.h )
s.files += %w( src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c )
s.files += %w( src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h )
s.files += %w( src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c )
@@ -885,6 +889,8 @@ Gem::Specification.new do |s|
s.files += %w( src/core/ext/xds/xds_http_filters.h )
s.files += %w( src/core/ext/xds/xds_http_rbac_filter.cc )
s.files += %w( src/core/ext/xds/xds_http_rbac_filter.h )
+ s.files += %w( src/core/ext/xds/xds_lb_policy_registry.cc )
+ s.files += %w( src/core/ext/xds/xds_lb_policy_registry.h )
s.files += %w( src/core/ext/xds/xds_listener.cc )
s.files += %w( src/core/ext/xds/xds_listener.h )
s.files += %w( src/core/ext/xds/xds_resource_type.cc )
diff --git a/grpc.gyp b/grpc.gyp
index 700a2370f6f..8733b3611c7 100644
--- a/grpc.gyp
+++ b/grpc.gyp
@@ -543,6 +543,8 @@
'src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.c',
'src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c',
'src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c',
+ 'src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.c',
+ 'src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.c',
'src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c',
'src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c',
'src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c',
@@ -768,6 +770,7 @@
'src/core/ext/xds/xds_http_fault_filter.cc',
'src/core/ext/xds/xds_http_filters.cc',
'src/core/ext/xds/xds_http_rbac_filter.cc',
+ 'src/core/ext/xds/xds_lb_policy_registry.cc',
'src/core/ext/xds/xds_listener.cc',
'src/core/ext/xds/xds_resource_type.cc',
'src/core/ext/xds/xds_route_config.cc',
diff --git a/package.xml b/package.xml
index 13a7318908f..ffc854f0731 100644
--- a/package.xml
+++ b/package.xml
@@ -414,6 +414,10 @@
+
+
+
+
@@ -867,6 +871,8 @@
+
+
diff --git a/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.c b/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.c
new file mode 100644
index 00000000000..23a52cab893
--- /dev/null
+++ b/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.c
@@ -0,0 +1,52 @@
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#include
+#include "upb/msg_internal.h"
+#include "envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h"
+#include "google/protobuf/wrappers.upb.h"
+#include "udpa/annotations/status.upb.h"
+#include "validate/validate.upb.h"
+
+#include "upb/port_def.inc"
+
+static const upb_MiniTable_Sub envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_submsgs[3] = {
+ {.submsg = &google_protobuf_UInt64Value_msginit},
+ {.submsg = &google_protobuf_UInt64Value_msginit},
+ {.submsg = &google_protobuf_UInt32Value_msginit},
+};
+
+static const upb_MiniTable_Field envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash__fields[5] = {
+ {1, UPB_SIZE(4, 4), UPB_SIZE(0, 0), kUpb_NoSub, 5, kUpb_FieldMode_Scalar | (kUpb_FieldRep_4Byte << kUpb_FieldRep_Shift)},
+ {2, UPB_SIZE(12, 16), UPB_SIZE(1, 1), 0, 11, kUpb_FieldMode_Scalar | (kUpb_FieldRep_Pointer << kUpb_FieldRep_Shift)},
+ {3, UPB_SIZE(16, 24), UPB_SIZE(2, 2), 1, 11, kUpb_FieldMode_Scalar | (kUpb_FieldRep_Pointer << kUpb_FieldRep_Shift)},
+ {4, UPB_SIZE(8, 8), UPB_SIZE(0, 0), kUpb_NoSub, 8, kUpb_FieldMode_Scalar | (kUpb_FieldRep_1Byte << kUpb_FieldRep_Shift)},
+ {5, UPB_SIZE(20, 32), UPB_SIZE(3, 3), 2, 11, kUpb_FieldMode_Scalar | (kUpb_FieldRep_Pointer << kUpb_FieldRep_Shift)},
+};
+
+const upb_MiniTable envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_msginit = {
+ &envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_submsgs[0],
+ &envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash__fields[0],
+ UPB_SIZE(24, 40), 5, kUpb_ExtMode_NonExtendable, 5, 255, 0,
+};
+
+static const upb_MiniTable *messages_layout[1] = {
+ &envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_msginit,
+};
+
+const upb_MiniTable_File envoy_extensions_load_balancing_policies_ring_hash_v3_ring_hash_proto_upb_file_layout = {
+ messages_layout,
+ NULL,
+ NULL,
+ 1,
+ 0,
+ 0,
+};
+
+#include "upb/port_undef.inc"
+
diff --git a/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h b/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h
new file mode 100644
index 00000000000..88ace25ead5
--- /dev/null
+++ b/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h
@@ -0,0 +1,164 @@
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#ifndef ENVOY_EXTENSIONS_LOAD_BALANCING_POLICIES_RING_HASH_V3_RING_HASH_PROTO_UPB_H_
+#define ENVOY_EXTENSIONS_LOAD_BALANCING_POLICIES_RING_HASH_V3_RING_HASH_PROTO_UPB_H_
+
+#include "upb/msg_internal.h"
+#include "upb/decode.h"
+#include "upb/decode_fast.h"
+#include "upb/encode.h"
+
+#include "upb/port_def.inc"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash;
+typedef struct envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash;
+extern const upb_MiniTable envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_msginit;
+struct google_protobuf_UInt32Value;
+struct google_protobuf_UInt64Value;
+extern const upb_MiniTable google_protobuf_UInt32Value_msginit;
+extern const upb_MiniTable google_protobuf_UInt64Value_msginit;
+
+typedef enum {
+ envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_DEFAULT_HASH = 0,
+ envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_XX_HASH = 1,
+ envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_MURMUR_HASH_2 = 2
+} envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_HashFunction;
+
+
+
+/* envoy.extensions.load_balancing_policies.ring_hash.v3.RingHash */
+
+UPB_INLINE envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash* envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_new(upb_Arena* arena) {
+ return (envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash*)_upb_Message_New(&envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_msginit, arena);
+}
+UPB_INLINE envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash* envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_parse(const char* buf, size_t size, upb_Arena* arena) {
+ envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash* ret = envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_new(arena);
+ if (!ret) return NULL;
+ if (upb_Decode(buf, size, ret, &envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_msginit, NULL, 0, arena) != kUpb_DecodeStatus_Ok) {
+ return NULL;
+ }
+ return ret;
+}
+UPB_INLINE envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash* envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_parse_ex(const char* buf, size_t size,
+ const upb_ExtensionRegistry* extreg,
+ int options, upb_Arena* arena) {
+ envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash* ret = envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_new(arena);
+ if (!ret) return NULL;
+ if (upb_Decode(buf, size, ret, &envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_msginit, extreg, options, arena) !=
+ kUpb_DecodeStatus_Ok) {
+ return NULL;
+ }
+ return ret;
+}
+UPB_INLINE char* envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_serialize(const envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash* msg, upb_Arena* arena, size_t* len) {
+ return upb_Encode(msg, &envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_msginit, 0, arena, len);
+}
+UPB_INLINE char* envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_serialize_ex(const envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash* msg, int options,
+ upb_Arena* arena, size_t* len) {
+ return upb_Encode(msg, &envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_msginit, options, arena, len);
+}
+UPB_INLINE void envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_clear_hash_function(const envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash* msg) {
+ *UPB_PTR_AT(msg, UPB_SIZE(4, 4), int32_t) = 0;
+}
+UPB_INLINE int32_t envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_hash_function(const envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash* msg) {
+ return *UPB_PTR_AT(msg, UPB_SIZE(4, 4), int32_t);
+}
+UPB_INLINE bool envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_has_minimum_ring_size(const envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash* msg) {
+ return _upb_hasbit(msg, 1);
+}
+UPB_INLINE void envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_clear_minimum_ring_size(const envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash* msg) {
+ *UPB_PTR_AT(msg, UPB_SIZE(12, 16), const upb_Message*) = NULL;
+}
+UPB_INLINE const struct google_protobuf_UInt64Value* envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_minimum_ring_size(const envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash* msg) {
+ return *UPB_PTR_AT(msg, UPB_SIZE(12, 16), const struct google_protobuf_UInt64Value*);
+}
+UPB_INLINE bool envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_has_maximum_ring_size(const envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash* msg) {
+ return _upb_hasbit(msg, 2);
+}
+UPB_INLINE void envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_clear_maximum_ring_size(const envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash* msg) {
+ *UPB_PTR_AT(msg, UPB_SIZE(16, 24), const upb_Message*) = NULL;
+}
+UPB_INLINE const struct google_protobuf_UInt64Value* envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_maximum_ring_size(const envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash* msg) {
+ return *UPB_PTR_AT(msg, UPB_SIZE(16, 24), const struct google_protobuf_UInt64Value*);
+}
+UPB_INLINE void envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_clear_use_hostname_for_hashing(const envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash* msg) {
+ *UPB_PTR_AT(msg, UPB_SIZE(8, 8), bool) = 0;
+}
+UPB_INLINE bool envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_use_hostname_for_hashing(const envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash* msg) {
+ return *UPB_PTR_AT(msg, UPB_SIZE(8, 8), bool);
+}
+UPB_INLINE bool envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_has_hash_balance_factor(const envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash* msg) {
+ return _upb_hasbit(msg, 3);
+}
+UPB_INLINE void envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_clear_hash_balance_factor(const envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash* msg) {
+ *UPB_PTR_AT(msg, UPB_SIZE(20, 32), const upb_Message*) = NULL;
+}
+UPB_INLINE const struct google_protobuf_UInt32Value* envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_hash_balance_factor(const envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash* msg) {
+ return *UPB_PTR_AT(msg, UPB_SIZE(20, 32), const struct google_protobuf_UInt32Value*);
+}
+
+UPB_INLINE void envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_set_hash_function(envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash *msg, int32_t value) {
+ *UPB_PTR_AT(msg, UPB_SIZE(4, 4), int32_t) = value;
+}
+UPB_INLINE void envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_set_minimum_ring_size(envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash *msg, struct google_protobuf_UInt64Value* value) {
+ _upb_sethas(msg, 1);
+ *UPB_PTR_AT(msg, UPB_SIZE(12, 16), struct google_protobuf_UInt64Value*) = value;
+}
+UPB_INLINE struct google_protobuf_UInt64Value* envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_mutable_minimum_ring_size(envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash* msg, upb_Arena* arena) {
+ struct google_protobuf_UInt64Value* sub = (struct google_protobuf_UInt64Value*)envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_minimum_ring_size(msg);
+ if (sub == NULL) {
+ sub = (struct google_protobuf_UInt64Value*)_upb_Message_New(&google_protobuf_UInt64Value_msginit, arena);
+ if (!sub) return NULL;
+ envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_set_minimum_ring_size(msg, sub);
+ }
+ return sub;
+}
+UPB_INLINE void envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_set_maximum_ring_size(envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash *msg, struct google_protobuf_UInt64Value* value) {
+ _upb_sethas(msg, 2);
+ *UPB_PTR_AT(msg, UPB_SIZE(16, 24), struct google_protobuf_UInt64Value*) = value;
+}
+UPB_INLINE struct google_protobuf_UInt64Value* envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_mutable_maximum_ring_size(envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash* msg, upb_Arena* arena) {
+ struct google_protobuf_UInt64Value* sub = (struct google_protobuf_UInt64Value*)envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_maximum_ring_size(msg);
+ if (sub == NULL) {
+ sub = (struct google_protobuf_UInt64Value*)_upb_Message_New(&google_protobuf_UInt64Value_msginit, arena);
+ if (!sub) return NULL;
+ envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_set_maximum_ring_size(msg, sub);
+ }
+ return sub;
+}
+UPB_INLINE void envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_set_use_hostname_for_hashing(envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash *msg, bool value) {
+ *UPB_PTR_AT(msg, UPB_SIZE(8, 8), bool) = value;
+}
+UPB_INLINE void envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_set_hash_balance_factor(envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash *msg, struct google_protobuf_UInt32Value* value) {
+ _upb_sethas(msg, 3);
+ *UPB_PTR_AT(msg, UPB_SIZE(20, 32), struct google_protobuf_UInt32Value*) = value;
+}
+UPB_INLINE struct google_protobuf_UInt32Value* envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_mutable_hash_balance_factor(envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash* msg, upb_Arena* arena) {
+ struct google_protobuf_UInt32Value* sub = (struct google_protobuf_UInt32Value*)envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_hash_balance_factor(msg);
+ if (sub == NULL) {
+ sub = (struct google_protobuf_UInt32Value*)_upb_Message_New(&google_protobuf_UInt32Value_msginit, arena);
+ if (!sub) return NULL;
+ envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_set_hash_balance_factor(msg, sub);
+ }
+ return sub;
+}
+
+extern const upb_MiniTable_File envoy_extensions_load_balancing_policies_ring_hash_v3_ring_hash_proto_upb_file_layout;
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#include "upb/port_undef.inc"
+
+#endif /* ENVOY_EXTENSIONS_LOAD_BALANCING_POLICIES_RING_HASH_V3_RING_HASH_PROTO_UPB_H_ */
diff --git a/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.c b/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.c
new file mode 100644
index 00000000000..4e798231c59
--- /dev/null
+++ b/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.c
@@ -0,0 +1,46 @@
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#include
+#include "upb/msg_internal.h"
+#include "envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.h"
+#include "envoy/config/cluster/v3/cluster.upb.h"
+#include "udpa/annotations/status.upb.h"
+#include "validate/validate.upb.h"
+
+#include "upb/port_def.inc"
+
+static const upb_MiniTable_Sub envoy_extensions_load_balancing_policies_wrr_locality_v3_WrrLocality_submsgs[1] = {
+ {.submsg = &envoy_config_cluster_v3_LoadBalancingPolicy_msginit},
+};
+
+static const upb_MiniTable_Field envoy_extensions_load_balancing_policies_wrr_locality_v3_WrrLocality__fields[1] = {
+ {1, UPB_SIZE(4, 8), UPB_SIZE(1, 1), 0, 11, kUpb_FieldMode_Scalar | (kUpb_FieldRep_Pointer << kUpb_FieldRep_Shift)},
+};
+
+const upb_MiniTable envoy_extensions_load_balancing_policies_wrr_locality_v3_WrrLocality_msginit = {
+ &envoy_extensions_load_balancing_policies_wrr_locality_v3_WrrLocality_submsgs[0],
+ &envoy_extensions_load_balancing_policies_wrr_locality_v3_WrrLocality__fields[0],
+ UPB_SIZE(8, 24), 1, kUpb_ExtMode_NonExtendable, 1, 255, 0,
+};
+
+static const upb_MiniTable *messages_layout[1] = {
+ &envoy_extensions_load_balancing_policies_wrr_locality_v3_WrrLocality_msginit,
+};
+
+const upb_MiniTable_File envoy_extensions_load_balancing_policies_wrr_locality_v3_wrr_locality_proto_upb_file_layout = {
+ messages_layout,
+ NULL,
+ NULL,
+ 1,
+ 0,
+ 0,
+};
+
+#include "upb/port_undef.inc"
+
diff --git a/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.h b/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.h
new file mode 100644
index 00000000000..76e5ab36882
--- /dev/null
+++ b/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.h
@@ -0,0 +1,94 @@
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#ifndef ENVOY_EXTENSIONS_LOAD_BALANCING_POLICIES_WRR_LOCALITY_V3_WRR_LOCALITY_PROTO_UPB_H_
+#define ENVOY_EXTENSIONS_LOAD_BALANCING_POLICIES_WRR_LOCALITY_V3_WRR_LOCALITY_PROTO_UPB_H_
+
+#include "upb/msg_internal.h"
+#include "upb/decode.h"
+#include "upb/decode_fast.h"
+#include "upb/encode.h"
+
+#include "upb/port_def.inc"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct envoy_extensions_load_balancing_policies_wrr_locality_v3_WrrLocality;
+typedef struct envoy_extensions_load_balancing_policies_wrr_locality_v3_WrrLocality envoy_extensions_load_balancing_policies_wrr_locality_v3_WrrLocality;
+extern const upb_MiniTable envoy_extensions_load_balancing_policies_wrr_locality_v3_WrrLocality_msginit;
+struct envoy_config_cluster_v3_LoadBalancingPolicy;
+extern const upb_MiniTable envoy_config_cluster_v3_LoadBalancingPolicy_msginit;
+
+
+
+/* envoy.extensions.load_balancing_policies.wrr_locality.v3.WrrLocality */
+
+UPB_INLINE envoy_extensions_load_balancing_policies_wrr_locality_v3_WrrLocality* envoy_extensions_load_balancing_policies_wrr_locality_v3_WrrLocality_new(upb_Arena* arena) {
+ return (envoy_extensions_load_balancing_policies_wrr_locality_v3_WrrLocality*)_upb_Message_New(&envoy_extensions_load_balancing_policies_wrr_locality_v3_WrrLocality_msginit, arena);
+}
+UPB_INLINE envoy_extensions_load_balancing_policies_wrr_locality_v3_WrrLocality* envoy_extensions_load_balancing_policies_wrr_locality_v3_WrrLocality_parse(const char* buf, size_t size, upb_Arena* arena) {
+ envoy_extensions_load_balancing_policies_wrr_locality_v3_WrrLocality* ret = envoy_extensions_load_balancing_policies_wrr_locality_v3_WrrLocality_new(arena);
+ if (!ret) return NULL;
+ if (upb_Decode(buf, size, ret, &envoy_extensions_load_balancing_policies_wrr_locality_v3_WrrLocality_msginit, NULL, 0, arena) != kUpb_DecodeStatus_Ok) {
+ return NULL;
+ }
+ return ret;
+}
+UPB_INLINE envoy_extensions_load_balancing_policies_wrr_locality_v3_WrrLocality* envoy_extensions_load_balancing_policies_wrr_locality_v3_WrrLocality_parse_ex(const char* buf, size_t size,
+ const upb_ExtensionRegistry* extreg,
+ int options, upb_Arena* arena) {
+ envoy_extensions_load_balancing_policies_wrr_locality_v3_WrrLocality* ret = envoy_extensions_load_balancing_policies_wrr_locality_v3_WrrLocality_new(arena);
+ if (!ret) return NULL;
+ if (upb_Decode(buf, size, ret, &envoy_extensions_load_balancing_policies_wrr_locality_v3_WrrLocality_msginit, extreg, options, arena) !=
+ kUpb_DecodeStatus_Ok) {
+ return NULL;
+ }
+ return ret;
+}
+UPB_INLINE char* envoy_extensions_load_balancing_policies_wrr_locality_v3_WrrLocality_serialize(const envoy_extensions_load_balancing_policies_wrr_locality_v3_WrrLocality* msg, upb_Arena* arena, size_t* len) {
+ return upb_Encode(msg, &envoy_extensions_load_balancing_policies_wrr_locality_v3_WrrLocality_msginit, 0, arena, len);
+}
+UPB_INLINE char* envoy_extensions_load_balancing_policies_wrr_locality_v3_WrrLocality_serialize_ex(const envoy_extensions_load_balancing_policies_wrr_locality_v3_WrrLocality* msg, int options,
+ upb_Arena* arena, size_t* len) {
+ return upb_Encode(msg, &envoy_extensions_load_balancing_policies_wrr_locality_v3_WrrLocality_msginit, options, arena, len);
+}
+UPB_INLINE bool envoy_extensions_load_balancing_policies_wrr_locality_v3_WrrLocality_has_endpoint_picking_policy(const envoy_extensions_load_balancing_policies_wrr_locality_v3_WrrLocality* msg) {
+ return _upb_hasbit(msg, 1);
+}
+UPB_INLINE void envoy_extensions_load_balancing_policies_wrr_locality_v3_WrrLocality_clear_endpoint_picking_policy(const envoy_extensions_load_balancing_policies_wrr_locality_v3_WrrLocality* msg) {
+ *UPB_PTR_AT(msg, UPB_SIZE(4, 8), const upb_Message*) = NULL;
+}
+UPB_INLINE const struct envoy_config_cluster_v3_LoadBalancingPolicy* envoy_extensions_load_balancing_policies_wrr_locality_v3_WrrLocality_endpoint_picking_policy(const envoy_extensions_load_balancing_policies_wrr_locality_v3_WrrLocality* msg) {
+ return *UPB_PTR_AT(msg, UPB_SIZE(4, 8), const struct envoy_config_cluster_v3_LoadBalancingPolicy*);
+}
+
+UPB_INLINE void envoy_extensions_load_balancing_policies_wrr_locality_v3_WrrLocality_set_endpoint_picking_policy(envoy_extensions_load_balancing_policies_wrr_locality_v3_WrrLocality *msg, struct envoy_config_cluster_v3_LoadBalancingPolicy* value) {
+ _upb_sethas(msg, 1);
+ *UPB_PTR_AT(msg, UPB_SIZE(4, 8), struct envoy_config_cluster_v3_LoadBalancingPolicy*) = value;
+}
+UPB_INLINE struct envoy_config_cluster_v3_LoadBalancingPolicy* envoy_extensions_load_balancing_policies_wrr_locality_v3_WrrLocality_mutable_endpoint_picking_policy(envoy_extensions_load_balancing_policies_wrr_locality_v3_WrrLocality* msg, upb_Arena* arena) {
+ struct envoy_config_cluster_v3_LoadBalancingPolicy* sub = (struct envoy_config_cluster_v3_LoadBalancingPolicy*)envoy_extensions_load_balancing_policies_wrr_locality_v3_WrrLocality_endpoint_picking_policy(msg);
+ if (sub == NULL) {
+ sub = (struct envoy_config_cluster_v3_LoadBalancingPolicy*)_upb_Message_New(&envoy_config_cluster_v3_LoadBalancingPolicy_msginit, arena);
+ if (!sub) return NULL;
+ envoy_extensions_load_balancing_policies_wrr_locality_v3_WrrLocality_set_endpoint_picking_policy(msg, sub);
+ }
+ return sub;
+}
+
+extern const upb_MiniTable_File envoy_extensions_load_balancing_policies_wrr_locality_v3_wrr_locality_proto_upb_file_layout;
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#include "upb/port_undef.inc"
+
+#endif /* ENVOY_EXTENSIONS_LOAD_BALANCING_POLICIES_WRR_LOCALITY_V3_WRR_LOCALITY_PROTO_UPB_H_ */
diff --git a/src/core/ext/xds/xds_common_types.cc b/src/core/ext/xds/xds_common_types.cc
index b4389d7c672..7942c35da75 100644
--- a/src/core/ext/xds/xds_common_types.cc
+++ b/src/core/ext/xds/xds_common_types.cc
@@ -30,7 +30,6 @@
#include "absl/strings/str_cat.h"
#include "absl/strings/str_format.h"
#include "absl/strings/str_join.h"
-#include "absl/strings/strip.h"
#include "envoy/extensions/transport_sockets/tls/v3/common.upb.h"
#include "envoy/extensions/transport_sockets/tls/v3/tls.upb.h"
#include "envoy/type/matcher/v3/regex.upb.h"
@@ -376,24 +375,29 @@ grpc_error_handle CommonTlsContext::Parse(
&errors);
}
-grpc_error_handle ExtractExtensionTypeName(const XdsEncodingContext& context,
- const google_protobuf_Any* any,
- absl::string_view* extension_type) {
- *extension_type = UpbStringToAbsl(google_protobuf_Any_type_url(any));
- if (*extension_type == "type.googleapis.com/xds.type.v3.TypedStruct" ||
- *extension_type == "type.googleapis.com/udpa.type.v1.TypedStruct") {
+absl::StatusOr ExtractExtensionTypeName(
+ const XdsEncodingContext& context, const google_protobuf_Any* any) {
+ ExtractExtensionTypeNameResult result;
+ result.type = UpbStringToAbsl(google_protobuf_Any_type_url(any));
+ if (result.type == "type.googleapis.com/xds.type.v3.TypedStruct" ||
+ result.type == "type.googleapis.com/udpa.type.v1.TypedStruct") {
upb_StringView any_value = google_protobuf_Any_value(any);
- const auto* typed_struct = xds_type_v3_TypedStruct_parse(
+ result.typed_struct = xds_type_v3_TypedStruct_parse(
any_value.data, any_value.size, context.arena);
- if (typed_struct == nullptr) {
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+ if (result.typed_struct == nullptr) {
+ return absl::InvalidArgumentError(
"could not parse TypedStruct from extension");
}
- *extension_type =
- UpbStringToAbsl(xds_type_v3_TypedStruct_type_url(typed_struct));
+ result.type =
+ UpbStringToAbsl(xds_type_v3_TypedStruct_type_url(result.typed_struct));
}
- *extension_type = absl::StripPrefix(*extension_type, "type.googleapis.com/");
- return GRPC_ERROR_NONE;
+ size_t pos = result.type.rfind('/');
+ if (pos == absl::string_view::npos || pos == result.type.size() - 1) {
+ return absl::InvalidArgumentError(
+ absl::StrCat("Invalid type_url ", result.type));
+ }
+ result.type = result.type.substr(pos + 1);
+ return result;
}
} // namespace grpc_core
diff --git a/src/core/ext/xds/xds_common_types.h b/src/core/ext/xds/xds_common_types.h
index 19704a1d5fc..fe258417e58 100644
--- a/src/core/ext/xds/xds_common_types.h
+++ b/src/core/ext/xds/xds_common_types.h
@@ -22,10 +22,12 @@
#include
#include
+#include "absl/status/statusor.h"
#include "absl/strings/string_view.h"
#include "envoy/extensions/transport_sockets/tls/v3/tls.upb.h"
#include "google/protobuf/any.upb.h"
#include "google/protobuf/duration.upb.h"
+#include "xds/type/v3/typed_struct.upb.h"
#include "src/core/ext/xds/upb_utils.h"
#include "src/core/lib/gprpp/time.h"
@@ -88,9 +90,13 @@ struct CommonTlsContext {
CommonTlsContext* common_tls_context);
};
-grpc_error_handle ExtractExtensionTypeName(const XdsEncodingContext& context,
- const google_protobuf_Any* any,
- absl::string_view* extension_type);
+struct ExtractExtensionTypeNameResult {
+ absl::string_view type;
+ xds_type_v3_TypedStruct* typed_struct = nullptr;
+};
+
+absl::StatusOr ExtractExtensionTypeName(
+ const XdsEncodingContext& context, const google_protobuf_Any* any);
} // namespace grpc_core
diff --git a/src/core/ext/xds/xds_lb_policy_registry.cc b/src/core/ext/xds/xds_lb_policy_registry.cc
new file mode 100644
index 00000000000..097cc416691
--- /dev/null
+++ b/src/core/ext/xds/xds_lb_policy_registry.cc
@@ -0,0 +1,291 @@
+//
+// Copyright 2022 gRPC authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include
+
+#include "src/core/ext/xds/xds_lb_policy_registry.h"
+
+#include
+
+#include
+#include
+#include
+#include
+
+#include "absl/memory/memory.h"
+#include "absl/status/status.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/str_format.h"
+#include "envoy/config/core/v3/extension.upb.h"
+#include "envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h"
+#include "envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.h"
+#include "google/protobuf/any.upb.h"
+#include "google/protobuf/struct.upb.h"
+#include "google/protobuf/struct.upbdefs.h"
+#include "google/protobuf/wrappers.upb.h"
+#include "upb/json_encode.h"
+#include "upb/upb.h"
+#include "upb/upb.hpp"
+#include "xds/type/v3/typed_struct.upb.h"
+
+#include "src/core/ext/filters/client_channel/lb_policy_registry.h"
+#include "src/core/ext/xds/upb_utils.h"
+#include "src/core/ext/xds/xds_common_types.h"
+#include "src/core/lib/iomgr/error.h"
+
+namespace grpc_core {
+
+namespace {
+
+class RingHashLbPolicyConfigFactory
+ : public XdsLbPolicyRegistry::ConfigFactory {
+ public:
+ absl::StatusOr ConvertXdsLbPolicyConfig(
+ const XdsEncodingContext& context, absl::string_view configuration,
+ int /* recursion_depth */) override {
+ const auto* resource =
+ envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_parse(
+ configuration.data(), configuration.size(), context.arena);
+ if (resource == nullptr) {
+ return absl::InvalidArgumentError(
+ "Can't decode RingHash loadbalancing policy");
+ }
+ if (envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_hash_function(
+ resource) !=
+ envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_XX_HASH) {
+ return absl::InvalidArgumentError(
+ "Invalid hash function provided for RingHash loadbalancing policy. "
+ "Only XX_HASH is supported.");
+ }
+ Json::Object json;
+ const auto* min_ring_size =
+ envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_minimum_ring_size(
+ resource);
+ if (min_ring_size != nullptr) {
+ json.emplace("minRingSize",
+ google_protobuf_UInt64Value_value(min_ring_size));
+ }
+ const auto* max_ring_size =
+ envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_maximum_ring_size(
+ resource);
+ if (max_ring_size != nullptr) {
+ json.emplace("maxRingSize",
+ google_protobuf_UInt64Value_value(max_ring_size));
+ }
+ return Json::Object{{"ring_hash_experimental", std::move(json)}};
+ }
+
+ absl::string_view type() override { return Type(); }
+
+ static absl::string_view Type() {
+ return "envoy.extensions.load_balancing_policies.ring_hash.v3.RingHash";
+ }
+};
+
+class RoundRobinLbPolicyConfigFactory
+ : public XdsLbPolicyRegistry::ConfigFactory {
+ public:
+ absl::StatusOr ConvertXdsLbPolicyConfig(
+ const XdsEncodingContext& /* context */,
+ absl::string_view /* configuration */,
+ int /* recursion_depth */) override {
+ return Json::Object{{"round_robin", Json::Object()}};
+ }
+
+ absl::string_view type() override { return Type(); }
+
+ static absl::string_view Type() {
+ return "envoy.extensions.load_balancing_policies.round_robin.v3.RoundRobin";
+ }
+};
+
+class WrrLocalityLbPolicyConfigFactory
+ : public XdsLbPolicyRegistry::ConfigFactory {
+ public:
+ absl::StatusOr ConvertXdsLbPolicyConfig(
+ const XdsEncodingContext& context, absl::string_view configuration,
+ int recursion_depth) override {
+ const auto* resource =
+ envoy_extensions_load_balancing_policies_wrr_locality_v3_WrrLocality_parse(
+ configuration.data(), configuration.size(), context.arena);
+ if (resource == nullptr) {
+ return absl::InvalidArgumentError(
+ "Can't decode WrrLocality loadbalancing policy");
+ }
+ const auto* endpoint_picking_policy =
+ envoy_extensions_load_balancing_policies_wrr_locality_v3_WrrLocality_endpoint_picking_policy(
+ resource);
+ if (endpoint_picking_policy == nullptr) {
+ return absl::InvalidArgumentError(
+ "WrrLocality: endpoint_picking_policy not found");
+ }
+ auto child_policy = XdsLbPolicyRegistry::ConvertXdsLbPolicyConfig(
+ context, endpoint_picking_policy, recursion_depth + 1);
+ if (!child_policy.ok()) {
+ return absl::InvalidArgumentError(
+ absl::StrCat("Error parsing WrrLocality load balancing policy: ",
+ child_policy.status().message()));
+ }
+ return Json::Object{
+ {"xds_wrr_locality_experimental",
+ Json::Object{{"child_policy", *std::move(child_policy)}}}};
+ }
+
+ absl::string_view type() override { return Type(); }
+
+ static absl::string_view Type() {
+ return "envoy.extensions.load_balancing_policies.wrr_locality.v3."
+ "WrrLocality";
+ }
+};
+
+absl::StatusOr ParseStructToJson(const XdsEncodingContext& context,
+ const google_protobuf_Struct* resource) {
+ upb::Status status;
+ const auto* msg_def = google_protobuf_Struct_getmsgdef(context.symtab);
+ size_t json_size = upb_JsonEncode(resource, msg_def, context.symtab, 0,
+ nullptr, 0, status.ptr());
+ if (json_size == static_cast(-1)) {
+ return absl::InvalidArgumentError(
+ absl::StrCat("Error parsing google::Protobuf::Struct: ",
+ upb_Status_ErrorMessage(status.ptr())));
+ }
+ void* buf = upb_Arena_Malloc(context.arena, json_size + 1);
+ upb_JsonEncode(resource, msg_def, context.symtab, 0,
+ reinterpret_cast(buf), json_size + 1, status.ptr());
+ grpc_error_handle error = GRPC_ERROR_NONE;
+ auto json = Json::Parse(reinterpret_cast(buf), &error);
+ if (error != GRPC_ERROR_NONE) {
+ // This should not happen
+ auto ret_status = absl::InternalError(
+ absl::StrCat("Error parsing JSON form of google::Protobuf::Struct "
+ "produced by upb library: ",
+ grpc_error_std_string(error)));
+ GRPC_ERROR_UNREF(error);
+ return ret_status;
+ }
+ return json;
+}
+
+} // namespace
+
+//
+// XdsLbPolicyRegistry
+//
+
+absl::StatusOr XdsLbPolicyRegistry::ConvertXdsLbPolicyConfig(
+ const XdsEncodingContext& context,
+ const envoy_config_cluster_v3_LoadBalancingPolicy* lb_policy,
+ int recursion_depth) {
+ constexpr int kMaxRecursionDepth = 16;
+ if (recursion_depth >= kMaxRecursionDepth) {
+ return absl::InvalidArgumentError(
+ absl::StrFormat("LoadBalancingPolicy configuration has a recursion "
+ "depth of more than %d.",
+ kMaxRecursionDepth));
+ }
+ size_t size = 0;
+ const auto* policies =
+ envoy_config_cluster_v3_LoadBalancingPolicy_policies(lb_policy, &size);
+ for (size_t i = 0; i < size; ++i) {
+ absl::StatusOr policy;
+ const auto* typed_extension_config =
+ envoy_config_cluster_v3_LoadBalancingPolicy_Policy_typed_extension_config(
+ policies[i]);
+ if (typed_extension_config == nullptr) {
+ return absl::InvalidArgumentError(
+ "Error parsing LoadBalancingPolicy::Policy - Missing "
+ "typed_extension_config field");
+ }
+ const auto* typed_config =
+ envoy_config_core_v3_TypedExtensionConfig_typed_config(
+ typed_extension_config);
+ if (typed_config == nullptr) {
+ return absl::InvalidArgumentError(
+ "Error parsing LoadBalancingPolicy::Policy - Missing "
+ "TypedExtensionConfig::typed_config field");
+ }
+ auto type = ExtractExtensionTypeName(context, typed_config);
+ if (!type.ok()) {
+ return absl::InvalidArgumentError(absl::StrCat(
+ "Error parsing "
+ "LoadBalancingPolicy::Policy::TypedExtensionConfig::typed_config: ",
+ type.status().message()));
+ }
+ absl::string_view value =
+ UpbStringToAbsl(google_protobuf_Any_value(typed_config));
+ auto config_factory_it = Get()->policy_config_factories_.find(type->type);
+ if (config_factory_it != Get()->policy_config_factories_.end()) {
+ policy = config_factory_it->second->ConvertXdsLbPolicyConfig(
+ context, value, recursion_depth);
+ if (!policy.ok()) {
+ return absl::InvalidArgumentError(
+ absl::StrCat("Error parsing "
+ "LoadBalancingPolicy::Policy::TypedExtensionConfig::"
+ "typed_config to JSON: ",
+ policy.status().message()));
+ }
+ } else if (type->typed_struct != nullptr) {
+ // Custom lb policy config
+ std::string custom_type = std::string(type->type);
+ if (!LoadBalancingPolicyRegistry::LoadBalancingPolicyExists(
+ custom_type.c_str(), nullptr)) {
+ // Skip unsupported custom lb policy.
+ continue;
+ }
+ // Convert typed struct to json.
+ auto value = xds_type_v3_TypedStruct_value(type->typed_struct);
+ if (value == nullptr) {
+ policy = Json::Object{{std::move(custom_type), Json() /* null */}};
+ } else {
+ auto parsed_value = ParseStructToJson(context, value);
+ if (!parsed_value.ok()) {
+ return absl::InvalidArgumentError(absl::StrCat(
+ "Error parsing LoadBalancingPolicy: Custom Policy: ", custom_type,
+ ": ", parsed_value.status().message()));
+ }
+ policy =
+ Json::Object{{std::move(custom_type), *(std::move(parsed_value))}};
+ }
+ } else {
+ // Unsupported type. Skipping entry.
+ continue;
+ }
+ return Json::Array{std::move(policy.value())};
+ }
+ return absl::InvalidArgumentError(
+ "No supported load balancing policy config found.");
+}
+
+XdsLbPolicyRegistry::XdsLbPolicyRegistry() {
+ policy_config_factories_.emplace(
+ RingHashLbPolicyConfigFactory::Type(),
+ absl::make_unique());
+ policy_config_factories_.emplace(
+ RoundRobinLbPolicyConfigFactory::Type(),
+ absl::make_unique());
+ policy_config_factories_.emplace(
+ WrrLocalityLbPolicyConfigFactory::Type(),
+ absl::make_unique());
+}
+
+XdsLbPolicyRegistry* XdsLbPolicyRegistry::Get() {
+ // This is thread-safe since C++11
+ static XdsLbPolicyRegistry* instance = new XdsLbPolicyRegistry();
+ return instance;
+}
+
+} // namespace grpc_core
diff --git a/src/core/ext/xds/xds_lb_policy_registry.h b/src/core/ext/xds/xds_lb_policy_registry.h
new file mode 100644
index 00000000000..4f1ba9f65e0
--- /dev/null
+++ b/src/core/ext/xds/xds_lb_policy_registry.h
@@ -0,0 +1,72 @@
+//
+// Copyright 2022 gRPC authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#ifndef GRPC_CORE_EXT_XDS_XDS_LB_POLICY_REGISTRY_H
+#define GRPC_CORE_EXT_XDS_XDS_LB_POLICY_REGISTRY_H
+
+#include
+
+#include