From 6b89acc7ba5a3d9cd6623841bb5f8bc1609df613 Mon Sep 17 00:00:00 2001 From: yifeizhuang Date: Tue, 22 Mar 2022 10:38:39 -0700 Subject: [PATCH 1/7] adding a GCR image for java 1.44.0 for compatibility test (#28697) Co-authored-by: Eric Anderson --- tools/interop_matrix/client_matrix.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/interop_matrix/client_matrix.py b/tools/interop_matrix/client_matrix.py index c866324eac3..e3bdef194d0 100644 --- a/tools/interop_matrix/client_matrix.py +++ b/tools/interop_matrix/client_matrix.py @@ -274,7 +274,8 @@ LANG_RELEASE_MATRIX = { ('v1.40.2', ReleaseInfo()), ('v1.41.1', ReleaseInfo()), ('v1.42.1', ReleaseInfo()), - ('v1.43.1', ReleaseInfo()), + ('v1.43.2', ReleaseInfo()), + ('v1.44.0', ReleaseInfo()), ('v1.45.0', ReleaseInfo()), ]), 'python': From 362e0b8706226b43aef09a7645af895230597de0 Mon Sep 17 00:00:00 2001 From: donnadionne Date: Tue, 22 Mar 2022 11:29:52 -0700 Subject: [PATCH 2/7] Initial structure for RLS (#28750) * Initial structure for RLS * Adding and building the proto to parse the Any proto for the plugins * re-org * Parsing the plugin * Parsing more into json * Parsed proto to json * small cleanup * Adding prefix * Added new rls_experimental policy * build files * Fixing according to code review comments * code review comments * Adding sym changes * adding action name check * fixing code review comments. * fixing unused var error * clean up * fixing code review comments * fixing code review comments * fixing according to code review comments. * Remove unnecessary include * small fix * generate more, hard-code less * Moving to using absl::variant * absl::string_view and absl::variant of vector of std::string are not playing nice together. * fixed variant * Using absl::variant now * Checkint used plugins * Refactor Parsing code and separating out Parsing of the plugin * Fixing code review comments * code review comments * fixing code review comments. * Addressing code review comments * First end-to-end test * generated build files * commit generated files via tools/codegen/core/gen_upb_api.sh * Fixing rls policy parsing tests * Restore checks for the test server * Refactor rls_server * added keys to rls request * fixing small logic error * Complete the test using all the keys * Separating out RLS test and rls_server thread * sanity errors * generated build files * Complete the rest of the tests and sanity cleanup * fixing code review comments: using upb_JsonEncode now! * fixing code review comments * fixing code review comments * Fixing code review comments * misisng fix * simplifying tests * simplify tests 2 * Linking in the correct proto for rls_config * restore metadata check * Add disable test * Fixing RLS test and removing environment var that is no longer necessary * Fixing "Wrong type" type of tests after json parsing change to accept STRING for number * adding json_encode.h/c to src/upb/gen_build_yaml.py and generate necessary files. * Fixing un-used var error * fixing sanity errors * Fixing the upb encoding buffer * Fixing code review comments. * Adding nack test for unkonwn plugin proto * Last bit of code review comments * fixing unused variable --- BUILD | 14 + CMakeLists.txt | 17 + Makefile | 7 + build_autogenerated.yaml | 12 + config.m4 | 5 + config.w32 | 9 + gRPC-C++.podspec | 8 + gRPC-Core.podspec | 12 + grpc.gemspec | 8 + grpc.gyp | 4 + package.xml | 8 + .../client_channel/lb_policy/rls/rls.cc | 11 +- .../resolver/xds/xds_resolver.cc | 89 ++- .../src/proto/grpc/lookup/v1/rls_config.upb.c | 172 +++++ .../src/proto/grpc/lookup/v1/rls_config.upb.h | 623 ++++++++++++++++++ .../proto/grpc/lookup/v1/rls_config.upbdefs.c | 99 +++ .../proto/grpc/lookup/v1/rls_config.upbdefs.h | 75 +++ src/core/ext/xds/xds_client.cc | 3 + .../ext/xds/xds_cluster_specifier_plugin.cc | 144 ++++ .../ext/xds/xds_cluster_specifier_plugin.h | 81 +++ src/core/ext/xds/xds_common_types.cc | 18 +- src/core/ext/xds/xds_common_types.h | 6 +- src/core/ext/xds/xds_listener.cc | 2 +- src/core/ext/xds/xds_route_config.cc | 168 ++++- src/core/ext/xds/xds_route_config.h | 23 +- src/core/lib/json/json_util.h | 6 +- src/proto/grpc/lookup/v1/BUILD | 14 + src/proto/grpc/testing/xds/v3/BUILD | 1 + src/proto/grpc/testing/xds/v3/route.proto | 19 + src/python/grpcio/grpc_core_dependencies.py | 4 + src/upb/gen_build_yaml.py | 2 + .../rls_lb_config_parser_test.cc | 44 +- .../rbac/rbac_service_config_parser_test.cc | 2 +- ...sh_ca_certificate_provider_factory_test.cc | 4 +- test/cpp/end2end/BUILD | 16 + test/cpp/end2end/rls_end2end_test.cc | 117 +--- test/cpp/end2end/rls_server.cc | 103 +++ test/cpp/end2end/rls_server.h | 94 +++ test/cpp/end2end/xds/BUILD | 3 + test/cpp/end2end/xds/xds_end2end_test.cc | 323 +++++++++ tools/doxygen/Doxyfile.c++.internal | 6 + tools/doxygen/Doxyfile.core.internal | 6 + 42 files changed, 2165 insertions(+), 217 deletions(-) create mode 100644 src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.c create mode 100644 src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.h create mode 100644 src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.c create mode 100644 src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.h create mode 100644 src/core/ext/xds/xds_cluster_specifier_plugin.cc create mode 100644 src/core/ext/xds/xds_cluster_specifier_plugin.h create mode 100644 test/cpp/end2end/rls_server.cc create mode 100644 test/cpp/end2end/rls_server.h diff --git a/BUILD b/BUILD index a27da2ec4d1..9cb2aebaafb 100644 --- a/BUILD +++ b/BUILD @@ -2881,6 +2881,7 @@ grpc_cc_library( "src/core/ext/xds/xds_client.cc", "src/core/ext/xds/xds_client_stats.cc", "src/core/ext/xds/xds_cluster.cc", + "src/core/ext/xds/xds_cluster_specifier_plugin.cc", "src/core/ext/xds/xds_common_types.cc", "src/core/ext/xds/xds_endpoint.cc", "src/core/ext/xds/xds_http_fault_filter.cc", @@ -2905,6 +2906,7 @@ grpc_cc_library( "src/core/ext/xds/xds_client.h", "src/core/ext/xds/xds_client_stats.h", "src/core/ext/xds/xds_cluster.h", + "src/core/ext/xds/xds_cluster_specifier_plugin.h", "src/core/ext/xds/xds_common_types.h", "src/core/ext/xds/xds_endpoint.h", "src/core/ext/xds/xds_http_fault_filter.h", @@ -2993,6 +2995,8 @@ grpc_cc_library( "protobuf_timestamp_upb", "protobuf_wrappers_upb", "ref_counted_ptr", + "rls_config_upb", + "rls_config_upbdefs", "slice", "slice_refcount", "sockaddr_utils", @@ -5369,6 +5373,16 @@ grpc_upb_proto_library( deps = ["//src/proto/grpc/lookup/v1:rls_proto_descriptor"], ) +grpc_upb_proto_library( + name = "rls_config_upb", + deps = ["//src/proto/grpc/lookup/v1:rls_config_proto_descriptor"], +) + +grpc_upb_proto_reflection_library( + name = "rls_config_upbdefs", + deps = ["//src/proto/grpc/lookup/v1:rls_config_proto_descriptor"], +) + WELL_KNOWN_PROTO_TARGETS = [ "any", "duration", diff --git a/CMakeLists.txt b/CMakeLists.txt index efa7230862a..bbb791db903 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -442,6 +442,9 @@ protobuf_generate_grpc_cpp( protobuf_generate_grpc_cpp( src/proto/grpc/lookup/v1/rls.proto ) +protobuf_generate_grpc_cpp( + src/proto/grpc/lookup/v1/rls_config.proto +) protobuf_generate_grpc_cpp( src/proto/grpc/reflection/v1alpha/reflection.proto ) @@ -1654,6 +1657,7 @@ add_library(grpc src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c + src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.c src/core/ext/upb-generated/udpa/annotations/migrate.upb.c src/core/ext/upb-generated/udpa/annotations/security.upb.c src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c @@ -1788,6 +1792,7 @@ add_library(grpc src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c src/core/ext/upbdefs-generated/opencensus/proto/trace/v1/trace_config.upbdefs.c + src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.c src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c @@ -1820,6 +1825,7 @@ add_library(grpc src/core/ext/xds/xds_client.cc src/core/ext/xds/xds_client_stats.cc src/core/ext/xds/xds_cluster.cc + src/core/ext/xds/xds_cluster_specifier_plugin.cc src/core/ext/xds/xds_common_types.cc src/core/ext/xds/xds_endpoint.cc src/core/ext/xds/xds_http_fault_filter.cc @@ -3956,6 +3962,7 @@ add_library(upb third_party/upb/upb/decode.c third_party/upb/upb/def.c third_party/upb/upb/encode.c + third_party/upb/upb/json_encode.c third_party/upb/upb/msg.c third_party/upb/upb/reflection.c third_party/upb/upb/table.c @@ -14118,6 +14125,7 @@ add_executable(rls_end2end_test ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.h test/core/util/test_lb_policies.cc test/cpp/end2end/rls_end2end_test.cc + test/cpp/end2end/rls_server.cc test/cpp/end2end/test_service_impl.cc third_party/googletest/googletest/src/gtest-all.cc third_party/googletest/googlemock/src/gmock-all.cc @@ -16986,6 +16994,14 @@ if(gRPC_BUILD_TESTS) if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) add_executable(xds_end2end_test + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/lookup/v1/rls.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/lookup/v1/rls.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/lookup/v1/rls.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/lookup/v1/rls.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/lookup/v1/rls_config.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/lookup/v1/rls_config.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/lookup/v1/rls_config.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/lookup/v1/rls_config.grpc.pb.h ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.pb.h @@ -17143,6 +17159,7 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/tls.pb.h ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/tls.grpc.pb.h src/cpp/server/csds/csds.cc + test/cpp/end2end/rls_server.cc test/cpp/end2end/test_service_impl.cc test/cpp/end2end/xds/xds_end2end_test.cc test/cpp/end2end/xds/xds_server.cc diff --git a/Makefile b/Makefile index 9e8c78fb5b3..9fa48e9769a 100644 --- a/Makefile +++ b/Makefile @@ -1242,6 +1242,7 @@ LIBGRPC_SRC = \ src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c \ src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c \ src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c \ + src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.c \ src/core/ext/upb-generated/udpa/annotations/migrate.upb.c \ src/core/ext/upb-generated/udpa/annotations/security.upb.c \ src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c \ @@ -1376,6 +1377,7 @@ LIBGRPC_SRC = \ src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c \ src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c \ src/core/ext/upbdefs-generated/opencensus/proto/trace/v1/trace_config.upbdefs.c \ + src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.c \ src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c \ src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c \ src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c \ @@ -1408,6 +1410,7 @@ LIBGRPC_SRC = \ src/core/ext/xds/xds_client.cc \ src/core/ext/xds/xds_client_stats.cc \ src/core/ext/xds/xds_cluster.cc \ + src/core/ext/xds/xds_cluster_specifier_plugin.cc \ src/core/ext/xds/xds_common_types.cc \ src/core/ext/xds/xds_endpoint.cc \ src/core/ext/xds/xds_http_fault_filter.cc \ @@ -2526,6 +2529,7 @@ LIBUPB_SRC = \ third_party/upb/upb/decode.c \ third_party/upb/upb/def.c \ third_party/upb/upb/encode.c \ + third_party/upb/upb/json_encode.c \ third_party/upb/upb/msg.c \ third_party/upb/upb/reflection.c \ third_party/upb/upb/table.c \ @@ -2943,6 +2947,7 @@ src/core/ext/upb-generated/opencensus/proto/trace/v1/trace_config.upb.c: $(OPENS src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c: $(OPENSSL_DEP) src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c: $(OPENSSL_DEP) src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c: $(OPENSSL_DEP) +src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.c: $(OPENSSL_DEP) src/core/ext/upb-generated/udpa/annotations/migrate.upb.c: $(OPENSSL_DEP) src/core/ext/upb-generated/udpa/annotations/security.upb.c: $(OPENSSL_DEP) src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c: $(OPENSSL_DEP) @@ -3074,6 +3079,7 @@ src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c: $(OPENSSL_DE src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c: $(OPENSSL_DEP) src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c: $(OPENSSL_DEP) src/core/ext/upbdefs-generated/opencensus/proto/trace/v1/trace_config.upbdefs.c: $(OPENSSL_DEP) +src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.c: $(OPENSSL_DEP) src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c: $(OPENSSL_DEP) src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c: $(OPENSSL_DEP) src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c: $(OPENSSL_DEP) @@ -3106,6 +3112,7 @@ src/core/ext/xds/xds_channel_stack_modifier.cc: $(OPENSSL_DEP) src/core/ext/xds/xds_client.cc: $(OPENSSL_DEP) src/core/ext/xds/xds_client_stats.cc: $(OPENSSL_DEP) src/core/ext/xds/xds_cluster.cc: $(OPENSSL_DEP) +src/core/ext/xds/xds_cluster_specifier_plugin.cc: $(OPENSSL_DEP) src/core/ext/xds/xds_common_types.cc: $(OPENSSL_DEP) src/core/ext/xds/xds_endpoint.cc: $(OPENSSL_DEP) src/core/ext/xds/xds_http_fault_filter.cc: $(OPENSSL_DEP) diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index 28993cf44fd..29123cb0a6a 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -513,6 +513,7 @@ libs: - src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h - src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h - src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h + - src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.h - src/core/ext/upb-generated/udpa/annotations/migrate.upb.h - src/core/ext/upb-generated/udpa/annotations/security.upb.h - src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h @@ -647,6 +648,7 @@ libs: - src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.h - src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.h - src/core/ext/upbdefs-generated/opencensus/proto/trace/v1/trace_config.upbdefs.h + - src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.h - src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.h - src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.h - src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.h @@ -682,6 +684,7 @@ libs: - src/core/ext/xds/xds_client.h - src/core/ext/xds/xds_client_stats.h - src/core/ext/xds/xds_cluster.h + - src/core/ext/xds/xds_cluster_specifier_plugin.h - src/core/ext/xds/xds_common_types.h - src/core/ext/xds/xds_endpoint.h - src/core/ext/xds/xds_http_fault_filter.h @@ -1185,6 +1188,7 @@ libs: - src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c - src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c - src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c + - src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.c - src/core/ext/upb-generated/udpa/annotations/migrate.upb.c - src/core/ext/upb-generated/udpa/annotations/security.upb.c - src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c @@ -1319,6 +1323,7 @@ libs: - src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c - src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c - src/core/ext/upbdefs-generated/opencensus/proto/trace/v1/trace_config.upbdefs.c + - src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.c - src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c - src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c - src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c @@ -1351,6 +1356,7 @@ libs: - src/core/ext/xds/xds_client.cc - src/core/ext/xds/xds_client_stats.cc - src/core/ext/xds/xds_cluster.cc + - src/core/ext/xds/xds_cluster_specifier_plugin.cc - src/core/ext/xds/xds_common_types.cc - src/core/ext/xds/xds_endpoint.cc - src/core/ext/xds/xds_http_fault_filter.cc @@ -7131,6 +7137,7 @@ targets: headers: - test/core/util/test_lb_policies.h - test/cpp/end2end/counted_service.h + - test/cpp/end2end/rls_server.h - test/cpp/end2end/test_service_impl.h src: - src/proto/grpc/lookup/v1/rls.proto @@ -7140,6 +7147,7 @@ targets: - src/proto/grpc/testing/simple_messages.proto - test/core/util/test_lb_policies.cc - test/cpp/end2end/rls_end2end_test.cc + - test/cpp/end2end/rls_server.cc - test/cpp/end2end/test_service_impl.cc deps: - grpc++_test_config @@ -8355,10 +8363,13 @@ targets: headers: - src/cpp/server/csds/csds.h - test/cpp/end2end/counted_service.h + - test/cpp/end2end/rls_server.h - test/cpp/end2end/test_service_impl.h - test/cpp/end2end/xds/xds_server.h - test/cpp/util/tls_test_utils.h src: + - src/proto/grpc/lookup/v1/rls.proto + - src/proto/grpc/lookup/v1/rls_config.proto - src/proto/grpc/testing/duplicate/echo_duplicate.proto - src/proto/grpc/testing/echo.proto - src/proto/grpc/testing/echo_messages.proto @@ -8399,6 +8410,7 @@ targets: - src/proto/grpc/testing/xds/v3/string.proto - src/proto/grpc/testing/xds/v3/tls.proto - src/cpp/server/csds/csds.cc + - test/cpp/end2end/rls_server.cc - test/cpp/end2end/test_service_impl.cc - test/cpp/end2end/xds/xds_end2end_test.cc - test/cpp/end2end/xds/xds_server.cc diff --git a/config.m4 b/config.m4 index aa1a9f3aae4..4a40af5382c 100644 --- a/config.m4 +++ b/config.m4 @@ -260,6 +260,7 @@ if test "$PHP_GRPC" != "no"; then src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c \ src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c \ src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c \ + src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.c \ src/core/ext/upb-generated/udpa/annotations/migrate.upb.c \ src/core/ext/upb-generated/udpa/annotations/security.upb.c \ src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c \ @@ -394,6 +395,7 @@ if test "$PHP_GRPC" != "no"; then src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c \ src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c \ src/core/ext/upbdefs-generated/opencensus/proto/trace/v1/trace_config.upbdefs.c \ + src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.c \ src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c \ src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c \ src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c \ @@ -426,6 +428,7 @@ if test "$PHP_GRPC" != "no"; then src/core/ext/xds/xds_client.cc \ src/core/ext/xds/xds_client_stats.cc \ src/core/ext/xds/xds_cluster.cc \ + src/core/ext/xds/xds_cluster_specifier_plugin.cc \ src/core/ext/xds/xds_common_types.cc \ src/core/ext/xds/xds_endpoint.cc \ src/core/ext/xds/xds_http_fault_filter.cc \ @@ -1150,6 +1153,7 @@ if test "$PHP_GRPC" != "no"; then third_party/upb/upb/decode_fast.c \ third_party/upb/upb/def.c \ third_party/upb/upb/encode.c \ + third_party/upb/upb/json_encode.c \ third_party/upb/upb/msg.c \ third_party/upb/upb/reflection.c \ third_party/upb/upb/table.c \ @@ -1280,6 +1284,7 @@ if test "$PHP_GRPC" != "no"; then PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/google/protobuf) PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/google/rpc) PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/opencensus/proto/trace/v1) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1) PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/udpa/annotations) PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/validate) PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/xds/annotations/v3) diff --git a/config.w32 b/config.w32 index dfc72f7db81..990db857c7f 100644 --- a/config.w32 +++ b/config.w32 @@ -226,6 +226,7 @@ if (PHP_GRPC != "no") { "src\\core\\ext\\upb-generated\\src\\proto\\grpc\\health\\v1\\health.upb.c " + "src\\core\\ext\\upb-generated\\src\\proto\\grpc\\lb\\v1\\load_balancer.upb.c " + "src\\core\\ext\\upb-generated\\src\\proto\\grpc\\lookup\\v1\\rls.upb.c " + + "src\\core\\ext\\upb-generated\\src\\proto\\grpc\\lookup\\v1\\rls_config.upb.c " + "src\\core\\ext\\upb-generated\\udpa\\annotations\\migrate.upb.c " + "src\\core\\ext\\upb-generated\\udpa\\annotations\\security.upb.c " + "src\\core\\ext\\upb-generated\\udpa\\annotations\\sensitive.upb.c " + @@ -360,6 +361,7 @@ if (PHP_GRPC != "no") { "src\\core\\ext\\upbdefs-generated\\google\\protobuf\\wrappers.upbdefs.c " + "src\\core\\ext\\upbdefs-generated\\google\\rpc\\status.upbdefs.c " + "src\\core\\ext\\upbdefs-generated\\opencensus\\proto\\trace\\v1\\trace_config.upbdefs.c " + + "src\\core\\ext\\upbdefs-generated\\src\\proto\\grpc\\lookup\\v1\\rls_config.upbdefs.c " + "src\\core\\ext\\upbdefs-generated\\udpa\\annotations\\migrate.upbdefs.c " + "src\\core\\ext\\upbdefs-generated\\udpa\\annotations\\security.upbdefs.c " + "src\\core\\ext\\upbdefs-generated\\udpa\\annotations\\sensitive.upbdefs.c " + @@ -392,6 +394,7 @@ if (PHP_GRPC != "no") { "src\\core\\ext\\xds\\xds_client.cc " + "src\\core\\ext\\xds\\xds_client_stats.cc " + "src\\core\\ext\\xds\\xds_cluster.cc " + + "src\\core\\ext\\xds\\xds_cluster_specifier_plugin.cc " + "src\\core\\ext\\xds\\xds_common_types.cc " + "src\\core\\ext\\xds\\xds_endpoint.cc " + "src\\core\\ext\\xds\\xds_http_fault_filter.cc " + @@ -1116,6 +1119,7 @@ if (PHP_GRPC != "no") { "third_party\\upb\\upb\\decode_fast.c " + "third_party\\upb\\upb\\def.c " + "third_party\\upb\\upb\\encode.c " + + "third_party\\upb\\upb\\json_encode.c " + "third_party\\upb\\upb\\msg.c " + "third_party\\upb\\upb\\reflection.c " + "third_party\\upb\\upb\\table.c " + @@ -1386,6 +1390,11 @@ if (PHP_GRPC != "no") { FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\opencensus\\proto"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\opencensus\\proto\\trace"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\opencensus\\proto\\trace\\v1"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\src"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\src\\proto"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\src\\proto\\grpc"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\src\\proto\\grpc\\lookup"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\src\\proto\\grpc\\lookup\\v1"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\udpa"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\udpa\\annotations"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\validate"); diff --git a/gRPC-C++.podspec b/gRPC-C++.podspec index 083a2998934..224de8efaeb 100644 --- a/gRPC-C++.podspec +++ b/gRPC-C++.podspec @@ -453,6 +453,7 @@ Pod::Spec.new do |s| 'src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h', 'src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h', 'src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h', + 'src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.h', 'src/core/ext/upb-generated/udpa/annotations/migrate.upb.h', 'src/core/ext/upb-generated/udpa/annotations/security.upb.h', 'src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h', @@ -587,6 +588,7 @@ Pod::Spec.new do |s| 'src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.h', 'src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.h', 'src/core/ext/upbdefs-generated/opencensus/proto/trace/v1/trace_config.upbdefs.h', + 'src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.h', 'src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.h', 'src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.h', 'src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.h', @@ -622,6 +624,7 @@ Pod::Spec.new do |s| 'src/core/ext/xds/xds_client.h', 'src/core/ext/xds/xds_client_stats.h', 'src/core/ext/xds/xds_cluster.h', + 'src/core/ext/xds/xds_cluster_specifier_plugin.h', 'src/core/ext/xds/xds_common_types.h', 'src/core/ext/xds/xds_endpoint.h', 'src/core/ext/xds/xds_http_fault_filter.h', @@ -1024,6 +1027,7 @@ Pod::Spec.new do |s| 'third_party/upb/upb/def.h', 'third_party/upb/upb/def.hpp', 'third_party/upb/upb/encode.h', + 'third_party/upb/upb/json_encode.h', 'third_party/upb/upb/msg.h', 'third_party/upb/upb/msg_internal.h', 'third_party/upb/upb/port_def.inc', @@ -1258,6 +1262,7 @@ Pod::Spec.new do |s| 'src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h', 'src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h', 'src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h', + 'src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.h', 'src/core/ext/upb-generated/udpa/annotations/migrate.upb.h', 'src/core/ext/upb-generated/udpa/annotations/security.upb.h', 'src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h', @@ -1392,6 +1397,7 @@ Pod::Spec.new do |s| 'src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.h', 'src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.h', 'src/core/ext/upbdefs-generated/opencensus/proto/trace/v1/trace_config.upbdefs.h', + 'src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.h', 'src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.h', 'src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.h', 'src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.h', @@ -1427,6 +1433,7 @@ Pod::Spec.new do |s| 'src/core/ext/xds/xds_client.h', 'src/core/ext/xds/xds_client_stats.h', 'src/core/ext/xds/xds_cluster.h', + 'src/core/ext/xds/xds_cluster_specifier_plugin.h', 'src/core/ext/xds/xds_common_types.h', 'src/core/ext/xds/xds_endpoint.h', 'src/core/ext/xds/xds_http_fault_filter.h', @@ -1779,6 +1786,7 @@ Pod::Spec.new do |s| 'third_party/upb/upb/def.h', 'third_party/upb/upb/def.hpp', 'third_party/upb/upb/encode.h', + 'third_party/upb/upb/json_encode.h', 'third_party/upb/upb/msg.h', 'third_party/upb/upb/msg_internal.h', 'third_party/upb/upb/port_def.inc', diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index 1b106b25d7e..0a860019718 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -612,6 +612,8 @@ Pod::Spec.new do |s| 'src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h', 'src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c', 'src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h', + 'src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.c', + 'src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.h', 'src/core/ext/upb-generated/udpa/annotations/migrate.upb.c', 'src/core/ext/upb-generated/udpa/annotations/migrate.upb.h', 'src/core/ext/upb-generated/udpa/annotations/security.upb.c', @@ -880,6 +882,8 @@ Pod::Spec.new do |s| 'src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.h', 'src/core/ext/upbdefs-generated/opencensus/proto/trace/v1/trace_config.upbdefs.c', 'src/core/ext/upbdefs-generated/opencensus/proto/trace/v1/trace_config.upbdefs.h', + 'src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.c', + 'src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.h', 'src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c', 'src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.h', 'src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c', @@ -947,6 +951,8 @@ Pod::Spec.new do |s| 'src/core/ext/xds/xds_client_stats.h', 'src/core/ext/xds/xds_cluster.cc', 'src/core/ext/xds/xds_cluster.h', + 'src/core/ext/xds/xds_cluster_specifier_plugin.cc', + 'src/core/ext/xds/xds_cluster_specifier_plugin.h', 'src/core/ext/xds/xds_common_types.cc', 'src/core/ext/xds/xds_common_types.h', 'src/core/ext/xds/xds_endpoint.cc', @@ -1638,6 +1644,8 @@ Pod::Spec.new do |s| 'third_party/upb/upb/def.hpp', 'third_party/upb/upb/encode.c', 'third_party/upb/upb/encode.h', + 'third_party/upb/upb/json_encode.c', + 'third_party/upb/upb/json_encode.h', 'third_party/upb/upb/msg.c', 'third_party/upb/upb/msg.h', 'third_party/upb/upb/msg_internal.h', @@ -1856,6 +1864,7 @@ Pod::Spec.new do |s| 'src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h', 'src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h', 'src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h', + 'src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.h', 'src/core/ext/upb-generated/udpa/annotations/migrate.upb.h', 'src/core/ext/upb-generated/udpa/annotations/security.upb.h', 'src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h', @@ -1990,6 +1999,7 @@ Pod::Spec.new do |s| 'src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.h', 'src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.h', 'src/core/ext/upbdefs-generated/opencensus/proto/trace/v1/trace_config.upbdefs.h', + 'src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.h', 'src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.h', 'src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.h', 'src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.h', @@ -2025,6 +2035,7 @@ Pod::Spec.new do |s| 'src/core/ext/xds/xds_client.h', 'src/core/ext/xds/xds_client_stats.h', 'src/core/ext/xds/xds_cluster.h', + 'src/core/ext/xds/xds_cluster_specifier_plugin.h', 'src/core/ext/xds/xds_common_types.h', 'src/core/ext/xds/xds_endpoint.h', 'src/core/ext/xds/xds_http_fault_filter.h', @@ -2367,6 +2378,7 @@ Pod::Spec.new do |s| 'third_party/upb/upb/def.h', 'third_party/upb/upb/def.hpp', 'third_party/upb/upb/encode.h', + 'third_party/upb/upb/json_encode.h', 'third_party/upb/upb/msg.h', 'third_party/upb/upb/msg_internal.h', 'third_party/upb/upb/port_def.inc', diff --git a/grpc.gemspec b/grpc.gemspec index 8a56c3841a0..2465cae2653 100644 --- a/grpc.gemspec +++ b/grpc.gemspec @@ -531,6 +531,8 @@ Gem::Specification.new do |s| s.files += %w( src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h ) s.files += %w( src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c ) s.files += %w( src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h ) + s.files += %w( src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.c ) + s.files += %w( src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.h ) s.files += %w( src/core/ext/upb-generated/udpa/annotations/migrate.upb.c ) s.files += %w( src/core/ext/upb-generated/udpa/annotations/migrate.upb.h ) s.files += %w( src/core/ext/upb-generated/udpa/annotations/security.upb.c ) @@ -799,6 +801,8 @@ Gem::Specification.new do |s| s.files += %w( src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.h ) s.files += %w( src/core/ext/upbdefs-generated/opencensus/proto/trace/v1/trace_config.upbdefs.c ) s.files += %w( src/core/ext/upbdefs-generated/opencensus/proto/trace/v1/trace_config.upbdefs.h ) + s.files += %w( src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.c ) + s.files += %w( src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.h ) s.files += %w( src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c ) s.files += %w( src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.h ) s.files += %w( src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c ) @@ -866,6 +870,8 @@ Gem::Specification.new do |s| s.files += %w( src/core/ext/xds/xds_client_stats.h ) s.files += %w( src/core/ext/xds/xds_cluster.cc ) s.files += %w( src/core/ext/xds/xds_cluster.h ) + s.files += %w( src/core/ext/xds/xds_cluster_specifier_plugin.cc ) + s.files += %w( src/core/ext/xds/xds_cluster_specifier_plugin.h ) s.files += %w( src/core/ext/xds/xds_common_types.cc ) s.files += %w( src/core/ext/xds/xds_common_types.h ) s.files += %w( src/core/ext/xds/xds_endpoint.cc ) @@ -2436,6 +2442,8 @@ Gem::Specification.new do |s| s.files += %w( third_party/upb/upb/def.hpp ) s.files += %w( third_party/upb/upb/encode.c ) s.files += %w( third_party/upb/upb/encode.h ) + s.files += %w( third_party/upb/upb/json_encode.c ) + s.files += %w( third_party/upb/upb/json_encode.h ) s.files += %w( third_party/upb/upb/msg.c ) s.files += %w( third_party/upb/upb/msg.h ) s.files += %w( third_party/upb/upb/msg_internal.h ) diff --git a/grpc.gyp b/grpc.gyp index ca719c20de5..3a796ce45b8 100644 --- a/grpc.gyp +++ b/grpc.gyp @@ -590,6 +590,7 @@ 'src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c', 'src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c', 'src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c', + 'src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.c', 'src/core/ext/upb-generated/udpa/annotations/migrate.upb.c', 'src/core/ext/upb-generated/udpa/annotations/security.upb.c', 'src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c', @@ -724,6 +725,7 @@ 'src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c', 'src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c', 'src/core/ext/upbdefs-generated/opencensus/proto/trace/v1/trace_config.upbdefs.c', + 'src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.c', 'src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c', 'src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c', 'src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c', @@ -756,6 +758,7 @@ 'src/core/ext/xds/xds_client.cc', 'src/core/ext/xds/xds_client_stats.cc', 'src/core/ext/xds/xds_cluster.cc', + 'src/core/ext/xds/xds_cluster_specifier_plugin.cc', 'src/core/ext/xds/xds_common_types.cc', 'src/core/ext/xds/xds_endpoint.cc', 'src/core/ext/xds/xds_http_fault_filter.cc', @@ -2036,6 +2039,7 @@ 'third_party/upb/upb/decode.c', 'third_party/upb/upb/def.c', 'third_party/upb/upb/encode.c', + 'third_party/upb/upb/json_encode.c', 'third_party/upb/upb/msg.c', 'third_party/upb/upb/reflection.c', 'third_party/upb/upb/table.c', diff --git a/package.xml b/package.xml index f7c2e8ff347..32f6916f712 100644 --- a/package.xml +++ b/package.xml @@ -511,6 +511,8 @@ + + @@ -779,6 +781,8 @@ + + @@ -846,6 +850,8 @@ + + @@ -2352,6 +2358,8 @@ + + diff --git a/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc b/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc index 068af6102a1..e7bd80895f9 100644 --- a/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +++ b/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc @@ -83,7 +83,7 @@ TraceFlag grpc_lb_rls_trace(false, "rls_lb"); namespace { -const char* kRls = "rls"; +const char* kRls = "rls_experimental"; const char kGrpc[] = "grpc"; const char* kRlsRequestPath = "/grpc.lookup.v1.RouteLookupService/RouteLookup"; const char* kFakeTargetFieldValue = "fake_target_field_value"; @@ -2530,18 +2530,9 @@ class RlsLbFactory : public LoadBalancingPolicyFactory { } }; -bool RlsEnabled() { - char* value = gpr_getenv("GRPC_EXPERIMENTAL_ENABLE_RLS_LB_POLICY"); - bool parsed_value; - bool parse_succeeded = gpr_parse_bool_value(value, &parsed_value); - gpr_free(value); - return parse_succeeded && parsed_value; -} - } // namespace void RlsLbPluginInit() { - if (!RlsEnabled()) return; LoadBalancingPolicyRegistry::Builder::RegisterLoadBalancingPolicyFactory( absl::make_unique()); } diff --git a/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc b/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc index b30debc2652..5c3e0ef1c34 100644 --- a/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +++ b/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc @@ -330,6 +330,9 @@ class XdsResolver : public Resolver { std::string route_config_name_; RouteConfigWatcher* route_config_watcher_ = nullptr; XdsRouteConfigResource::VirtualHost current_virtual_host_; + std::map + cluster_specifier_plugin_map_; ClusterState::ClusterStateMap cluster_state_map_; }; @@ -416,13 +419,23 @@ XdsResolver::XdsConfigSelector::XdsConfigSelector( resolver_->current_listener_.http_connection_manager .http_max_stream_duration; } - if (route_action->weighted_clusters.empty()) { + if (route_action->action.index() == + XdsRouteConfigResource::Route::RouteAction::kClusterIndex) { *error = CreateMethodConfig(route_entry.route, nullptr, &route_entry.method_config); - MaybeAddCluster(route_action->cluster_name); - } else { + MaybeAddCluster(absl::StrCat( + "cluster:", + absl::get< + XdsRouteConfigResource::Route::RouteAction::kClusterIndex>( + route_action->action))); + } else if (route_action->action.index() == + XdsRouteConfigResource::Route::RouteAction:: + kWeightedClustersIndex) { + auto& action_weighted_clusters = absl::get< + XdsRouteConfigResource::Route::RouteAction::kWeightedClustersIndex>( + route_action->action); uint32_t end = 0; - for (const auto& weighted_cluster : route_action->weighted_clusters) { + for (const auto& weighted_cluster : action_weighted_clusters) { Route::ClusterWeightState cluster_weight_state; *error = CreateMethodConfig(route_entry.route, &weighted_cluster, &cluster_weight_state.method_config); @@ -432,8 +445,18 @@ XdsResolver::XdsConfigSelector::XdsConfigSelector( cluster_weight_state.cluster = weighted_cluster.name; route_entry.weighted_cluster_state.push_back( std::move(cluster_weight_state)); - MaybeAddCluster(weighted_cluster.name); + MaybeAddCluster(absl::StrCat("cluster:", weighted_cluster.name)); } + } else if (route_action->action.index() == + XdsRouteConfigResource::Route::RouteAction:: + kClusterSpecifierPluginIndex) { + // cluster_specifier_plugin case: + *error = CreateMethodConfig(route_entry.route, nullptr, + &route_entry.method_config); + MaybeAddCluster(absl::StrCat( + "cluster_specifier_plugin:", + absl::get(route_action->action))); } } } @@ -612,12 +635,18 @@ ConfigSelector::CallConfig XdsResolver::XdsConfigSelector::GetCallConfig( GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE); return call_config; } - absl::string_view cluster_name; + std::string cluster_name; RefCountedPtr method_config; - if (route_action->weighted_clusters.empty()) { - cluster_name = route_action->cluster_name; + if (route_action->action.index() == + XdsRouteConfigResource::Route::RouteAction::kClusterIndex) { + cluster_name = absl::StrCat( + "cluster:", + absl::get( + route_action->action)); method_config = entry.method_config; - } else { + } else if (route_action->action.index() == + XdsRouteConfigResource::Route::RouteAction:: + kWeightedClustersIndex) { const uint32_t key = rand() % entry.weighted_cluster_state[entry.weighted_cluster_state.size() - 1] @@ -640,8 +669,17 @@ ConfigSelector::CallConfig XdsResolver::XdsConfigSelector::GetCallConfig( } if (index == 0) index = start_index; GPR_ASSERT(entry.weighted_cluster_state[index].range_end > key); - cluster_name = entry.weighted_cluster_state[index].cluster; + cluster_name = + absl::StrCat("cluster:", entry.weighted_cluster_state[index].cluster); method_config = entry.weighted_cluster_state[index].method_config; + } else if (route_action->action.index() == + XdsRouteConfigResource::Route::RouteAction:: + kClusterSpecifierPluginIndex) { + cluster_name = absl::StrCat( + "cluster_specifier_plugin:", + absl::get(route_action->action)); + method_config = entry.method_config; } auto it = clusters_.find(cluster_name); GPR_ASSERT(it != clusters_.end()); @@ -863,6 +901,8 @@ void XdsResolver::OnRouteConfigUpdate(XdsRouteConfigResource rds_update) { } // Save the virtual host in the resolver. current_virtual_host_ = std::move(rds_update.virtual_hosts[*vhost_index]); + cluster_specifier_plugin_map_ = + std::move(rds_update.cluster_specifier_plugin_map); // Send a new result to the channel. GenerateResult(); } @@ -900,15 +940,26 @@ absl::StatusOr> XdsResolver::CreateServiceConfig() { std::vector clusters; for (const auto& cluster : cluster_state_map_) { - clusters.push_back( - absl::StrFormat(" \"%s\":{\n" - " \"childPolicy\":[ {\n" - " \"cds_experimental\":{\n" - " \"cluster\": \"%s\"\n" - " }\n" - " } ]\n" - " }", - cluster.first, cluster.first)); + absl::string_view child_name = cluster.first; + if (absl::ConsumePrefix(&child_name, "cluster_specifier_plugin:")) { + clusters.push_back(absl::StrFormat( + " \"%s\":{\n" + " \"childPolicy\": %s\n" + " }", + cluster.first, + cluster_specifier_plugin_map_[std::string(child_name)])); + } else { + absl::ConsumePrefix(&child_name, "cluster:"); + clusters.push_back( + absl::StrFormat(" \"%s\":{\n" + " \"childPolicy\":[ {\n" + " \"cds_experimental\":{\n" + " \"cluster\": \"%s\"\n" + " }\n" + " } ]\n" + " }", + cluster.first, child_name)); + } } std::vector config_parts; config_parts.push_back( diff --git a/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.c b/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.c new file mode 100644 index 00000000000..aa69eaf7f41 --- /dev/null +++ b/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.c @@ -0,0 +1,172 @@ +/* This file was generated by upbc (the upb compiler) from the input + * file: + * + * src/proto/grpc/lookup/v1/rls_config.proto + * + * Do not edit -- your changes will be discarded when the file is + * regenerated. */ + +#include +#include "upb/msg_internal.h" +#include "src/proto/grpc/lookup/v1/rls_config.upb.h" +#include "google/protobuf/duration.upb.h" + +#include "upb/port_def.inc" + +static const upb_MiniTable_Field grpc_lookup_v1_NameMatcher__fields[3] = { + {1, UPB_SIZE(4, 8), 0, 0, 9, kUpb_FieldMode_Scalar | (upb_FieldRep_StringView << upb_FieldRep_Shift)}, + {2, UPB_SIZE(12, 24), 0, 0, 9, kUpb_FieldMode_Array | (upb_FieldRep_Pointer << upb_FieldRep_Shift)}, + {3, UPB_SIZE(0, 0), 0, 0, 8, kUpb_FieldMode_Scalar | (upb_FieldRep_1Byte << upb_FieldRep_Shift)}, +}; + +const upb_MiniTable grpc_lookup_v1_NameMatcher_msginit = { + NULL, + &grpc_lookup_v1_NameMatcher__fields[0], + UPB_SIZE(16, 32), 3, upb_ExtMode_NonExtendable, 3, 255, 0, +}; + +static const upb_MiniTable_Sub grpc_lookup_v1_GrpcKeyBuilder_submsgs[4] = { + {.submsg = &grpc_lookup_v1_GrpcKeyBuilder_ConstantKeysEntry_msginit}, + {.submsg = &grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys_msginit}, + {.submsg = &grpc_lookup_v1_GrpcKeyBuilder_Name_msginit}, + {.submsg = &grpc_lookup_v1_NameMatcher_msginit}, +}; + +static const upb_MiniTable_Field grpc_lookup_v1_GrpcKeyBuilder__fields[4] = { + {1, UPB_SIZE(8, 16), 0, 2, 11, kUpb_FieldMode_Array | (upb_FieldRep_Pointer << upb_FieldRep_Shift)}, + {2, UPB_SIZE(12, 24), 0, 3, 11, kUpb_FieldMode_Array | (upb_FieldRep_Pointer << upb_FieldRep_Shift)}, + {3, UPB_SIZE(4, 8), 1, 1, 11, kUpb_FieldMode_Scalar | (upb_FieldRep_Pointer << upb_FieldRep_Shift)}, + {4, UPB_SIZE(16, 32), 0, 0, 11, kUpb_FieldMode_Map | (upb_FieldRep_Pointer << upb_FieldRep_Shift)}, +}; + +const upb_MiniTable grpc_lookup_v1_GrpcKeyBuilder_msginit = { + &grpc_lookup_v1_GrpcKeyBuilder_submsgs[0], + &grpc_lookup_v1_GrpcKeyBuilder__fields[0], + UPB_SIZE(24, 40), 4, upb_ExtMode_NonExtendable, 4, 255, 0, +}; + +static const upb_MiniTable_Field grpc_lookup_v1_GrpcKeyBuilder_Name__fields[2] = { + {1, UPB_SIZE(0, 0), 0, 0, 9, kUpb_FieldMode_Scalar | (upb_FieldRep_StringView << upb_FieldRep_Shift)}, + {2, UPB_SIZE(8, 16), 0, 0, 9, kUpb_FieldMode_Scalar | (upb_FieldRep_StringView << upb_FieldRep_Shift)}, +}; + +const upb_MiniTable grpc_lookup_v1_GrpcKeyBuilder_Name_msginit = { + NULL, + &grpc_lookup_v1_GrpcKeyBuilder_Name__fields[0], + UPB_SIZE(16, 32), 2, upb_ExtMode_NonExtendable, 2, 255, 0, +}; + +static const upb_MiniTable_Field grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys__fields[3] = { + {1, UPB_SIZE(0, 0), 0, 0, 9, kUpb_FieldMode_Scalar | (upb_FieldRep_StringView << upb_FieldRep_Shift)}, + {2, UPB_SIZE(8, 16), 0, 0, 9, kUpb_FieldMode_Scalar | (upb_FieldRep_StringView << upb_FieldRep_Shift)}, + {3, UPB_SIZE(16, 32), 0, 0, 9, kUpb_FieldMode_Scalar | (upb_FieldRep_StringView << upb_FieldRep_Shift)}, +}; + +const upb_MiniTable grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys_msginit = { + NULL, + &grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys__fields[0], + UPB_SIZE(24, 48), 3, upb_ExtMode_NonExtendable, 3, 255, 0, +}; + +static const upb_MiniTable_Field grpc_lookup_v1_GrpcKeyBuilder_ConstantKeysEntry__fields[2] = { + {1, UPB_SIZE(0, 0), 0, 0, 9, kUpb_FieldMode_Scalar | (upb_FieldRep_StringView << upb_FieldRep_Shift)}, + {2, UPB_SIZE(8, 16), 0, 0, 9, kUpb_FieldMode_Scalar | (upb_FieldRep_StringView << upb_FieldRep_Shift)}, +}; + +const upb_MiniTable grpc_lookup_v1_GrpcKeyBuilder_ConstantKeysEntry_msginit = { + NULL, + &grpc_lookup_v1_GrpcKeyBuilder_ConstantKeysEntry__fields[0], + UPB_SIZE(16, 32), 2, upb_ExtMode_NonExtendable, 2, 255, 0, +}; + +static const upb_MiniTable_Sub grpc_lookup_v1_HttpKeyBuilder_submsgs[2] = { + {.submsg = &grpc_lookup_v1_HttpKeyBuilder_ConstantKeysEntry_msginit}, + {.submsg = &grpc_lookup_v1_NameMatcher_msginit}, +}; + +static const upb_MiniTable_Field grpc_lookup_v1_HttpKeyBuilder__fields[5] = { + {1, UPB_SIZE(0, 0), 0, 0, 9, kUpb_FieldMode_Array | (upb_FieldRep_Pointer << upb_FieldRep_Shift)}, + {2, UPB_SIZE(4, 8), 0, 0, 9, kUpb_FieldMode_Array | (upb_FieldRep_Pointer << upb_FieldRep_Shift)}, + {3, UPB_SIZE(8, 16), 0, 1, 11, kUpb_FieldMode_Array | (upb_FieldRep_Pointer << upb_FieldRep_Shift)}, + {4, UPB_SIZE(12, 24), 0, 1, 11, kUpb_FieldMode_Array | (upb_FieldRep_Pointer << upb_FieldRep_Shift)}, + {5, UPB_SIZE(16, 32), 0, 0, 11, kUpb_FieldMode_Map | (upb_FieldRep_Pointer << upb_FieldRep_Shift)}, +}; + +const upb_MiniTable grpc_lookup_v1_HttpKeyBuilder_msginit = { + &grpc_lookup_v1_HttpKeyBuilder_submsgs[0], + &grpc_lookup_v1_HttpKeyBuilder__fields[0], + UPB_SIZE(24, 40), 5, upb_ExtMode_NonExtendable, 5, 255, 0, +}; + +static const upb_MiniTable_Field grpc_lookup_v1_HttpKeyBuilder_ConstantKeysEntry__fields[2] = { + {1, UPB_SIZE(0, 0), 0, 0, 9, kUpb_FieldMode_Scalar | (upb_FieldRep_StringView << upb_FieldRep_Shift)}, + {2, UPB_SIZE(8, 16), 0, 0, 9, kUpb_FieldMode_Scalar | (upb_FieldRep_StringView << upb_FieldRep_Shift)}, +}; + +const upb_MiniTable grpc_lookup_v1_HttpKeyBuilder_ConstantKeysEntry_msginit = { + NULL, + &grpc_lookup_v1_HttpKeyBuilder_ConstantKeysEntry__fields[0], + UPB_SIZE(16, 32), 2, upb_ExtMode_NonExtendable, 2, 255, 0, +}; + +static const upb_MiniTable_Sub grpc_lookup_v1_RouteLookupConfig_submsgs[3] = { + {.submsg = &google_protobuf_Duration_msginit}, + {.submsg = &grpc_lookup_v1_GrpcKeyBuilder_msginit}, + {.submsg = &grpc_lookup_v1_HttpKeyBuilder_msginit}, +}; + +static const upb_MiniTable_Field grpc_lookup_v1_RouteLookupConfig__fields[9] = { + {1, UPB_SIZE(44, 72), 0, 2, 11, kUpb_FieldMode_Array | (upb_FieldRep_Pointer << upb_FieldRep_Shift)}, + {2, UPB_SIZE(48, 80), 0, 1, 11, kUpb_FieldMode_Array | (upb_FieldRep_Pointer << upb_FieldRep_Shift)}, + {3, UPB_SIZE(16, 16), 0, 0, 9, kUpb_FieldMode_Scalar | (upb_FieldRep_StringView << upb_FieldRep_Shift)}, + {4, UPB_SIZE(32, 48), 1, 0, 11, kUpb_FieldMode_Scalar | (upb_FieldRep_Pointer << upb_FieldRep_Shift)}, + {5, UPB_SIZE(36, 56), 2, 0, 11, kUpb_FieldMode_Scalar | (upb_FieldRep_Pointer << upb_FieldRep_Shift)}, + {6, UPB_SIZE(40, 64), 3, 0, 11, kUpb_FieldMode_Scalar | (upb_FieldRep_Pointer << upb_FieldRep_Shift)}, + {7, UPB_SIZE(8, 8), 0, 0, 3, kUpb_FieldMode_Scalar | (upb_FieldRep_8Byte << upb_FieldRep_Shift)}, + {8, UPB_SIZE(52, 88), 0, 0, 9, kUpb_FieldMode_Array | (upb_FieldRep_Pointer << upb_FieldRep_Shift)}, + {9, UPB_SIZE(24, 32), 0, 0, 9, kUpb_FieldMode_Scalar | (upb_FieldRep_StringView << upb_FieldRep_Shift)}, +}; + +const upb_MiniTable grpc_lookup_v1_RouteLookupConfig_msginit = { + &grpc_lookup_v1_RouteLookupConfig_submsgs[0], + &grpc_lookup_v1_RouteLookupConfig__fields[0], + UPB_SIZE(56, 96), 9, upb_ExtMode_NonExtendable, 9, 255, 0, +}; + +static const upb_MiniTable_Sub grpc_lookup_v1_RouteLookupClusterSpecifier_submsgs[1] = { + {.submsg = &grpc_lookup_v1_RouteLookupConfig_msginit}, +}; + +static const upb_MiniTable_Field grpc_lookup_v1_RouteLookupClusterSpecifier__fields[1] = { + {1, UPB_SIZE(4, 8), 1, 0, 11, kUpb_FieldMode_Scalar | (upb_FieldRep_Pointer << upb_FieldRep_Shift)}, +}; + +const upb_MiniTable grpc_lookup_v1_RouteLookupClusterSpecifier_msginit = { + &grpc_lookup_v1_RouteLookupClusterSpecifier_submsgs[0], + &grpc_lookup_v1_RouteLookupClusterSpecifier__fields[0], + UPB_SIZE(8, 16), 1, upb_ExtMode_NonExtendable, 1, 255, 0, +}; + +static const upb_MiniTable *messages_layout[9] = { + &grpc_lookup_v1_NameMatcher_msginit, + &grpc_lookup_v1_GrpcKeyBuilder_msginit, + &grpc_lookup_v1_GrpcKeyBuilder_Name_msginit, + &grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys_msginit, + &grpc_lookup_v1_GrpcKeyBuilder_ConstantKeysEntry_msginit, + &grpc_lookup_v1_HttpKeyBuilder_msginit, + &grpc_lookup_v1_HttpKeyBuilder_ConstantKeysEntry_msginit, + &grpc_lookup_v1_RouteLookupConfig_msginit, + &grpc_lookup_v1_RouteLookupClusterSpecifier_msginit, +}; + +const upb_MiniTable_File src_proto_grpc_lookup_v1_rls_config_proto_upb_file_layout = { + messages_layout, + NULL, + NULL, + 9, + 0, + 0, +}; + +#include "upb/port_undef.inc" + diff --git a/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.h b/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.h new file mode 100644 index 00000000000..fefd848cd8f --- /dev/null +++ b/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.h @@ -0,0 +1,623 @@ +/* This file was generated by upbc (the upb compiler) from the input + * file: + * + * src/proto/grpc/lookup/v1/rls_config.proto + * + * Do not edit -- your changes will be discarded when the file is + * regenerated. */ + +#ifndef SRC_PROTO_GRPC_LOOKUP_V1_RLS_CONFIG_PROTO_UPB_H_ +#define SRC_PROTO_GRPC_LOOKUP_V1_RLS_CONFIG_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 grpc_lookup_v1_NameMatcher; +struct grpc_lookup_v1_GrpcKeyBuilder; +struct grpc_lookup_v1_GrpcKeyBuilder_Name; +struct grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys; +struct grpc_lookup_v1_GrpcKeyBuilder_ConstantKeysEntry; +struct grpc_lookup_v1_HttpKeyBuilder; +struct grpc_lookup_v1_HttpKeyBuilder_ConstantKeysEntry; +struct grpc_lookup_v1_RouteLookupConfig; +struct grpc_lookup_v1_RouteLookupClusterSpecifier; +typedef struct grpc_lookup_v1_NameMatcher grpc_lookup_v1_NameMatcher; +typedef struct grpc_lookup_v1_GrpcKeyBuilder grpc_lookup_v1_GrpcKeyBuilder; +typedef struct grpc_lookup_v1_GrpcKeyBuilder_Name grpc_lookup_v1_GrpcKeyBuilder_Name; +typedef struct grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys; +typedef struct grpc_lookup_v1_GrpcKeyBuilder_ConstantKeysEntry grpc_lookup_v1_GrpcKeyBuilder_ConstantKeysEntry; +typedef struct grpc_lookup_v1_HttpKeyBuilder grpc_lookup_v1_HttpKeyBuilder; +typedef struct grpc_lookup_v1_HttpKeyBuilder_ConstantKeysEntry grpc_lookup_v1_HttpKeyBuilder_ConstantKeysEntry; +typedef struct grpc_lookup_v1_RouteLookupConfig grpc_lookup_v1_RouteLookupConfig; +typedef struct grpc_lookup_v1_RouteLookupClusterSpecifier grpc_lookup_v1_RouteLookupClusterSpecifier; +extern const upb_MiniTable grpc_lookup_v1_NameMatcher_msginit; +extern const upb_MiniTable grpc_lookup_v1_GrpcKeyBuilder_msginit; +extern const upb_MiniTable grpc_lookup_v1_GrpcKeyBuilder_Name_msginit; +extern const upb_MiniTable grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys_msginit; +extern const upb_MiniTable grpc_lookup_v1_GrpcKeyBuilder_ConstantKeysEntry_msginit; +extern const upb_MiniTable grpc_lookup_v1_HttpKeyBuilder_msginit; +extern const upb_MiniTable grpc_lookup_v1_HttpKeyBuilder_ConstantKeysEntry_msginit; +extern const upb_MiniTable grpc_lookup_v1_RouteLookupConfig_msginit; +extern const upb_MiniTable grpc_lookup_v1_RouteLookupClusterSpecifier_msginit; +struct google_protobuf_Duration; +extern const upb_MiniTable google_protobuf_Duration_msginit; + + + +/* grpc.lookup.v1.NameMatcher */ + +UPB_INLINE grpc_lookup_v1_NameMatcher* grpc_lookup_v1_NameMatcher_new(upb_Arena* arena) { + return (grpc_lookup_v1_NameMatcher*)_upb_Message_New(&grpc_lookup_v1_NameMatcher_msginit, arena); +} +UPB_INLINE grpc_lookup_v1_NameMatcher* grpc_lookup_v1_NameMatcher_parse(const char* buf, size_t size, upb_Arena* arena) { + grpc_lookup_v1_NameMatcher* ret = grpc_lookup_v1_NameMatcher_new(arena); + if (!ret) return NULL; + if (upb_Decode(buf, size, ret, &grpc_lookup_v1_NameMatcher_msginit, NULL, 0, arena) != kUpb_DecodeStatus_Ok) { + return NULL; + } + return ret; +} +UPB_INLINE grpc_lookup_v1_NameMatcher* grpc_lookup_v1_NameMatcher_parse_ex(const char* buf, size_t size, + const upb_ExtensionRegistry* extreg, + int options, upb_Arena* arena) { + grpc_lookup_v1_NameMatcher* ret = grpc_lookup_v1_NameMatcher_new(arena); + if (!ret) return NULL; + if (upb_Decode(buf, size, ret, &grpc_lookup_v1_NameMatcher_msginit, extreg, options, arena) != + kUpb_DecodeStatus_Ok) { + return NULL; + } + return ret; +} +UPB_INLINE char* grpc_lookup_v1_NameMatcher_serialize(const grpc_lookup_v1_NameMatcher* msg, upb_Arena* arena, size_t* len) { + return upb_Encode(msg, &grpc_lookup_v1_NameMatcher_msginit, 0, arena, len); +} +UPB_INLINE char* grpc_lookup_v1_NameMatcher_serialize_ex(const grpc_lookup_v1_NameMatcher* msg, int options, + upb_Arena* arena, size_t* len) { + return upb_Encode(msg, &grpc_lookup_v1_NameMatcher_msginit, options, arena, len); +} +UPB_INLINE upb_StringView grpc_lookup_v1_NameMatcher_key(const grpc_lookup_v1_NameMatcher* msg) { + return *UPB_PTR_AT(msg, UPB_SIZE(4, 8), upb_StringView); +} +UPB_INLINE upb_StringView const* grpc_lookup_v1_NameMatcher_names(const grpc_lookup_v1_NameMatcher *msg, size_t *len) { return (upb_StringView const*)_upb_array_accessor(msg, UPB_SIZE(12, 24), len); } +UPB_INLINE bool grpc_lookup_v1_NameMatcher_required_match(const grpc_lookup_v1_NameMatcher* msg) { + return *UPB_PTR_AT(msg, UPB_SIZE(0, 0), bool); +} + +UPB_INLINE void grpc_lookup_v1_NameMatcher_set_key(grpc_lookup_v1_NameMatcher *msg, upb_StringView value) { + *UPB_PTR_AT(msg, UPB_SIZE(4, 8), upb_StringView) = value; +} +UPB_INLINE upb_StringView* grpc_lookup_v1_NameMatcher_mutable_names(grpc_lookup_v1_NameMatcher *msg, size_t *len) { + return (upb_StringView*)_upb_array_mutable_accessor(msg, UPB_SIZE(12, 24), len); +} +UPB_INLINE upb_StringView* grpc_lookup_v1_NameMatcher_resize_names(grpc_lookup_v1_NameMatcher *msg, size_t len, upb_Arena *arena) { + return (upb_StringView*)_upb_Array_Resize_accessor2(msg, UPB_SIZE(12, 24), len, UPB_SIZE(3, 4), arena); +} +UPB_INLINE bool grpc_lookup_v1_NameMatcher_add_names(grpc_lookup_v1_NameMatcher *msg, upb_StringView val, upb_Arena *arena) { + return _upb_Array_Append_accessor2(msg, UPB_SIZE(12, 24), UPB_SIZE(3, 4), &val, + arena); +} +UPB_INLINE void grpc_lookup_v1_NameMatcher_set_required_match(grpc_lookup_v1_NameMatcher *msg, bool value) { + *UPB_PTR_AT(msg, UPB_SIZE(0, 0), bool) = value; +} + +/* grpc.lookup.v1.GrpcKeyBuilder */ + +UPB_INLINE grpc_lookup_v1_GrpcKeyBuilder* grpc_lookup_v1_GrpcKeyBuilder_new(upb_Arena* arena) { + return (grpc_lookup_v1_GrpcKeyBuilder*)_upb_Message_New(&grpc_lookup_v1_GrpcKeyBuilder_msginit, arena); +} +UPB_INLINE grpc_lookup_v1_GrpcKeyBuilder* grpc_lookup_v1_GrpcKeyBuilder_parse(const char* buf, size_t size, upb_Arena* arena) { + grpc_lookup_v1_GrpcKeyBuilder* ret = grpc_lookup_v1_GrpcKeyBuilder_new(arena); + if (!ret) return NULL; + if (upb_Decode(buf, size, ret, &grpc_lookup_v1_GrpcKeyBuilder_msginit, NULL, 0, arena) != kUpb_DecodeStatus_Ok) { + return NULL; + } + return ret; +} +UPB_INLINE grpc_lookup_v1_GrpcKeyBuilder* grpc_lookup_v1_GrpcKeyBuilder_parse_ex(const char* buf, size_t size, + const upb_ExtensionRegistry* extreg, + int options, upb_Arena* arena) { + grpc_lookup_v1_GrpcKeyBuilder* ret = grpc_lookup_v1_GrpcKeyBuilder_new(arena); + if (!ret) return NULL; + if (upb_Decode(buf, size, ret, &grpc_lookup_v1_GrpcKeyBuilder_msginit, extreg, options, arena) != + kUpb_DecodeStatus_Ok) { + return NULL; + } + return ret; +} +UPB_INLINE char* grpc_lookup_v1_GrpcKeyBuilder_serialize(const grpc_lookup_v1_GrpcKeyBuilder* msg, upb_Arena* arena, size_t* len) { + return upb_Encode(msg, &grpc_lookup_v1_GrpcKeyBuilder_msginit, 0, arena, len); +} +UPB_INLINE char* grpc_lookup_v1_GrpcKeyBuilder_serialize_ex(const grpc_lookup_v1_GrpcKeyBuilder* msg, int options, + upb_Arena* arena, size_t* len) { + return upb_Encode(msg, &grpc_lookup_v1_GrpcKeyBuilder_msginit, options, arena, len); +} +UPB_INLINE bool grpc_lookup_v1_GrpcKeyBuilder_has_names(const grpc_lookup_v1_GrpcKeyBuilder *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(8, 16)); } +UPB_INLINE const grpc_lookup_v1_GrpcKeyBuilder_Name* const* grpc_lookup_v1_GrpcKeyBuilder_names(const grpc_lookup_v1_GrpcKeyBuilder *msg, size_t *len) { return (const grpc_lookup_v1_GrpcKeyBuilder_Name* const*)_upb_array_accessor(msg, UPB_SIZE(8, 16), len); } +UPB_INLINE bool grpc_lookup_v1_GrpcKeyBuilder_has_headers(const grpc_lookup_v1_GrpcKeyBuilder *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(12, 24)); } +UPB_INLINE const grpc_lookup_v1_NameMatcher* const* grpc_lookup_v1_GrpcKeyBuilder_headers(const grpc_lookup_v1_GrpcKeyBuilder *msg, size_t *len) { return (const grpc_lookup_v1_NameMatcher* const*)_upb_array_accessor(msg, UPB_SIZE(12, 24), len); } +UPB_INLINE bool grpc_lookup_v1_GrpcKeyBuilder_has_extra_keys(const grpc_lookup_v1_GrpcKeyBuilder *msg) { return _upb_hasbit(msg, 1); } +UPB_INLINE const grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys* grpc_lookup_v1_GrpcKeyBuilder_extra_keys(const grpc_lookup_v1_GrpcKeyBuilder* msg) { + return *UPB_PTR_AT(msg, UPB_SIZE(4, 8), const grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys*); +} +UPB_INLINE bool grpc_lookup_v1_GrpcKeyBuilder_has_constant_keys(const grpc_lookup_v1_GrpcKeyBuilder *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(16, 32)); } +UPB_INLINE size_t grpc_lookup_v1_GrpcKeyBuilder_constant_keys_size(const grpc_lookup_v1_GrpcKeyBuilder *msg) {return _upb_msg_map_size(msg, UPB_SIZE(16, 32)); } +UPB_INLINE bool grpc_lookup_v1_GrpcKeyBuilder_constant_keys_get(const grpc_lookup_v1_GrpcKeyBuilder *msg, upb_StringView key, upb_StringView *val) { return _upb_msg_map_get(msg, UPB_SIZE(16, 32), &key, 0, val, 0); } +UPB_INLINE const grpc_lookup_v1_GrpcKeyBuilder_ConstantKeysEntry* grpc_lookup_v1_GrpcKeyBuilder_constant_keys_next(const grpc_lookup_v1_GrpcKeyBuilder *msg, size_t* iter) { return (const grpc_lookup_v1_GrpcKeyBuilder_ConstantKeysEntry*)_upb_msg_map_next(msg, UPB_SIZE(16, 32), iter); } + +UPB_INLINE grpc_lookup_v1_GrpcKeyBuilder_Name** grpc_lookup_v1_GrpcKeyBuilder_mutable_names(grpc_lookup_v1_GrpcKeyBuilder *msg, size_t *len) { + return (grpc_lookup_v1_GrpcKeyBuilder_Name**)_upb_array_mutable_accessor(msg, UPB_SIZE(8, 16), len); +} +UPB_INLINE grpc_lookup_v1_GrpcKeyBuilder_Name** grpc_lookup_v1_GrpcKeyBuilder_resize_names(grpc_lookup_v1_GrpcKeyBuilder *msg, size_t len, upb_Arena *arena) { + return (grpc_lookup_v1_GrpcKeyBuilder_Name**)_upb_Array_Resize_accessor2(msg, UPB_SIZE(8, 16), len, UPB_SIZE(2, 3), arena); +} +UPB_INLINE struct grpc_lookup_v1_GrpcKeyBuilder_Name* grpc_lookup_v1_GrpcKeyBuilder_add_names(grpc_lookup_v1_GrpcKeyBuilder *msg, upb_Arena *arena) { + struct grpc_lookup_v1_GrpcKeyBuilder_Name* sub = (struct grpc_lookup_v1_GrpcKeyBuilder_Name*)_upb_Message_New(&grpc_lookup_v1_GrpcKeyBuilder_Name_msginit, arena); + bool ok = _upb_Array_Append_accessor2( + msg, UPB_SIZE(8, 16), UPB_SIZE(2, 3), &sub, arena); + if (!ok) return NULL; + return sub; +} +UPB_INLINE grpc_lookup_v1_NameMatcher** grpc_lookup_v1_GrpcKeyBuilder_mutable_headers(grpc_lookup_v1_GrpcKeyBuilder *msg, size_t *len) { + return (grpc_lookup_v1_NameMatcher**)_upb_array_mutable_accessor(msg, UPB_SIZE(12, 24), len); +} +UPB_INLINE grpc_lookup_v1_NameMatcher** grpc_lookup_v1_GrpcKeyBuilder_resize_headers(grpc_lookup_v1_GrpcKeyBuilder *msg, size_t len, upb_Arena *arena) { + return (grpc_lookup_v1_NameMatcher**)_upb_Array_Resize_accessor2(msg, UPB_SIZE(12, 24), len, UPB_SIZE(2, 3), arena); +} +UPB_INLINE struct grpc_lookup_v1_NameMatcher* grpc_lookup_v1_GrpcKeyBuilder_add_headers(grpc_lookup_v1_GrpcKeyBuilder *msg, upb_Arena *arena) { + struct grpc_lookup_v1_NameMatcher* sub = (struct grpc_lookup_v1_NameMatcher*)_upb_Message_New(&grpc_lookup_v1_NameMatcher_msginit, arena); + bool ok = _upb_Array_Append_accessor2( + msg, UPB_SIZE(12, 24), UPB_SIZE(2, 3), &sub, arena); + if (!ok) return NULL; + return sub; +} +UPB_INLINE void grpc_lookup_v1_GrpcKeyBuilder_set_extra_keys(grpc_lookup_v1_GrpcKeyBuilder *msg, grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys* value) { + _upb_sethas(msg, 1); + *UPB_PTR_AT(msg, UPB_SIZE(4, 8), grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys*) = value; +} +UPB_INLINE struct grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys* grpc_lookup_v1_GrpcKeyBuilder_mutable_extra_keys(grpc_lookup_v1_GrpcKeyBuilder *msg, upb_Arena *arena) { + struct grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys* sub = (struct grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys*)grpc_lookup_v1_GrpcKeyBuilder_extra_keys(msg); + if (sub == NULL) { + sub = (struct grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys*)_upb_Message_New(&grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys_msginit, arena); + if (!sub) return NULL; + grpc_lookup_v1_GrpcKeyBuilder_set_extra_keys(msg, sub); + } + return sub; +} +UPB_INLINE void grpc_lookup_v1_GrpcKeyBuilder_constant_keys_clear(grpc_lookup_v1_GrpcKeyBuilder *msg) { _upb_msg_map_clear(msg, UPB_SIZE(16, 32)); } +UPB_INLINE bool grpc_lookup_v1_GrpcKeyBuilder_constant_keys_set(grpc_lookup_v1_GrpcKeyBuilder *msg, upb_StringView key, upb_StringView val, upb_Arena *a) { return _upb_msg_map_set(msg, UPB_SIZE(16, 32), &key, 0, &val, 0, a); } +UPB_INLINE bool grpc_lookup_v1_GrpcKeyBuilder_constant_keys_delete(grpc_lookup_v1_GrpcKeyBuilder *msg, upb_StringView key) { return _upb_msg_map_delete(msg, UPB_SIZE(16, 32), &key, 0); } +UPB_INLINE grpc_lookup_v1_GrpcKeyBuilder_ConstantKeysEntry* grpc_lookup_v1_GrpcKeyBuilder_constant_keys_nextmutable(grpc_lookup_v1_GrpcKeyBuilder *msg, size_t* iter) { return (grpc_lookup_v1_GrpcKeyBuilder_ConstantKeysEntry*)_upb_msg_map_next(msg, UPB_SIZE(16, 32), iter); } + +/* grpc.lookup.v1.GrpcKeyBuilder.Name */ + +UPB_INLINE grpc_lookup_v1_GrpcKeyBuilder_Name* grpc_lookup_v1_GrpcKeyBuilder_Name_new(upb_Arena* arena) { + return (grpc_lookup_v1_GrpcKeyBuilder_Name*)_upb_Message_New(&grpc_lookup_v1_GrpcKeyBuilder_Name_msginit, arena); +} +UPB_INLINE grpc_lookup_v1_GrpcKeyBuilder_Name* grpc_lookup_v1_GrpcKeyBuilder_Name_parse(const char* buf, size_t size, upb_Arena* arena) { + grpc_lookup_v1_GrpcKeyBuilder_Name* ret = grpc_lookup_v1_GrpcKeyBuilder_Name_new(arena); + if (!ret) return NULL; + if (upb_Decode(buf, size, ret, &grpc_lookup_v1_GrpcKeyBuilder_Name_msginit, NULL, 0, arena) != kUpb_DecodeStatus_Ok) { + return NULL; + } + return ret; +} +UPB_INLINE grpc_lookup_v1_GrpcKeyBuilder_Name* grpc_lookup_v1_GrpcKeyBuilder_Name_parse_ex(const char* buf, size_t size, + const upb_ExtensionRegistry* extreg, + int options, upb_Arena* arena) { + grpc_lookup_v1_GrpcKeyBuilder_Name* ret = grpc_lookup_v1_GrpcKeyBuilder_Name_new(arena); + if (!ret) return NULL; + if (upb_Decode(buf, size, ret, &grpc_lookup_v1_GrpcKeyBuilder_Name_msginit, extreg, options, arena) != + kUpb_DecodeStatus_Ok) { + return NULL; + } + return ret; +} +UPB_INLINE char* grpc_lookup_v1_GrpcKeyBuilder_Name_serialize(const grpc_lookup_v1_GrpcKeyBuilder_Name* msg, upb_Arena* arena, size_t* len) { + return upb_Encode(msg, &grpc_lookup_v1_GrpcKeyBuilder_Name_msginit, 0, arena, len); +} +UPB_INLINE char* grpc_lookup_v1_GrpcKeyBuilder_Name_serialize_ex(const grpc_lookup_v1_GrpcKeyBuilder_Name* msg, int options, + upb_Arena* arena, size_t* len) { + return upb_Encode(msg, &grpc_lookup_v1_GrpcKeyBuilder_Name_msginit, options, arena, len); +} +UPB_INLINE upb_StringView grpc_lookup_v1_GrpcKeyBuilder_Name_service(const grpc_lookup_v1_GrpcKeyBuilder_Name* msg) { + return *UPB_PTR_AT(msg, UPB_SIZE(0, 0), upb_StringView); +} +UPB_INLINE upb_StringView grpc_lookup_v1_GrpcKeyBuilder_Name_method(const grpc_lookup_v1_GrpcKeyBuilder_Name* msg) { + return *UPB_PTR_AT(msg, UPB_SIZE(8, 16), upb_StringView); +} + +UPB_INLINE void grpc_lookup_v1_GrpcKeyBuilder_Name_set_service(grpc_lookup_v1_GrpcKeyBuilder_Name *msg, upb_StringView value) { + *UPB_PTR_AT(msg, UPB_SIZE(0, 0), upb_StringView) = value; +} +UPB_INLINE void grpc_lookup_v1_GrpcKeyBuilder_Name_set_method(grpc_lookup_v1_GrpcKeyBuilder_Name *msg, upb_StringView value) { + *UPB_PTR_AT(msg, UPB_SIZE(8, 16), upb_StringView) = value; +} + +/* grpc.lookup.v1.GrpcKeyBuilder.ExtraKeys */ + +UPB_INLINE grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys* grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys_new(upb_Arena* arena) { + return (grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys*)_upb_Message_New(&grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys_msginit, arena); +} +UPB_INLINE grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys* grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys_parse(const char* buf, size_t size, upb_Arena* arena) { + grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys* ret = grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys_new(arena); + if (!ret) return NULL; + if (upb_Decode(buf, size, ret, &grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys_msginit, NULL, 0, arena) != kUpb_DecodeStatus_Ok) { + return NULL; + } + return ret; +} +UPB_INLINE grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys* grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys_parse_ex(const char* buf, size_t size, + const upb_ExtensionRegistry* extreg, + int options, upb_Arena* arena) { + grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys* ret = grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys_new(arena); + if (!ret) return NULL; + if (upb_Decode(buf, size, ret, &grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys_msginit, extreg, options, arena) != + kUpb_DecodeStatus_Ok) { + return NULL; + } + return ret; +} +UPB_INLINE char* grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys_serialize(const grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys* msg, upb_Arena* arena, size_t* len) { + return upb_Encode(msg, &grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys_msginit, 0, arena, len); +} +UPB_INLINE char* grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys_serialize_ex(const grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys* msg, int options, + upb_Arena* arena, size_t* len) { + return upb_Encode(msg, &grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys_msginit, options, arena, len); +} +UPB_INLINE upb_StringView grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys_host(const grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys* msg) { + return *UPB_PTR_AT(msg, UPB_SIZE(0, 0), upb_StringView); +} +UPB_INLINE upb_StringView grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys_service(const grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys* msg) { + return *UPB_PTR_AT(msg, UPB_SIZE(8, 16), upb_StringView); +} +UPB_INLINE upb_StringView grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys_method(const grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys* msg) { + return *UPB_PTR_AT(msg, UPB_SIZE(16, 32), upb_StringView); +} + +UPB_INLINE void grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys_set_host(grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys *msg, upb_StringView value) { + *UPB_PTR_AT(msg, UPB_SIZE(0, 0), upb_StringView) = value; +} +UPB_INLINE void grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys_set_service(grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys *msg, upb_StringView value) { + *UPB_PTR_AT(msg, UPB_SIZE(8, 16), upb_StringView) = value; +} +UPB_INLINE void grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys_set_method(grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys *msg, upb_StringView value) { + *UPB_PTR_AT(msg, UPB_SIZE(16, 32), upb_StringView) = value; +} + +/* grpc.lookup.v1.GrpcKeyBuilder.ConstantKeysEntry */ + +UPB_INLINE upb_StringView grpc_lookup_v1_GrpcKeyBuilder_ConstantKeysEntry_key(const grpc_lookup_v1_GrpcKeyBuilder_ConstantKeysEntry *msg) { + upb_StringView ret; + _upb_msg_map_key(msg, &ret, 0); + return ret; +} +UPB_INLINE upb_StringView grpc_lookup_v1_GrpcKeyBuilder_ConstantKeysEntry_value(const grpc_lookup_v1_GrpcKeyBuilder_ConstantKeysEntry *msg) { + upb_StringView ret; + _upb_msg_map_value(msg, &ret, 0); + return ret; +} + +UPB_INLINE void grpc_lookup_v1_GrpcKeyBuilder_ConstantKeysEntry_set_value(grpc_lookup_v1_GrpcKeyBuilder_ConstantKeysEntry *msg, upb_StringView value) { + _upb_msg_map_set_value(msg, &value, 0); +} + +/* grpc.lookup.v1.HttpKeyBuilder */ + +UPB_INLINE grpc_lookup_v1_HttpKeyBuilder* grpc_lookup_v1_HttpKeyBuilder_new(upb_Arena* arena) { + return (grpc_lookup_v1_HttpKeyBuilder*)_upb_Message_New(&grpc_lookup_v1_HttpKeyBuilder_msginit, arena); +} +UPB_INLINE grpc_lookup_v1_HttpKeyBuilder* grpc_lookup_v1_HttpKeyBuilder_parse(const char* buf, size_t size, upb_Arena* arena) { + grpc_lookup_v1_HttpKeyBuilder* ret = grpc_lookup_v1_HttpKeyBuilder_new(arena); + if (!ret) return NULL; + if (upb_Decode(buf, size, ret, &grpc_lookup_v1_HttpKeyBuilder_msginit, NULL, 0, arena) != kUpb_DecodeStatus_Ok) { + return NULL; + } + return ret; +} +UPB_INLINE grpc_lookup_v1_HttpKeyBuilder* grpc_lookup_v1_HttpKeyBuilder_parse_ex(const char* buf, size_t size, + const upb_ExtensionRegistry* extreg, + int options, upb_Arena* arena) { + grpc_lookup_v1_HttpKeyBuilder* ret = grpc_lookup_v1_HttpKeyBuilder_new(arena); + if (!ret) return NULL; + if (upb_Decode(buf, size, ret, &grpc_lookup_v1_HttpKeyBuilder_msginit, extreg, options, arena) != + kUpb_DecodeStatus_Ok) { + return NULL; + } + return ret; +} +UPB_INLINE char* grpc_lookup_v1_HttpKeyBuilder_serialize(const grpc_lookup_v1_HttpKeyBuilder* msg, upb_Arena* arena, size_t* len) { + return upb_Encode(msg, &grpc_lookup_v1_HttpKeyBuilder_msginit, 0, arena, len); +} +UPB_INLINE char* grpc_lookup_v1_HttpKeyBuilder_serialize_ex(const grpc_lookup_v1_HttpKeyBuilder* msg, int options, + upb_Arena* arena, size_t* len) { + return upb_Encode(msg, &grpc_lookup_v1_HttpKeyBuilder_msginit, options, arena, len); +} +UPB_INLINE upb_StringView const* grpc_lookup_v1_HttpKeyBuilder_host_patterns(const grpc_lookup_v1_HttpKeyBuilder *msg, size_t *len) { return (upb_StringView const*)_upb_array_accessor(msg, UPB_SIZE(0, 0), len); } +UPB_INLINE upb_StringView const* grpc_lookup_v1_HttpKeyBuilder_path_patterns(const grpc_lookup_v1_HttpKeyBuilder *msg, size_t *len) { return (upb_StringView const*)_upb_array_accessor(msg, UPB_SIZE(4, 8), len); } +UPB_INLINE bool grpc_lookup_v1_HttpKeyBuilder_has_query_parameters(const grpc_lookup_v1_HttpKeyBuilder *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(8, 16)); } +UPB_INLINE const grpc_lookup_v1_NameMatcher* const* grpc_lookup_v1_HttpKeyBuilder_query_parameters(const grpc_lookup_v1_HttpKeyBuilder *msg, size_t *len) { return (const grpc_lookup_v1_NameMatcher* const*)_upb_array_accessor(msg, UPB_SIZE(8, 16), len); } +UPB_INLINE bool grpc_lookup_v1_HttpKeyBuilder_has_headers(const grpc_lookup_v1_HttpKeyBuilder *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(12, 24)); } +UPB_INLINE const grpc_lookup_v1_NameMatcher* const* grpc_lookup_v1_HttpKeyBuilder_headers(const grpc_lookup_v1_HttpKeyBuilder *msg, size_t *len) { return (const grpc_lookup_v1_NameMatcher* const*)_upb_array_accessor(msg, UPB_SIZE(12, 24), len); } +UPB_INLINE bool grpc_lookup_v1_HttpKeyBuilder_has_constant_keys(const grpc_lookup_v1_HttpKeyBuilder *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(16, 32)); } +UPB_INLINE size_t grpc_lookup_v1_HttpKeyBuilder_constant_keys_size(const grpc_lookup_v1_HttpKeyBuilder *msg) {return _upb_msg_map_size(msg, UPB_SIZE(16, 32)); } +UPB_INLINE bool grpc_lookup_v1_HttpKeyBuilder_constant_keys_get(const grpc_lookup_v1_HttpKeyBuilder *msg, upb_StringView key, upb_StringView *val) { return _upb_msg_map_get(msg, UPB_SIZE(16, 32), &key, 0, val, 0); } +UPB_INLINE const grpc_lookup_v1_HttpKeyBuilder_ConstantKeysEntry* grpc_lookup_v1_HttpKeyBuilder_constant_keys_next(const grpc_lookup_v1_HttpKeyBuilder *msg, size_t* iter) { return (const grpc_lookup_v1_HttpKeyBuilder_ConstantKeysEntry*)_upb_msg_map_next(msg, UPB_SIZE(16, 32), iter); } + +UPB_INLINE upb_StringView* grpc_lookup_v1_HttpKeyBuilder_mutable_host_patterns(grpc_lookup_v1_HttpKeyBuilder *msg, size_t *len) { + return (upb_StringView*)_upb_array_mutable_accessor(msg, UPB_SIZE(0, 0), len); +} +UPB_INLINE upb_StringView* grpc_lookup_v1_HttpKeyBuilder_resize_host_patterns(grpc_lookup_v1_HttpKeyBuilder *msg, size_t len, upb_Arena *arena) { + return (upb_StringView*)_upb_Array_Resize_accessor2(msg, UPB_SIZE(0, 0), len, UPB_SIZE(3, 4), arena); +} +UPB_INLINE bool grpc_lookup_v1_HttpKeyBuilder_add_host_patterns(grpc_lookup_v1_HttpKeyBuilder *msg, upb_StringView val, upb_Arena *arena) { + return _upb_Array_Append_accessor2(msg, UPB_SIZE(0, 0), UPB_SIZE(3, 4), &val, + arena); +} +UPB_INLINE upb_StringView* grpc_lookup_v1_HttpKeyBuilder_mutable_path_patterns(grpc_lookup_v1_HttpKeyBuilder *msg, size_t *len) { + return (upb_StringView*)_upb_array_mutable_accessor(msg, UPB_SIZE(4, 8), len); +} +UPB_INLINE upb_StringView* grpc_lookup_v1_HttpKeyBuilder_resize_path_patterns(grpc_lookup_v1_HttpKeyBuilder *msg, size_t len, upb_Arena *arena) { + return (upb_StringView*)_upb_Array_Resize_accessor2(msg, UPB_SIZE(4, 8), len, UPB_SIZE(3, 4), arena); +} +UPB_INLINE bool grpc_lookup_v1_HttpKeyBuilder_add_path_patterns(grpc_lookup_v1_HttpKeyBuilder *msg, upb_StringView val, upb_Arena *arena) { + return _upb_Array_Append_accessor2(msg, UPB_SIZE(4, 8), UPB_SIZE(3, 4), &val, + arena); +} +UPB_INLINE grpc_lookup_v1_NameMatcher** grpc_lookup_v1_HttpKeyBuilder_mutable_query_parameters(grpc_lookup_v1_HttpKeyBuilder *msg, size_t *len) { + return (grpc_lookup_v1_NameMatcher**)_upb_array_mutable_accessor(msg, UPB_SIZE(8, 16), len); +} +UPB_INLINE grpc_lookup_v1_NameMatcher** grpc_lookup_v1_HttpKeyBuilder_resize_query_parameters(grpc_lookup_v1_HttpKeyBuilder *msg, size_t len, upb_Arena *arena) { + return (grpc_lookup_v1_NameMatcher**)_upb_Array_Resize_accessor2(msg, UPB_SIZE(8, 16), len, UPB_SIZE(2, 3), arena); +} +UPB_INLINE struct grpc_lookup_v1_NameMatcher* grpc_lookup_v1_HttpKeyBuilder_add_query_parameters(grpc_lookup_v1_HttpKeyBuilder *msg, upb_Arena *arena) { + struct grpc_lookup_v1_NameMatcher* sub = (struct grpc_lookup_v1_NameMatcher*)_upb_Message_New(&grpc_lookup_v1_NameMatcher_msginit, arena); + bool ok = _upb_Array_Append_accessor2( + msg, UPB_SIZE(8, 16), UPB_SIZE(2, 3), &sub, arena); + if (!ok) return NULL; + return sub; +} +UPB_INLINE grpc_lookup_v1_NameMatcher** grpc_lookup_v1_HttpKeyBuilder_mutable_headers(grpc_lookup_v1_HttpKeyBuilder *msg, size_t *len) { + return (grpc_lookup_v1_NameMatcher**)_upb_array_mutable_accessor(msg, UPB_SIZE(12, 24), len); +} +UPB_INLINE grpc_lookup_v1_NameMatcher** grpc_lookup_v1_HttpKeyBuilder_resize_headers(grpc_lookup_v1_HttpKeyBuilder *msg, size_t len, upb_Arena *arena) { + return (grpc_lookup_v1_NameMatcher**)_upb_Array_Resize_accessor2(msg, UPB_SIZE(12, 24), len, UPB_SIZE(2, 3), arena); +} +UPB_INLINE struct grpc_lookup_v1_NameMatcher* grpc_lookup_v1_HttpKeyBuilder_add_headers(grpc_lookup_v1_HttpKeyBuilder *msg, upb_Arena *arena) { + struct grpc_lookup_v1_NameMatcher* sub = (struct grpc_lookup_v1_NameMatcher*)_upb_Message_New(&grpc_lookup_v1_NameMatcher_msginit, arena); + bool ok = _upb_Array_Append_accessor2( + msg, UPB_SIZE(12, 24), UPB_SIZE(2, 3), &sub, arena); + if (!ok) return NULL; + return sub; +} +UPB_INLINE void grpc_lookup_v1_HttpKeyBuilder_constant_keys_clear(grpc_lookup_v1_HttpKeyBuilder *msg) { _upb_msg_map_clear(msg, UPB_SIZE(16, 32)); } +UPB_INLINE bool grpc_lookup_v1_HttpKeyBuilder_constant_keys_set(grpc_lookup_v1_HttpKeyBuilder *msg, upb_StringView key, upb_StringView val, upb_Arena *a) { return _upb_msg_map_set(msg, UPB_SIZE(16, 32), &key, 0, &val, 0, a); } +UPB_INLINE bool grpc_lookup_v1_HttpKeyBuilder_constant_keys_delete(grpc_lookup_v1_HttpKeyBuilder *msg, upb_StringView key) { return _upb_msg_map_delete(msg, UPB_SIZE(16, 32), &key, 0); } +UPB_INLINE grpc_lookup_v1_HttpKeyBuilder_ConstantKeysEntry* grpc_lookup_v1_HttpKeyBuilder_constant_keys_nextmutable(grpc_lookup_v1_HttpKeyBuilder *msg, size_t* iter) { return (grpc_lookup_v1_HttpKeyBuilder_ConstantKeysEntry*)_upb_msg_map_next(msg, UPB_SIZE(16, 32), iter); } + +/* grpc.lookup.v1.HttpKeyBuilder.ConstantKeysEntry */ + +UPB_INLINE upb_StringView grpc_lookup_v1_HttpKeyBuilder_ConstantKeysEntry_key(const grpc_lookup_v1_HttpKeyBuilder_ConstantKeysEntry *msg) { + upb_StringView ret; + _upb_msg_map_key(msg, &ret, 0); + return ret; +} +UPB_INLINE upb_StringView grpc_lookup_v1_HttpKeyBuilder_ConstantKeysEntry_value(const grpc_lookup_v1_HttpKeyBuilder_ConstantKeysEntry *msg) { + upb_StringView ret; + _upb_msg_map_value(msg, &ret, 0); + return ret; +} + +UPB_INLINE void grpc_lookup_v1_HttpKeyBuilder_ConstantKeysEntry_set_value(grpc_lookup_v1_HttpKeyBuilder_ConstantKeysEntry *msg, upb_StringView value) { + _upb_msg_map_set_value(msg, &value, 0); +} + +/* grpc.lookup.v1.RouteLookupConfig */ + +UPB_INLINE grpc_lookup_v1_RouteLookupConfig* grpc_lookup_v1_RouteLookupConfig_new(upb_Arena* arena) { + return (grpc_lookup_v1_RouteLookupConfig*)_upb_Message_New(&grpc_lookup_v1_RouteLookupConfig_msginit, arena); +} +UPB_INLINE grpc_lookup_v1_RouteLookupConfig* grpc_lookup_v1_RouteLookupConfig_parse(const char* buf, size_t size, upb_Arena* arena) { + grpc_lookup_v1_RouteLookupConfig* ret = grpc_lookup_v1_RouteLookupConfig_new(arena); + if (!ret) return NULL; + if (upb_Decode(buf, size, ret, &grpc_lookup_v1_RouteLookupConfig_msginit, NULL, 0, arena) != kUpb_DecodeStatus_Ok) { + return NULL; + } + return ret; +} +UPB_INLINE grpc_lookup_v1_RouteLookupConfig* grpc_lookup_v1_RouteLookupConfig_parse_ex(const char* buf, size_t size, + const upb_ExtensionRegistry* extreg, + int options, upb_Arena* arena) { + grpc_lookup_v1_RouteLookupConfig* ret = grpc_lookup_v1_RouteLookupConfig_new(arena); + if (!ret) return NULL; + if (upb_Decode(buf, size, ret, &grpc_lookup_v1_RouteLookupConfig_msginit, extreg, options, arena) != + kUpb_DecodeStatus_Ok) { + return NULL; + } + return ret; +} +UPB_INLINE char* grpc_lookup_v1_RouteLookupConfig_serialize(const grpc_lookup_v1_RouteLookupConfig* msg, upb_Arena* arena, size_t* len) { + return upb_Encode(msg, &grpc_lookup_v1_RouteLookupConfig_msginit, 0, arena, len); +} +UPB_INLINE char* grpc_lookup_v1_RouteLookupConfig_serialize_ex(const grpc_lookup_v1_RouteLookupConfig* msg, int options, + upb_Arena* arena, size_t* len) { + return upb_Encode(msg, &grpc_lookup_v1_RouteLookupConfig_msginit, options, arena, len); +} +UPB_INLINE bool grpc_lookup_v1_RouteLookupConfig_has_http_keybuilders(const grpc_lookup_v1_RouteLookupConfig *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(44, 72)); } +UPB_INLINE const grpc_lookup_v1_HttpKeyBuilder* const* grpc_lookup_v1_RouteLookupConfig_http_keybuilders(const grpc_lookup_v1_RouteLookupConfig *msg, size_t *len) { return (const grpc_lookup_v1_HttpKeyBuilder* const*)_upb_array_accessor(msg, UPB_SIZE(44, 72), len); } +UPB_INLINE bool grpc_lookup_v1_RouteLookupConfig_has_grpc_keybuilders(const grpc_lookup_v1_RouteLookupConfig *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(48, 80)); } +UPB_INLINE const grpc_lookup_v1_GrpcKeyBuilder* const* grpc_lookup_v1_RouteLookupConfig_grpc_keybuilders(const grpc_lookup_v1_RouteLookupConfig *msg, size_t *len) { return (const grpc_lookup_v1_GrpcKeyBuilder* const*)_upb_array_accessor(msg, UPB_SIZE(48, 80), len); } +UPB_INLINE upb_StringView grpc_lookup_v1_RouteLookupConfig_lookup_service(const grpc_lookup_v1_RouteLookupConfig* msg) { + return *UPB_PTR_AT(msg, UPB_SIZE(16, 16), upb_StringView); +} +UPB_INLINE bool grpc_lookup_v1_RouteLookupConfig_has_lookup_service_timeout(const grpc_lookup_v1_RouteLookupConfig *msg) { return _upb_hasbit(msg, 1); } +UPB_INLINE const struct google_protobuf_Duration* grpc_lookup_v1_RouteLookupConfig_lookup_service_timeout(const grpc_lookup_v1_RouteLookupConfig* msg) { + return *UPB_PTR_AT(msg, UPB_SIZE(32, 48), const struct google_protobuf_Duration*); +} +UPB_INLINE bool grpc_lookup_v1_RouteLookupConfig_has_max_age(const grpc_lookup_v1_RouteLookupConfig *msg) { return _upb_hasbit(msg, 2); } +UPB_INLINE const struct google_protobuf_Duration* grpc_lookup_v1_RouteLookupConfig_max_age(const grpc_lookup_v1_RouteLookupConfig* msg) { + return *UPB_PTR_AT(msg, UPB_SIZE(36, 56), const struct google_protobuf_Duration*); +} +UPB_INLINE bool grpc_lookup_v1_RouteLookupConfig_has_stale_age(const grpc_lookup_v1_RouteLookupConfig *msg) { return _upb_hasbit(msg, 3); } +UPB_INLINE const struct google_protobuf_Duration* grpc_lookup_v1_RouteLookupConfig_stale_age(const grpc_lookup_v1_RouteLookupConfig* msg) { + return *UPB_PTR_AT(msg, UPB_SIZE(40, 64), const struct google_protobuf_Duration*); +} +UPB_INLINE int64_t grpc_lookup_v1_RouteLookupConfig_cache_size_bytes(const grpc_lookup_v1_RouteLookupConfig* msg) { + return *UPB_PTR_AT(msg, UPB_SIZE(8, 8), int64_t); +} +UPB_INLINE upb_StringView const* grpc_lookup_v1_RouteLookupConfig_valid_targets(const grpc_lookup_v1_RouteLookupConfig *msg, size_t *len) { return (upb_StringView const*)_upb_array_accessor(msg, UPB_SIZE(52, 88), len); } +UPB_INLINE upb_StringView grpc_lookup_v1_RouteLookupConfig_default_target(const grpc_lookup_v1_RouteLookupConfig* msg) { + return *UPB_PTR_AT(msg, UPB_SIZE(24, 32), upb_StringView); +} + +UPB_INLINE grpc_lookup_v1_HttpKeyBuilder** grpc_lookup_v1_RouteLookupConfig_mutable_http_keybuilders(grpc_lookup_v1_RouteLookupConfig *msg, size_t *len) { + return (grpc_lookup_v1_HttpKeyBuilder**)_upb_array_mutable_accessor(msg, UPB_SIZE(44, 72), len); +} +UPB_INLINE grpc_lookup_v1_HttpKeyBuilder** grpc_lookup_v1_RouteLookupConfig_resize_http_keybuilders(grpc_lookup_v1_RouteLookupConfig *msg, size_t len, upb_Arena *arena) { + return (grpc_lookup_v1_HttpKeyBuilder**)_upb_Array_Resize_accessor2(msg, UPB_SIZE(44, 72), len, UPB_SIZE(2, 3), arena); +} +UPB_INLINE struct grpc_lookup_v1_HttpKeyBuilder* grpc_lookup_v1_RouteLookupConfig_add_http_keybuilders(grpc_lookup_v1_RouteLookupConfig *msg, upb_Arena *arena) { + struct grpc_lookup_v1_HttpKeyBuilder* sub = (struct grpc_lookup_v1_HttpKeyBuilder*)_upb_Message_New(&grpc_lookup_v1_HttpKeyBuilder_msginit, arena); + bool ok = _upb_Array_Append_accessor2( + msg, UPB_SIZE(44, 72), UPB_SIZE(2, 3), &sub, arena); + if (!ok) return NULL; + return sub; +} +UPB_INLINE grpc_lookup_v1_GrpcKeyBuilder** grpc_lookup_v1_RouteLookupConfig_mutable_grpc_keybuilders(grpc_lookup_v1_RouteLookupConfig *msg, size_t *len) { + return (grpc_lookup_v1_GrpcKeyBuilder**)_upb_array_mutable_accessor(msg, UPB_SIZE(48, 80), len); +} +UPB_INLINE grpc_lookup_v1_GrpcKeyBuilder** grpc_lookup_v1_RouteLookupConfig_resize_grpc_keybuilders(grpc_lookup_v1_RouteLookupConfig *msg, size_t len, upb_Arena *arena) { + return (grpc_lookup_v1_GrpcKeyBuilder**)_upb_Array_Resize_accessor2(msg, UPB_SIZE(48, 80), len, UPB_SIZE(2, 3), arena); +} +UPB_INLINE struct grpc_lookup_v1_GrpcKeyBuilder* grpc_lookup_v1_RouteLookupConfig_add_grpc_keybuilders(grpc_lookup_v1_RouteLookupConfig *msg, upb_Arena *arena) { + struct grpc_lookup_v1_GrpcKeyBuilder* sub = (struct grpc_lookup_v1_GrpcKeyBuilder*)_upb_Message_New(&grpc_lookup_v1_GrpcKeyBuilder_msginit, arena); + bool ok = _upb_Array_Append_accessor2( + msg, UPB_SIZE(48, 80), UPB_SIZE(2, 3), &sub, arena); + if (!ok) return NULL; + return sub; +} +UPB_INLINE void grpc_lookup_v1_RouteLookupConfig_set_lookup_service(grpc_lookup_v1_RouteLookupConfig *msg, upb_StringView value) { + *UPB_PTR_AT(msg, UPB_SIZE(16, 16), upb_StringView) = value; +} +UPB_INLINE void grpc_lookup_v1_RouteLookupConfig_set_lookup_service_timeout(grpc_lookup_v1_RouteLookupConfig *msg, struct google_protobuf_Duration* value) { + _upb_sethas(msg, 1); + *UPB_PTR_AT(msg, UPB_SIZE(32, 48), struct google_protobuf_Duration*) = value; +} +UPB_INLINE struct google_protobuf_Duration* grpc_lookup_v1_RouteLookupConfig_mutable_lookup_service_timeout(grpc_lookup_v1_RouteLookupConfig *msg, upb_Arena *arena) { + struct google_protobuf_Duration* sub = (struct google_protobuf_Duration*)grpc_lookup_v1_RouteLookupConfig_lookup_service_timeout(msg); + if (sub == NULL) { + sub = (struct google_protobuf_Duration*)_upb_Message_New(&google_protobuf_Duration_msginit, arena); + if (!sub) return NULL; + grpc_lookup_v1_RouteLookupConfig_set_lookup_service_timeout(msg, sub); + } + return sub; +} +UPB_INLINE void grpc_lookup_v1_RouteLookupConfig_set_max_age(grpc_lookup_v1_RouteLookupConfig *msg, struct google_protobuf_Duration* value) { + _upb_sethas(msg, 2); + *UPB_PTR_AT(msg, UPB_SIZE(36, 56), struct google_protobuf_Duration*) = value; +} +UPB_INLINE struct google_protobuf_Duration* grpc_lookup_v1_RouteLookupConfig_mutable_max_age(grpc_lookup_v1_RouteLookupConfig *msg, upb_Arena *arena) { + struct google_protobuf_Duration* sub = (struct google_protobuf_Duration*)grpc_lookup_v1_RouteLookupConfig_max_age(msg); + if (sub == NULL) { + sub = (struct google_protobuf_Duration*)_upb_Message_New(&google_protobuf_Duration_msginit, arena); + if (!sub) return NULL; + grpc_lookup_v1_RouteLookupConfig_set_max_age(msg, sub); + } + return sub; +} +UPB_INLINE void grpc_lookup_v1_RouteLookupConfig_set_stale_age(grpc_lookup_v1_RouteLookupConfig *msg, struct google_protobuf_Duration* value) { + _upb_sethas(msg, 3); + *UPB_PTR_AT(msg, UPB_SIZE(40, 64), struct google_protobuf_Duration*) = value; +} +UPB_INLINE struct google_protobuf_Duration* grpc_lookup_v1_RouteLookupConfig_mutable_stale_age(grpc_lookup_v1_RouteLookupConfig *msg, upb_Arena *arena) { + struct google_protobuf_Duration* sub = (struct google_protobuf_Duration*)grpc_lookup_v1_RouteLookupConfig_stale_age(msg); + if (sub == NULL) { + sub = (struct google_protobuf_Duration*)_upb_Message_New(&google_protobuf_Duration_msginit, arena); + if (!sub) return NULL; + grpc_lookup_v1_RouteLookupConfig_set_stale_age(msg, sub); + } + return sub; +} +UPB_INLINE void grpc_lookup_v1_RouteLookupConfig_set_cache_size_bytes(grpc_lookup_v1_RouteLookupConfig *msg, int64_t value) { + *UPB_PTR_AT(msg, UPB_SIZE(8, 8), int64_t) = value; +} +UPB_INLINE upb_StringView* grpc_lookup_v1_RouteLookupConfig_mutable_valid_targets(grpc_lookup_v1_RouteLookupConfig *msg, size_t *len) { + return (upb_StringView*)_upb_array_mutable_accessor(msg, UPB_SIZE(52, 88), len); +} +UPB_INLINE upb_StringView* grpc_lookup_v1_RouteLookupConfig_resize_valid_targets(grpc_lookup_v1_RouteLookupConfig *msg, size_t len, upb_Arena *arena) { + return (upb_StringView*)_upb_Array_Resize_accessor2(msg, UPB_SIZE(52, 88), len, UPB_SIZE(3, 4), arena); +} +UPB_INLINE bool grpc_lookup_v1_RouteLookupConfig_add_valid_targets(grpc_lookup_v1_RouteLookupConfig *msg, upb_StringView val, upb_Arena *arena) { + return _upb_Array_Append_accessor2(msg, UPB_SIZE(52, 88), UPB_SIZE(3, 4), &val, + arena); +} +UPB_INLINE void grpc_lookup_v1_RouteLookupConfig_set_default_target(grpc_lookup_v1_RouteLookupConfig *msg, upb_StringView value) { + *UPB_PTR_AT(msg, UPB_SIZE(24, 32), upb_StringView) = value; +} + +/* grpc.lookup.v1.RouteLookupClusterSpecifier */ + +UPB_INLINE grpc_lookup_v1_RouteLookupClusterSpecifier* grpc_lookup_v1_RouteLookupClusterSpecifier_new(upb_Arena* arena) { + return (grpc_lookup_v1_RouteLookupClusterSpecifier*)_upb_Message_New(&grpc_lookup_v1_RouteLookupClusterSpecifier_msginit, arena); +} +UPB_INLINE grpc_lookup_v1_RouteLookupClusterSpecifier* grpc_lookup_v1_RouteLookupClusterSpecifier_parse(const char* buf, size_t size, upb_Arena* arena) { + grpc_lookup_v1_RouteLookupClusterSpecifier* ret = grpc_lookup_v1_RouteLookupClusterSpecifier_new(arena); + if (!ret) return NULL; + if (upb_Decode(buf, size, ret, &grpc_lookup_v1_RouteLookupClusterSpecifier_msginit, NULL, 0, arena) != kUpb_DecodeStatus_Ok) { + return NULL; + } + return ret; +} +UPB_INLINE grpc_lookup_v1_RouteLookupClusterSpecifier* grpc_lookup_v1_RouteLookupClusterSpecifier_parse_ex(const char* buf, size_t size, + const upb_ExtensionRegistry* extreg, + int options, upb_Arena* arena) { + grpc_lookup_v1_RouteLookupClusterSpecifier* ret = grpc_lookup_v1_RouteLookupClusterSpecifier_new(arena); + if (!ret) return NULL; + if (upb_Decode(buf, size, ret, &grpc_lookup_v1_RouteLookupClusterSpecifier_msginit, extreg, options, arena) != + kUpb_DecodeStatus_Ok) { + return NULL; + } + return ret; +} +UPB_INLINE char* grpc_lookup_v1_RouteLookupClusterSpecifier_serialize(const grpc_lookup_v1_RouteLookupClusterSpecifier* msg, upb_Arena* arena, size_t* len) { + return upb_Encode(msg, &grpc_lookup_v1_RouteLookupClusterSpecifier_msginit, 0, arena, len); +} +UPB_INLINE char* grpc_lookup_v1_RouteLookupClusterSpecifier_serialize_ex(const grpc_lookup_v1_RouteLookupClusterSpecifier* msg, int options, + upb_Arena* arena, size_t* len) { + return upb_Encode(msg, &grpc_lookup_v1_RouteLookupClusterSpecifier_msginit, options, arena, len); +} +UPB_INLINE bool grpc_lookup_v1_RouteLookupClusterSpecifier_has_route_lookup_config(const grpc_lookup_v1_RouteLookupClusterSpecifier *msg) { return _upb_hasbit(msg, 1); } +UPB_INLINE const grpc_lookup_v1_RouteLookupConfig* grpc_lookup_v1_RouteLookupClusterSpecifier_route_lookup_config(const grpc_lookup_v1_RouteLookupClusterSpecifier* msg) { + return *UPB_PTR_AT(msg, UPB_SIZE(4, 8), const grpc_lookup_v1_RouteLookupConfig*); +} + +UPB_INLINE void grpc_lookup_v1_RouteLookupClusterSpecifier_set_route_lookup_config(grpc_lookup_v1_RouteLookupClusterSpecifier *msg, grpc_lookup_v1_RouteLookupConfig* value) { + _upb_sethas(msg, 1); + *UPB_PTR_AT(msg, UPB_SIZE(4, 8), grpc_lookup_v1_RouteLookupConfig*) = value; +} +UPB_INLINE struct grpc_lookup_v1_RouteLookupConfig* grpc_lookup_v1_RouteLookupClusterSpecifier_mutable_route_lookup_config(grpc_lookup_v1_RouteLookupClusterSpecifier *msg, upb_Arena *arena) { + struct grpc_lookup_v1_RouteLookupConfig* sub = (struct grpc_lookup_v1_RouteLookupConfig*)grpc_lookup_v1_RouteLookupClusterSpecifier_route_lookup_config(msg); + if (sub == NULL) { + sub = (struct grpc_lookup_v1_RouteLookupConfig*)_upb_Message_New(&grpc_lookup_v1_RouteLookupConfig_msginit, arena); + if (!sub) return NULL; + grpc_lookup_v1_RouteLookupClusterSpecifier_set_route_lookup_config(msg, sub); + } + return sub; +} + +extern const upb_MiniTable_File src_proto_grpc_lookup_v1_rls_config_proto_upb_file_layout; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#include "upb/port_undef.inc" + +#endif /* SRC_PROTO_GRPC_LOOKUP_V1_RLS_CONFIG_PROTO_UPB_H_ */ diff --git a/src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.c b/src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.c new file mode 100644 index 00000000000..92c529b67db --- /dev/null +++ b/src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.c @@ -0,0 +1,99 @@ +/* This file was generated by upbc (the upb compiler) from the input + * file: + * + * src/proto/grpc/lookup/v1/rls_config.proto + * + * Do not edit -- your changes will be discarded when the file is + * regenerated. */ + +#include "upb/def.h" +#include "src/proto/grpc/lookup/v1/rls_config.upbdefs.h" +#include "src/proto/grpc/lookup/v1/rls_config.upb.h" + +extern _upb_DefPool_Init google_protobuf_duration_proto_upbdefinit; +static const char descriptor[1816] = {'\n', ')', 's', 'r', 'c', '/', 'p', 'r', 'o', 't', 'o', '/', 'g', 'r', 'p', 'c', '/', 'l', 'o', 'o', 'k', 'u', 'p', '/', 'v', +'1', '/', 'r', 'l', 's', '_', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'p', 'r', 'o', 't', 'o', '\022', '\016', 'g', 'r', 'p', 'c', '.', +'l', 'o', 'o', 'k', 'u', 'p', '.', 'v', '1', '\032', '\036', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', +'f', '/', 'd', 'u', 'r', 'a', 't', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\"', '\\', '\n', '\013', 'N', 'a', 'm', 'e', 'M', +'a', 't', 'c', 'h', 'e', 'r', '\022', '\020', '\n', '\003', 'k', 'e', 'y', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\003', 'k', 'e', 'y', '\022', +'\024', '\n', '\005', 'n', 'a', 'm', 'e', 's', '\030', '\002', ' ', '\003', '(', '\t', 'R', '\005', 'n', 'a', 'm', 'e', 's', '\022', '%', '\n', '\016', +'r', 'e', 'q', 'u', 'i', 'r', 'e', 'd', '_', 'm', 'a', 't', 'c', 'h', '\030', '\003', ' ', '\001', '(', '\010', 'R', '\r', 'r', 'e', 'q', +'u', 'i', 'r', 'e', 'd', 'M', 'a', 't', 'c', 'h', '\"', '\360', '\003', '\n', '\016', 'G', 'r', 'p', 'c', 'K', 'e', 'y', 'B', 'u', 'i', +'l', 'd', 'e', 'r', '\022', '9', '\n', '\005', 'n', 'a', 'm', 'e', 's', '\030', '\001', ' ', '\003', '(', '\013', '2', '#', '.', 'g', 'r', 'p', +'c', '.', 'l', 'o', 'o', 'k', 'u', 'p', '.', 'v', '1', '.', 'G', 'r', 'p', 'c', 'K', 'e', 'y', 'B', 'u', 'i', 'l', 'd', 'e', +'r', '.', 'N', 'a', 'm', 'e', 'R', '\005', 'n', 'a', 'm', 'e', 's', '\022', 'G', '\n', '\n', 'e', 'x', 't', 'r', 'a', '_', 'k', 'e', +'y', 's', '\030', '\003', ' ', '\001', '(', '\013', '2', '(', '.', 'g', 'r', 'p', 'c', '.', 'l', 'o', 'o', 'k', 'u', 'p', '.', 'v', '1', +'.', 'G', 'r', 'p', 'c', 'K', 'e', 'y', 'B', 'u', 'i', 'l', 'd', 'e', 'r', '.', 'E', 'x', 't', 'r', 'a', 'K', 'e', 'y', 's', +'R', '\t', 'e', 'x', 't', 'r', 'a', 'K', 'e', 'y', 's', '\022', '5', '\n', '\007', 'h', 'e', 'a', 'd', 'e', 'r', 's', '\030', '\002', ' ', +'\003', '(', '\013', '2', '\033', '.', 'g', 'r', 'p', 'c', '.', 'l', 'o', 'o', 'k', 'u', 'p', '.', 'v', '1', '.', 'N', 'a', 'm', 'e', +'M', 'a', 't', 'c', 'h', 'e', 'r', 'R', '\007', 'h', 'e', 'a', 'd', 'e', 'r', 's', '\022', 'U', '\n', '\r', 'c', 'o', 'n', 's', 't', +'a', 'n', 't', '_', 'k', 'e', 'y', 's', '\030', '\004', ' ', '\003', '(', '\013', '2', '0', '.', 'g', 'r', 'p', 'c', '.', 'l', 'o', 'o', +'k', 'u', 'p', '.', 'v', '1', '.', 'G', 'r', 'p', 'c', 'K', 'e', 'y', 'B', 'u', 'i', 'l', 'd', 'e', 'r', '.', 'C', 'o', 'n', +'s', 't', 'a', 'n', 't', 'K', 'e', 'y', 's', 'E', 'n', 't', 'r', 'y', 'R', '\014', 'c', 'o', 'n', 's', 't', 'a', 'n', 't', 'K', +'e', 'y', 's', '\032', '8', '\n', '\004', 'N', 'a', 'm', 'e', '\022', '\030', '\n', '\007', 's', 'e', 'r', 'v', 'i', 'c', 'e', '\030', '\001', ' ', +'\001', '(', '\t', 'R', '\007', 's', 'e', 'r', 'v', 'i', 'c', 'e', '\022', '\026', '\n', '\006', 'm', 'e', 't', 'h', 'o', 'd', '\030', '\002', ' ', +'\001', '(', '\t', 'R', '\006', 'm', 'e', 't', 'h', 'o', 'd', '\032', 'Q', '\n', '\t', 'E', 'x', 't', 'r', 'a', 'K', 'e', 'y', 's', '\022', +'\022', '\n', '\004', 'h', 'o', 's', 't', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\004', 'h', 'o', 's', 't', '\022', '\030', '\n', '\007', 's', 'e', +'r', 'v', 'i', 'c', 'e', '\030', '\002', ' ', '\001', '(', '\t', 'R', '\007', 's', 'e', 'r', 'v', 'i', 'c', 'e', '\022', '\026', '\n', '\006', 'm', +'e', 't', 'h', 'o', 'd', '\030', '\003', ' ', '\001', '(', '\t', 'R', '\006', 'm', 'e', 't', 'h', 'o', 'd', '\032', '?', '\n', '\021', 'C', 'o', +'n', 's', 't', 'a', 'n', 't', 'K', 'e', 'y', 's', 'E', 'n', 't', 'r', 'y', '\022', '\020', '\n', '\003', 'k', 'e', 'y', '\030', '\001', ' ', +'\001', '(', '\t', 'R', '\003', 'k', 'e', 'y', '\022', '\024', '\n', '\005', 'v', 'a', 'l', 'u', 'e', '\030', '\002', ' ', '\001', '(', '\t', 'R', '\005', +'v', 'a', 'l', 'u', 'e', ':', '\002', '8', '\001', '\"', '\361', '\002', '\n', '\016', 'H', 't', 't', 'p', 'K', 'e', 'y', 'B', 'u', 'i', 'l', +'d', 'e', 'r', '\022', '#', '\n', '\r', 'h', 'o', 's', 't', '_', 'p', 'a', 't', 't', 'e', 'r', 'n', 's', '\030', '\001', ' ', '\003', '(', +'\t', 'R', '\014', 'h', 'o', 's', 't', 'P', 'a', 't', 't', 'e', 'r', 'n', 's', '\022', '#', '\n', '\r', 'p', 'a', 't', 'h', '_', 'p', +'a', 't', 't', 'e', 'r', 'n', 's', '\030', '\002', ' ', '\003', '(', '\t', 'R', '\014', 'p', 'a', 't', 'h', 'P', 'a', 't', 't', 'e', 'r', +'n', 's', '\022', 'F', '\n', '\020', 'q', 'u', 'e', 'r', 'y', '_', 'p', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', 's', '\030', '\003', ' ', +'\003', '(', '\013', '2', '\033', '.', 'g', 'r', 'p', 'c', '.', 'l', 'o', 'o', 'k', 'u', 'p', '.', 'v', '1', '.', 'N', 'a', 'm', 'e', +'M', 'a', 't', 'c', 'h', 'e', 'r', 'R', '\017', 'q', 'u', 'e', 'r', 'y', 'P', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', 's', '\022', +'5', '\n', '\007', 'h', 'e', 'a', 'd', 'e', 'r', 's', '\030', '\004', ' ', '\003', '(', '\013', '2', '\033', '.', 'g', 'r', 'p', 'c', '.', 'l', +'o', 'o', 'k', 'u', 'p', '.', 'v', '1', '.', 'N', 'a', 'm', 'e', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'R', '\007', 'h', 'e', 'a', +'d', 'e', 'r', 's', '\022', 'U', '\n', '\r', 'c', 'o', 'n', 's', 't', 'a', 'n', 't', '_', 'k', 'e', 'y', 's', '\030', '\005', ' ', '\003', +'(', '\013', '2', '0', '.', 'g', 'r', 'p', 'c', '.', 'l', 'o', 'o', 'k', 'u', 'p', '.', 'v', '1', '.', 'H', 't', 't', 'p', 'K', +'e', 'y', 'B', 'u', 'i', 'l', 'd', 'e', 'r', '.', 'C', 'o', 'n', 's', 't', 'a', 'n', 't', 'K', 'e', 'y', 's', 'E', 'n', 't', +'r', 'y', 'R', '\014', 'c', 'o', 'n', 's', 't', 'a', 'n', 't', 'K', 'e', 'y', 's', '\032', '?', '\n', '\021', 'C', 'o', 'n', 's', 't', +'a', 'n', 't', 'K', 'e', 'y', 's', 'E', 'n', 't', 'r', 'y', '\022', '\020', '\n', '\003', 'k', 'e', 'y', '\030', '\001', ' ', '\001', '(', '\t', +'R', '\003', 'k', 'e', 'y', '\022', '\024', '\n', '\005', 'v', 'a', 'l', 'u', 'e', '\030', '\002', ' ', '\001', '(', '\t', 'R', '\005', 'v', 'a', 'l', +'u', 'e', ':', '\002', '8', '\001', '\"', '\246', '\004', '\n', '\021', 'R', 'o', 'u', 't', 'e', 'L', 'o', 'o', 'k', 'u', 'p', 'C', 'o', 'n', +'f', 'i', 'g', '\022', 'I', '\n', '\020', 'h', 't', 't', 'p', '_', 'k', 'e', 'y', 'b', 'u', 'i', 'l', 'd', 'e', 'r', 's', '\030', '\001', +' ', '\003', '(', '\013', '2', '\036', '.', 'g', 'r', 'p', 'c', '.', 'l', 'o', 'o', 'k', 'u', 'p', '.', 'v', '1', '.', 'H', 't', 't', +'p', 'K', 'e', 'y', 'B', 'u', 'i', 'l', 'd', 'e', 'r', 'R', '\017', 'h', 't', 't', 'p', 'K', 'e', 'y', 'b', 'u', 'i', 'l', 'd', +'e', 'r', 's', '\022', 'I', '\n', '\020', 'g', 'r', 'p', 'c', '_', 'k', 'e', 'y', 'b', 'u', 'i', 'l', 'd', 'e', 'r', 's', '\030', '\002', +' ', '\003', '(', '\013', '2', '\036', '.', 'g', 'r', 'p', 'c', '.', 'l', 'o', 'o', 'k', 'u', 'p', '.', 'v', '1', '.', 'G', 'r', 'p', +'c', 'K', 'e', 'y', 'B', 'u', 'i', 'l', 'd', 'e', 'r', 'R', '\017', 'g', 'r', 'p', 'c', 'K', 'e', 'y', 'b', 'u', 'i', 'l', 'd', +'e', 'r', 's', '\022', '%', '\n', '\016', 'l', 'o', 'o', 'k', 'u', 'p', '_', 's', 'e', 'r', 'v', 'i', 'c', 'e', '\030', '\003', ' ', '\001', +'(', '\t', 'R', '\r', 'l', 'o', 'o', 'k', 'u', 'p', 'S', 'e', 'r', 'v', 'i', 'c', 'e', '\022', 'O', '\n', '\026', 'l', 'o', 'o', 'k', +'u', 'p', '_', 's', 'e', 'r', 'v', 'i', 'c', 'e', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\004', ' ', '\001', '(', '\013', '2', +'\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', +'n', 'R', '\024', 'l', 'o', 'o', 'k', 'u', 'p', 'S', 'e', 'r', 'v', 'i', 'c', 'e', 'T', 'i', 'm', 'e', 'o', 'u', 't', '\022', '2', +'\n', '\007', 'm', 'a', 'x', '_', 'a', 'g', 'e', '\030', '\005', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', +'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\006', 'm', 'a', 'x', 'A', 'g', 'e', +'\022', '6', '\n', '\t', 's', 't', 'a', 'l', 'e', '_', 'a', 'g', 'e', '\030', '\006', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', +'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\010', 's', 't', +'a', 'l', 'e', 'A', 'g', 'e', '\022', '(', '\n', '\020', 'c', 'a', 'c', 'h', 'e', '_', 's', 'i', 'z', 'e', '_', 'b', 'y', 't', 'e', +'s', '\030', '\007', ' ', '\001', '(', '\003', 'R', '\016', 'c', 'a', 'c', 'h', 'e', 'S', 'i', 'z', 'e', 'B', 'y', 't', 'e', 's', '\022', '#', +'\n', '\r', 'v', 'a', 'l', 'i', 'd', '_', 't', 'a', 'r', 'g', 'e', 't', 's', '\030', '\010', ' ', '\003', '(', '\t', 'R', '\014', 'v', 'a', +'l', 'i', 'd', 'T', 'a', 'r', 'g', 'e', 't', 's', '\022', '%', '\n', '\016', 'd', 'e', 'f', 'a', 'u', 'l', 't', '_', 't', 'a', 'r', +'g', 'e', 't', '\030', '\t', ' ', '\001', '(', '\t', 'R', '\r', 'd', 'e', 'f', 'a', 'u', 'l', 't', 'T', 'a', 'r', 'g', 'e', 't', 'J', +'\004', '\010', '\n', '\020', '\013', 'R', '\033', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'p', 'r', 'o', 'c', 'e', 's', 's', 'i', 'n', 'g', +'_', 's', 't', 'r', 'a', 't', 'e', 'g', 'y', '\"', 'p', '\n', '\033', 'R', 'o', 'u', 't', 'e', 'L', 'o', 'o', 'k', 'u', 'p', 'C', +'l', 'u', 's', 't', 'e', 'r', 'S', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', '\022', 'Q', '\n', '\023', 'r', 'o', 'u', 't', 'e', '_', +'l', 'o', 'o', 'k', 'u', 'p', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\001', ' ', '\001', '(', '\013', '2', '!', '.', 'g', 'r', 'p', +'c', '.', 'l', 'o', 'o', 'k', 'u', 'p', '.', 'v', '1', '.', 'R', 'o', 'u', 't', 'e', 'L', 'o', 'o', 'k', 'u', 'p', 'C', 'o', +'n', 'f', 'i', 'g', 'R', '\021', 'r', 'o', 'u', 't', 'e', 'L', 'o', 'o', 'k', 'u', 'p', 'C', 'o', 'n', 'f', 'i', 'g', 'B', 'S', +'\n', '\021', 'i', 'o', '.', 'g', 'r', 'p', 'c', '.', 'l', 'o', 'o', 'k', 'u', 'p', '.', 'v', '1', 'B', '\016', 'R', 'l', 's', 'C', +'o', 'n', 'f', 'i', 'g', 'P', 'r', 'o', 't', 'o', 'P', '\001', 'Z', ',', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'g', 'o', 'l', 'a', +'n', 'g', '.', 'o', 'r', 'g', '/', 'g', 'r', 'p', 'c', '/', 'l', 'o', 'o', 'k', 'u', 'p', '/', 'g', 'r', 'p', 'c', '_', 'l', +'o', 'o', 'k', 'u', 'p', '_', 'v', '1', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3', +}; + +static _upb_DefPool_Init *deps[2] = { + &google_protobuf_duration_proto_upbdefinit, + NULL +}; + +_upb_DefPool_Init src_proto_grpc_lookup_v1_rls_config_proto_upbdefinit = { + deps, + &src_proto_grpc_lookup_v1_rls_config_proto_upb_file_layout, + "src/proto/grpc/lookup/v1/rls_config.proto", + UPB_STRINGVIEW_INIT(descriptor, 1816) +}; diff --git a/src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.h b/src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.h new file mode 100644 index 00000000000..3a7591fa5de --- /dev/null +++ b/src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.h @@ -0,0 +1,75 @@ +/* This file was generated by upbc (the upb compiler) from the input + * file: + * + * src/proto/grpc/lookup/v1/rls_config.proto + * + * Do not edit -- your changes will be discarded when the file is + * regenerated. */ + +#ifndef SRC_PROTO_GRPC_LOOKUP_V1_RLS_CONFIG_PROTO_UPBDEFS_H_ +#define SRC_PROTO_GRPC_LOOKUP_V1_RLS_CONFIG_PROTO_UPBDEFS_H_ + +#include "upb/def.h" +#include "upb/port_def.inc" +#ifdef __cplusplus +extern "C" { +#endif + +#include "upb/def.h" + +#include "upb/port_def.inc" + +extern _upb_DefPool_Init src_proto_grpc_lookup_v1_rls_config_proto_upbdefinit; + +UPB_INLINE const upb_MessageDef *grpc_lookup_v1_NameMatcher_getmsgdef(upb_DefPool *s) { + _upb_DefPool_LoadDefInit(s, &src_proto_grpc_lookup_v1_rls_config_proto_upbdefinit); + return upb_DefPool_FindMessageByName(s, "grpc.lookup.v1.NameMatcher"); +} + +UPB_INLINE const upb_MessageDef *grpc_lookup_v1_GrpcKeyBuilder_getmsgdef(upb_DefPool *s) { + _upb_DefPool_LoadDefInit(s, &src_proto_grpc_lookup_v1_rls_config_proto_upbdefinit); + return upb_DefPool_FindMessageByName(s, "grpc.lookup.v1.GrpcKeyBuilder"); +} + +UPB_INLINE const upb_MessageDef *grpc_lookup_v1_GrpcKeyBuilder_Name_getmsgdef(upb_DefPool *s) { + _upb_DefPool_LoadDefInit(s, &src_proto_grpc_lookup_v1_rls_config_proto_upbdefinit); + return upb_DefPool_FindMessageByName(s, "grpc.lookup.v1.GrpcKeyBuilder.Name"); +} + +UPB_INLINE const upb_MessageDef *grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys_getmsgdef(upb_DefPool *s) { + _upb_DefPool_LoadDefInit(s, &src_proto_grpc_lookup_v1_rls_config_proto_upbdefinit); + return upb_DefPool_FindMessageByName(s, "grpc.lookup.v1.GrpcKeyBuilder.ExtraKeys"); +} + +UPB_INLINE const upb_MessageDef *grpc_lookup_v1_GrpcKeyBuilder_ConstantKeysEntry_getmsgdef(upb_DefPool *s) { + _upb_DefPool_LoadDefInit(s, &src_proto_grpc_lookup_v1_rls_config_proto_upbdefinit); + return upb_DefPool_FindMessageByName(s, "grpc.lookup.v1.GrpcKeyBuilder.ConstantKeysEntry"); +} + +UPB_INLINE const upb_MessageDef *grpc_lookup_v1_HttpKeyBuilder_getmsgdef(upb_DefPool *s) { + _upb_DefPool_LoadDefInit(s, &src_proto_grpc_lookup_v1_rls_config_proto_upbdefinit); + return upb_DefPool_FindMessageByName(s, "grpc.lookup.v1.HttpKeyBuilder"); +} + +UPB_INLINE const upb_MessageDef *grpc_lookup_v1_HttpKeyBuilder_ConstantKeysEntry_getmsgdef(upb_DefPool *s) { + _upb_DefPool_LoadDefInit(s, &src_proto_grpc_lookup_v1_rls_config_proto_upbdefinit); + return upb_DefPool_FindMessageByName(s, "grpc.lookup.v1.HttpKeyBuilder.ConstantKeysEntry"); +} + +UPB_INLINE const upb_MessageDef *grpc_lookup_v1_RouteLookupConfig_getmsgdef(upb_DefPool *s) { + _upb_DefPool_LoadDefInit(s, &src_proto_grpc_lookup_v1_rls_config_proto_upbdefinit); + return upb_DefPool_FindMessageByName(s, "grpc.lookup.v1.RouteLookupConfig"); +} + +UPB_INLINE const upb_MessageDef *grpc_lookup_v1_RouteLookupClusterSpecifier_getmsgdef(upb_DefPool *s) { + _upb_DefPool_LoadDefInit(s, &src_proto_grpc_lookup_v1_rls_config_proto_upbdefinit); + return upb_DefPool_FindMessageByName(s, "grpc.lookup.v1.RouteLookupClusterSpecifier"); +} + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#include "upb/port_undef.inc" + +#endif /* SRC_PROTO_GRPC_LOOKUP_V1_RLS_CONFIG_PROTO_UPBDEFS_H_ */ diff --git a/src/core/ext/xds/xds_client.cc b/src/core/ext/xds/xds_client.cc index 400f7fbf5d7..ae246b44a74 100644 --- a/src/core/ext/xds/xds_client.cc +++ b/src/core/ext/xds/xds_client.cc @@ -38,6 +38,7 @@ #include "src/core/ext/xds/xds_channel_args.h" #include "src/core/ext/xds/xds_client_stats.h" #include "src/core/ext/xds/xds_cluster.h" +#include "src/core/ext/xds/xds_cluster_specifier_plugin.h" #include "src/core/ext/xds/xds_endpoint.h" #include "src/core/ext/xds/xds_http_filters.h" #include "src/core/ext/xds/xds_listener.h" @@ -2333,6 +2334,7 @@ std::string XdsClient::DumpClientConfigBinary() { void XdsClientGlobalInit() { g_mu = new Mutex; XdsHttpFilterRegistry::Init(); + XdsClusterSpecifierPluginRegistry::Init(); } // TODO(roth): Find a better way to clear the fallback config that does @@ -2343,6 +2345,7 @@ void XdsClientGlobalShutdown() ABSL_NO_THREAD_SAFETY_ANALYSIS { delete g_mu; g_mu = nullptr; XdsHttpFilterRegistry::Shutdown(); + XdsClusterSpecifierPluginRegistry::Shutdown(); } namespace { diff --git a/src/core/ext/xds/xds_cluster_specifier_plugin.cc b/src/core/ext/xds/xds_cluster_specifier_plugin.cc new file mode 100644 index 00000000000..de3f6934f06 --- /dev/null +++ b/src/core/ext/xds/xds_cluster_specifier_plugin.cc @@ -0,0 +1,144 @@ +// +// 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_cluster_specifier_plugin.h" + +#include "absl/strings/str_format.h" +#include "envoy/extensions/filters/http/router/v3/router.upb.h" +#include "envoy/extensions/filters/http/router/v3/router.upbdefs.h" +#include "google/protobuf/duration.upb.h" +#include "upb/json_encode.h" + +#include "src/core/ext/filters/client_channel/lb_policy_registry.h" +#include "src/core/ext/xds/upb_utils.h" +#include "src/proto/grpc/lookup/v1/rls_config.upb.h" +#include "src/proto/grpc/lookup/v1/rls_config.upbdefs.h" + +namespace grpc_core { + +const char* kXdsRouteLookupClusterSpecifierPluginConfigName = + "grpc.lookup.v1.RouteLookupClusterSpecifier"; + +void XdsRouteLookupClusterSpecifierPlugin::PopulateSymtab( + upb_DefPool* symtab) const { + grpc_lookup_v1_RouteLookupConfig_getmsgdef(symtab); +} + +absl::StatusOr +XdsRouteLookupClusterSpecifierPlugin::GenerateLoadBalancingPolicyConfig( + upb_StringView serialized_plugin_config, upb_Arena* arena, + upb_DefPool* symtab) const { + const auto* specifier = grpc_lookup_v1_RouteLookupClusterSpecifier_parse( + serialized_plugin_config.data, serialized_plugin_config.size, arena); + if (specifier == nullptr) { + return absl::InvalidArgumentError("Could not parse plugin config"); + } + const auto* plugin_config = + grpc_lookup_v1_RouteLookupClusterSpecifier_route_lookup_config(specifier); + if (plugin_config == nullptr) { + return absl::InvalidArgumentError( + "Could not get route lookup config from route lookup cluster " + "specifier"); + } + upb::Status status; + const upb_MessageDef* msg_type = + grpc_lookup_v1_RouteLookupConfig_getmsgdef(symtab); + size_t json_size = upb_JsonEncode(plugin_config, msg_type, symtab, 0, nullptr, + 0, status.ptr()); + if (json_size == static_cast(-1)) { + return absl::InvalidArgumentError( + absl::StrCat("failed to dump proto to JSON: ", + upb_Status_ErrorMessage(status.ptr()))); + } + void* buf = upb_Arena_Malloc(arena, json_size + 1); + upb_JsonEncode(plugin_config, msg_type, symtab, 0, + reinterpret_cast(buf), json_size + 1, status.ptr()); + Json::Object rls_policy; + grpc_error_handle error = GRPC_ERROR_NONE; + rls_policy["routeLookupConfig"] = + Json::Parse(reinterpret_cast(buf), &error); + GPR_ASSERT(error == GRPC_ERROR_NONE); + Json::Object cds_policy; + cds_policy["cds_experimental"] = Json::Object(); + Json::Array child_policy; + child_policy.emplace_back(std::move(cds_policy)); + rls_policy["childPolicy"] = std::move(child_policy); + rls_policy["childPolicyConfigTargetFieldName"] = "cluster"; + Json::Object policy; + policy["rls_experimental"] = std::move(rls_policy); + Json::Array policies; + policies.emplace_back(std::move(policy)); + return Json(policies); +} + +namespace { + +using PluginRegistryMap = + std::map>; + +PluginRegistryMap* g_plugin_registry = nullptr; + +} // namespace + +void XdsClusterSpecifierPluginRegistry::PopulateSymtab(upb_DefPool* symtab) { + for (const auto& p : *g_plugin_registry) { + p.second->PopulateSymtab(symtab); + } +} + +void XdsClusterSpecifierPluginRegistry::RegisterPlugin( + std::unique_ptr plugin, + absl::string_view config_proto_type_name) { + (*g_plugin_registry)[config_proto_type_name] = std::move(plugin); +} + +absl::StatusOr +XdsClusterSpecifierPluginRegistry::GenerateLoadBalancingPolicyConfig( + absl::string_view proto_type_name, upb_StringView serialized_plugin_config, + upb_Arena* arena, upb_DefPool* symtab) { + auto it = g_plugin_registry->find(proto_type_name); + if (it == g_plugin_registry->end()) { + return absl::InvalidArgumentError( + "Unable to locate the cluster specifier plugin in the registry"); + } + auto lb_policy_config = it->second->GenerateLoadBalancingPolicyConfig( + serialized_plugin_config, arena, symtab); + if (!lb_policy_config.ok()) return lb_policy_config.status(); + grpc_error_handle parse_error = GRPC_ERROR_NONE; + LoadBalancingPolicyRegistry::ParseLoadBalancingConfig(*lb_policy_config, + &parse_error); + if (parse_error != GRPC_ERROR_NONE) { + absl::Status status = absl::InvalidArgumentError(absl::StrCat( + proto_type_name, + " ClusterSpecifierPlugin returned invalid LB policy config: ", + grpc_error_std_string(parse_error))); + GRPC_ERROR_UNREF(parse_error); + return status; + } + return lb_policy_config->Dump(); +} + +void XdsClusterSpecifierPluginRegistry::Init() { + g_plugin_registry = new PluginRegistryMap; + RegisterPlugin(absl::make_unique(), + kXdsRouteLookupClusterSpecifierPluginConfigName); +} + +void XdsClusterSpecifierPluginRegistry::Shutdown() { delete g_plugin_registry; } + +} // namespace grpc_core diff --git a/src/core/ext/xds/xds_cluster_specifier_plugin.h b/src/core/ext/xds/xds_cluster_specifier_plugin.h new file mode 100644 index 00000000000..1d688cfc02e --- /dev/null +++ b/src/core/ext/xds/xds_cluster_specifier_plugin.h @@ -0,0 +1,81 @@ +// +// 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_CLUSTER_SPECIFIER_PLUGIN_H +#define GRPC_CORE_EXT_XDS_XDS_CLUSTER_SPECIFIER_PLUGIN_H + +#include + +#include +#include +#include + +#include "absl/status/statusor.h" +#include "absl/strings/str_cat.h" +#include "absl/strings/string_view.h" +#include "google/protobuf/any.upb.h" +#include "upb/def.h" + +#include + +#include "src/core/lib/channel/channel_stack.h" +#include "src/core/lib/json/json.h" + +namespace grpc_core { + +class XdsClusterSpecifierPluginImpl { + public: + virtual ~XdsClusterSpecifierPluginImpl() = default; + + // Loads the proto message into the upb symtab. + virtual void PopulateSymtab(upb_DefPool* symtab) const = 0; + + // Returns the LB policy config in JSON form. + virtual absl::StatusOr GenerateLoadBalancingPolicyConfig( + upb_StringView serialized_plugin_config, upb_Arena* arena, + upb_DefPool* symtab) const = 0; +}; + +class XdsRouteLookupClusterSpecifierPlugin + : public XdsClusterSpecifierPluginImpl { + void PopulateSymtab(upb_DefPool* symtab) const override; + + absl::StatusOr GenerateLoadBalancingPolicyConfig( + upb_StringView serialized_plugin_config, upb_Arena* arena, + upb_DefPool* symtab) const override; +}; + +class XdsClusterSpecifierPluginRegistry { + public: + static void RegisterPlugin( + std::unique_ptr plugin, + absl::string_view config_proto_type_name); + + static void PopulateSymtab(upb_DefPool* symtab); + + static absl::StatusOr GenerateLoadBalancingPolicyConfig( + absl::string_view proto_type_name, + upb_StringView serialized_plugin_config, upb_Arena* arena, + upb_DefPool* symtab); + + // Global init and shutdown. + static void Init(); + static void Shutdown(); +}; + +} // namespace grpc_core + +#endif // GRPC_CORE_EXT_XDS_XDS_CLUSTER_SPECIFIER_PLUGIN_H diff --git a/src/core/ext/xds/xds_common_types.cc b/src/core/ext/xds/xds_common_types.cc index bfa0ecad173..37083181321 100644 --- a/src/core/ext/xds/xds_common_types.cc +++ b/src/core/ext/xds/xds_common_types.cc @@ -365,23 +365,23 @@ grpc_error_handle CommonTlsContext::Parse( &errors); } -grpc_error_handle ExtractHttpFilterTypeName(const XdsEncodingContext& context, - const google_protobuf_Any* any, - absl::string_view* filter_type) { - *filter_type = UpbStringToAbsl(google_protobuf_Any_type_url(any)); - if (*filter_type == "type.googleapis.com/xds.type.v3.TypedStruct" || - *filter_type == "type.googleapis.com/udpa.type.v1.TypedStruct") { +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") { upb_StringView any_value = google_protobuf_Any_value(any); const auto* 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( - "could not parse TypedStruct from filter config"); + "could not parse TypedStruct from extension"); } - *filter_type = + *extension_type = UpbStringToAbsl(xds_type_v3_TypedStruct_type_url(typed_struct)); } - *filter_type = absl::StripPrefix(*filter_type, "type.googleapis.com/"); + *extension_type = absl::StripPrefix(*extension_type, "type.googleapis.com/"); return GRPC_ERROR_NONE; } diff --git a/src/core/ext/xds/xds_common_types.h b/src/core/ext/xds/xds_common_types.h index df96e8c93ff..c5e118bd828 100644 --- a/src/core/ext/xds/xds_common_types.h +++ b/src/core/ext/xds/xds_common_types.h @@ -86,9 +86,9 @@ struct CommonTlsContext { CommonTlsContext* common_tls_context); }; -grpc_error_handle ExtractHttpFilterTypeName(const XdsEncodingContext& context, - const google_protobuf_Any* any, - absl::string_view* filter_type); +grpc_error_handle ExtractExtensionTypeName(const XdsEncodingContext& context, + const google_protobuf_Any* any, + absl::string_view* extension_type); } // namespace grpc_core diff --git a/src/core/ext/xds/xds_listener.cc b/src/core/ext/xds/xds_listener.cc index 24cde3609fe..14847e31d19 100644 --- a/src/core/ext/xds/xds_listener.cc +++ b/src/core/ext/xds/xds_listener.cc @@ -332,7 +332,7 @@ grpc_error_handle HttpConnectionManagerParse( } absl::string_view filter_type; grpc_error_handle error = - ExtractHttpFilterTypeName(context, any, &filter_type); + ExtractExtensionTypeName(context, any, &filter_type); if (error != GRPC_ERROR_NONE) return error; const XdsHttpFilterImpl* filter_impl = XdsHttpFilterRegistry::GetFilterForType(filter_type); diff --git a/src/core/ext/xds/xds_route_config.cc b/src/core/ext/xds/xds_route_config.cc index c894ad6800d..6720c90a2bc 100644 --- a/src/core/ext/xds/xds_route_config.cc +++ b/src/core/ext/xds/xds_route_config.cc @@ -23,6 +23,7 @@ #include "absl/strings/str_split.h" #include "absl/strings/string_view.h" #include "envoy/config/core/v3/base.upb.h" +#include "envoy/config/core/v3/extension.upb.h" #include "envoy/config/route/v3/route.upb.h" #include "envoy/config/route/v3/route.upbdefs.h" #include "envoy/config/route/v3/route_components.upb.h" @@ -39,12 +40,14 @@ #include "src/core/ext/xds/upb_utils.h" #include "src/core/ext/xds/xds_api.h" +#include "src/core/ext/xds/xds_cluster_specifier_plugin.h" #include "src/core/ext/xds/xds_common_types.h" #include "src/core/ext/xds/xds_resource_type.h" #include "src/core/ext/xds/xds_routing.h" #include "src/core/lib/gpr/env.h" #include "src/core/lib/gpr/string.h" #include "src/core/lib/iomgr/error.h" +#include "src/core/lib/transport/error_utils.h" namespace grpc_core { @@ -57,6 +60,15 @@ bool XdsRbacEnabled() { return parse_succeeded && parsed_value; } +// TODO(donnadionne): Remove once RLS is no longer experimental +bool XdsRlsEnabled() { + char* value = gpr_getenv("GRPC_EXPERIMENTAL_XDS_RLS_LB"); + bool parsed_value; + bool parse_succeeded = gpr_parse_bool_value(value, &parsed_value); + gpr_free(value); + return parse_succeeded && parsed_value; +} + // // XdsRouteConfigResource::RetryPolicy // @@ -212,11 +224,18 @@ std::string XdsRouteConfigResource::Route::RouteAction::ToString() const { if (retry_policy.has_value()) { contents.push_back(absl::StrCat("retry_policy=", retry_policy->ToString())); } - if (!cluster_name.empty()) { - contents.push_back(absl::StrFormat("Cluster name: %s", cluster_name)); - } - for (const ClusterWeight& cluster_weight : weighted_clusters) { - contents.push_back(cluster_weight.ToString()); + if (action.index() == kClusterIndex) { + contents.push_back( + absl::StrFormat("Cluster name: %s", absl::get(action))); + } else if (action.index() == kWeightedClustersIndex) { + auto& action_weighted_clusters = absl::get(action); + for (const ClusterWeight& cluster_weight : action_weighted_clusters) { + contents.push_back(cluster_weight.ToString()); + } + } else if (action.index() == kClusterSpecifierPluginIndex) { + contents.push_back( + absl::StrFormat("Cluster specifier plugin name: %s", + absl::get(action))); } if (max_stream_duration.has_value()) { contents.push_back(max_stream_duration->ToString()); @@ -258,35 +277,78 @@ std::string XdsRouteConfigResource::Route::ToString() const { // std::string XdsRouteConfigResource::ToString() const { - std::vector vhosts; + std::vector parts; for (const VirtualHost& vhost : virtual_hosts) { - vhosts.push_back( + parts.push_back( absl::StrCat("vhost={\n" " domains=[", absl::StrJoin(vhost.domains, ", "), "]\n" " routes=[\n")); for (const XdsRouteConfigResource::Route& route : vhost.routes) { - vhosts.push_back(" {\n"); - vhosts.push_back(route.ToString()); - vhosts.push_back("\n }\n"); + parts.push_back(" {\n"); + parts.push_back(route.ToString()); + parts.push_back("\n }\n"); } - vhosts.push_back(" ]\n"); - vhosts.push_back(" typed_per_filter_config={\n"); + parts.push_back(" ]\n"); + parts.push_back(" typed_per_filter_config={\n"); for (const auto& p : vhost.typed_per_filter_config) { const std::string& name = p.first; const auto& config = p.second; - vhosts.push_back( - absl::StrCat(" ", name, "=", config.ToString(), "\n")); + parts.push_back(absl::StrCat(" ", name, "=", config.ToString(), "\n")); } - vhosts.push_back(" }\n"); - vhosts.push_back("]\n"); + parts.push_back(" }\n"); + parts.push_back("]\n"); } - return absl::StrJoin(vhosts, ""); + parts.push_back("cluster_specifier_plugins={\n"); + for (const auto& it : cluster_specifier_plugin_map) { + parts.push_back(absl::StrFormat("%s={%s}\n", it.first, it.second)); + } + parts.push_back("}"); + return absl::StrJoin(parts, ""); } namespace { +grpc_error_handle ClusterSpecifierPluginParse( + const XdsEncodingContext& context, + const envoy_config_route_v3_RouteConfiguration* route_config, + XdsRouteConfigResource* rds_update) { + size_t num_cluster_specifier_plugins; + const envoy_config_route_v3_ClusterSpecifierPlugin* const* + cluster_specifier_plugin = + envoy_config_route_v3_RouteConfiguration_cluster_specifier_plugins( + route_config, &num_cluster_specifier_plugins); + for (size_t i = 0; i < num_cluster_specifier_plugins; ++i) { + const envoy_config_core_v3_TypedExtensionConfig* extension = + envoy_config_route_v3_ClusterSpecifierPlugin_extension( + cluster_specifier_plugin[i]); + std::string name = UpbStringToStdString( + envoy_config_core_v3_TypedExtensionConfig_name(extension)); + const google_protobuf_Any* any = + envoy_config_core_v3_TypedExtensionConfig_typed_config(extension); + if (any == nullptr) { + return GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "could not obtrain TypedExtensionConfig for plugin config"); + } + absl::string_view plugin_type; + grpc_error_handle error = + ExtractExtensionTypeName(context, any, &plugin_type); + if (error != GRPC_ERROR_NONE) return error; + // Find the plugin and generate the policy. + auto lb_policy_config = + XdsClusterSpecifierPluginRegistry::GenerateLoadBalancingPolicyConfig( + plugin_type, google_protobuf_Any_value(any), context.arena, + context.symtab); + if (!lb_policy_config.ok()) { + return absl_status_to_grpc_error(lb_policy_config.status()); + } + rds_update->cluster_specifier_plugin_map[std::move(name)] = + std::move(lb_policy_config.value()); + } + return GRPC_ERROR_NONE; +} + grpc_error_handle RoutePathMatchParse( const envoy_config_route_v3_RouteMatch* match, XdsRouteConfigResource::Route* route, bool* ignore_route) { @@ -523,7 +585,7 @@ grpc_error_handle ParseTypedPerFilterConfig( } } grpc_error_handle error = - ExtractHttpFilterTypeName(context, any, &filter_type); + ExtractExtensionTypeName(context, any, &filter_type); if (error != GRPC_ERROR_NONE) return error; const XdsHttpFilterImpl* filter_impl = XdsHttpFilterRegistry::GetFilterForType(filter_type); @@ -623,19 +685,27 @@ grpc_error_handle RetryPolicyParse( grpc_error_handle RouteActionParse( const XdsEncodingContext& context, const envoy_config_route_v3_Route* route_msg, + const std::map& + cluster_specifier_plugin_map, XdsRouteConfigResource::Route::RouteAction* route, bool* ignore_route) { const envoy_config_route_v3_RouteAction* route_action = envoy_config_route_v3_Route_route(route_msg); // Get the cluster or weighted_clusters in the RouteAction. if (envoy_config_route_v3_RouteAction_has_cluster(route_action)) { - route->cluster_name = UpbStringToStdString( + std::string cluster_name = UpbStringToStdString( envoy_config_route_v3_RouteAction_cluster(route_action)); - if (route->cluster_name.empty()) { + if (cluster_name.empty()) { return GRPC_ERROR_CREATE_FROM_STATIC_STRING( "RouteAction cluster contains empty cluster name."); } + route->action + .emplace( + std::move(cluster_name)); } else if (envoy_config_route_v3_RouteAction_has_weighted_clusters( route_action)) { + std::vector + action_weighted_clusters; const envoy_config_route_v3_WeightedCluster* weighted_cluster = envoy_config_route_v3_RouteAction_weighted_clusters(route_action); uint32_t total_weight = 100; @@ -682,18 +752,39 @@ grpc_error_handle RouteActionParse( &cluster.typed_per_filter_config); if (error != GRPC_ERROR_NONE) return error; } - route->weighted_clusters.emplace_back(std::move(cluster)); + action_weighted_clusters.emplace_back(std::move(cluster)); } if (total_weight != sum_of_weights) { return GRPC_ERROR_CREATE_FROM_STATIC_STRING( "RouteAction weighted_cluster has incorrect total weight"); } - if (route->weighted_clusters.empty()) { + if (action_weighted_clusters.empty()) { return GRPC_ERROR_CREATE_FROM_STATIC_STRING( "RouteAction weighted_cluster has no valid clusters specified."); } + route->action = std::move(action_weighted_clusters); + } else if (XdsRlsEnabled() && + envoy_config_route_v3_RouteAction_has_cluster_specifier_plugin( + route_action)) { + std::string plugin_name = UpbStringToStdString( + envoy_config_route_v3_RouteAction_cluster_specifier_plugin( + route_action)); + if (plugin_name.empty()) { + return GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "RouteAction cluster contains empty cluster specifier plugin name."); + } + if (cluster_specifier_plugin_map.find(plugin_name) == + cluster_specifier_plugin_map.end()) { + return GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "RouteAction cluster contains cluster specifier plugin name not " + "configured."); + } + route->action.emplace( + std::move(plugin_name)); } else { - // No cluster or weighted_clusters found in RouteAction, ignore this route. + // No cluster or weighted_clusters or plugin found in RouteAction, ignore + // this route. *ignore_route = true; } if (!*ignore_route) { @@ -808,6 +899,12 @@ grpc_error_handle XdsRouteConfigResource::Parse( const XdsEncodingContext& context, const envoy_config_route_v3_RouteConfiguration* route_config, XdsRouteConfigResource* rds_update) { + // Get the cluster spcifier plugins + if (XdsRlsEnabled()) { + grpc_error_handle error = + ClusterSpecifierPluginParse(context, route_config, rds_update); + if (error != GRPC_ERROR_NONE) return error; + } // Get the virtual hosts. size_t num_virtual_hosts; const envoy_config_route_v3_VirtualHost* const* virtual_hosts = @@ -862,6 +959,12 @@ grpc_error_handle XdsRouteConfigResource::Parse( return GRPC_ERROR_CREATE_FROM_STATIC_STRING( "No route found in the virtual host."); } + // Build a set of cluster_specifier_plugin configured to make sure each is + // actually referenced by a route action. + std::set cluster_specifier_plugins; + for (auto& plugin : rds_update->cluster_specifier_plugin_map) { + cluster_specifier_plugins.emplace(plugin.first); + } // Loop over the whole list of routes for (size_t j = 0; j < num_routes; ++j) { const envoy_config_route_v3_RouteMatch* match = @@ -889,14 +992,23 @@ grpc_error_handle XdsRouteConfigResource::Parse( route.action.emplace(); auto& route_action = absl::get(route.action); - error = - RouteActionParse(context, routes[j], &route_action, &ignore_route); + error = RouteActionParse(context, routes[j], + rds_update->cluster_specifier_plugin_map, + &route_action, &ignore_route); if (error != GRPC_ERROR_NONE) return error; if (ignore_route) continue; if (route_action.retry_policy == absl::nullopt && retry_policy != nullptr) { route_action.retry_policy = virtual_host_retry_policy; } + // Mark off plugins used in route action. + std::string* cluster_specifier_action = + absl::get_if( + &route_action.action); + if (cluster_specifier_action != nullptr) { + cluster_specifier_plugins.erase(*cluster_specifier_action); + } } else if (envoy_config_route_v3_Route_has_non_forwarding_action( routes[j])) { route.action @@ -918,6 +1030,12 @@ grpc_error_handle XdsRouteConfigResource::Parse( if (vhost.routes.empty()) { return GRPC_ERROR_CREATE_FROM_STATIC_STRING("No valid routes specified."); } + // For plugins not used in route action, delete from the update to prevent + // further use. + for (auto& unused_plugin : cluster_specifier_plugins) { + rds_update->cluster_specifier_plugin_map.erase( + std::string(unused_plugin)); + } } return GRPC_ERROR_NONE; } diff --git a/src/core/ext/xds/xds_route_config.h b/src/core/ext/xds/xds_route_config.h index 08803a09815..dd719b0c86c 100644 --- a/src/core/ext/xds/xds_route_config.h +++ b/src/core/ext/xds/xds_route_config.h @@ -30,6 +30,7 @@ #include "re2/re2.h" #include "src/core/ext/xds/xds_client.h" +#include "src/core/ext/xds/xds_cluster_specifier_plugin.h" #include "src/core/ext/xds/xds_common_types.h" #include "src/core/ext/xds/xds_http_filters.h" #include "src/core/ext/xds/xds_resource_type_impl.h" @@ -67,8 +68,6 @@ struct XdsRouteConfigResource { std::string ToString() const; }; - // TODO(donnadionne): When we can use absl::variant<>, consider using that - // for: PathMatcher, HeaderMatcher, cluster_name and weighted_clusters struct Route { // Matchers for this route. struct Matchers { @@ -130,10 +129,11 @@ struct XdsRouteConfigResource { absl::optional retry_policy; // Action for this route. - // TODO(roth): When we can use absl::variant<>, consider using that - // here, to enforce the fact that only one of the two fields can be set. - std::string cluster_name; - std::vector weighted_clusters; + static constexpr size_t kClusterIndex = 0; + static constexpr size_t kWeightedClustersIndex = 1; + static constexpr size_t kClusterSpecifierPluginIndex = 2; + absl::variant, std::string> + action; // Storing the timeout duration from route action: // RouteAction.max_stream_duration.grpc_timeout_header_max or // RouteAction.max_stream_duration.max_stream_duration if the former is @@ -142,9 +142,7 @@ struct XdsRouteConfigResource { bool operator==(const RouteAction& other) const { return hash_policies == other.hash_policies && - retry_policy == other.retry_policy && - cluster_name == other.cluster_name && - weighted_clusters == other.weighted_clusters && + retry_policy == other.retry_policy && action == other.action && max_stream_duration == other.max_stream_duration; } std::string ToString() const; @@ -178,9 +176,13 @@ struct XdsRouteConfigResource { }; std::vector virtual_hosts; + std::map + cluster_specifier_plugin_map; bool operator==(const XdsRouteConfigResource& other) const { - return virtual_hosts == other.virtual_hosts; + return virtual_hosts == other.virtual_hosts && + cluster_specifier_plugin_map == other.cluster_specifier_plugin_map; } std::string ToString() const; @@ -207,6 +209,7 @@ class XdsRouteConfigResourceType void InitUpbSymtab(upb_DefPool* symtab) const override { envoy_config_route_v3_RouteConfiguration_getmsgdef(symtab); + XdsClusterSpecifierPluginRegistry::PopulateSymtab(symtab); } }; diff --git a/src/core/lib/json/json_util.h b/src/core/lib/json/json_util.h index 29de52d8173..9582ab21f9e 100644 --- a/src/core/lib/json/json_util.h +++ b/src/core/lib/json/json_util.h @@ -45,9 +45,9 @@ bool ExtractJsonNumber(const Json& json, absl::string_view field_name, NumericType* output, std::vector* error_list) { static_assert(std::is_integral::value, "Integral required"); - if (json.type() != Json::Type::NUMBER) { - error_list->push_back(GRPC_ERROR_CREATE_FROM_CPP_STRING( - absl::StrCat("field:", field_name, " error:type should be NUMBER"))); + if (json.type() != Json::Type::NUMBER && json.type() != Json::Type::STRING) { + error_list->push_back(GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrCat( + "field:", field_name, " error:type should be NUMBER or STRING"))); return false; } if (!absl::SimpleAtoi(json.string_value(), output)) { diff --git a/src/proto/grpc/lookup/v1/BUILD b/src/proto/grpc/lookup/v1/BUILD index 0701ec0e674..81cf765b56f 100644 --- a/src/proto/grpc/lookup/v1/BUILD +++ b/src/proto/grpc/lookup/v1/BUILD @@ -28,7 +28,21 @@ grpc_proto_library( well_known_protos = True, ) +grpc_proto_library( + name = "rls_config_proto", + srcs = ["rls_config.proto"], + well_known_protos = True, +) + proto_library( name = "rls_proto_descriptor", srcs = ["rls.proto"], ) + +proto_library( + name = "rls_config_proto_descriptor", + srcs = ["rls_config.proto"], + deps = [ + "@com_google_protobuf//:duration_proto", + ], +) diff --git a/src/proto/grpc/testing/xds/v3/BUILD b/src/proto/grpc/testing/xds/v3/BUILD index 2c87a97ea76..fe2ee270bf9 100644 --- a/src/proto/grpc/testing/xds/v3/BUILD +++ b/src/proto/grpc/testing/xds/v3/BUILD @@ -197,6 +197,7 @@ grpc_proto_library( well_known_protos = True, deps = [ "base_proto", + "extension_proto", "percent_proto", "range_proto", "regex_proto", diff --git a/src/proto/grpc/testing/xds/v3/route.proto b/src/proto/grpc/testing/xds/v3/route.proto index 7109fe21db1..02133d8de36 100644 --- a/src/proto/grpc/testing/xds/v3/route.proto +++ b/src/proto/grpc/testing/xds/v3/route.proto @@ -19,6 +19,7 @@ syntax = "proto3"; package envoy.config.route.v3; import "src/proto/grpc/testing/xds/v3/base.proto"; +import "src/proto/grpc/testing/xds/v3/extension.proto"; import "src/proto/grpc/testing/xds/v3/regex.proto"; import "src/proto/grpc/testing/xds/v3/percent.proto"; import "src/proto/grpc/testing/xds/v3/range.proto"; @@ -268,6 +269,13 @@ message RouteAction { // :ref:`traffic splitting ` // for additional documentation. WeightedCluster weighted_clusters = 3; + + // Name of the cluster specifier plugin to use to determine the cluster for + // requests on this route. The plugin name must be defined in the associated + // :ref:`envoy_v3_api_field_config.route.v3.RouteConfiguration.cluster_specifier_plugins` + // in the + // :ref:`envoy_v3_api_field_config.core.v3.TypedExtensionConfig.name` field. + string cluster_specifier_plugin = 37; } message HashPolicy { @@ -435,6 +443,12 @@ message HeaderMatcher { message QueryParameterMatcher { } +// Configuration for a cluster specifier plugin. +message ClusterSpecifierPlugin { + // The name of the plugin and its opaque configuration. + core.v3.TypedExtensionConfig extension = 1; +} + // [#protodoc-title: HTTP route configuration] // * Routing :ref:`architecture overview ` // * HTTP :ref:`router filter ` @@ -449,6 +463,11 @@ message RouteConfiguration { // An array of virtual hosts that make up the route table. repeated VirtualHost virtual_hosts = 2; + + // A list of plugins and their configurations which may be used by a + // :ref:`envoy_v3_api_field_config.route.v3.RouteAction.cluster_specifier_plugin` + // within the route. All *extension.name* fields in this list must be unique. + repeated ClusterSpecifierPlugin cluster_specifier_plugins = 12; } message RedirectAction { diff --git a/src/python/grpcio/grpc_core_dependencies.py b/src/python/grpcio/grpc_core_dependencies.py index 7305945dc3f..f1d0e689883 100644 --- a/src/python/grpcio/grpc_core_dependencies.py +++ b/src/python/grpcio/grpc_core_dependencies.py @@ -235,6 +235,7 @@ CORE_SOURCE_FILES = [ 'src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c', 'src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c', 'src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c', + 'src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.c', 'src/core/ext/upb-generated/udpa/annotations/migrate.upb.c', 'src/core/ext/upb-generated/udpa/annotations/security.upb.c', 'src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c', @@ -369,6 +370,7 @@ CORE_SOURCE_FILES = [ 'src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c', 'src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c', 'src/core/ext/upbdefs-generated/opencensus/proto/trace/v1/trace_config.upbdefs.c', + 'src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.c', 'src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c', 'src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c', 'src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c', @@ -401,6 +403,7 @@ CORE_SOURCE_FILES = [ 'src/core/ext/xds/xds_client.cc', 'src/core/ext/xds/xds_client_stats.cc', 'src/core/ext/xds/xds_cluster.cc', + 'src/core/ext/xds/xds_cluster_specifier_plugin.cc', 'src/core/ext/xds/xds_common_types.cc', 'src/core/ext/xds/xds_endpoint.cc', 'src/core/ext/xds/xds_http_fault_filter.cc', @@ -1171,6 +1174,7 @@ CORE_SOURCE_FILES = [ 'third_party/upb/upb/decode_fast.c', 'third_party/upb/upb/def.c', 'third_party/upb/upb/encode.c', + 'third_party/upb/upb/json_encode.c', 'third_party/upb/upb/msg.c', 'third_party/upb/upb/reflection.c', 'third_party/upb/upb/table.c', diff --git a/src/upb/gen_build_yaml.py b/src/upb/gen_build_yaml.py index d347eb554f4..939d71b3991 100755 --- a/src/upb/gen_build_yaml.py +++ b/src/upb/gen_build_yaml.py @@ -36,6 +36,7 @@ try: "third_party/upb/upb/decode.c", "third_party/upb/upb/def.c", "third_party/upb/upb/encode.c", + "third_party/upb/upb/json_encode.c", "third_party/upb/upb/msg.c", "third_party/upb/upb/reflection.c", "third_party/upb/upb/table.c", @@ -52,6 +53,7 @@ try: "third_party/upb/upb/def.h", "third_party/upb/upb/def.hpp", "third_party/upb/upb/encode.h", + "third_party/upb/upb/json_encode.h", "third_party/upb/upb/msg_internal.h", "third_party/upb/upb/msg.h", "third_party/upb/upb/port_def.inc", diff --git a/test/core/client_channel/rls_lb_config_parser_test.cc b/test/core/client_channel/rls_lb_config_parser_test.cc index 3089e33c988..7ac0efef283 100644 --- a/test/core/client_channel/rls_lb_config_parser_test.cc +++ b/test/core/client_channel/rls_lb_config_parser_test.cc @@ -35,22 +35,16 @@ namespace { class RlsConfigParsingTest : public ::testing::Test { public: - static void SetUpTestSuite() { - gpr_setenv("GRPC_EXPERIMENTAL_ENABLE_RLS_LB_POLICY", "true"); - grpc_init(); - } + static void SetUpTestSuite() { grpc_init(); } - static void TearDownTestSuite() { - grpc_shutdown_blocking(); - gpr_unsetenv("GRPC_EXPERIMENTAL_ENABLE_RLS_LB_POLICY"); - } + static void TearDownTestSuite() { grpc_shutdown_blocking(); } }; TEST_F(RlsConfigParsingTest, ValidConfig) { const char* service_config_json = "{\n" " \"loadBalancingConfig\":[{\n" - " \"rls\":{\n" + " \"rls_experimental\":{\n" " \"routeLookupConfig\":{\n" " \"lookupService\":\"rls.example.com:80\",\n" " \"cacheSizeBytes\":1,\n" @@ -88,7 +82,7 @@ TEST_F(RlsConfigParsingTest, TopLevelRequiredFieldsMissing) { const char* service_config_json = "{\n" " \"loadBalancingConfig\":[{\n" - " \"rls\":{\n" + " \"rls_experimental\":{\n" " }\n" " }]\n" "}\n"; @@ -109,7 +103,7 @@ TEST_F(RlsConfigParsingTest, TopLevelFieldsWrongTypes) { const char* service_config_json = "{\n" " \"loadBalancingConfig\":[{\n" - " \"rls\":{\n" + " \"rls_experimental\":{\n" " \"routeLookupConfig\":1,\n" " \"routeLookupChannelServiceConfig\": 1,\n" " \"childPolicy\":1,\n" @@ -135,7 +129,7 @@ TEST_F(RlsConfigParsingTest, TopLevelFieldsInvalidValues) { const char* service_config_json = "{\n" " \"loadBalancingConfig\":[{\n" - " \"rls\":{\n" + " \"rls_experimental\":{\n" " \"childPolicy\":[\n" " {\"unknown\":{}}\n" " ],\n" @@ -160,7 +154,7 @@ TEST_F(RlsConfigParsingTest, InvalidChildPolicyConfig) { const char* service_config_json = "{\n" " \"loadBalancingConfig\":[{\n" - " \"rls\":{\n" + " \"rls_experimental\":{\n" " \"childPolicy\":[\n" " {\"grpclb\":{\"childPolicy\":1}}\n" " ],\n" @@ -184,7 +178,7 @@ TEST_F(RlsConfigParsingTest, InvalidRlsChannelServiceConfig) { const char* service_config_json = "{\n" " \"loadBalancingConfig\":[{\n" - " \"rls\":{\n" + " \"rls_experimental\":{\n" " \"routeLookupChannelServiceConfig\": {\n" " \"loadBalancingPolicy\": \"unknown\"\n" " },\n" @@ -217,7 +211,7 @@ TEST_F(RlsConfigParsingTest, RouteLookupConfigRequiredFieldsMissing) { const char* service_config_json = "{\n" " \"loadBalancingConfig\":[{\n" - " \"rls\":{\n" + " \"rls_experimental\":{\n" " \"routeLookupConfig\":{\n" " }\n" " }\n" @@ -239,7 +233,7 @@ TEST_F(RlsConfigParsingTest, RouteLookupConfigFieldsWrongTypes) { const char* service_config_json = "{\n" " \"loadBalancingConfig\":[{\n" - " \"rls\":{\n" + " \"rls_experimental\":{\n" " \"routeLookupConfig\":{\n" " \"grpcKeybuilders\":1,\n" " \"name\":1,\n" @@ -264,7 +258,7 @@ TEST_F(RlsConfigParsingTest, RouteLookupConfigFieldsWrongTypes) { "field:lookupService error:type should be STRING.*" "field:maxAge error:type should be STRING.*" "field:staleAge error:type should be STRING.*" - "field:cacheSizeBytes error:type should be NUMBER.*" + "field:cacheSizeBytes error:failed to parse.*" "field:defaultTarget error:type should be STRING")); GRPC_ERROR_UNREF(error); } @@ -273,7 +267,7 @@ TEST_F(RlsConfigParsingTest, RouteLookupConfigFieldsInvalidValues) { const char* service_config_json = "{\n" " \"loadBalancingConfig\":[{\n" - " \"rls\":{\n" + " \"rls_experimental\":{\n" " \"routeLookupConfig\":{\n" " \"lookupService\":\"\",\n" " \"cacheSizeBytes\":0\n" @@ -301,7 +295,7 @@ TEST_F(RlsConfigParsingTest, GrpcKeybuilderRequiredFieldsMissing) { const char* service_config_json = "{\n" " \"loadBalancingConfig\":[{\n" - " \"rls\":{\n" + " \"rls_experimental\":{\n" " \"routeLookupConfig\":{\n" " \"grpcKeybuilders\":[\n" " {\n" @@ -328,7 +322,7 @@ TEST_F(RlsConfigParsingTest, GrpcKeybuilderWrongFieldTypes) { const char* service_config_json = "{\n" " \"loadBalancingConfig\":[{\n" - " \"rls\":{\n" + " \"rls_experimental\":{\n" " \"routeLookupConfig\":{\n" " \"grpcKeybuilders\":[\n" " {\n" @@ -362,7 +356,7 @@ TEST_F(RlsConfigParsingTest, GrpcKeybuilderInvalidValues) { const char* service_config_json = "{\n" " \"loadBalancingConfig\":[{\n" - " \"rls\":{\n" + " \"rls_experimental\":{\n" " \"routeLookupConfig\":{\n" " \"grpcKeybuilders\":[\n" " {\n" @@ -403,7 +397,7 @@ TEST_F(RlsConfigParsingTest, GrpcKeybuilderInvalidHeaders) { const char* service_config_json = "{\n" " \"loadBalancingConfig\":[{\n" - " \"rls\":{\n" + " \"rls_experimental\":{\n" " \"routeLookupConfig\":{\n" " \"grpcKeybuilders\":[\n" " {\n" @@ -463,7 +457,7 @@ TEST_F(RlsConfigParsingTest, GrpcKeybuilderNameWrongFieldTypes) { const char* service_config_json = "{\n" " \"loadBalancingConfig\":[{\n" - " \"rls\":{\n" + " \"rls_experimental\":{\n" " \"routeLookupConfig\":{\n" " \"grpcKeybuilders\":[\n" " {\n" @@ -500,7 +494,7 @@ TEST_F(RlsConfigParsingTest, DuplicateMethodNamesInSameKeyBuilder) { const char* service_config_json = "{\n" " \"loadBalancingConfig\":[{\n" - " \"rls\":{\n" + " \"rls_experimental\":{\n" " \"routeLookupConfig\":{\n" " \"grpcKeybuilders\":[\n" " {\n" @@ -537,7 +531,7 @@ TEST_F(RlsConfigParsingTest, DuplicateMethodNamesInDifferentKeyBuilders) { const char* service_config_json = "{\n" " \"loadBalancingConfig\":[{\n" - " \"rls\":{\n" + " \"rls_experimental\":{\n" " \"routeLookupConfig\":{\n" " \"grpcKeybuilders\":[\n" " {\n" diff --git a/test/core/ext/filters/rbac/rbac_service_config_parser_test.cc b/test/core/ext/filters/rbac/rbac_service_config_parser_test.cc index 9ab1102c4dc..400c6281c58 100644 --- a/test/core/ext/filters/rbac/rbac_service_config_parser_test.cc +++ b/test/core/ext/filters/rbac/rbac_service_config_parser_test.cc @@ -410,7 +410,7 @@ TEST(RbacServiceConfigParsingTest, VariousPermissionsAndPrincipalsBadTypes) { "permissions\\[5\\]" CHILD_ERROR_TAG "field:destinationIp error:type should be OBJECT.*" "permissions\\[6\\]" CHILD_ERROR_TAG - "field:destinationPort error:type should be NUMBER.*" + "field:destinationPort error:failed to parse.*" "permissions\\[7\\]" CHILD_ERROR_TAG "field:metadata error:type should be OBJECT.*" "permissions\\[8\\]" CHILD_ERROR_TAG diff --git a/test/core/xds/google_mesh_ca_certificate_provider_factory_test.cc b/test/core/xds/google_mesh_ca_certificate_provider_factory_test.cc index b5ee4fbbb63..cbbad3c5988 100644 --- a/test/core/xds/google_mesh_ca_certificate_provider_factory_test.cc +++ b/test/core/xds/google_mesh_ca_certificate_provider_factory_test.cc @@ -214,7 +214,7 @@ TEST(GoogleMeshCaConfigTest, WrongTypes) { " \"certificate_lifetime\": 400," " \"renewal_grace_period\": 100," " \"key_type\": 123," - " \"key_size\": \"1024\"," + " \"key_size\": \"1024A\"," " \"location\": 123" "}"; grpc_error_handle error = GRPC_ERROR_NONE; @@ -245,7 +245,7 @@ TEST(GoogleMeshCaConfigTest, WrongTypes) { "field:renewal_grace_period error:type should be STRING of the form " "given by google.proto.Duration..*" "field:key_type error:type should be STRING.*" - "field:key_size error:type should be NUMBER.*" + "field:key_size error:failed to parse.*" "field:location error:type should be STRING")); GRPC_ERROR_UNREF(error); } diff --git a/test/cpp/end2end/BUILD b/test/cpp/end2end/BUILD index 2bae92a3b17..32bcf8bea58 100644 --- a/test/cpp/end2end/BUILD +++ b/test/cpp/end2end/BUILD @@ -70,6 +70,21 @@ grpc_cc_library( ], ) +grpc_cc_library( + name = "rls_server", + testonly = True, + srcs = ["rls_server.cc"], + hdrs = ["rls_server.h"], + external_deps = [ + "gtest", + ], + deps = [ + ":counted_service", + "//src/proto/grpc/lookup/v1:rls_proto", + "//test/core/util:grpc_test_util", + ], +) + grpc_cc_test( name = "async_end2end_test", srcs = ["async_end2end_test.cc"], @@ -487,6 +502,7 @@ grpc_cc_test( tags = ["no_test_ios"], deps = [ ":counted_service", + ":rls_server", ":test_service_impl", "//:gpr", "//:grpc", diff --git a/test/cpp/end2end/rls_end2end_test.cc b/test/cpp/end2end/rls_end2end_test.cc index a759ffc5664..c35766b5ebd 100644 --- a/test/cpp/end2end/rls_end2end_test.cc +++ b/test/cpp/end2end/rls_end2end_test.cc @@ -60,11 +60,11 @@ #include "test/core/util/test_config.h" #include "test/core/util/test_lb_policies.h" #include "test/cpp/end2end/counted_service.h" +#include "test/cpp/end2end/rls_server.h" #include "test/cpp/end2end/test_service_impl.h" #include "test/cpp/util/test_config.h" using ::grpc::lookup::v1::RouteLookupRequest; -using ::grpc::lookup::v1::RouteLookupResponse; namespace grpc { namespace testing { @@ -87,92 +87,6 @@ const char* kConstantKey = "constant_key"; const char* kConstantValue = "constant_value"; using BackendService = CountedService; -using RlsService = - CountedService; - -class RlsServiceImpl : public RlsService { - public: - grpc::Status RouteLookup(grpc::ServerContext* context, - const RouteLookupRequest* request, - RouteLookupResponse* response) override { - gpr_log(GPR_INFO, "RLS: Received request: %s", - request->DebugString().c_str()); - // RLS server should see call creds. - EXPECT_THAT(context->client_metadata(), - ::testing::Contains( - ::testing::Pair(kCallCredsMdKey, kCallCredsMdValue))); - IncreaseRequestCount(); - EXPECT_EQ(request->target_type(), "grpc"); - // See if we have a configured response for this request. - ResponseData res; - { - grpc::internal::MutexLock lock(&mu_); - auto it = responses_.find(*request); - if (it == responses_.end()) { - gpr_log(GPR_INFO, "RLS: no matching request, returning INTERNAL"); - unmatched_requests_.push_back(*request); - return Status(StatusCode::INTERNAL, "no response entry"); - } - res = it->second; - } - // Configured response found, so use it. - if (res.response_delay > grpc_core::Duration::Zero()) { - gpr_sleep_until( - grpc_timeout_milliseconds_to_deadline(res.response_delay.millis())); - } - IncreaseResponseCount(); - *response = res.response; - gpr_log(GPR_INFO, "RLS: returning configured response: %s", - response->DebugString().c_str()); - return Status::OK; - } - - void Start() {} - - void Shutdown() {} - - void SetResponse(RouteLookupRequest request, RouteLookupResponse response, - grpc_core::Duration response_delay = grpc_core::Duration()) { - grpc::internal::MutexLock lock(&mu_); - responses_[std::move(request)] = {std::move(response), response_delay}; - } - - void RemoveResponse(const RouteLookupRequest& request) { - grpc::internal::MutexLock lock(&mu_); - responses_.erase(request); - } - - std::vector GetUnmatchedRequests() { - grpc::internal::MutexLock lock(&mu_); - return std::move(unmatched_requests_); - } - - private: - // Sorting thunk for RouteLookupRequest. - struct RlsRequestLessThan { - bool operator()(const RouteLookupRequest& req1, - const RouteLookupRequest& req2) const { - std::map key_map1( - req1.key_map().begin(), req1.key_map().end()); - std::map key_map2( - req2.key_map().begin(), req2.key_map().end()); - if (key_map1 < key_map2) return true; - if (req1.reason() < req2.reason()) return true; - if (req1.stale_header_data() < req2.stale_header_data()) return true; - return false; - } - }; - - struct ResponseData { - RouteLookupResponse response; - grpc_core::Duration response_delay; - }; - - grpc::internal::Mutex mu_; - std::map responses_ - ABSL_GUARDED_BY(&mu_); - std::vector unmatched_requests_ ABSL_GUARDED_BY(&mu_); -}; // Subclass of TestServiceImpl that increments a request counter for // every call to the Echo Rpc. @@ -265,7 +179,12 @@ class RlsEnd2endTest : public ::testing::Test { grpc_core::LocalhostResolves(&localhost_resolves_to_ipv4, &localhost_resolves_to_ipv6); ipv6_only_ = !localhost_resolves_to_ipv4 && localhost_resolves_to_ipv6; - rls_server_ = absl::make_unique>("rls"); + rls_server_ = absl::make_unique>( + "rls", [](grpc::ServerContext* ctx) { + EXPECT_THAT(ctx->client_metadata(), + ::testing::Contains( + ::testing::Pair(kCallCredsMdKey, kCallCredsMdValue))); + }); rls_server_->Start(); resolver_response_generator_ = absl::make_unique(); @@ -316,26 +235,6 @@ class RlsEnd2endTest : public ::testing::Test { return absl::StrCat("ipv4:127.0.0.1:", port); } - static RouteLookupRequest BuildRlsRequest( - std::map key, - RouteLookupRequest::Reason reason = RouteLookupRequest::REASON_MISS, - const char* stale_header_data = "") { - RouteLookupRequest request; - request.set_target_type("grpc"); - request.mutable_key_map()->insert(key.begin(), key.end()); - request.set_reason(reason); - request.set_stale_header_data(stale_header_data); - return request; - } - - static RouteLookupResponse BuildRlsResponse(std::vector targets, - const char* header_data = "") { - RouteLookupResponse response; - response.mutable_targets()->Add(targets.begin(), targets.end()); - response.set_header_data(header_data); - return response; - } - struct RpcOptions { int timeout_ms = 1000; bool wait_for_ready = false; @@ -481,7 +380,7 @@ class RlsEnd2endTest : public ::testing::Test { return absl::StrCat( "{" " \"loadBalancingConfig\":[{" - " \"rls\":{", + " \"rls_experimental\":{", absl::StrJoin(rls_config_parts, ","), " }" " }]" diff --git a/test/cpp/end2end/rls_server.cc b/test/cpp/end2end/rls_server.cc new file mode 100644 index 00000000000..c5053792cc4 --- /dev/null +++ b/test/cpp/end2end/rls_server.cc @@ -0,0 +1,103 @@ +// +// Copyright 2020 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 "test/cpp/end2end/rls_server.h" + +#include + +#include "src/proto/grpc/lookup/v1/rls.grpc.pb.h" +#include "src/proto/grpc/lookup/v1/rls.pb.h" +#include "test/core/util/test_config.h" + +using ::grpc::lookup::v1::RouteLookupRequest; +using ::grpc::lookup::v1::RouteLookupResponse; + +namespace grpc { +namespace testing { + +::grpc::Status RlsServiceImpl::RouteLookup(grpc::ServerContext* context, + const RouteLookupRequest* request, + RouteLookupResponse* response) { + gpr_log(GPR_INFO, "RLS: Received request: %s", + request->DebugString().c_str()); + if (context_proc_ != nullptr) { + context_proc_(context); + } + IncreaseRequestCount(); + EXPECT_EQ(request->target_type(), "grpc"); + // See if we have a configured response for this request. + ResponseData res; + { + grpc::internal::MutexLock lock(&mu_); + auto it = responses_.find(*request); + if (it == responses_.end()) { + gpr_log(GPR_INFO, "RLS: no matching request, returning INTERNAL"); + unmatched_requests_.push_back(*request); + return Status(StatusCode::INTERNAL, "no response entry"); + } + res = it->second; + } + // Configured response found, so use it. + if (res.response_delay > grpc_core::Duration::Zero()) { + gpr_sleep_until( + grpc_timeout_milliseconds_to_deadline(res.response_delay.millis())); + } + IncreaseResponseCount(); + *response = res.response; + gpr_log(GPR_INFO, "RLS: returning configured response: %s", + response->DebugString().c_str()); + return Status::OK; +} + +void RlsServiceImpl::SetResponse(RouteLookupRequest request, + RouteLookupResponse response, + grpc_core::Duration response_delay) { + grpc::internal::MutexLock lock(&mu_); + responses_[std::move(request)] = {std::move(response), response_delay}; +} + +void RlsServiceImpl::RemoveResponse(const RouteLookupRequest& request) { + grpc::internal::MutexLock lock(&mu_); + responses_.erase(request); +} + +std::vector RlsServiceImpl::GetUnmatchedRequests() { + grpc::internal::MutexLock lock(&mu_); + return std::move(unmatched_requests_); +} + +grpc::lookup::v1::RouteLookupRequest BuildRlsRequest( + std::map key, + grpc::lookup::v1::RouteLookupRequest::Reason reason, + const char* stale_header_data) { + grpc::lookup::v1::RouteLookupRequest request; + request.set_target_type("grpc"); + request.mutable_key_map()->insert(key.begin(), key.end()); + request.set_reason(reason); + request.set_stale_header_data(stale_header_data); + return request; +} + +grpc::lookup::v1::RouteLookupResponse BuildRlsResponse( + std::vector targets, const char* header_data) { + grpc::lookup::v1::RouteLookupResponse response; + response.mutable_targets()->Add(targets.begin(), targets.end()); + response.set_header_data(header_data); + return response; +} + +} // namespace testing +} // namespace grpc diff --git a/test/cpp/end2end/rls_server.h b/test/cpp/end2end/rls_server.h new file mode 100644 index 00000000000..958d19676e3 --- /dev/null +++ b/test/cpp/end2end/rls_server.h @@ -0,0 +1,94 @@ +// +// Copyright 2020 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 "absl/types/optional.h" + +#include "src/core/lib/gprpp/time.h" +#include "src/proto/grpc/lookup/v1/rls.grpc.pb.h" +#include "src/proto/grpc/lookup/v1/rls.pb.h" +#include "test/cpp/end2end/counted_service.h" + +namespace grpc { +namespace testing { + +using RlsService = + CountedService; + +class RlsServiceImpl : public RlsService { + public: + using ContextProcessingFunc = std::function; + + explicit RlsServiceImpl(ContextProcessingFunc context_proc = nullptr) + : context_proc_(std::move(context_proc)) {} + + grpc::Status RouteLookup( + grpc::ServerContext* context, + const grpc::lookup::v1::RouteLookupRequest* request, + grpc::lookup::v1::RouteLookupResponse* response) override; + + void Start() {} + + void Shutdown() {} + + void SetResponse(grpc::lookup::v1::RouteLookupRequest request, + grpc::lookup::v1::RouteLookupResponse response, + grpc_core::Duration response_delay = grpc_core::Duration()); + + void RemoveResponse(const grpc::lookup::v1::RouteLookupRequest& request); + + std::vector GetUnmatchedRequests(); + + private: + // Sorting thunk for RouteLookupRequest. + struct RlsRequestLessThan { + bool operator()(const grpc::lookup::v1::RouteLookupRequest& req1, + const grpc::lookup::v1::RouteLookupRequest& req2) const { + std::map key_map1( + req1.key_map().begin(), req1.key_map().end()); + std::map key_map2( + req2.key_map().begin(), req2.key_map().end()); + if (key_map1 < key_map2) return true; + if (req1.reason() < req2.reason()) return true; + if (req1.stale_header_data() < req2.stale_header_data()) return true; + return false; + } + }; + + struct ResponseData { + grpc::lookup::v1::RouteLookupResponse response; + grpc_core::Duration response_delay; + }; + + ContextProcessingFunc context_proc_; + grpc::internal::Mutex mu_; + std::map + responses_ ABSL_GUARDED_BY(&mu_); + std::vector unmatched_requests_ + ABSL_GUARDED_BY(&mu_); +}; + +grpc::lookup::v1::RouteLookupRequest BuildRlsRequest( + std::map key, + grpc::lookup::v1::RouteLookupRequest::Reason reason = + grpc::lookup::v1::RouteLookupRequest::REASON_MISS, + const char* stale_header_data = ""); + +grpc::lookup::v1::RouteLookupResponse BuildRlsResponse( + std::vector targets, const char* header_data = ""); + +} // namespace testing +} // namespace grpc diff --git a/test/cpp/end2end/xds/BUILD b/test/cpp/end2end/xds/BUILD index 19c53146c08..4a69b5c8953 100644 --- a/test/cpp/end2end/xds/BUILD +++ b/test/cpp/end2end/xds/BUILD @@ -77,6 +77,8 @@ grpc_cc_test( "//:grpc++", "//:grpc_resolver_fake", "//:grpcpp_csds", + "//src/proto/grpc/lookup/v1:rls_config_proto", + "//src/proto/grpc/lookup/v1:rls_proto", "//src/proto/grpc/testing:echo_messages_proto", "//src/proto/grpc/testing:echo_proto", "//src/proto/grpc/testing/duplicate:echo_duplicate_proto", @@ -96,6 +98,7 @@ grpc_cc_test( "//src/proto/grpc/testing/xds/v3:tls_proto", "//test/core/util:grpc_test_util", "//test/cpp/end2end:counted_service", + "//test/cpp/end2end:rls_server", "//test/cpp/end2end:test_service_impl", "//test/cpp/util:test_config", "//test/cpp/util:test_util", diff --git a/test/cpp/end2end/xds/xds_end2end_test.cc b/test/cpp/end2end/xds/xds_end2end_test.cc index af7e9d8d216..ccbcf3735bc 100644 --- a/test/cpp/end2end/xds/xds_end2end_test.cc +++ b/test/cpp/end2end/xds/xds_end2end_test.cc @@ -80,6 +80,9 @@ #include "src/core/lib/security/credentials/fake/fake_credentials.h" #include "src/cpp/client/secure_credentials.h" #include "src/cpp/server/secure_server_credentials.h" +#include "src/proto/grpc/lookup/v1/rls.grpc.pb.h" +#include "src/proto/grpc/lookup/v1/rls.pb.h" +#include "src/proto/grpc/lookup/v1/rls_config.pb.h" #include "src/proto/grpc/testing/echo.grpc.pb.h" #include "src/proto/grpc/testing/xds/ads_for_test.grpc.pb.h" #include "src/proto/grpc/testing/xds/cds_for_test.grpc.pb.h" @@ -103,6 +106,7 @@ #include "test/core/util/resolve_localhost_ip46.h" #include "test/core/util/test_config.h" #include "test/cpp/end2end/counted_service.h" +#include "test/cpp/end2end/rls_server.h" #include "test/cpp/end2end/test_service_impl.h" #include "test/cpp/end2end/xds/xds_server.h" #include "test/cpp/util/test_config.h" @@ -153,6 +157,9 @@ using ClientStats = LrsServiceImpl::ClientStats; using ::grpc::experimental::ExternalCertificateVerifier; using ::grpc::experimental::IdentityKeyCertPair; using ::grpc::experimental::StaticDataCertificateProvider; +using ::grpc::lookup::v1::RouteLookupClusterSpecifier; +using ::grpc::lookup::v1::RouteLookupConfig; +using ::grpc::lookup::v1::RouteLookupRequest; constexpr char kDefaultLocalityRegion[] = "xds_default_locality_region"; constexpr char kDefaultLocalityZone[] = "xds_default_locality_zone"; @@ -177,6 +184,18 @@ constexpr char kClientKeyPath[] = "src/core/tsi/test_creds/client.key"; constexpr char kBadClientCertPath[] = "src/core/tsi/test_creds/badclient.pem"; constexpr char kBadClientKeyPath[] = "src/core/tsi/test_creds/badclient.key"; +constexpr char kRlsTestKey[] = "test_key"; +constexpr char kRlsTestKey1[] = "key1"; +constexpr char kRlsTestValue[] = "test_value"; +constexpr char kRlsHostKey[] = "host_key"; +constexpr char kRlsServiceKey[] = "service_key"; +constexpr char kRlsServiceValue[] = "grpc.testing.EchoTestService"; +constexpr char kRlsMethodKey[] = "method_key"; +constexpr char kRlsMethodValue[] = "Echo"; +constexpr char kRlsConstantKey[] = "constant_key"; +constexpr char kRlsConstantValue[] = "constant_value"; +constexpr char kRlsClusterSpecifierPluginInstanceName[] = "rls_plugin_instance"; + template class BackendServiceImpl : public CountedService> { @@ -7493,6 +7512,302 @@ TEST_P(CdsTest, RingHashPolicyHasInvalidRingSizeMinGreaterThanMax) { "min_ring_size cannot be greater than max_ring_size.")); } +class RlsTest : public XdsEnd2endTest { + protected: + class RlsServerThread : public ServerThread { + public: + explicit RlsServerThread(XdsEnd2endTest* test_obj) + : ServerThread(test_obj, /*use_xds_enabled_server=*/false), + rls_service_(new RlsServiceImpl()) {} + + RlsServiceImpl* rls_service() { return rls_service_.get(); } + + private: + void RegisterAllServices(ServerBuilder* builder) override { + builder->RegisterService(rls_service_.get()); + } + + void StartAllServices() override { rls_service_->Start(); } + + void ShutdownAllServices() override { rls_service_->Shutdown(); } + + const char* Type() override { return "Rls"; } + + std::shared_ptr rls_service_; + }; + + RlsTest() : XdsEnd2endTest(4) { + rls_server_ = absl::make_unique(this); + rls_server_->Start(); + } + + void SetUp() override { + XdsEnd2endTest::SetUp(); + StartAllBackends(); + } + + void TearDown() override { + rls_server_->Shutdown(); + XdsEnd2endTest::TearDown(); + } + + std::unique_ptr rls_server_; +}; + +TEST_P(RlsTest, XdsRoutingClusterSpecifierPlugin) { + gpr_setenv("GRPC_EXPERIMENTAL_XDS_RLS_LB", "true"); + const char* kNewClusterName = "new_cluster"; + const char* kNewEdsServiceName = "new_eds_service_name"; + const size_t kNumEchoRpcs = 5; + // Populate new EDS resources. + EdsResourceArgs args({ + {"locality0", CreateEndpointsForBackends(0, 1)}, + }); + EdsResourceArgs args1({ + {"locality0", CreateEndpointsForBackends(1, 2)}, + }); + balancer_->ads_service()->SetEdsResource(BuildEdsResource(args)); + balancer_->ads_service()->SetEdsResource( + BuildEdsResource(args1, kNewEdsServiceName)); + // Populate new CDS resources. + Cluster new_cluster = default_cluster_; + new_cluster.set_name(kNewClusterName); + new_cluster.mutable_eds_cluster_config()->set_service_name( + kNewEdsServiceName); + balancer_->ads_service()->SetCdsResource(new_cluster); + // Prepare the RLSLookupConfig and configure all the keys; change route + // configurations to use cluster specifier plugin. + rls_server_->rls_service()->SetResponse( + BuildRlsRequest({{kRlsTestKey, kRlsTestValue}, + {kRlsHostKey, kServerName}, + {kRlsServiceKey, kRlsServiceValue}, + {kRlsMethodKey, kRlsMethodValue}, + {kRlsConstantKey, kRlsConstantValue}}), + BuildRlsResponse({kNewClusterName})); + RouteLookupConfig route_lookup_config; + auto* key_builder = route_lookup_config.add_grpc_keybuilders(); + auto* name = key_builder->add_names(); + name->set_service(kRlsServiceValue); + name->set_method(kRlsMethodValue); + auto* header = key_builder->add_headers(); + header->set_key(kRlsTestKey); + header->add_names(kRlsTestKey1); + header->add_names("key2"); + auto* extra_keys = key_builder->mutable_extra_keys(); + extra_keys->set_host(kRlsHostKey); + extra_keys->set_service(kRlsServiceKey); + extra_keys->set_method(kRlsMethodKey); + (*key_builder->mutable_constant_keys())[kRlsConstantKey] = kRlsConstantValue; + route_lookup_config.set_lookup_service( + absl::StrCat("localhost:", rls_server_->port())); + route_lookup_config.set_cache_size_bytes(5000); + RouteLookupClusterSpecifier rls; + *rls.mutable_route_lookup_config() = std::move(route_lookup_config); + RouteConfiguration new_route_config = default_route_config_; + auto* plugin = new_route_config.add_cluster_specifier_plugins(); + plugin->mutable_extension()->set_name(kRlsClusterSpecifierPluginInstanceName); + plugin->mutable_extension()->mutable_typed_config()->PackFrom(rls); + auto* default_route = + new_route_config.mutable_virtual_hosts(0)->mutable_routes(0); + default_route->mutable_route()->set_cluster_specifier_plugin( + kRlsClusterSpecifierPluginInstanceName); + SetRouteConfiguration(balancer_.get(), new_route_config); + auto rpc_options = RpcOptions().set_metadata({{kRlsTestKey1, kRlsTestValue}}); + WaitForAllBackends(1, 2, WaitForBackendOptions(), rpc_options); + CheckRpcSendOk(kNumEchoRpcs, rpc_options); + // Make sure RPCs all go to the correct backend. + EXPECT_EQ(kNumEchoRpcs, backends_[1]->backend_service()->request_count()); + gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_XDS_RLS_LB"); +} + +TEST_P(RlsTest, XdsRoutingClusterSpecifierPluginNacksUndefinedSpecifier) { + gpr_setenv("GRPC_EXPERIMENTAL_XDS_RLS_LB", "true"); + const char* kNewClusterName = "new_cluster"; + const char* kNewEdsServiceName = "new_eds_service_name"; + // Populate new EDS resources. + EdsResourceArgs args({ + {"locality0", CreateEndpointsForBackends(0, 1)}, + }); + EdsResourceArgs args1({ + {"locality0", CreateEndpointsForBackends(1, 2)}, + }); + balancer_->ads_service()->SetEdsResource(BuildEdsResource(args)); + balancer_->ads_service()->SetEdsResource( + BuildEdsResource(args1, kNewEdsServiceName)); + // Populate new CDS resources. + Cluster new_cluster = default_cluster_; + new_cluster.set_name(kNewClusterName); + new_cluster.mutable_eds_cluster_config()->set_service_name( + kNewEdsServiceName); + balancer_->ads_service()->SetCdsResource(new_cluster); + RouteConfiguration new_route_config = default_route_config_; + auto* default_route = + new_route_config.mutable_virtual_hosts(0)->mutable_routes(0); + // Set Cluster Specifier Plugin to something that does not exist. + default_route->mutable_route()->set_cluster_specifier_plugin( + kRlsClusterSpecifierPluginInstanceName); + SetRouteConfiguration(balancer_.get(), new_route_config); + const auto response_state = WaitForRdsNack(); + ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK"; + EXPECT_THAT(response_state->error_message, + ::testing::HasSubstr("RouteAction cluster contains cluster " + "specifier plugin name not configured.")); + gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_XDS_RLS_LB"); +} + +TEST_P(RlsTest, XdsRoutingClusterSpecifierPluginNacksUnknownSpecifierProto) { + // TODO(donnadionne): Doug is working on adding a new is_optional field to + // ClusterSpecifierPlugin in envoyproxy/envoy#20301. Once that goes in, the + // behavior we want in this case is that if is_optional is true, then we + // ignore that plugin and ignore any routes that refer to that plugin. + // However, if is_optional is false, then we want to NACK. + gpr_setenv("GRPC_EXPERIMENTAL_XDS_RLS_LB", "true"); + const char* kNewClusterName = "new_cluster"; + const char* kNewEdsServiceName = "new_eds_service_name"; + // Populate new EDS resources. + EdsResourceArgs args({ + {"locality0", CreateEndpointsForBackends(0, 1)}, + }); + EdsResourceArgs args1({ + {"locality0", CreateEndpointsForBackends(1, 2)}, + }); + balancer_->ads_service()->SetEdsResource(BuildEdsResource(args)); + balancer_->ads_service()->SetEdsResource( + BuildEdsResource(args1, kNewEdsServiceName)); + // Populate new CDS resources. + Cluster new_cluster = default_cluster_; + new_cluster.set_name(kNewClusterName); + new_cluster.mutable_eds_cluster_config()->set_service_name( + kNewEdsServiceName); + balancer_->ads_service()->SetCdsResource(new_cluster); + // Prepare the RLSLookupConfig: change route configurations to use cluster + // specifier plugin. + RouteLookupConfig route_lookup_config; + RouteConfiguration new_route_config = default_route_config_; + auto* plugin = new_route_config.add_cluster_specifier_plugins(); + plugin->mutable_extension()->set_name(kRlsClusterSpecifierPluginInstanceName); + // Instead of grpc.lookup.v1.RouteLookupClusterSpecifier, let's say we + // mistakenly packed the inner RouteLookupConfig instead. + plugin->mutable_extension()->mutable_typed_config()->PackFrom( + route_lookup_config); + auto* default_route = + new_route_config.mutable_virtual_hosts(0)->mutable_routes(0); + default_route->mutable_route()->set_cluster_specifier_plugin( + kRlsClusterSpecifierPluginInstanceName); + SetRouteConfiguration(balancer_.get(), new_route_config); + const auto response_state = WaitForRdsNack(); + ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK"; + EXPECT_THAT( + response_state->error_message, + ::testing::HasSubstr( + "Unable to locate the cluster specifier plugin in the registry")); + gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_XDS_RLS_LB"); +} + +TEST_P(RlsTest, XdsRoutingRlsClusterSpecifierPluginNacksRequiredMatch) { + gpr_setenv("GRPC_EXPERIMENTAL_XDS_RLS_LB", "true"); + const char* kNewClusterName = "new_cluster"; + const char* kNewEdsServiceName = "new_eds_service_name"; + // Populate new EDS resources. + EdsResourceArgs args({ + {"locality0", CreateEndpointsForBackends(0, 1)}, + }); + EdsResourceArgs args1({ + {"locality0", CreateEndpointsForBackends(1, 2)}, + }); + balancer_->ads_service()->SetEdsResource(BuildEdsResource(args)); + balancer_->ads_service()->SetEdsResource( + BuildEdsResource(args1, kNewEdsServiceName)); + // Populate new CDS resources. + Cluster new_cluster = default_cluster_; + new_cluster.set_name(kNewClusterName); + new_cluster.mutable_eds_cluster_config()->set_service_name( + kNewEdsServiceName); + balancer_->ads_service()->SetCdsResource(new_cluster); + // Prepare the RLSLookupConfig and configure all the keys; add required_match + // field which should not be there. + RouteLookupConfig route_lookup_config; + auto* key_builder = route_lookup_config.add_grpc_keybuilders(); + auto* name = key_builder->add_names(); + name->set_service(kRlsServiceValue); + name->set_method(kRlsMethodValue); + auto* header = key_builder->add_headers(); + header->set_key(kRlsTestKey); + header->add_names(kRlsTestKey1); + header->set_required_match(true); + route_lookup_config.set_lookup_service( + absl::StrCat("localhost:", rls_server_->port())); + route_lookup_config.set_cache_size_bytes(5000); + RouteLookupClusterSpecifier rls; + *rls.mutable_route_lookup_config() = std::move(route_lookup_config); + RouteConfiguration new_route_config = default_route_config_; + auto* plugin = new_route_config.add_cluster_specifier_plugins(); + plugin->mutable_extension()->set_name(kRlsClusterSpecifierPluginInstanceName); + plugin->mutable_extension()->mutable_typed_config()->PackFrom(rls); + auto* default_route = + new_route_config.mutable_virtual_hosts(0)->mutable_routes(0); + default_route->mutable_route()->set_cluster_specifier_plugin( + kRlsClusterSpecifierPluginInstanceName); + SetRouteConfiguration(balancer_.get(), new_route_config); + const auto response_state = WaitForRdsNack(); + ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK"; + EXPECT_THAT( + response_state->error_message, + ::testing::HasSubstr("field:requiredMatch error:must not be present")); + gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_XDS_RLS_LB"); +} + +TEST_P(RlsTest, XdsRoutingClusterSpecifierPluginDisabled) { + const char* kNewClusterName = "new_cluster"; + const char* kNewEdsServiceName = "new_eds_service_name"; + // Populate new EDS resources. + EdsResourceArgs args({ + {"locality0", CreateEndpointsForBackends(0, 1)}, + }); + EdsResourceArgs args1({ + {"locality0", CreateEndpointsForBackends(1, 2)}, + }); + balancer_->ads_service()->SetEdsResource(BuildEdsResource(args)); + balancer_->ads_service()->SetEdsResource( + BuildEdsResource(args1, kNewEdsServiceName)); + // Populate new CDS resources. + Cluster new_cluster = default_cluster_; + new_cluster.set_name(kNewClusterName); + new_cluster.mutable_eds_cluster_config()->set_service_name( + kNewEdsServiceName); + balancer_->ads_service()->SetCdsResource(new_cluster); + // Prepare the RLSLookupConfig and configure all the keys; change route + // configurations to use cluster specifier plugin. + RouteLookupConfig route_lookup_config; + auto* key_builder = route_lookup_config.add_grpc_keybuilders(); + auto* name = key_builder->add_names(); + name->set_service(kRlsServiceValue); + name->set_method(kRlsMethodValue); + auto* header = key_builder->add_headers(); + header->set_key(kRlsTestKey); + header->add_names(kRlsTestKey1); + route_lookup_config.set_lookup_service( + absl::StrCat("localhost:", rls_server_->port())); + route_lookup_config.set_cache_size_bytes(5000); + RouteLookupClusterSpecifier rls; + *rls.mutable_route_lookup_config() = std::move(route_lookup_config); + RouteConfiguration new_route_config = default_route_config_; + auto* plugin = new_route_config.add_cluster_specifier_plugins(); + plugin->mutable_extension()->set_name(kRlsClusterSpecifierPluginInstanceName); + plugin->mutable_extension()->mutable_typed_config()->PackFrom(rls); + auto* route = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0); + route->mutable_route()->set_cluster_specifier_plugin( + kRlsClusterSpecifierPluginInstanceName); + auto* default_route = new_route_config.mutable_virtual_hosts(0)->add_routes(); + default_route->mutable_match()->set_prefix(""); + default_route->mutable_route()->set_cluster(kDefaultClusterName); + SetRouteConfiguration(balancer_.get(), new_route_config); + // Ensure we ignore the cluster specifier plugin and send traffic according to + // the default route. + auto rpc_options = RpcOptions().set_metadata({{kRlsTestKey1, kRlsTestValue}}); + WaitForAllBackends(0, 1, WaitForBackendOptions(), rpc_options); +} + class XdsSecurityTest : public BasicTest { protected: void SetUp() override { @@ -13465,6 +13780,14 @@ INSTANTIATE_TEST_SUITE_P( TestType().set_enable_rds_testing().set_use_v2()), &TestTypeName); +// Rls tests depend on XdsResolver. +INSTANTIATE_TEST_SUITE_P( + XdsTest, RlsTest, + ::testing::Values(TestType(), TestType().set_enable_rds_testing(), + // Also test with xDS v2. + TestType().set_enable_rds_testing().set_use_v2()), + &TestTypeName); + // CDS depends on XdsResolver. INSTANTIATE_TEST_SUITE_P( XdsTest, CdsTest, diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal index 1625b8c33de..61bb989f88c 100644 --- a/tools/doxygen/Doxyfile.c++.internal +++ b/tools/doxygen/Doxyfile.c++.internal @@ -1510,6 +1510,8 @@ src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c \ src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h \ src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c \ src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h \ +src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.c \ +src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.h \ src/core/ext/upb-generated/udpa/annotations/migrate.upb.c \ src/core/ext/upb-generated/udpa/annotations/migrate.upb.h \ src/core/ext/upb-generated/udpa/annotations/security.upb.c \ @@ -1778,6 +1780,8 @@ src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c \ src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.h \ src/core/ext/upbdefs-generated/opencensus/proto/trace/v1/trace_config.upbdefs.c \ src/core/ext/upbdefs-generated/opencensus/proto/trace/v1/trace_config.upbdefs.h \ +src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.c \ +src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.h \ src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c \ src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.h \ src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c \ @@ -1845,6 +1849,8 @@ src/core/ext/xds/xds_client_stats.cc \ src/core/ext/xds/xds_client_stats.h \ src/core/ext/xds/xds_cluster.cc \ src/core/ext/xds/xds_cluster.h \ +src/core/ext/xds/xds_cluster_specifier_plugin.cc \ +src/core/ext/xds/xds_cluster_specifier_plugin.h \ src/core/ext/xds/xds_common_types.cc \ src/core/ext/xds/xds_common_types.h \ src/core/ext/xds/xds_endpoint.cc \ diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal index ec96d23da06..e0964b3c0c0 100644 --- a/tools/doxygen/Doxyfile.core.internal +++ b/tools/doxygen/Doxyfile.core.internal @@ -1300,6 +1300,8 @@ src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c \ src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h \ src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c \ src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h \ +src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.c \ +src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.h \ src/core/ext/upb-generated/udpa/annotations/migrate.upb.c \ src/core/ext/upb-generated/udpa/annotations/migrate.upb.h \ src/core/ext/upb-generated/udpa/annotations/security.upb.c \ @@ -1568,6 +1570,8 @@ src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c \ src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.h \ src/core/ext/upbdefs-generated/opencensus/proto/trace/v1/trace_config.upbdefs.c \ src/core/ext/upbdefs-generated/opencensus/proto/trace/v1/trace_config.upbdefs.h \ +src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.c \ +src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.h \ src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c \ src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.h \ src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c \ @@ -1635,6 +1639,8 @@ src/core/ext/xds/xds_client_stats.cc \ src/core/ext/xds/xds_client_stats.h \ src/core/ext/xds/xds_cluster.cc \ src/core/ext/xds/xds_cluster.h \ +src/core/ext/xds/xds_cluster_specifier_plugin.cc \ +src/core/ext/xds/xds_cluster_specifier_plugin.h \ src/core/ext/xds/xds_common_types.cc \ src/core/ext/xds/xds_common_types.h \ src/core/ext/xds/xds_endpoint.cc \ From 59d9749c716158b0d9d3846f6c4c9cb815f3d66a Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Tue, 22 Mar 2022 20:00:13 +0100 Subject: [PATCH 3/7] fix csharp single-job distribtest on grpc-win2016 (#29183) --- tools/internal_ci/windows/grpc_distribtests_csharp.bat | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tools/internal_ci/windows/grpc_distribtests_csharp.bat b/tools/internal_ci/windows/grpc_distribtests_csharp.bat index 4d5ce3fa9b3..8ba209c1ba4 100644 --- a/tools/internal_ci/windows/grpc_distribtests_csharp.bat +++ b/tools/internal_ci/windows/grpc_distribtests_csharp.bat @@ -30,6 +30,14 @@ call tools/internal_ci/helper_scripts/prepare_build_windows.bat || exit /b 1 call tools/internal_ci/helper_scripts/prepare_ccache.bat || exit /b 1 +@rem Install Msys2 zip to avoid crash when using cygwin's zip on grpc-win2016 kokoro workers. +@rem Downloading from GCS should be very reliables when on a GCP VM. +@rem TODO(jtattermusch): find a better way of making the build_packages step work on windows workers. +mkdir C:\zip +curl -sSL --fail -o C:\zip\zip.exe https://storage.googleapis.com/grpc-build-helper/zip-3.0-1-x86_64/zip.exe || goto :error +set PATH=C:\zip;%PATH% +zip --version + @rem Build all C# windows artifacts python tools/run_tests/task_runner.py -f artifact windows csharp %TASK_RUNNER_EXTRA_FILTERS% -j 4 --inner_jobs 4 -x build_artifacts_csharp/sponge_log.xml || set FAILED=true From 882f64e376f6d91b368775ef92525220277e0273 Mon Sep 17 00:00:00 2001 From: AJ Heller Date: Tue, 22 Mar 2022 12:19:20 -0700 Subject: [PATCH 4/7] Revert "HTTP2: Add graceful goaway (#29050)" (#29187) This reverts commit f76e1563eabefab655f41d747347501761bcfd27. --- CMakeLists.txt | 37 -- build_autogenerated.yaml | 11 - .../chttp2/transport/chttp2_transport.cc | 122 +---- .../ext/transport/chttp2/transport/internal.h | 5 +- .../ext/transport/chttp2/transport/parsing.cc | 8 - .../ext/transport/chttp2/transport/writing.cc | 5 +- src/core/lib/surface/server.cc | 1 + test/core/transport/chttp2/BUILD | 13 - .../chttp2/graceful_shutdown_test.cc | 418 ------------------ .../transport/chttp2/simple_request.headers | 12 - tools/run_tests/generated/tests.json | 24 - 11 files changed, 15 insertions(+), 641 deletions(-) delete mode 100644 test/core/transport/chttp2/graceful_shutdown_test.cc delete mode 100644 test/core/transport/chttp2/simple_request.headers diff --git a/CMakeLists.txt b/CMakeLists.txt index bbb791db903..92adbc9eb06 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -867,7 +867,6 @@ if(gRPC_BUILD_TESTS) add_dependencies(buildtests_cxx global_config_test) add_dependencies(buildtests_cxx google_c2p_resolver_test) add_dependencies(buildtests_cxx google_mesh_ca_certificate_provider_factory_test) - add_dependencies(buildtests_cxx graceful_shutdown_test) add_dependencies(buildtests_cxx grpc_authorization_engine_test) add_dependencies(buildtests_cxx grpc_authorization_policy_provider_test) add_dependencies(buildtests_cxx grpc_authz_end2end_test) @@ -10698,42 +10697,6 @@ target_link_libraries(google_mesh_ca_certificate_provider_factory_test ) -endif() -if(gRPC_BUILD_TESTS) - -add_executable(graceful_shutdown_test - test/core/end2end/cq_verifier.cc - test/core/transport/chttp2/graceful_shutdown_test.cc - third_party/googletest/googletest/src/gtest-all.cc - third_party/googletest/googlemock/src/gmock-all.cc -) - -target_include_directories(graceful_shutdown_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(graceful_shutdown_test - ${_gRPC_PROTOBUF_LIBRARIES} - ${_gRPC_ALLTARGETS_LIBRARIES} - grpc_test_util -) - - endif() if(gRPC_BUILD_TESTS) diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index 29123cb0a6a..d62ebe376eb 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -5832,17 +5832,6 @@ targets: - test/core/xds/google_mesh_ca_certificate_provider_factory_test.cc deps: - grpc_test_util -- name: graceful_shutdown_test - gtest: true - build: test - language: c++ - headers: - - test/core/end2end/cq_verifier.h - src: - - test/core/end2end/cq_verifier.cc - - test/core/transport/chttp2/graceful_shutdown_test.cc - deps: - - grpc_test_util - name: grpc_authorization_engine_test gtest: true build: test diff --git a/src/core/ext/transport/chttp2/transport/chttp2_transport.cc b/src/core/ext/transport/chttp2/transport/chttp2_transport.cc index eb91e1f10cb..1d6facdd176 100644 --- a/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +++ b/src/core/ext/transport/chttp2/transport/chttp2_transport.cc @@ -1006,8 +1006,8 @@ static void write_action_end_locked(void* tp, grpc_error_handle error) { closed = true; } - if (t->sent_goaway_state == GRPC_CHTTP2_FINAL_GOAWAY_SEND_SCHEDULED) { - t->sent_goaway_state = GRPC_CHTTP2_FINAL_GOAWAY_SENT; + if (t->sent_goaway_state == GRPC_CHTTP2_GOAWAY_SEND_SCHEDULED) { + t->sent_goaway_state = GRPC_CHTTP2_GOAWAY_SENT; closed = true; if (grpc_chttp2_stream_map_size(&t->stream_map) == 0) { close_transport_locked( @@ -1759,120 +1759,18 @@ void grpc_chttp2_ack_ping(grpc_chttp2_transport* t, uint64_t id) { } } -namespace { - -// Fire and forget (deletes itself on completion). Does a graceful shutdown by -// sending a GOAWAY frame with the last stream id set to 2^31-1, sending a ping -// and waiting for an ack (effective waiting for an RTT) and then sending a -// final GOAWAY freame with an updated last stream identifier. This helps ensure -// that a connection can be cleanly shut down without losing requests. -// In the event, that the client does not respond to the ping for some reason, -// we add a 20 second deadline, after which we send the second goaway. -class GracefulGoaway : public grpc_core::RefCounted { - public: - static void Start(grpc_chttp2_transport* t) { new GracefulGoaway(t); } - - ~GracefulGoaway() override { - GRPC_CHTTP2_UNREF_TRANSPORT(t_, "graceful goaway"); - } - - private: - explicit GracefulGoaway(grpc_chttp2_transport* t) : t_(t) { - t->sent_goaway_state = GRPC_CHTTP2_GRACEFUL_GOAWAY; - GRPC_CHTTP2_REF_TRANSPORT(t_, "graceful goaway"); - grpc_chttp2_goaway_append((1u << 31) - 1, 0, grpc_empty_slice(), &t->qbuf); - send_ping_locked( - t, nullptr, GRPC_CLOSURE_INIT(&on_ping_ack_, OnPingAck, this, nullptr)); - grpc_chttp2_initiate_write(t, GRPC_CHTTP2_INITIATE_WRITE_GOAWAY_SENT); - Ref().release(); // Ref for the timer - grpc_timer_init( - &timer_, - grpc_core::ExecCtx::Get()->Now() + grpc_core::Duration::Seconds(20), - GRPC_CLOSURE_INIT(&on_timer_, OnTimer, this, nullptr)); - } - - void MaybeSendFinalGoawayLocked() { - if (t_->sent_goaway_state != GRPC_CHTTP2_GRACEFUL_GOAWAY) { - // We already sent the final GOAWAY. - return; - } - if (t_->destroying || t_->closed_with_error != GRPC_ERROR_NONE) { - GRPC_CHTTP2_IF_TRACING(gpr_log( - GPR_INFO, - "transport:%p %s peer:%s Transport already shutting down. " - "Graceful GOAWAY abandoned.", - t_, t_->is_client ? "CLIENT" : "SERVER", t_->peer_string.c_str())); - return; - } - // Ping completed. Send final goaway. - GRPC_CHTTP2_IF_TRACING( - gpr_log(GPR_INFO, - "transport:%p %s peer:%s Graceful shutdown: Ping received. " - "Sending final GOAWAY with stream_id:%d", - t_, t_->is_client ? "CLIENT" : "SERVER", - t_->peer_string.c_str(), t_->last_new_stream_id)); - t_->sent_goaway_state = GRPC_CHTTP2_FINAL_GOAWAY_SEND_SCHEDULED; - grpc_chttp2_goaway_append(t_->last_new_stream_id, 0, grpc_empty_slice(), - &t_->qbuf); - grpc_chttp2_initiate_write(t_, GRPC_CHTTP2_INITIATE_WRITE_GOAWAY_SENT); - } - - static void OnPingAck(void* arg, grpc_error_handle /* error */) { - auto* self = static_cast(arg); - self->t_->combiner->Run( - GRPC_CLOSURE_INIT(&self->on_ping_ack_, OnPingAckLocked, self, nullptr), - GRPC_ERROR_NONE); - } - - static void OnPingAckLocked(void* arg, grpc_error_handle /* error */) { - auto* self = static_cast(arg); - grpc_timer_cancel(&self->timer_); - self->MaybeSendFinalGoawayLocked(); - self->Unref(); - } - - static void OnTimer(void* arg, grpc_error_handle error) { - auto* self = static_cast(arg); - if (error != GRPC_ERROR_NONE) { - self->Unref(); - return; - } - self->t_->combiner->Run( - GRPC_CLOSURE_INIT(&self->on_timer_, OnTimerLocked, self, nullptr), - GRPC_ERROR_NONE); - } - - static void OnTimerLocked(void* arg, grpc_error_handle /* error */) { - auto* self = static_cast(arg); - self->MaybeSendFinalGoawayLocked(); - self->Unref(); - } - - grpc_chttp2_transport* t_; - grpc_closure on_ping_ack_; - grpc_timer timer_; - grpc_closure on_timer_; -}; - -} // namespace - static void send_goaway(grpc_chttp2_transport* t, grpc_error_handle error) { + // We want to log this irrespective of whether http tracing is enabled + gpr_log(GPR_DEBUG, "%s: Sending goaway err=%s", t->peer_string.c_str(), + grpc_error_std_string(error).c_str()); + t->sent_goaway_state = GRPC_CHTTP2_GOAWAY_SEND_SCHEDULED; grpc_http2_error_code http_error; std::string message; grpc_error_get_status(error, grpc_core::Timestamp::InfFuture(), nullptr, &message, &http_error, nullptr); - if (!t->is_client && http_error == GRPC_HTTP2_NO_ERROR) { - // Do a graceful shutdown. - GracefulGoaway::Start(t); - } else { - // We want to log this irrespective of whether http tracing is enabled - gpr_log(GPR_DEBUG, "%s: Sending goaway err=%s", t->peer_string.c_str(), - grpc_error_std_string(error).c_str()); - t->sent_goaway_state = GRPC_CHTTP2_FINAL_GOAWAY_SEND_SCHEDULED; - grpc_chttp2_goaway_append( - t->last_new_stream_id, static_cast(http_error), - grpc_slice_from_cpp_string(std::move(message)), &t->qbuf); - } + grpc_chttp2_goaway_append( + t->last_new_stream_id, static_cast(http_error), + grpc_slice_from_cpp_string(std::move(message)), &t->qbuf); grpc_chttp2_initiate_write(t, GRPC_CHTTP2_INITIATE_WRITE_GOAWAY_SENT); GRPC_ERROR_UNREF(error); } @@ -2101,7 +1999,7 @@ static void remove_stream(grpc_chttp2_transport* t, uint32_t id, if (grpc_chttp2_stream_map_size(&t->stream_map) == 0) { post_benign_reclaimer(t); - if (t->sent_goaway_state == GRPC_CHTTP2_FINAL_GOAWAY_SENT) { + if (t->sent_goaway_state == GRPC_CHTTP2_GOAWAY_SENT) { close_transport_locked( t, GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING( "Last stream closed after sending GOAWAY", &error, 1)); diff --git a/src/core/ext/transport/chttp2/transport/internal.h b/src/core/ext/transport/chttp2/transport/internal.h index 48c62ef1d77..fe2b437552f 100644 --- a/src/core/ext/transport/chttp2/transport/internal.h +++ b/src/core/ext/transport/chttp2/transport/internal.h @@ -196,9 +196,8 @@ typedef enum { typedef enum { GRPC_CHTTP2_NO_GOAWAY_SEND, - GRPC_CHTTP2_GRACEFUL_GOAWAY, - GRPC_CHTTP2_FINAL_GOAWAY_SEND_SCHEDULED, - GRPC_CHTTP2_FINAL_GOAWAY_SENT, + GRPC_CHTTP2_GOAWAY_SEND_SCHEDULED, + GRPC_CHTTP2_GOAWAY_SENT, } grpc_chttp2_sent_goaway_state; typedef struct grpc_chttp2_write_cb { diff --git a/src/core/ext/transport/chttp2/transport/parsing.cc b/src/core/ext/transport/chttp2/transport/parsing.cc index 7cac0850834..1864a416a1e 100644 --- a/src/core/ext/transport/chttp2/transport/parsing.cc +++ b/src/core/ext/transport/chttp2/transport/parsing.cc @@ -479,14 +479,6 @@ static grpc_error_handle init_header_frame_parser(grpc_chttp2_transport* t, t->settings[GRPC_ACKED_SETTINGS] [GRPC_CHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS])) { return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Max stream count exceeded"); - } else if (t->sent_goaway_state == GRPC_CHTTP2_FINAL_GOAWAY_SENT) { - GRPC_CHTTP2_IF_TRACING(gpr_log( - GPR_INFO, - "transport:%p SERVER peer:%s Final GOAWAY sent. Ignoring new " - "grpc_chttp2_stream request id=%d, last grpc_chttp2_stream id=%d", - t, t->peer_string.c_str(), t->incoming_stream_id, - t->last_new_stream_id)); - return init_header_skip_frame_parser(t, priority_type); } t->last_new_stream_id = t->incoming_stream_id; s = t->incoming_stream = diff --git a/src/core/ext/transport/chttp2/transport/writing.cc b/src/core/ext/transport/chttp2/transport/writing.cc index 7a89986bfa7..0c7b6760d6d 100644 --- a/src/core/ext/transport/chttp2/transport/writing.cc +++ b/src/core/ext/transport/chttp2/transport/writing.cc @@ -87,10 +87,9 @@ static void maybe_initiate_ping(grpc_chttp2_transport* t) { ? grpc_core::Duration::Hours(2) : grpc_core::Duration::Seconds(1); /* A second is added to deal with network delays and timing imprecision */ - } else if (t->sent_goaway_state != GRPC_CHTTP2_GRACEFUL_GOAWAY) { + } else { // The gRPC keepalive spec doesn't call for any throttling on the server - // side, but we are adding some throttling for protection anyway, unless - // we are doing a graceful GOAWAY in which case we don't want to wait. + // side, but we are adding some throttling for protection anyway. next_allowed_ping_interval = t->keepalive_time == grpc_core::Duration::Infinity() ? grpc_core::Duration::Seconds(20) diff --git a/src/core/lib/surface/server.cc b/src/core/lib/surface/server.cc index 4c0220837ee..a276d9c6d50 100644 --- a/src/core/lib/surface/server.cc +++ b/src/core/lib/surface/server.cc @@ -479,6 +479,7 @@ class ChannelBroadcaster { GRPC_ERROR_CREATE_FROM_STATIC_STRING("Server shutdown"), GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_OK) : GRPC_ERROR_NONE; + op->set_accept_stream = true; sc->slice = grpc_slice_from_copied_string("Server shutdown"); op->disconnect_with_error = send_disconnect; elem = diff --git a/test/core/transport/chttp2/BUILD b/test/core/transport/chttp2/BUILD index 31e5c556c74..ffaa0e1a331 100644 --- a/test/core/transport/chttp2/BUILD +++ b/test/core/transport/chttp2/BUILD @@ -98,19 +98,6 @@ grpc_cc_test( ], ) -grpc_cc_test( - name = "graceful_shutdown_test", - srcs = ["graceful_shutdown_test.cc"], - external_deps = ["gtest"], - language = "C++", - deps = [ - "//:gpr", - "//:grpc", - "//test/core/end2end:cq_verifier", - "//test/core/util:grpc_test_util", - ], -) - grpc_cc_test( name = "hpack_encoder_test", srcs = ["hpack_encoder_test.cc"], diff --git a/test/core/transport/chttp2/graceful_shutdown_test.cc b/test/core/transport/chttp2/graceful_shutdown_test.cc deleted file mode 100644 index 41a8b34d8dd..00000000000 --- a/test/core/transport/chttp2/graceful_shutdown_test.cc +++ /dev/null @@ -1,418 +0,0 @@ -// -// -// 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 -#include - -#include - -#include - -#include "absl/synchronization/mutex.h" -#include "absl/synchronization/notification.h" - -#include -#include -#include - -#include "src/core/ext/transport/chttp2/transport/chttp2_transport.h" -#include "src/core/ext/transport/chttp2/transport/frame_goaway.h" -#include "src/core/ext/transport/chttp2/transport/frame_ping.h" -#include "src/core/lib/channel/channel_stack_builder.h" -#include "src/core/lib/config/core_configuration.h" -#include "src/core/lib/gprpp/host_port.h" -#include "src/core/lib/iomgr/endpoint_pair.h" -#include "src/core/lib/slice/slice.h" -#include "src/core/lib/slice/slice_string_helpers.h" -#include "src/core/lib/surface/channel.h" -#include "src/core/lib/surface/server.h" -#include "test/core/end2end/cq_verifier.h" -#include "test/core/util/port.h" -#include "test/core/util/test_config.h" -#include "test/core/util/test_tcp_server.h" - -namespace grpc_core { -namespace { - -void* Tag(intptr_t t) { return reinterpret_cast(t); } - -class GracefulShutdownTest : public ::testing::Test { - protected: - GracefulShutdownTest() { SetupAndStart(); } - - ~GracefulShutdownTest() override { ShutdownAndDestroy(); } - - // Sets up the client and server - void SetupAndStart() { - ExecCtx exec_ctx; - cq_ = grpc_completion_queue_create_for_next(nullptr); - cqv_ = cq_verifier_create(cq_); - grpc_arg server_args[] = { - grpc_channel_arg_integer_create( - const_cast(GRPC_ARG_HTTP2_BDP_PROBE), 0), - grpc_channel_arg_integer_create( - const_cast(GRPC_ARG_KEEPALIVE_TIME_MS), INT_MAX)}; - grpc_channel_args server_channel_args = {GPR_ARRAY_SIZE(server_args), - server_args}; - // Create server - server_ = grpc_server_create(&server_channel_args, nullptr); - auto* core_server = Server::FromC(server_); - grpc_server_register_completion_queue(server_, cq_, nullptr); - grpc_server_start(server_); - fds_ = grpc_iomgr_create_endpoint_pair("fixture", nullptr); - auto* transport = grpc_create_chttp2_transport(core_server->channel_args(), - fds_.server, false); - grpc_endpoint_add_to_pollset(fds_.server, grpc_cq_pollset(cq_)); - GPR_ASSERT(core_server->SetupTransport(transport, nullptr, - core_server->channel_args(), - nullptr) == GRPC_ERROR_NONE); - grpc_chttp2_transport_start_reading(transport, nullptr, nullptr, nullptr); - // Start polling on the client - client_poll_thread_ = absl::make_unique([this]() { - grpc_completion_queue* client_cq = - grpc_completion_queue_create_for_next(nullptr); - { - ExecCtx exec_ctx; - grpc_endpoint_add_to_pollset(fds_.client, grpc_cq_pollset(client_cq)); - grpc_endpoint_add_to_pollset(fds_.server, grpc_cq_pollset(client_cq)); - } - while (!shutdown_) { - GPR_ASSERT( - grpc_completion_queue_next( - client_cq, grpc_timeout_milliseconds_to_deadline(10), nullptr) - .type == GRPC_QUEUE_TIMEOUT); - } - grpc_completion_queue_destroy(client_cq); - }); - // Write connection prefix and settings frame - constexpr char kPrefix[] = - "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n\x00\x00\x00\x04\x00\x00\x00\x00\x00"; - Write(absl::string_view(kPrefix, sizeof(kPrefix) - 1)); - // Start reading on the client - grpc_slice_buffer_init(&read_buffer_); - GRPC_CLOSURE_INIT(&on_read_done_, OnReadDone, this, nullptr); - grpc_endpoint_read(fds_.client, &read_buffer_, &on_read_done_, false); - } - - // Shuts down and destroys the client and server. - void ShutdownAndDestroy() { - shutdown_ = true; - ExecCtx exec_ctx; - grpc_endpoint_shutdown( - fds_.client, GRPC_ERROR_CREATE_FROM_STATIC_STRING("Client shutdown")); - ExecCtx::Get()->Flush(); - client_poll_thread_->join(); - GPR_ASSERT(read_end_notification_.WaitForNotificationWithTimeout( - absl::Seconds(5))); - grpc_endpoint_destroy(fds_.client); - ExecCtx::Get()->Flush(); - // Shutdown and destroy server - grpc_server_shutdown_and_notify(server_, cq_, Tag(1000)); - CQ_EXPECT_COMPLETION(cqv_, Tag(1000), true); - cq_verify(cqv_); - grpc_server_destroy(server_); - cq_verifier_destroy(cqv_); - grpc_completion_queue_destroy(cq_); - } - - static void OnReadDone(void* arg, grpc_error_handle error) { - GracefulShutdownTest* self = static_cast(arg); - if (error == GRPC_ERROR_NONE) { - { - absl::MutexLock lock(&self->mu_); - for (size_t i = 0; i < self->read_buffer_.count; ++i) { - absl::StrAppend(&self->read_bytes_, - StringViewFromSlice(self->read_buffer_.slices[i])); - } - self->read_cv_.SignalAll(); - } - grpc_slice_buffer_reset_and_unref(&self->read_buffer_); - grpc_endpoint_read(self->fds_.client, &self->read_buffer_, - &self->on_read_done_, false); - } else { - grpc_slice_buffer_destroy(&self->read_buffer_); - self->read_end_notification_.Notify(); - } - } - - // Waits for \a bytes to show up in read_bytes_ - void WaitForReadBytes(absl::string_view bytes) { - std::atomic done{false}; - { - absl::MutexLock lock(&mu_); - while (!absl::StrContains(read_bytes_, bytes)) { - read_cv_.WaitWithTimeout(&mu_, absl::Seconds(5)); - } - } - done = true; - } - - void WaitForGoaway(uint32_t last_stream_id) { - grpc_slice_buffer buffer; - grpc_slice_buffer_init(&buffer); - grpc_chttp2_goaway_append(last_stream_id, 0, grpc_empty_slice(), &buffer); - std::string expected_bytes; - for (size_t i = 0; i < buffer.count; ++i) { - absl::StrAppend(&expected_bytes, StringViewFromSlice(buffer.slices[i])); - } - grpc_slice_buffer_destroy(&buffer); - WaitForReadBytes(expected_bytes); - } - - void WaitForPing(uint64_t opaque_data) { - grpc_slice ping_slice = grpc_chttp2_ping_create(0, opaque_data); - WaitForReadBytes(StringViewFromSlice(ping_slice)); - } - - void SendPingAck(uint64_t opaque_data) { - grpc_slice ping_slice = grpc_chttp2_ping_create(1, opaque_data); - Write(StringViewFromSlice(ping_slice)); - } - - // This is a blocking call. It waits for the write callback to be invoked - // before returning. (In other words, do not call this from a thread that - // should not be blocked, for example, a polling thread.) - void Write(absl::string_view bytes) { - ExecCtx exec_ctx; - grpc_slice slice = - StaticSlice::FromStaticBuffer(bytes.data(), bytes.size()).TakeCSlice(); - grpc_slice_buffer buffer; - grpc_slice_buffer_init(&buffer); - grpc_slice_buffer_add(&buffer, slice); - WriteBuffer(&buffer); - grpc_slice_buffer_destroy(&buffer); - } - - void WriteBuffer(grpc_slice_buffer* buffer) { - absl::Notification on_write_done_notification_; - GRPC_CLOSURE_INIT(&on_write_done_, OnWriteDone, - &on_write_done_notification_, nullptr); - grpc_endpoint_write(fds_.client, buffer, &on_write_done_, nullptr); - ExecCtx::Get()->Flush(); - GPR_ASSERT(on_write_done_notification_.WaitForNotificationWithTimeout( - absl::Seconds(5))); - } - - static void OnWriteDone(void* arg, grpc_error_handle error) { - GPR_ASSERT(error == GRPC_ERROR_NONE); - absl::Notification* on_write_done_notification_ = - static_cast(arg); - on_write_done_notification_->Notify(); - } - - grpc_endpoint_pair fds_; - grpc_server* server_ = nullptr; - grpc_completion_queue* cq_ = nullptr; - cq_verifier* cqv_ = nullptr; - std::unique_ptr client_poll_thread_; - std::atomic shutdown_{false}; - grpc_closure on_read_done_; - absl::Mutex mu_; - absl::CondVar read_cv_; - absl::Notification read_end_notification_; - grpc_slice_buffer read_buffer_; - std::string read_bytes_ ABSL_GUARDED_BY(mu_); - grpc_closure on_write_done_; -}; - -TEST_F(GracefulShutdownTest, GracefulGoaway) { - // Initiate shutdown on the server - grpc_server_shutdown_and_notify(server_, cq_, Tag(1)); - // Wait for first goaway - WaitForGoaway((1u << 31) - 1); - // Wait for the ping - WaitForPing(0); - // Reply to the ping - SendPingAck(0); - // Wait for final goaway - WaitForGoaway(0); - // The shutdown should successfully complete. - CQ_EXPECT_COMPLETION(cqv_, Tag(1), true); - cq_verify(cqv_); -} - -TEST_F(GracefulShutdownTest, RequestStartedBeforeFinalGoaway) { - grpc_call_error error; - grpc_call* s; - grpc_call_details call_details; - grpc_metadata_array request_metadata_recv; - grpc_call_details_init(&call_details); - grpc_metadata_array_init(&request_metadata_recv); - error = grpc_server_request_call(server_, &s, &call_details, - &request_metadata_recv, cq_, cq_, Tag(100)); - GPR_ASSERT(GRPC_CALL_OK == error); - // Initiate shutdown on the server - grpc_server_shutdown_and_notify(server_, cq_, Tag(1)); - // Wait for first goaway - WaitForGoaway((1u << 31) - 1); - // Wait for the ping - WaitForPing(0); - // Start a request - constexpr char kRequestFrame[] = - "\x00\x00\xbe\x01\x05\x00\x00\x00\x01" - "\x10\x05:path\x08/foo/bar" - "\x10\x07:scheme\x04http" - "\x10\x07:method\x04POST" - "\x10\x0a:authority\x09localhost" - "\x10\x0c" - "content-type\x10" - "application/grpc" - "\x10\x14grpc-accept-encoding\x15identity,deflate,gzip" - "\x10\x02te\x08trailers" - "\x10\x0auser-agent\x17grpc-c/0.12.0.0 (linux)"; - Write(absl::string_view(kRequestFrame, sizeof(kRequestFrame) - 1)); - // Reply to the ping - SendPingAck(0); - // Wait for final goaway with last stream ID 1 to show that the HTTP2 - // transport accepted the stream. - WaitForGoaway(1); - // TODO(yashykt): The surface layer automatically cancels calls received after - // shutdown has been called. Once that is fixed, this should be a success. - CQ_EXPECT_COMPLETION(cqv_, Tag(100), 0); - // The shutdown should successfully complete. - CQ_EXPECT_COMPLETION(cqv_, Tag(1), true); - cq_verify(cqv_); - grpc_metadata_array_destroy(&request_metadata_recv); - grpc_call_details_destroy(&call_details); -} - -TEST_F(GracefulShutdownTest, RequestStartedAfterFinalGoawayIsIgnored) { - // Start a request before shutdown to make sure that the connection stays - // alive. - grpc_call_error error; - grpc_call* s; - grpc_call_details call_details; - grpc_metadata_array request_metadata_recv; - grpc_call_details_init(&call_details); - grpc_metadata_array_init(&request_metadata_recv); - error = grpc_server_request_call(server_, &s, &call_details, - &request_metadata_recv, cq_, cq_, Tag(100)); - GPR_ASSERT(GRPC_CALL_OK == error); - // Send the request from the client. - constexpr char kRequestFrame[] = - "\x00\x00\xbe\x01\x05\x00\x00\x00\x01" - "\x10\x05:path\x08/foo/bar" - "\x10\x07:scheme\x04http" - "\x10\x07:method\x04POST" - "\x10\x0a:authority\x09localhost" - "\x10\x0c" - "content-type\x10" - "application/grpc" - "\x10\x14grpc-accept-encoding\x15identity,deflate,gzip" - "\x10\x02te\x08trailers" - "\x10\x0auser-agent\x17grpc-c/0.12.0.0 (linux)"; - Write(absl::string_view(kRequestFrame, sizeof(kRequestFrame) - 1)); - CQ_EXPECT_COMPLETION(cqv_, Tag(100), 1); - cq_verify(cqv_); - - // Initiate shutdown on the server - grpc_server_shutdown_and_notify(server_, cq_, Tag(1)); - // Wait for first goaway - WaitForGoaway((1u << 31) - 1); - // Wait for the ping - WaitForPing(0); - // Reply to the ping - SendPingAck(0); - // Wait for final goaway - WaitForGoaway(1); - - // Send another request from the client which should be ignored. - constexpr char kNewRequestFrame[] = - "\x00\x00\xbe\x01\x05\x00\x00\x00\x03" - "\x10\x05:path\x08/foo/bar" - "\x10\x07:scheme\x04http" - "\x10\x07:method\x04POST" - "\x10\x0a:authority\x09localhost" - "\x10\x0c" - "content-type\x10" - "application/grpc" - "\x10\x14grpc-accept-encoding\x15identity,deflate,gzip" - "\x10\x02te\x08trailers" - "\x10\x0auser-agent\x17grpc-c/0.12.0.0 (linux)"; - Write(absl::string_view(kNewRequestFrame, sizeof(kNewRequestFrame) - 1)); - - // Finish the accepted request. - grpc_op ops[3]; - grpc_op* op; - memset(ops, 0, sizeof(ops)); - op = ops; - op->op = GRPC_OP_SEND_INITIAL_METADATA; - op->data.send_initial_metadata.count = 0; - op->flags = 0; - op->reserved = nullptr; - op++; - op->op = GRPC_OP_SEND_STATUS_FROM_SERVER; - op->data.send_status_from_server.trailing_metadata_count = 0; - op->data.send_status_from_server.status = GRPC_STATUS_UNIMPLEMENTED; - grpc_slice status_details = grpc_slice_from_static_string("xyz"); - op->data.send_status_from_server.status_details = &status_details; - op->flags = 0; - op->reserved = nullptr; - op++; - op->op = GRPC_OP_RECV_CLOSE_ON_SERVER; - int was_cancelled = 2; - op->data.recv_close_on_server.cancelled = &was_cancelled; - op->flags = 0; - op->reserved = nullptr; - op++; - error = grpc_call_start_batch(s, ops, static_cast(op - ops), Tag(101), - nullptr); - GPR_ASSERT(GRPC_CALL_OK == error); - CQ_EXPECT_COMPLETION(cqv_, Tag(101), true); - // The shutdown should successfully complete. - CQ_EXPECT_COMPLETION(cqv_, Tag(1), true); - cq_verify(cqv_); - grpc_call_unref(s); - grpc_metadata_array_destroy(&request_metadata_recv); - grpc_call_details_destroy(&call_details); -} - -// Make sure that the graceful goaway eventually makes progress even if a client -// does not respond to the ping. -TEST_F(GracefulShutdownTest, UnresponsiveClient) { - absl::Time initial_time = absl::Now(); - // Initiate shutdown on the server - grpc_server_shutdown_and_notify(server_, cq_, Tag(1)); - // Wait for first goaway - WaitForGoaway((1u << 31) - 1); - // Wait for the ping - WaitForPing(0); - // Wait for final goaway without sending a ping ACK. - WaitForGoaway(0); - EXPECT_GE(absl::Now() - initial_time, - absl::Seconds(20) - - absl::Seconds( - 1) /* clock skew between threads due to time caching */); - // The shutdown should successfully complete. - CQ_EXPECT_COMPLETION(cqv_, Tag(1), true); - cq_verify(cqv_); -} - -} // namespace -} // namespace grpc_core - -int main(int argc, char** argv) { - ::testing::InitGoogleTest(&argc, argv); - grpc::testing::TestEnvironment env(argc, argv); - grpc_init(); - int result = RUN_ALL_TESTS(); - grpc_shutdown(); - return result; -} diff --git a/test/core/transport/chttp2/simple_request.headers b/test/core/transport/chttp2/simple_request.headers deleted file mode 100644 index 6ca29e21a82..00000000000 --- a/test/core/transport/chttp2/simple_request.headers +++ /dev/null @@ -1,12 +0,0 @@ -# headers used in graceful_shutdown_test.cc -# use tools/codegen/core/gen_header_frame.py to generate the binary strings -# contained in the source code -:path: /foo/bar -:scheme: http -:method: POST -:authority: localhost -content-type: application/grpc -grpc-accept-encoding: identity,deflate,gzip -te: trailers -user-agent: grpc-c/0.12.0.0 (linux) - diff --git a/tools/run_tests/generated/tests.json b/tools/run_tests/generated/tests.json index 58fd973c97a..3e67534a1a8 100644 --- a/tools/run_tests/generated/tests.json +++ b/tools/run_tests/generated/tests.json @@ -4427,30 +4427,6 @@ ], "uses_polling": true }, - { - "args": [], - "benchmark": false, - "ci_platforms": [ - "linux", - "mac", - "posix", - "windows" - ], - "cpu_cost": 1.0, - "exclude_configs": [], - "exclude_iomgrs": [], - "flaky": false, - "gtest": true, - "language": "c++", - "name": "graceful_shutdown_test", - "platforms": [ - "linux", - "mac", - "posix", - "windows" - ], - "uses_polling": true - }, { "args": [], "benchmark": false, From 7ece81084378f1bcba95221138465e7c61154719 Mon Sep 17 00:00:00 2001 From: donnadionne Date: Tue, 22 Mar 2022 13:41:21 -0700 Subject: [PATCH 5/7] Revert "Initial structure for RLS (#28750)" (#29189) This reverts commit 362e0b8706226b43aef09a7645af895230597de0. --- BUILD | 14 - CMakeLists.txt | 17 - Makefile | 7 - build_autogenerated.yaml | 12 - config.m4 | 5 - config.w32 | 9 - gRPC-C++.podspec | 8 - gRPC-Core.podspec | 12 - grpc.gemspec | 8 - grpc.gyp | 4 - package.xml | 8 - .../client_channel/lb_policy/rls/rls.cc | 11 +- .../resolver/xds/xds_resolver.cc | 89 +-- .../src/proto/grpc/lookup/v1/rls_config.upb.c | 172 ----- .../src/proto/grpc/lookup/v1/rls_config.upb.h | 623 ------------------ .../proto/grpc/lookup/v1/rls_config.upbdefs.c | 99 --- .../proto/grpc/lookup/v1/rls_config.upbdefs.h | 75 --- src/core/ext/xds/xds_client.cc | 3 - .../ext/xds/xds_cluster_specifier_plugin.cc | 144 ---- .../ext/xds/xds_cluster_specifier_plugin.h | 81 --- src/core/ext/xds/xds_common_types.cc | 18 +- src/core/ext/xds/xds_common_types.h | 6 +- src/core/ext/xds/xds_listener.cc | 2 +- src/core/ext/xds/xds_route_config.cc | 168 +---- src/core/ext/xds/xds_route_config.h | 23 +- src/core/lib/json/json_util.h | 6 +- src/proto/grpc/lookup/v1/BUILD | 14 - src/proto/grpc/testing/xds/v3/BUILD | 1 - src/proto/grpc/testing/xds/v3/route.proto | 19 - src/python/grpcio/grpc_core_dependencies.py | 4 - src/upb/gen_build_yaml.py | 2 - .../rls_lb_config_parser_test.cc | 44 +- .../rbac/rbac_service_config_parser_test.cc | 2 +- ...sh_ca_certificate_provider_factory_test.cc | 4 +- test/cpp/end2end/BUILD | 16 - test/cpp/end2end/rls_end2end_test.cc | 117 +++- test/cpp/end2end/rls_server.cc | 103 --- test/cpp/end2end/rls_server.h | 94 --- test/cpp/end2end/xds/BUILD | 3 - test/cpp/end2end/xds/xds_end2end_test.cc | 323 --------- tools/doxygen/Doxyfile.c++.internal | 6 - tools/doxygen/Doxyfile.core.internal | 6 - 42 files changed, 217 insertions(+), 2165 deletions(-) delete mode 100644 src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.c delete mode 100644 src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.h delete mode 100644 src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.c delete mode 100644 src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.h delete mode 100644 src/core/ext/xds/xds_cluster_specifier_plugin.cc delete mode 100644 src/core/ext/xds/xds_cluster_specifier_plugin.h delete mode 100644 test/cpp/end2end/rls_server.cc delete mode 100644 test/cpp/end2end/rls_server.h diff --git a/BUILD b/BUILD index 9cb2aebaafb..a27da2ec4d1 100644 --- a/BUILD +++ b/BUILD @@ -2881,7 +2881,6 @@ grpc_cc_library( "src/core/ext/xds/xds_client.cc", "src/core/ext/xds/xds_client_stats.cc", "src/core/ext/xds/xds_cluster.cc", - "src/core/ext/xds/xds_cluster_specifier_plugin.cc", "src/core/ext/xds/xds_common_types.cc", "src/core/ext/xds/xds_endpoint.cc", "src/core/ext/xds/xds_http_fault_filter.cc", @@ -2906,7 +2905,6 @@ grpc_cc_library( "src/core/ext/xds/xds_client.h", "src/core/ext/xds/xds_client_stats.h", "src/core/ext/xds/xds_cluster.h", - "src/core/ext/xds/xds_cluster_specifier_plugin.h", "src/core/ext/xds/xds_common_types.h", "src/core/ext/xds/xds_endpoint.h", "src/core/ext/xds/xds_http_fault_filter.h", @@ -2995,8 +2993,6 @@ grpc_cc_library( "protobuf_timestamp_upb", "protobuf_wrappers_upb", "ref_counted_ptr", - "rls_config_upb", - "rls_config_upbdefs", "slice", "slice_refcount", "sockaddr_utils", @@ -5373,16 +5369,6 @@ grpc_upb_proto_library( deps = ["//src/proto/grpc/lookup/v1:rls_proto_descriptor"], ) -grpc_upb_proto_library( - name = "rls_config_upb", - deps = ["//src/proto/grpc/lookup/v1:rls_config_proto_descriptor"], -) - -grpc_upb_proto_reflection_library( - name = "rls_config_upbdefs", - deps = ["//src/proto/grpc/lookup/v1:rls_config_proto_descriptor"], -) - WELL_KNOWN_PROTO_TARGETS = [ "any", "duration", diff --git a/CMakeLists.txt b/CMakeLists.txt index 92adbc9eb06..ca5471ce3c8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -442,9 +442,6 @@ protobuf_generate_grpc_cpp( protobuf_generate_grpc_cpp( src/proto/grpc/lookup/v1/rls.proto ) -protobuf_generate_grpc_cpp( - src/proto/grpc/lookup/v1/rls_config.proto -) protobuf_generate_grpc_cpp( src/proto/grpc/reflection/v1alpha/reflection.proto ) @@ -1656,7 +1653,6 @@ add_library(grpc src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c - src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.c src/core/ext/upb-generated/udpa/annotations/migrate.upb.c src/core/ext/upb-generated/udpa/annotations/security.upb.c src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c @@ -1791,7 +1787,6 @@ add_library(grpc src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c src/core/ext/upbdefs-generated/opencensus/proto/trace/v1/trace_config.upbdefs.c - src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.c src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c @@ -1824,7 +1819,6 @@ add_library(grpc src/core/ext/xds/xds_client.cc src/core/ext/xds/xds_client_stats.cc src/core/ext/xds/xds_cluster.cc - src/core/ext/xds/xds_cluster_specifier_plugin.cc src/core/ext/xds/xds_common_types.cc src/core/ext/xds/xds_endpoint.cc src/core/ext/xds/xds_http_fault_filter.cc @@ -3961,7 +3955,6 @@ add_library(upb third_party/upb/upb/decode.c third_party/upb/upb/def.c third_party/upb/upb/encode.c - third_party/upb/upb/json_encode.c third_party/upb/upb/msg.c third_party/upb/upb/reflection.c third_party/upb/upb/table.c @@ -14088,7 +14081,6 @@ add_executable(rls_end2end_test ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.h test/core/util/test_lb_policies.cc test/cpp/end2end/rls_end2end_test.cc - test/cpp/end2end/rls_server.cc test/cpp/end2end/test_service_impl.cc third_party/googletest/googletest/src/gtest-all.cc third_party/googletest/googlemock/src/gmock-all.cc @@ -16957,14 +16949,6 @@ if(gRPC_BUILD_TESTS) if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) add_executable(xds_end2end_test - ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/lookup/v1/rls.pb.cc - ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/lookup/v1/rls.grpc.pb.cc - ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/lookup/v1/rls.pb.h - ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/lookup/v1/rls.grpc.pb.h - ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/lookup/v1/rls_config.pb.cc - ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/lookup/v1/rls_config.grpc.pb.cc - ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/lookup/v1/rls_config.pb.h - ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/lookup/v1/rls_config.grpc.pb.h ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.pb.h @@ -17122,7 +17106,6 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/tls.pb.h ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/tls.grpc.pb.h src/cpp/server/csds/csds.cc - test/cpp/end2end/rls_server.cc test/cpp/end2end/test_service_impl.cc test/cpp/end2end/xds/xds_end2end_test.cc test/cpp/end2end/xds/xds_server.cc diff --git a/Makefile b/Makefile index 9fa48e9769a..9e8c78fb5b3 100644 --- a/Makefile +++ b/Makefile @@ -1242,7 +1242,6 @@ LIBGRPC_SRC = \ src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c \ src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c \ src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c \ - src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.c \ src/core/ext/upb-generated/udpa/annotations/migrate.upb.c \ src/core/ext/upb-generated/udpa/annotations/security.upb.c \ src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c \ @@ -1377,7 +1376,6 @@ LIBGRPC_SRC = \ src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c \ src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c \ src/core/ext/upbdefs-generated/opencensus/proto/trace/v1/trace_config.upbdefs.c \ - src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.c \ src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c \ src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c \ src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c \ @@ -1410,7 +1408,6 @@ LIBGRPC_SRC = \ src/core/ext/xds/xds_client.cc \ src/core/ext/xds/xds_client_stats.cc \ src/core/ext/xds/xds_cluster.cc \ - src/core/ext/xds/xds_cluster_specifier_plugin.cc \ src/core/ext/xds/xds_common_types.cc \ src/core/ext/xds/xds_endpoint.cc \ src/core/ext/xds/xds_http_fault_filter.cc \ @@ -2529,7 +2526,6 @@ LIBUPB_SRC = \ third_party/upb/upb/decode.c \ third_party/upb/upb/def.c \ third_party/upb/upb/encode.c \ - third_party/upb/upb/json_encode.c \ third_party/upb/upb/msg.c \ third_party/upb/upb/reflection.c \ third_party/upb/upb/table.c \ @@ -2947,7 +2943,6 @@ src/core/ext/upb-generated/opencensus/proto/trace/v1/trace_config.upb.c: $(OPENS src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c: $(OPENSSL_DEP) src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c: $(OPENSSL_DEP) src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c: $(OPENSSL_DEP) -src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.c: $(OPENSSL_DEP) src/core/ext/upb-generated/udpa/annotations/migrate.upb.c: $(OPENSSL_DEP) src/core/ext/upb-generated/udpa/annotations/security.upb.c: $(OPENSSL_DEP) src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c: $(OPENSSL_DEP) @@ -3079,7 +3074,6 @@ src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c: $(OPENSSL_DE src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c: $(OPENSSL_DEP) src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c: $(OPENSSL_DEP) src/core/ext/upbdefs-generated/opencensus/proto/trace/v1/trace_config.upbdefs.c: $(OPENSSL_DEP) -src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.c: $(OPENSSL_DEP) src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c: $(OPENSSL_DEP) src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c: $(OPENSSL_DEP) src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c: $(OPENSSL_DEP) @@ -3112,7 +3106,6 @@ src/core/ext/xds/xds_channel_stack_modifier.cc: $(OPENSSL_DEP) src/core/ext/xds/xds_client.cc: $(OPENSSL_DEP) src/core/ext/xds/xds_client_stats.cc: $(OPENSSL_DEP) src/core/ext/xds/xds_cluster.cc: $(OPENSSL_DEP) -src/core/ext/xds/xds_cluster_specifier_plugin.cc: $(OPENSSL_DEP) src/core/ext/xds/xds_common_types.cc: $(OPENSSL_DEP) src/core/ext/xds/xds_endpoint.cc: $(OPENSSL_DEP) src/core/ext/xds/xds_http_fault_filter.cc: $(OPENSSL_DEP) diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index d62ebe376eb..b7992335411 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -513,7 +513,6 @@ libs: - src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h - src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h - src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h - - src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.h - src/core/ext/upb-generated/udpa/annotations/migrate.upb.h - src/core/ext/upb-generated/udpa/annotations/security.upb.h - src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h @@ -648,7 +647,6 @@ libs: - src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.h - src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.h - src/core/ext/upbdefs-generated/opencensus/proto/trace/v1/trace_config.upbdefs.h - - src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.h - src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.h - src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.h - src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.h @@ -684,7 +682,6 @@ libs: - src/core/ext/xds/xds_client.h - src/core/ext/xds/xds_client_stats.h - src/core/ext/xds/xds_cluster.h - - src/core/ext/xds/xds_cluster_specifier_plugin.h - src/core/ext/xds/xds_common_types.h - src/core/ext/xds/xds_endpoint.h - src/core/ext/xds/xds_http_fault_filter.h @@ -1188,7 +1185,6 @@ libs: - src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c - src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c - src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c - - src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.c - src/core/ext/upb-generated/udpa/annotations/migrate.upb.c - src/core/ext/upb-generated/udpa/annotations/security.upb.c - src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c @@ -1323,7 +1319,6 @@ libs: - src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c - src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c - src/core/ext/upbdefs-generated/opencensus/proto/trace/v1/trace_config.upbdefs.c - - src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.c - src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c - src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c - src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c @@ -1356,7 +1351,6 @@ libs: - src/core/ext/xds/xds_client.cc - src/core/ext/xds/xds_client_stats.cc - src/core/ext/xds/xds_cluster.cc - - src/core/ext/xds/xds_cluster_specifier_plugin.cc - src/core/ext/xds/xds_common_types.cc - src/core/ext/xds/xds_endpoint.cc - src/core/ext/xds/xds_http_fault_filter.cc @@ -7126,7 +7120,6 @@ targets: headers: - test/core/util/test_lb_policies.h - test/cpp/end2end/counted_service.h - - test/cpp/end2end/rls_server.h - test/cpp/end2end/test_service_impl.h src: - src/proto/grpc/lookup/v1/rls.proto @@ -7136,7 +7129,6 @@ targets: - src/proto/grpc/testing/simple_messages.proto - test/core/util/test_lb_policies.cc - test/cpp/end2end/rls_end2end_test.cc - - test/cpp/end2end/rls_server.cc - test/cpp/end2end/test_service_impl.cc deps: - grpc++_test_config @@ -8352,13 +8344,10 @@ targets: headers: - src/cpp/server/csds/csds.h - test/cpp/end2end/counted_service.h - - test/cpp/end2end/rls_server.h - test/cpp/end2end/test_service_impl.h - test/cpp/end2end/xds/xds_server.h - test/cpp/util/tls_test_utils.h src: - - src/proto/grpc/lookup/v1/rls.proto - - src/proto/grpc/lookup/v1/rls_config.proto - src/proto/grpc/testing/duplicate/echo_duplicate.proto - src/proto/grpc/testing/echo.proto - src/proto/grpc/testing/echo_messages.proto @@ -8399,7 +8388,6 @@ targets: - src/proto/grpc/testing/xds/v3/string.proto - src/proto/grpc/testing/xds/v3/tls.proto - src/cpp/server/csds/csds.cc - - test/cpp/end2end/rls_server.cc - test/cpp/end2end/test_service_impl.cc - test/cpp/end2end/xds/xds_end2end_test.cc - test/cpp/end2end/xds/xds_server.cc diff --git a/config.m4 b/config.m4 index 4a40af5382c..aa1a9f3aae4 100644 --- a/config.m4 +++ b/config.m4 @@ -260,7 +260,6 @@ if test "$PHP_GRPC" != "no"; then src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c \ src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c \ src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c \ - src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.c \ src/core/ext/upb-generated/udpa/annotations/migrate.upb.c \ src/core/ext/upb-generated/udpa/annotations/security.upb.c \ src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c \ @@ -395,7 +394,6 @@ if test "$PHP_GRPC" != "no"; then src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c \ src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c \ src/core/ext/upbdefs-generated/opencensus/proto/trace/v1/trace_config.upbdefs.c \ - src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.c \ src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c \ src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c \ src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c \ @@ -428,7 +426,6 @@ if test "$PHP_GRPC" != "no"; then src/core/ext/xds/xds_client.cc \ src/core/ext/xds/xds_client_stats.cc \ src/core/ext/xds/xds_cluster.cc \ - src/core/ext/xds/xds_cluster_specifier_plugin.cc \ src/core/ext/xds/xds_common_types.cc \ src/core/ext/xds/xds_endpoint.cc \ src/core/ext/xds/xds_http_fault_filter.cc \ @@ -1153,7 +1150,6 @@ if test "$PHP_GRPC" != "no"; then third_party/upb/upb/decode_fast.c \ third_party/upb/upb/def.c \ third_party/upb/upb/encode.c \ - third_party/upb/upb/json_encode.c \ third_party/upb/upb/msg.c \ third_party/upb/upb/reflection.c \ third_party/upb/upb/table.c \ @@ -1284,7 +1280,6 @@ if test "$PHP_GRPC" != "no"; then PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/google/protobuf) PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/google/rpc) PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/opencensus/proto/trace/v1) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1) PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/udpa/annotations) PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/validate) PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/xds/annotations/v3) diff --git a/config.w32 b/config.w32 index 990db857c7f..dfc72f7db81 100644 --- a/config.w32 +++ b/config.w32 @@ -226,7 +226,6 @@ if (PHP_GRPC != "no") { "src\\core\\ext\\upb-generated\\src\\proto\\grpc\\health\\v1\\health.upb.c " + "src\\core\\ext\\upb-generated\\src\\proto\\grpc\\lb\\v1\\load_balancer.upb.c " + "src\\core\\ext\\upb-generated\\src\\proto\\grpc\\lookup\\v1\\rls.upb.c " + - "src\\core\\ext\\upb-generated\\src\\proto\\grpc\\lookup\\v1\\rls_config.upb.c " + "src\\core\\ext\\upb-generated\\udpa\\annotations\\migrate.upb.c " + "src\\core\\ext\\upb-generated\\udpa\\annotations\\security.upb.c " + "src\\core\\ext\\upb-generated\\udpa\\annotations\\sensitive.upb.c " + @@ -361,7 +360,6 @@ if (PHP_GRPC != "no") { "src\\core\\ext\\upbdefs-generated\\google\\protobuf\\wrappers.upbdefs.c " + "src\\core\\ext\\upbdefs-generated\\google\\rpc\\status.upbdefs.c " + "src\\core\\ext\\upbdefs-generated\\opencensus\\proto\\trace\\v1\\trace_config.upbdefs.c " + - "src\\core\\ext\\upbdefs-generated\\src\\proto\\grpc\\lookup\\v1\\rls_config.upbdefs.c " + "src\\core\\ext\\upbdefs-generated\\udpa\\annotations\\migrate.upbdefs.c " + "src\\core\\ext\\upbdefs-generated\\udpa\\annotations\\security.upbdefs.c " + "src\\core\\ext\\upbdefs-generated\\udpa\\annotations\\sensitive.upbdefs.c " + @@ -394,7 +392,6 @@ if (PHP_GRPC != "no") { "src\\core\\ext\\xds\\xds_client.cc " + "src\\core\\ext\\xds\\xds_client_stats.cc " + "src\\core\\ext\\xds\\xds_cluster.cc " + - "src\\core\\ext\\xds\\xds_cluster_specifier_plugin.cc " + "src\\core\\ext\\xds\\xds_common_types.cc " + "src\\core\\ext\\xds\\xds_endpoint.cc " + "src\\core\\ext\\xds\\xds_http_fault_filter.cc " + @@ -1119,7 +1116,6 @@ if (PHP_GRPC != "no") { "third_party\\upb\\upb\\decode_fast.c " + "third_party\\upb\\upb\\def.c " + "third_party\\upb\\upb\\encode.c " + - "third_party\\upb\\upb\\json_encode.c " + "third_party\\upb\\upb\\msg.c " + "third_party\\upb\\upb\\reflection.c " + "third_party\\upb\\upb\\table.c " + @@ -1390,11 +1386,6 @@ if (PHP_GRPC != "no") { FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\opencensus\\proto"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\opencensus\\proto\\trace"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\opencensus\\proto\\trace\\v1"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\src"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\src\\proto"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\src\\proto\\grpc"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\src\\proto\\grpc\\lookup"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\src\\proto\\grpc\\lookup\\v1"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\udpa"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\udpa\\annotations"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\validate"); diff --git a/gRPC-C++.podspec b/gRPC-C++.podspec index 224de8efaeb..083a2998934 100644 --- a/gRPC-C++.podspec +++ b/gRPC-C++.podspec @@ -453,7 +453,6 @@ Pod::Spec.new do |s| 'src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h', 'src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h', 'src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h', - 'src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.h', 'src/core/ext/upb-generated/udpa/annotations/migrate.upb.h', 'src/core/ext/upb-generated/udpa/annotations/security.upb.h', 'src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h', @@ -588,7 +587,6 @@ Pod::Spec.new do |s| 'src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.h', 'src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.h', 'src/core/ext/upbdefs-generated/opencensus/proto/trace/v1/trace_config.upbdefs.h', - 'src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.h', 'src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.h', 'src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.h', 'src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.h', @@ -624,7 +622,6 @@ Pod::Spec.new do |s| 'src/core/ext/xds/xds_client.h', 'src/core/ext/xds/xds_client_stats.h', 'src/core/ext/xds/xds_cluster.h', - 'src/core/ext/xds/xds_cluster_specifier_plugin.h', 'src/core/ext/xds/xds_common_types.h', 'src/core/ext/xds/xds_endpoint.h', 'src/core/ext/xds/xds_http_fault_filter.h', @@ -1027,7 +1024,6 @@ Pod::Spec.new do |s| 'third_party/upb/upb/def.h', 'third_party/upb/upb/def.hpp', 'third_party/upb/upb/encode.h', - 'third_party/upb/upb/json_encode.h', 'third_party/upb/upb/msg.h', 'third_party/upb/upb/msg_internal.h', 'third_party/upb/upb/port_def.inc', @@ -1262,7 +1258,6 @@ Pod::Spec.new do |s| 'src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h', 'src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h', 'src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h', - 'src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.h', 'src/core/ext/upb-generated/udpa/annotations/migrate.upb.h', 'src/core/ext/upb-generated/udpa/annotations/security.upb.h', 'src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h', @@ -1397,7 +1392,6 @@ Pod::Spec.new do |s| 'src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.h', 'src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.h', 'src/core/ext/upbdefs-generated/opencensus/proto/trace/v1/trace_config.upbdefs.h', - 'src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.h', 'src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.h', 'src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.h', 'src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.h', @@ -1433,7 +1427,6 @@ Pod::Spec.new do |s| 'src/core/ext/xds/xds_client.h', 'src/core/ext/xds/xds_client_stats.h', 'src/core/ext/xds/xds_cluster.h', - 'src/core/ext/xds/xds_cluster_specifier_plugin.h', 'src/core/ext/xds/xds_common_types.h', 'src/core/ext/xds/xds_endpoint.h', 'src/core/ext/xds/xds_http_fault_filter.h', @@ -1786,7 +1779,6 @@ Pod::Spec.new do |s| 'third_party/upb/upb/def.h', 'third_party/upb/upb/def.hpp', 'third_party/upb/upb/encode.h', - 'third_party/upb/upb/json_encode.h', 'third_party/upb/upb/msg.h', 'third_party/upb/upb/msg_internal.h', 'third_party/upb/upb/port_def.inc', diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index 0a860019718..1b106b25d7e 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -612,8 +612,6 @@ Pod::Spec.new do |s| 'src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h', 'src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c', 'src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h', - 'src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.c', - 'src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.h', 'src/core/ext/upb-generated/udpa/annotations/migrate.upb.c', 'src/core/ext/upb-generated/udpa/annotations/migrate.upb.h', 'src/core/ext/upb-generated/udpa/annotations/security.upb.c', @@ -882,8 +880,6 @@ Pod::Spec.new do |s| 'src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.h', 'src/core/ext/upbdefs-generated/opencensus/proto/trace/v1/trace_config.upbdefs.c', 'src/core/ext/upbdefs-generated/opencensus/proto/trace/v1/trace_config.upbdefs.h', - 'src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.c', - 'src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.h', 'src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c', 'src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.h', 'src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c', @@ -951,8 +947,6 @@ Pod::Spec.new do |s| 'src/core/ext/xds/xds_client_stats.h', 'src/core/ext/xds/xds_cluster.cc', 'src/core/ext/xds/xds_cluster.h', - 'src/core/ext/xds/xds_cluster_specifier_plugin.cc', - 'src/core/ext/xds/xds_cluster_specifier_plugin.h', 'src/core/ext/xds/xds_common_types.cc', 'src/core/ext/xds/xds_common_types.h', 'src/core/ext/xds/xds_endpoint.cc', @@ -1644,8 +1638,6 @@ Pod::Spec.new do |s| 'third_party/upb/upb/def.hpp', 'third_party/upb/upb/encode.c', 'third_party/upb/upb/encode.h', - 'third_party/upb/upb/json_encode.c', - 'third_party/upb/upb/json_encode.h', 'third_party/upb/upb/msg.c', 'third_party/upb/upb/msg.h', 'third_party/upb/upb/msg_internal.h', @@ -1864,7 +1856,6 @@ Pod::Spec.new do |s| 'src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h', 'src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h', 'src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h', - 'src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.h', 'src/core/ext/upb-generated/udpa/annotations/migrate.upb.h', 'src/core/ext/upb-generated/udpa/annotations/security.upb.h', 'src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h', @@ -1999,7 +1990,6 @@ Pod::Spec.new do |s| 'src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.h', 'src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.h', 'src/core/ext/upbdefs-generated/opencensus/proto/trace/v1/trace_config.upbdefs.h', - 'src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.h', 'src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.h', 'src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.h', 'src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.h', @@ -2035,7 +2025,6 @@ Pod::Spec.new do |s| 'src/core/ext/xds/xds_client.h', 'src/core/ext/xds/xds_client_stats.h', 'src/core/ext/xds/xds_cluster.h', - 'src/core/ext/xds/xds_cluster_specifier_plugin.h', 'src/core/ext/xds/xds_common_types.h', 'src/core/ext/xds/xds_endpoint.h', 'src/core/ext/xds/xds_http_fault_filter.h', @@ -2378,7 +2367,6 @@ Pod::Spec.new do |s| 'third_party/upb/upb/def.h', 'third_party/upb/upb/def.hpp', 'third_party/upb/upb/encode.h', - 'third_party/upb/upb/json_encode.h', 'third_party/upb/upb/msg.h', 'third_party/upb/upb/msg_internal.h', 'third_party/upb/upb/port_def.inc', diff --git a/grpc.gemspec b/grpc.gemspec index 2465cae2653..8a56c3841a0 100644 --- a/grpc.gemspec +++ b/grpc.gemspec @@ -531,8 +531,6 @@ Gem::Specification.new do |s| s.files += %w( src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h ) s.files += %w( src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c ) s.files += %w( src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h ) - s.files += %w( src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.c ) - s.files += %w( src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.h ) s.files += %w( src/core/ext/upb-generated/udpa/annotations/migrate.upb.c ) s.files += %w( src/core/ext/upb-generated/udpa/annotations/migrate.upb.h ) s.files += %w( src/core/ext/upb-generated/udpa/annotations/security.upb.c ) @@ -801,8 +799,6 @@ Gem::Specification.new do |s| s.files += %w( src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.h ) s.files += %w( src/core/ext/upbdefs-generated/opencensus/proto/trace/v1/trace_config.upbdefs.c ) s.files += %w( src/core/ext/upbdefs-generated/opencensus/proto/trace/v1/trace_config.upbdefs.h ) - s.files += %w( src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.c ) - s.files += %w( src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.h ) s.files += %w( src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c ) s.files += %w( src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.h ) s.files += %w( src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c ) @@ -870,8 +866,6 @@ Gem::Specification.new do |s| s.files += %w( src/core/ext/xds/xds_client_stats.h ) s.files += %w( src/core/ext/xds/xds_cluster.cc ) s.files += %w( src/core/ext/xds/xds_cluster.h ) - s.files += %w( src/core/ext/xds/xds_cluster_specifier_plugin.cc ) - s.files += %w( src/core/ext/xds/xds_cluster_specifier_plugin.h ) s.files += %w( src/core/ext/xds/xds_common_types.cc ) s.files += %w( src/core/ext/xds/xds_common_types.h ) s.files += %w( src/core/ext/xds/xds_endpoint.cc ) @@ -2442,8 +2436,6 @@ Gem::Specification.new do |s| s.files += %w( third_party/upb/upb/def.hpp ) s.files += %w( third_party/upb/upb/encode.c ) s.files += %w( third_party/upb/upb/encode.h ) - s.files += %w( third_party/upb/upb/json_encode.c ) - s.files += %w( third_party/upb/upb/json_encode.h ) s.files += %w( third_party/upb/upb/msg.c ) s.files += %w( third_party/upb/upb/msg.h ) s.files += %w( third_party/upb/upb/msg_internal.h ) diff --git a/grpc.gyp b/grpc.gyp index 3a796ce45b8..ca719c20de5 100644 --- a/grpc.gyp +++ b/grpc.gyp @@ -590,7 +590,6 @@ 'src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c', 'src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c', 'src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c', - 'src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.c', 'src/core/ext/upb-generated/udpa/annotations/migrate.upb.c', 'src/core/ext/upb-generated/udpa/annotations/security.upb.c', 'src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c', @@ -725,7 +724,6 @@ 'src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c', 'src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c', 'src/core/ext/upbdefs-generated/opencensus/proto/trace/v1/trace_config.upbdefs.c', - 'src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.c', 'src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c', 'src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c', 'src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c', @@ -758,7 +756,6 @@ 'src/core/ext/xds/xds_client.cc', 'src/core/ext/xds/xds_client_stats.cc', 'src/core/ext/xds/xds_cluster.cc', - 'src/core/ext/xds/xds_cluster_specifier_plugin.cc', 'src/core/ext/xds/xds_common_types.cc', 'src/core/ext/xds/xds_endpoint.cc', 'src/core/ext/xds/xds_http_fault_filter.cc', @@ -2039,7 +2036,6 @@ 'third_party/upb/upb/decode.c', 'third_party/upb/upb/def.c', 'third_party/upb/upb/encode.c', - 'third_party/upb/upb/json_encode.c', 'third_party/upb/upb/msg.c', 'third_party/upb/upb/reflection.c', 'third_party/upb/upb/table.c', diff --git a/package.xml b/package.xml index 32f6916f712..f7c2e8ff347 100644 --- a/package.xml +++ b/package.xml @@ -511,8 +511,6 @@ - - @@ -781,8 +779,6 @@ - - @@ -850,8 +846,6 @@ - - @@ -2358,8 +2352,6 @@ - - diff --git a/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc b/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc index e7bd80895f9..068af6102a1 100644 --- a/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +++ b/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc @@ -83,7 +83,7 @@ TraceFlag grpc_lb_rls_trace(false, "rls_lb"); namespace { -const char* kRls = "rls_experimental"; +const char* kRls = "rls"; const char kGrpc[] = "grpc"; const char* kRlsRequestPath = "/grpc.lookup.v1.RouteLookupService/RouteLookup"; const char* kFakeTargetFieldValue = "fake_target_field_value"; @@ -2530,9 +2530,18 @@ class RlsLbFactory : public LoadBalancingPolicyFactory { } }; +bool RlsEnabled() { + char* value = gpr_getenv("GRPC_EXPERIMENTAL_ENABLE_RLS_LB_POLICY"); + bool parsed_value; + bool parse_succeeded = gpr_parse_bool_value(value, &parsed_value); + gpr_free(value); + return parse_succeeded && parsed_value; +} + } // namespace void RlsLbPluginInit() { + if (!RlsEnabled()) return; LoadBalancingPolicyRegistry::Builder::RegisterLoadBalancingPolicyFactory( absl::make_unique()); } diff --git a/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc b/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc index 5c3e0ef1c34..b30debc2652 100644 --- a/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +++ b/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc @@ -330,9 +330,6 @@ class XdsResolver : public Resolver { std::string route_config_name_; RouteConfigWatcher* route_config_watcher_ = nullptr; XdsRouteConfigResource::VirtualHost current_virtual_host_; - std::map - cluster_specifier_plugin_map_; ClusterState::ClusterStateMap cluster_state_map_; }; @@ -419,23 +416,13 @@ XdsResolver::XdsConfigSelector::XdsConfigSelector( resolver_->current_listener_.http_connection_manager .http_max_stream_duration; } - if (route_action->action.index() == - XdsRouteConfigResource::Route::RouteAction::kClusterIndex) { + if (route_action->weighted_clusters.empty()) { *error = CreateMethodConfig(route_entry.route, nullptr, &route_entry.method_config); - MaybeAddCluster(absl::StrCat( - "cluster:", - absl::get< - XdsRouteConfigResource::Route::RouteAction::kClusterIndex>( - route_action->action))); - } else if (route_action->action.index() == - XdsRouteConfigResource::Route::RouteAction:: - kWeightedClustersIndex) { - auto& action_weighted_clusters = absl::get< - XdsRouteConfigResource::Route::RouteAction::kWeightedClustersIndex>( - route_action->action); + MaybeAddCluster(route_action->cluster_name); + } else { uint32_t end = 0; - for (const auto& weighted_cluster : action_weighted_clusters) { + for (const auto& weighted_cluster : route_action->weighted_clusters) { Route::ClusterWeightState cluster_weight_state; *error = CreateMethodConfig(route_entry.route, &weighted_cluster, &cluster_weight_state.method_config); @@ -445,18 +432,8 @@ XdsResolver::XdsConfigSelector::XdsConfigSelector( cluster_weight_state.cluster = weighted_cluster.name; route_entry.weighted_cluster_state.push_back( std::move(cluster_weight_state)); - MaybeAddCluster(absl::StrCat("cluster:", weighted_cluster.name)); + MaybeAddCluster(weighted_cluster.name); } - } else if (route_action->action.index() == - XdsRouteConfigResource::Route::RouteAction:: - kClusterSpecifierPluginIndex) { - // cluster_specifier_plugin case: - *error = CreateMethodConfig(route_entry.route, nullptr, - &route_entry.method_config); - MaybeAddCluster(absl::StrCat( - "cluster_specifier_plugin:", - absl::get(route_action->action))); } } } @@ -635,18 +612,12 @@ ConfigSelector::CallConfig XdsResolver::XdsConfigSelector::GetCallConfig( GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE); return call_config; } - std::string cluster_name; + absl::string_view cluster_name; RefCountedPtr method_config; - if (route_action->action.index() == - XdsRouteConfigResource::Route::RouteAction::kClusterIndex) { - cluster_name = absl::StrCat( - "cluster:", - absl::get( - route_action->action)); + if (route_action->weighted_clusters.empty()) { + cluster_name = route_action->cluster_name; method_config = entry.method_config; - } else if (route_action->action.index() == - XdsRouteConfigResource::Route::RouteAction:: - kWeightedClustersIndex) { + } else { const uint32_t key = rand() % entry.weighted_cluster_state[entry.weighted_cluster_state.size() - 1] @@ -669,17 +640,8 @@ ConfigSelector::CallConfig XdsResolver::XdsConfigSelector::GetCallConfig( } if (index == 0) index = start_index; GPR_ASSERT(entry.weighted_cluster_state[index].range_end > key); - cluster_name = - absl::StrCat("cluster:", entry.weighted_cluster_state[index].cluster); + cluster_name = entry.weighted_cluster_state[index].cluster; method_config = entry.weighted_cluster_state[index].method_config; - } else if (route_action->action.index() == - XdsRouteConfigResource::Route::RouteAction:: - kClusterSpecifierPluginIndex) { - cluster_name = absl::StrCat( - "cluster_specifier_plugin:", - absl::get(route_action->action)); - method_config = entry.method_config; } auto it = clusters_.find(cluster_name); GPR_ASSERT(it != clusters_.end()); @@ -901,8 +863,6 @@ void XdsResolver::OnRouteConfigUpdate(XdsRouteConfigResource rds_update) { } // Save the virtual host in the resolver. current_virtual_host_ = std::move(rds_update.virtual_hosts[*vhost_index]); - cluster_specifier_plugin_map_ = - std::move(rds_update.cluster_specifier_plugin_map); // Send a new result to the channel. GenerateResult(); } @@ -940,26 +900,15 @@ absl::StatusOr> XdsResolver::CreateServiceConfig() { std::vector clusters; for (const auto& cluster : cluster_state_map_) { - absl::string_view child_name = cluster.first; - if (absl::ConsumePrefix(&child_name, "cluster_specifier_plugin:")) { - clusters.push_back(absl::StrFormat( - " \"%s\":{\n" - " \"childPolicy\": %s\n" - " }", - cluster.first, - cluster_specifier_plugin_map_[std::string(child_name)])); - } else { - absl::ConsumePrefix(&child_name, "cluster:"); - clusters.push_back( - absl::StrFormat(" \"%s\":{\n" - " \"childPolicy\":[ {\n" - " \"cds_experimental\":{\n" - " \"cluster\": \"%s\"\n" - " }\n" - " } ]\n" - " }", - cluster.first, child_name)); - } + clusters.push_back( + absl::StrFormat(" \"%s\":{\n" + " \"childPolicy\":[ {\n" + " \"cds_experimental\":{\n" + " \"cluster\": \"%s\"\n" + " }\n" + " } ]\n" + " }", + cluster.first, cluster.first)); } std::vector config_parts; config_parts.push_back( diff --git a/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.c b/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.c deleted file mode 100644 index aa69eaf7f41..00000000000 --- a/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.c +++ /dev/null @@ -1,172 +0,0 @@ -/* This file was generated by upbc (the upb compiler) from the input - * file: - * - * src/proto/grpc/lookup/v1/rls_config.proto - * - * Do not edit -- your changes will be discarded when the file is - * regenerated. */ - -#include -#include "upb/msg_internal.h" -#include "src/proto/grpc/lookup/v1/rls_config.upb.h" -#include "google/protobuf/duration.upb.h" - -#include "upb/port_def.inc" - -static const upb_MiniTable_Field grpc_lookup_v1_NameMatcher__fields[3] = { - {1, UPB_SIZE(4, 8), 0, 0, 9, kUpb_FieldMode_Scalar | (upb_FieldRep_StringView << upb_FieldRep_Shift)}, - {2, UPB_SIZE(12, 24), 0, 0, 9, kUpb_FieldMode_Array | (upb_FieldRep_Pointer << upb_FieldRep_Shift)}, - {3, UPB_SIZE(0, 0), 0, 0, 8, kUpb_FieldMode_Scalar | (upb_FieldRep_1Byte << upb_FieldRep_Shift)}, -}; - -const upb_MiniTable grpc_lookup_v1_NameMatcher_msginit = { - NULL, - &grpc_lookup_v1_NameMatcher__fields[0], - UPB_SIZE(16, 32), 3, upb_ExtMode_NonExtendable, 3, 255, 0, -}; - -static const upb_MiniTable_Sub grpc_lookup_v1_GrpcKeyBuilder_submsgs[4] = { - {.submsg = &grpc_lookup_v1_GrpcKeyBuilder_ConstantKeysEntry_msginit}, - {.submsg = &grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys_msginit}, - {.submsg = &grpc_lookup_v1_GrpcKeyBuilder_Name_msginit}, - {.submsg = &grpc_lookup_v1_NameMatcher_msginit}, -}; - -static const upb_MiniTable_Field grpc_lookup_v1_GrpcKeyBuilder__fields[4] = { - {1, UPB_SIZE(8, 16), 0, 2, 11, kUpb_FieldMode_Array | (upb_FieldRep_Pointer << upb_FieldRep_Shift)}, - {2, UPB_SIZE(12, 24), 0, 3, 11, kUpb_FieldMode_Array | (upb_FieldRep_Pointer << upb_FieldRep_Shift)}, - {3, UPB_SIZE(4, 8), 1, 1, 11, kUpb_FieldMode_Scalar | (upb_FieldRep_Pointer << upb_FieldRep_Shift)}, - {4, UPB_SIZE(16, 32), 0, 0, 11, kUpb_FieldMode_Map | (upb_FieldRep_Pointer << upb_FieldRep_Shift)}, -}; - -const upb_MiniTable grpc_lookup_v1_GrpcKeyBuilder_msginit = { - &grpc_lookup_v1_GrpcKeyBuilder_submsgs[0], - &grpc_lookup_v1_GrpcKeyBuilder__fields[0], - UPB_SIZE(24, 40), 4, upb_ExtMode_NonExtendable, 4, 255, 0, -}; - -static const upb_MiniTable_Field grpc_lookup_v1_GrpcKeyBuilder_Name__fields[2] = { - {1, UPB_SIZE(0, 0), 0, 0, 9, kUpb_FieldMode_Scalar | (upb_FieldRep_StringView << upb_FieldRep_Shift)}, - {2, UPB_SIZE(8, 16), 0, 0, 9, kUpb_FieldMode_Scalar | (upb_FieldRep_StringView << upb_FieldRep_Shift)}, -}; - -const upb_MiniTable grpc_lookup_v1_GrpcKeyBuilder_Name_msginit = { - NULL, - &grpc_lookup_v1_GrpcKeyBuilder_Name__fields[0], - UPB_SIZE(16, 32), 2, upb_ExtMode_NonExtendable, 2, 255, 0, -}; - -static const upb_MiniTable_Field grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys__fields[3] = { - {1, UPB_SIZE(0, 0), 0, 0, 9, kUpb_FieldMode_Scalar | (upb_FieldRep_StringView << upb_FieldRep_Shift)}, - {2, UPB_SIZE(8, 16), 0, 0, 9, kUpb_FieldMode_Scalar | (upb_FieldRep_StringView << upb_FieldRep_Shift)}, - {3, UPB_SIZE(16, 32), 0, 0, 9, kUpb_FieldMode_Scalar | (upb_FieldRep_StringView << upb_FieldRep_Shift)}, -}; - -const upb_MiniTable grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys_msginit = { - NULL, - &grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys__fields[0], - UPB_SIZE(24, 48), 3, upb_ExtMode_NonExtendable, 3, 255, 0, -}; - -static const upb_MiniTable_Field grpc_lookup_v1_GrpcKeyBuilder_ConstantKeysEntry__fields[2] = { - {1, UPB_SIZE(0, 0), 0, 0, 9, kUpb_FieldMode_Scalar | (upb_FieldRep_StringView << upb_FieldRep_Shift)}, - {2, UPB_SIZE(8, 16), 0, 0, 9, kUpb_FieldMode_Scalar | (upb_FieldRep_StringView << upb_FieldRep_Shift)}, -}; - -const upb_MiniTable grpc_lookup_v1_GrpcKeyBuilder_ConstantKeysEntry_msginit = { - NULL, - &grpc_lookup_v1_GrpcKeyBuilder_ConstantKeysEntry__fields[0], - UPB_SIZE(16, 32), 2, upb_ExtMode_NonExtendable, 2, 255, 0, -}; - -static const upb_MiniTable_Sub grpc_lookup_v1_HttpKeyBuilder_submsgs[2] = { - {.submsg = &grpc_lookup_v1_HttpKeyBuilder_ConstantKeysEntry_msginit}, - {.submsg = &grpc_lookup_v1_NameMatcher_msginit}, -}; - -static const upb_MiniTable_Field grpc_lookup_v1_HttpKeyBuilder__fields[5] = { - {1, UPB_SIZE(0, 0), 0, 0, 9, kUpb_FieldMode_Array | (upb_FieldRep_Pointer << upb_FieldRep_Shift)}, - {2, UPB_SIZE(4, 8), 0, 0, 9, kUpb_FieldMode_Array | (upb_FieldRep_Pointer << upb_FieldRep_Shift)}, - {3, UPB_SIZE(8, 16), 0, 1, 11, kUpb_FieldMode_Array | (upb_FieldRep_Pointer << upb_FieldRep_Shift)}, - {4, UPB_SIZE(12, 24), 0, 1, 11, kUpb_FieldMode_Array | (upb_FieldRep_Pointer << upb_FieldRep_Shift)}, - {5, UPB_SIZE(16, 32), 0, 0, 11, kUpb_FieldMode_Map | (upb_FieldRep_Pointer << upb_FieldRep_Shift)}, -}; - -const upb_MiniTable grpc_lookup_v1_HttpKeyBuilder_msginit = { - &grpc_lookup_v1_HttpKeyBuilder_submsgs[0], - &grpc_lookup_v1_HttpKeyBuilder__fields[0], - UPB_SIZE(24, 40), 5, upb_ExtMode_NonExtendable, 5, 255, 0, -}; - -static const upb_MiniTable_Field grpc_lookup_v1_HttpKeyBuilder_ConstantKeysEntry__fields[2] = { - {1, UPB_SIZE(0, 0), 0, 0, 9, kUpb_FieldMode_Scalar | (upb_FieldRep_StringView << upb_FieldRep_Shift)}, - {2, UPB_SIZE(8, 16), 0, 0, 9, kUpb_FieldMode_Scalar | (upb_FieldRep_StringView << upb_FieldRep_Shift)}, -}; - -const upb_MiniTable grpc_lookup_v1_HttpKeyBuilder_ConstantKeysEntry_msginit = { - NULL, - &grpc_lookup_v1_HttpKeyBuilder_ConstantKeysEntry__fields[0], - UPB_SIZE(16, 32), 2, upb_ExtMode_NonExtendable, 2, 255, 0, -}; - -static const upb_MiniTable_Sub grpc_lookup_v1_RouteLookupConfig_submsgs[3] = { - {.submsg = &google_protobuf_Duration_msginit}, - {.submsg = &grpc_lookup_v1_GrpcKeyBuilder_msginit}, - {.submsg = &grpc_lookup_v1_HttpKeyBuilder_msginit}, -}; - -static const upb_MiniTable_Field grpc_lookup_v1_RouteLookupConfig__fields[9] = { - {1, UPB_SIZE(44, 72), 0, 2, 11, kUpb_FieldMode_Array | (upb_FieldRep_Pointer << upb_FieldRep_Shift)}, - {2, UPB_SIZE(48, 80), 0, 1, 11, kUpb_FieldMode_Array | (upb_FieldRep_Pointer << upb_FieldRep_Shift)}, - {3, UPB_SIZE(16, 16), 0, 0, 9, kUpb_FieldMode_Scalar | (upb_FieldRep_StringView << upb_FieldRep_Shift)}, - {4, UPB_SIZE(32, 48), 1, 0, 11, kUpb_FieldMode_Scalar | (upb_FieldRep_Pointer << upb_FieldRep_Shift)}, - {5, UPB_SIZE(36, 56), 2, 0, 11, kUpb_FieldMode_Scalar | (upb_FieldRep_Pointer << upb_FieldRep_Shift)}, - {6, UPB_SIZE(40, 64), 3, 0, 11, kUpb_FieldMode_Scalar | (upb_FieldRep_Pointer << upb_FieldRep_Shift)}, - {7, UPB_SIZE(8, 8), 0, 0, 3, kUpb_FieldMode_Scalar | (upb_FieldRep_8Byte << upb_FieldRep_Shift)}, - {8, UPB_SIZE(52, 88), 0, 0, 9, kUpb_FieldMode_Array | (upb_FieldRep_Pointer << upb_FieldRep_Shift)}, - {9, UPB_SIZE(24, 32), 0, 0, 9, kUpb_FieldMode_Scalar | (upb_FieldRep_StringView << upb_FieldRep_Shift)}, -}; - -const upb_MiniTable grpc_lookup_v1_RouteLookupConfig_msginit = { - &grpc_lookup_v1_RouteLookupConfig_submsgs[0], - &grpc_lookup_v1_RouteLookupConfig__fields[0], - UPB_SIZE(56, 96), 9, upb_ExtMode_NonExtendable, 9, 255, 0, -}; - -static const upb_MiniTable_Sub grpc_lookup_v1_RouteLookupClusterSpecifier_submsgs[1] = { - {.submsg = &grpc_lookup_v1_RouteLookupConfig_msginit}, -}; - -static const upb_MiniTable_Field grpc_lookup_v1_RouteLookupClusterSpecifier__fields[1] = { - {1, UPB_SIZE(4, 8), 1, 0, 11, kUpb_FieldMode_Scalar | (upb_FieldRep_Pointer << upb_FieldRep_Shift)}, -}; - -const upb_MiniTable grpc_lookup_v1_RouteLookupClusterSpecifier_msginit = { - &grpc_lookup_v1_RouteLookupClusterSpecifier_submsgs[0], - &grpc_lookup_v1_RouteLookupClusterSpecifier__fields[0], - UPB_SIZE(8, 16), 1, upb_ExtMode_NonExtendable, 1, 255, 0, -}; - -static const upb_MiniTable *messages_layout[9] = { - &grpc_lookup_v1_NameMatcher_msginit, - &grpc_lookup_v1_GrpcKeyBuilder_msginit, - &grpc_lookup_v1_GrpcKeyBuilder_Name_msginit, - &grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys_msginit, - &grpc_lookup_v1_GrpcKeyBuilder_ConstantKeysEntry_msginit, - &grpc_lookup_v1_HttpKeyBuilder_msginit, - &grpc_lookup_v1_HttpKeyBuilder_ConstantKeysEntry_msginit, - &grpc_lookup_v1_RouteLookupConfig_msginit, - &grpc_lookup_v1_RouteLookupClusterSpecifier_msginit, -}; - -const upb_MiniTable_File src_proto_grpc_lookup_v1_rls_config_proto_upb_file_layout = { - messages_layout, - NULL, - NULL, - 9, - 0, - 0, -}; - -#include "upb/port_undef.inc" - diff --git a/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.h b/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.h deleted file mode 100644 index fefd848cd8f..00000000000 --- a/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.h +++ /dev/null @@ -1,623 +0,0 @@ -/* This file was generated by upbc (the upb compiler) from the input - * file: - * - * src/proto/grpc/lookup/v1/rls_config.proto - * - * Do not edit -- your changes will be discarded when the file is - * regenerated. */ - -#ifndef SRC_PROTO_GRPC_LOOKUP_V1_RLS_CONFIG_PROTO_UPB_H_ -#define SRC_PROTO_GRPC_LOOKUP_V1_RLS_CONFIG_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 grpc_lookup_v1_NameMatcher; -struct grpc_lookup_v1_GrpcKeyBuilder; -struct grpc_lookup_v1_GrpcKeyBuilder_Name; -struct grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys; -struct grpc_lookup_v1_GrpcKeyBuilder_ConstantKeysEntry; -struct grpc_lookup_v1_HttpKeyBuilder; -struct grpc_lookup_v1_HttpKeyBuilder_ConstantKeysEntry; -struct grpc_lookup_v1_RouteLookupConfig; -struct grpc_lookup_v1_RouteLookupClusterSpecifier; -typedef struct grpc_lookup_v1_NameMatcher grpc_lookup_v1_NameMatcher; -typedef struct grpc_lookup_v1_GrpcKeyBuilder grpc_lookup_v1_GrpcKeyBuilder; -typedef struct grpc_lookup_v1_GrpcKeyBuilder_Name grpc_lookup_v1_GrpcKeyBuilder_Name; -typedef struct grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys; -typedef struct grpc_lookup_v1_GrpcKeyBuilder_ConstantKeysEntry grpc_lookup_v1_GrpcKeyBuilder_ConstantKeysEntry; -typedef struct grpc_lookup_v1_HttpKeyBuilder grpc_lookup_v1_HttpKeyBuilder; -typedef struct grpc_lookup_v1_HttpKeyBuilder_ConstantKeysEntry grpc_lookup_v1_HttpKeyBuilder_ConstantKeysEntry; -typedef struct grpc_lookup_v1_RouteLookupConfig grpc_lookup_v1_RouteLookupConfig; -typedef struct grpc_lookup_v1_RouteLookupClusterSpecifier grpc_lookup_v1_RouteLookupClusterSpecifier; -extern const upb_MiniTable grpc_lookup_v1_NameMatcher_msginit; -extern const upb_MiniTable grpc_lookup_v1_GrpcKeyBuilder_msginit; -extern const upb_MiniTable grpc_lookup_v1_GrpcKeyBuilder_Name_msginit; -extern const upb_MiniTable grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys_msginit; -extern const upb_MiniTable grpc_lookup_v1_GrpcKeyBuilder_ConstantKeysEntry_msginit; -extern const upb_MiniTable grpc_lookup_v1_HttpKeyBuilder_msginit; -extern const upb_MiniTable grpc_lookup_v1_HttpKeyBuilder_ConstantKeysEntry_msginit; -extern const upb_MiniTable grpc_lookup_v1_RouteLookupConfig_msginit; -extern const upb_MiniTable grpc_lookup_v1_RouteLookupClusterSpecifier_msginit; -struct google_protobuf_Duration; -extern const upb_MiniTable google_protobuf_Duration_msginit; - - - -/* grpc.lookup.v1.NameMatcher */ - -UPB_INLINE grpc_lookup_v1_NameMatcher* grpc_lookup_v1_NameMatcher_new(upb_Arena* arena) { - return (grpc_lookup_v1_NameMatcher*)_upb_Message_New(&grpc_lookup_v1_NameMatcher_msginit, arena); -} -UPB_INLINE grpc_lookup_v1_NameMatcher* grpc_lookup_v1_NameMatcher_parse(const char* buf, size_t size, upb_Arena* arena) { - grpc_lookup_v1_NameMatcher* ret = grpc_lookup_v1_NameMatcher_new(arena); - if (!ret) return NULL; - if (upb_Decode(buf, size, ret, &grpc_lookup_v1_NameMatcher_msginit, NULL, 0, arena) != kUpb_DecodeStatus_Ok) { - return NULL; - } - return ret; -} -UPB_INLINE grpc_lookup_v1_NameMatcher* grpc_lookup_v1_NameMatcher_parse_ex(const char* buf, size_t size, - const upb_ExtensionRegistry* extreg, - int options, upb_Arena* arena) { - grpc_lookup_v1_NameMatcher* ret = grpc_lookup_v1_NameMatcher_new(arena); - if (!ret) return NULL; - if (upb_Decode(buf, size, ret, &grpc_lookup_v1_NameMatcher_msginit, extreg, options, arena) != - kUpb_DecodeStatus_Ok) { - return NULL; - } - return ret; -} -UPB_INLINE char* grpc_lookup_v1_NameMatcher_serialize(const grpc_lookup_v1_NameMatcher* msg, upb_Arena* arena, size_t* len) { - return upb_Encode(msg, &grpc_lookup_v1_NameMatcher_msginit, 0, arena, len); -} -UPB_INLINE char* grpc_lookup_v1_NameMatcher_serialize_ex(const grpc_lookup_v1_NameMatcher* msg, int options, - upb_Arena* arena, size_t* len) { - return upb_Encode(msg, &grpc_lookup_v1_NameMatcher_msginit, options, arena, len); -} -UPB_INLINE upb_StringView grpc_lookup_v1_NameMatcher_key(const grpc_lookup_v1_NameMatcher* msg) { - return *UPB_PTR_AT(msg, UPB_SIZE(4, 8), upb_StringView); -} -UPB_INLINE upb_StringView const* grpc_lookup_v1_NameMatcher_names(const grpc_lookup_v1_NameMatcher *msg, size_t *len) { return (upb_StringView const*)_upb_array_accessor(msg, UPB_SIZE(12, 24), len); } -UPB_INLINE bool grpc_lookup_v1_NameMatcher_required_match(const grpc_lookup_v1_NameMatcher* msg) { - return *UPB_PTR_AT(msg, UPB_SIZE(0, 0), bool); -} - -UPB_INLINE void grpc_lookup_v1_NameMatcher_set_key(grpc_lookup_v1_NameMatcher *msg, upb_StringView value) { - *UPB_PTR_AT(msg, UPB_SIZE(4, 8), upb_StringView) = value; -} -UPB_INLINE upb_StringView* grpc_lookup_v1_NameMatcher_mutable_names(grpc_lookup_v1_NameMatcher *msg, size_t *len) { - return (upb_StringView*)_upb_array_mutable_accessor(msg, UPB_SIZE(12, 24), len); -} -UPB_INLINE upb_StringView* grpc_lookup_v1_NameMatcher_resize_names(grpc_lookup_v1_NameMatcher *msg, size_t len, upb_Arena *arena) { - return (upb_StringView*)_upb_Array_Resize_accessor2(msg, UPB_SIZE(12, 24), len, UPB_SIZE(3, 4), arena); -} -UPB_INLINE bool grpc_lookup_v1_NameMatcher_add_names(grpc_lookup_v1_NameMatcher *msg, upb_StringView val, upb_Arena *arena) { - return _upb_Array_Append_accessor2(msg, UPB_SIZE(12, 24), UPB_SIZE(3, 4), &val, - arena); -} -UPB_INLINE void grpc_lookup_v1_NameMatcher_set_required_match(grpc_lookup_v1_NameMatcher *msg, bool value) { - *UPB_PTR_AT(msg, UPB_SIZE(0, 0), bool) = value; -} - -/* grpc.lookup.v1.GrpcKeyBuilder */ - -UPB_INLINE grpc_lookup_v1_GrpcKeyBuilder* grpc_lookup_v1_GrpcKeyBuilder_new(upb_Arena* arena) { - return (grpc_lookup_v1_GrpcKeyBuilder*)_upb_Message_New(&grpc_lookup_v1_GrpcKeyBuilder_msginit, arena); -} -UPB_INLINE grpc_lookup_v1_GrpcKeyBuilder* grpc_lookup_v1_GrpcKeyBuilder_parse(const char* buf, size_t size, upb_Arena* arena) { - grpc_lookup_v1_GrpcKeyBuilder* ret = grpc_lookup_v1_GrpcKeyBuilder_new(arena); - if (!ret) return NULL; - if (upb_Decode(buf, size, ret, &grpc_lookup_v1_GrpcKeyBuilder_msginit, NULL, 0, arena) != kUpb_DecodeStatus_Ok) { - return NULL; - } - return ret; -} -UPB_INLINE grpc_lookup_v1_GrpcKeyBuilder* grpc_lookup_v1_GrpcKeyBuilder_parse_ex(const char* buf, size_t size, - const upb_ExtensionRegistry* extreg, - int options, upb_Arena* arena) { - grpc_lookup_v1_GrpcKeyBuilder* ret = grpc_lookup_v1_GrpcKeyBuilder_new(arena); - if (!ret) return NULL; - if (upb_Decode(buf, size, ret, &grpc_lookup_v1_GrpcKeyBuilder_msginit, extreg, options, arena) != - kUpb_DecodeStatus_Ok) { - return NULL; - } - return ret; -} -UPB_INLINE char* grpc_lookup_v1_GrpcKeyBuilder_serialize(const grpc_lookup_v1_GrpcKeyBuilder* msg, upb_Arena* arena, size_t* len) { - return upb_Encode(msg, &grpc_lookup_v1_GrpcKeyBuilder_msginit, 0, arena, len); -} -UPB_INLINE char* grpc_lookup_v1_GrpcKeyBuilder_serialize_ex(const grpc_lookup_v1_GrpcKeyBuilder* msg, int options, - upb_Arena* arena, size_t* len) { - return upb_Encode(msg, &grpc_lookup_v1_GrpcKeyBuilder_msginit, options, arena, len); -} -UPB_INLINE bool grpc_lookup_v1_GrpcKeyBuilder_has_names(const grpc_lookup_v1_GrpcKeyBuilder *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(8, 16)); } -UPB_INLINE const grpc_lookup_v1_GrpcKeyBuilder_Name* const* grpc_lookup_v1_GrpcKeyBuilder_names(const grpc_lookup_v1_GrpcKeyBuilder *msg, size_t *len) { return (const grpc_lookup_v1_GrpcKeyBuilder_Name* const*)_upb_array_accessor(msg, UPB_SIZE(8, 16), len); } -UPB_INLINE bool grpc_lookup_v1_GrpcKeyBuilder_has_headers(const grpc_lookup_v1_GrpcKeyBuilder *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(12, 24)); } -UPB_INLINE const grpc_lookup_v1_NameMatcher* const* grpc_lookup_v1_GrpcKeyBuilder_headers(const grpc_lookup_v1_GrpcKeyBuilder *msg, size_t *len) { return (const grpc_lookup_v1_NameMatcher* const*)_upb_array_accessor(msg, UPB_SIZE(12, 24), len); } -UPB_INLINE bool grpc_lookup_v1_GrpcKeyBuilder_has_extra_keys(const grpc_lookup_v1_GrpcKeyBuilder *msg) { return _upb_hasbit(msg, 1); } -UPB_INLINE const grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys* grpc_lookup_v1_GrpcKeyBuilder_extra_keys(const grpc_lookup_v1_GrpcKeyBuilder* msg) { - return *UPB_PTR_AT(msg, UPB_SIZE(4, 8), const grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys*); -} -UPB_INLINE bool grpc_lookup_v1_GrpcKeyBuilder_has_constant_keys(const grpc_lookup_v1_GrpcKeyBuilder *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(16, 32)); } -UPB_INLINE size_t grpc_lookup_v1_GrpcKeyBuilder_constant_keys_size(const grpc_lookup_v1_GrpcKeyBuilder *msg) {return _upb_msg_map_size(msg, UPB_SIZE(16, 32)); } -UPB_INLINE bool grpc_lookup_v1_GrpcKeyBuilder_constant_keys_get(const grpc_lookup_v1_GrpcKeyBuilder *msg, upb_StringView key, upb_StringView *val) { return _upb_msg_map_get(msg, UPB_SIZE(16, 32), &key, 0, val, 0); } -UPB_INLINE const grpc_lookup_v1_GrpcKeyBuilder_ConstantKeysEntry* grpc_lookup_v1_GrpcKeyBuilder_constant_keys_next(const grpc_lookup_v1_GrpcKeyBuilder *msg, size_t* iter) { return (const grpc_lookup_v1_GrpcKeyBuilder_ConstantKeysEntry*)_upb_msg_map_next(msg, UPB_SIZE(16, 32), iter); } - -UPB_INLINE grpc_lookup_v1_GrpcKeyBuilder_Name** grpc_lookup_v1_GrpcKeyBuilder_mutable_names(grpc_lookup_v1_GrpcKeyBuilder *msg, size_t *len) { - return (grpc_lookup_v1_GrpcKeyBuilder_Name**)_upb_array_mutable_accessor(msg, UPB_SIZE(8, 16), len); -} -UPB_INLINE grpc_lookup_v1_GrpcKeyBuilder_Name** grpc_lookup_v1_GrpcKeyBuilder_resize_names(grpc_lookup_v1_GrpcKeyBuilder *msg, size_t len, upb_Arena *arena) { - return (grpc_lookup_v1_GrpcKeyBuilder_Name**)_upb_Array_Resize_accessor2(msg, UPB_SIZE(8, 16), len, UPB_SIZE(2, 3), arena); -} -UPB_INLINE struct grpc_lookup_v1_GrpcKeyBuilder_Name* grpc_lookup_v1_GrpcKeyBuilder_add_names(grpc_lookup_v1_GrpcKeyBuilder *msg, upb_Arena *arena) { - struct grpc_lookup_v1_GrpcKeyBuilder_Name* sub = (struct grpc_lookup_v1_GrpcKeyBuilder_Name*)_upb_Message_New(&grpc_lookup_v1_GrpcKeyBuilder_Name_msginit, arena); - bool ok = _upb_Array_Append_accessor2( - msg, UPB_SIZE(8, 16), UPB_SIZE(2, 3), &sub, arena); - if (!ok) return NULL; - return sub; -} -UPB_INLINE grpc_lookup_v1_NameMatcher** grpc_lookup_v1_GrpcKeyBuilder_mutable_headers(grpc_lookup_v1_GrpcKeyBuilder *msg, size_t *len) { - return (grpc_lookup_v1_NameMatcher**)_upb_array_mutable_accessor(msg, UPB_SIZE(12, 24), len); -} -UPB_INLINE grpc_lookup_v1_NameMatcher** grpc_lookup_v1_GrpcKeyBuilder_resize_headers(grpc_lookup_v1_GrpcKeyBuilder *msg, size_t len, upb_Arena *arena) { - return (grpc_lookup_v1_NameMatcher**)_upb_Array_Resize_accessor2(msg, UPB_SIZE(12, 24), len, UPB_SIZE(2, 3), arena); -} -UPB_INLINE struct grpc_lookup_v1_NameMatcher* grpc_lookup_v1_GrpcKeyBuilder_add_headers(grpc_lookup_v1_GrpcKeyBuilder *msg, upb_Arena *arena) { - struct grpc_lookup_v1_NameMatcher* sub = (struct grpc_lookup_v1_NameMatcher*)_upb_Message_New(&grpc_lookup_v1_NameMatcher_msginit, arena); - bool ok = _upb_Array_Append_accessor2( - msg, UPB_SIZE(12, 24), UPB_SIZE(2, 3), &sub, arena); - if (!ok) return NULL; - return sub; -} -UPB_INLINE void grpc_lookup_v1_GrpcKeyBuilder_set_extra_keys(grpc_lookup_v1_GrpcKeyBuilder *msg, grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys* value) { - _upb_sethas(msg, 1); - *UPB_PTR_AT(msg, UPB_SIZE(4, 8), grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys*) = value; -} -UPB_INLINE struct grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys* grpc_lookup_v1_GrpcKeyBuilder_mutable_extra_keys(grpc_lookup_v1_GrpcKeyBuilder *msg, upb_Arena *arena) { - struct grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys* sub = (struct grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys*)grpc_lookup_v1_GrpcKeyBuilder_extra_keys(msg); - if (sub == NULL) { - sub = (struct grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys*)_upb_Message_New(&grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys_msginit, arena); - if (!sub) return NULL; - grpc_lookup_v1_GrpcKeyBuilder_set_extra_keys(msg, sub); - } - return sub; -} -UPB_INLINE void grpc_lookup_v1_GrpcKeyBuilder_constant_keys_clear(grpc_lookup_v1_GrpcKeyBuilder *msg) { _upb_msg_map_clear(msg, UPB_SIZE(16, 32)); } -UPB_INLINE bool grpc_lookup_v1_GrpcKeyBuilder_constant_keys_set(grpc_lookup_v1_GrpcKeyBuilder *msg, upb_StringView key, upb_StringView val, upb_Arena *a) { return _upb_msg_map_set(msg, UPB_SIZE(16, 32), &key, 0, &val, 0, a); } -UPB_INLINE bool grpc_lookup_v1_GrpcKeyBuilder_constant_keys_delete(grpc_lookup_v1_GrpcKeyBuilder *msg, upb_StringView key) { return _upb_msg_map_delete(msg, UPB_SIZE(16, 32), &key, 0); } -UPB_INLINE grpc_lookup_v1_GrpcKeyBuilder_ConstantKeysEntry* grpc_lookup_v1_GrpcKeyBuilder_constant_keys_nextmutable(grpc_lookup_v1_GrpcKeyBuilder *msg, size_t* iter) { return (grpc_lookup_v1_GrpcKeyBuilder_ConstantKeysEntry*)_upb_msg_map_next(msg, UPB_SIZE(16, 32), iter); } - -/* grpc.lookup.v1.GrpcKeyBuilder.Name */ - -UPB_INLINE grpc_lookup_v1_GrpcKeyBuilder_Name* grpc_lookup_v1_GrpcKeyBuilder_Name_new(upb_Arena* arena) { - return (grpc_lookup_v1_GrpcKeyBuilder_Name*)_upb_Message_New(&grpc_lookup_v1_GrpcKeyBuilder_Name_msginit, arena); -} -UPB_INLINE grpc_lookup_v1_GrpcKeyBuilder_Name* grpc_lookup_v1_GrpcKeyBuilder_Name_parse(const char* buf, size_t size, upb_Arena* arena) { - grpc_lookup_v1_GrpcKeyBuilder_Name* ret = grpc_lookup_v1_GrpcKeyBuilder_Name_new(arena); - if (!ret) return NULL; - if (upb_Decode(buf, size, ret, &grpc_lookup_v1_GrpcKeyBuilder_Name_msginit, NULL, 0, arena) != kUpb_DecodeStatus_Ok) { - return NULL; - } - return ret; -} -UPB_INLINE grpc_lookup_v1_GrpcKeyBuilder_Name* grpc_lookup_v1_GrpcKeyBuilder_Name_parse_ex(const char* buf, size_t size, - const upb_ExtensionRegistry* extreg, - int options, upb_Arena* arena) { - grpc_lookup_v1_GrpcKeyBuilder_Name* ret = grpc_lookup_v1_GrpcKeyBuilder_Name_new(arena); - if (!ret) return NULL; - if (upb_Decode(buf, size, ret, &grpc_lookup_v1_GrpcKeyBuilder_Name_msginit, extreg, options, arena) != - kUpb_DecodeStatus_Ok) { - return NULL; - } - return ret; -} -UPB_INLINE char* grpc_lookup_v1_GrpcKeyBuilder_Name_serialize(const grpc_lookup_v1_GrpcKeyBuilder_Name* msg, upb_Arena* arena, size_t* len) { - return upb_Encode(msg, &grpc_lookup_v1_GrpcKeyBuilder_Name_msginit, 0, arena, len); -} -UPB_INLINE char* grpc_lookup_v1_GrpcKeyBuilder_Name_serialize_ex(const grpc_lookup_v1_GrpcKeyBuilder_Name* msg, int options, - upb_Arena* arena, size_t* len) { - return upb_Encode(msg, &grpc_lookup_v1_GrpcKeyBuilder_Name_msginit, options, arena, len); -} -UPB_INLINE upb_StringView grpc_lookup_v1_GrpcKeyBuilder_Name_service(const grpc_lookup_v1_GrpcKeyBuilder_Name* msg) { - return *UPB_PTR_AT(msg, UPB_SIZE(0, 0), upb_StringView); -} -UPB_INLINE upb_StringView grpc_lookup_v1_GrpcKeyBuilder_Name_method(const grpc_lookup_v1_GrpcKeyBuilder_Name* msg) { - return *UPB_PTR_AT(msg, UPB_SIZE(8, 16), upb_StringView); -} - -UPB_INLINE void grpc_lookup_v1_GrpcKeyBuilder_Name_set_service(grpc_lookup_v1_GrpcKeyBuilder_Name *msg, upb_StringView value) { - *UPB_PTR_AT(msg, UPB_SIZE(0, 0), upb_StringView) = value; -} -UPB_INLINE void grpc_lookup_v1_GrpcKeyBuilder_Name_set_method(grpc_lookup_v1_GrpcKeyBuilder_Name *msg, upb_StringView value) { - *UPB_PTR_AT(msg, UPB_SIZE(8, 16), upb_StringView) = value; -} - -/* grpc.lookup.v1.GrpcKeyBuilder.ExtraKeys */ - -UPB_INLINE grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys* grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys_new(upb_Arena* arena) { - return (grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys*)_upb_Message_New(&grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys_msginit, arena); -} -UPB_INLINE grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys* grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys_parse(const char* buf, size_t size, upb_Arena* arena) { - grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys* ret = grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys_new(arena); - if (!ret) return NULL; - if (upb_Decode(buf, size, ret, &grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys_msginit, NULL, 0, arena) != kUpb_DecodeStatus_Ok) { - return NULL; - } - return ret; -} -UPB_INLINE grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys* grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys_parse_ex(const char* buf, size_t size, - const upb_ExtensionRegistry* extreg, - int options, upb_Arena* arena) { - grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys* ret = grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys_new(arena); - if (!ret) return NULL; - if (upb_Decode(buf, size, ret, &grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys_msginit, extreg, options, arena) != - kUpb_DecodeStatus_Ok) { - return NULL; - } - return ret; -} -UPB_INLINE char* grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys_serialize(const grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys* msg, upb_Arena* arena, size_t* len) { - return upb_Encode(msg, &grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys_msginit, 0, arena, len); -} -UPB_INLINE char* grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys_serialize_ex(const grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys* msg, int options, - upb_Arena* arena, size_t* len) { - return upb_Encode(msg, &grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys_msginit, options, arena, len); -} -UPB_INLINE upb_StringView grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys_host(const grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys* msg) { - return *UPB_PTR_AT(msg, UPB_SIZE(0, 0), upb_StringView); -} -UPB_INLINE upb_StringView grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys_service(const grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys* msg) { - return *UPB_PTR_AT(msg, UPB_SIZE(8, 16), upb_StringView); -} -UPB_INLINE upb_StringView grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys_method(const grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys* msg) { - return *UPB_PTR_AT(msg, UPB_SIZE(16, 32), upb_StringView); -} - -UPB_INLINE void grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys_set_host(grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys *msg, upb_StringView value) { - *UPB_PTR_AT(msg, UPB_SIZE(0, 0), upb_StringView) = value; -} -UPB_INLINE void grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys_set_service(grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys *msg, upb_StringView value) { - *UPB_PTR_AT(msg, UPB_SIZE(8, 16), upb_StringView) = value; -} -UPB_INLINE void grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys_set_method(grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys *msg, upb_StringView value) { - *UPB_PTR_AT(msg, UPB_SIZE(16, 32), upb_StringView) = value; -} - -/* grpc.lookup.v1.GrpcKeyBuilder.ConstantKeysEntry */ - -UPB_INLINE upb_StringView grpc_lookup_v1_GrpcKeyBuilder_ConstantKeysEntry_key(const grpc_lookup_v1_GrpcKeyBuilder_ConstantKeysEntry *msg) { - upb_StringView ret; - _upb_msg_map_key(msg, &ret, 0); - return ret; -} -UPB_INLINE upb_StringView grpc_lookup_v1_GrpcKeyBuilder_ConstantKeysEntry_value(const grpc_lookup_v1_GrpcKeyBuilder_ConstantKeysEntry *msg) { - upb_StringView ret; - _upb_msg_map_value(msg, &ret, 0); - return ret; -} - -UPB_INLINE void grpc_lookup_v1_GrpcKeyBuilder_ConstantKeysEntry_set_value(grpc_lookup_v1_GrpcKeyBuilder_ConstantKeysEntry *msg, upb_StringView value) { - _upb_msg_map_set_value(msg, &value, 0); -} - -/* grpc.lookup.v1.HttpKeyBuilder */ - -UPB_INLINE grpc_lookup_v1_HttpKeyBuilder* grpc_lookup_v1_HttpKeyBuilder_new(upb_Arena* arena) { - return (grpc_lookup_v1_HttpKeyBuilder*)_upb_Message_New(&grpc_lookup_v1_HttpKeyBuilder_msginit, arena); -} -UPB_INLINE grpc_lookup_v1_HttpKeyBuilder* grpc_lookup_v1_HttpKeyBuilder_parse(const char* buf, size_t size, upb_Arena* arena) { - grpc_lookup_v1_HttpKeyBuilder* ret = grpc_lookup_v1_HttpKeyBuilder_new(arena); - if (!ret) return NULL; - if (upb_Decode(buf, size, ret, &grpc_lookup_v1_HttpKeyBuilder_msginit, NULL, 0, arena) != kUpb_DecodeStatus_Ok) { - return NULL; - } - return ret; -} -UPB_INLINE grpc_lookup_v1_HttpKeyBuilder* grpc_lookup_v1_HttpKeyBuilder_parse_ex(const char* buf, size_t size, - const upb_ExtensionRegistry* extreg, - int options, upb_Arena* arena) { - grpc_lookup_v1_HttpKeyBuilder* ret = grpc_lookup_v1_HttpKeyBuilder_new(arena); - if (!ret) return NULL; - if (upb_Decode(buf, size, ret, &grpc_lookup_v1_HttpKeyBuilder_msginit, extreg, options, arena) != - kUpb_DecodeStatus_Ok) { - return NULL; - } - return ret; -} -UPB_INLINE char* grpc_lookup_v1_HttpKeyBuilder_serialize(const grpc_lookup_v1_HttpKeyBuilder* msg, upb_Arena* arena, size_t* len) { - return upb_Encode(msg, &grpc_lookup_v1_HttpKeyBuilder_msginit, 0, arena, len); -} -UPB_INLINE char* grpc_lookup_v1_HttpKeyBuilder_serialize_ex(const grpc_lookup_v1_HttpKeyBuilder* msg, int options, - upb_Arena* arena, size_t* len) { - return upb_Encode(msg, &grpc_lookup_v1_HttpKeyBuilder_msginit, options, arena, len); -} -UPB_INLINE upb_StringView const* grpc_lookup_v1_HttpKeyBuilder_host_patterns(const grpc_lookup_v1_HttpKeyBuilder *msg, size_t *len) { return (upb_StringView const*)_upb_array_accessor(msg, UPB_SIZE(0, 0), len); } -UPB_INLINE upb_StringView const* grpc_lookup_v1_HttpKeyBuilder_path_patterns(const grpc_lookup_v1_HttpKeyBuilder *msg, size_t *len) { return (upb_StringView const*)_upb_array_accessor(msg, UPB_SIZE(4, 8), len); } -UPB_INLINE bool grpc_lookup_v1_HttpKeyBuilder_has_query_parameters(const grpc_lookup_v1_HttpKeyBuilder *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(8, 16)); } -UPB_INLINE const grpc_lookup_v1_NameMatcher* const* grpc_lookup_v1_HttpKeyBuilder_query_parameters(const grpc_lookup_v1_HttpKeyBuilder *msg, size_t *len) { return (const grpc_lookup_v1_NameMatcher* const*)_upb_array_accessor(msg, UPB_SIZE(8, 16), len); } -UPB_INLINE bool grpc_lookup_v1_HttpKeyBuilder_has_headers(const grpc_lookup_v1_HttpKeyBuilder *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(12, 24)); } -UPB_INLINE const grpc_lookup_v1_NameMatcher* const* grpc_lookup_v1_HttpKeyBuilder_headers(const grpc_lookup_v1_HttpKeyBuilder *msg, size_t *len) { return (const grpc_lookup_v1_NameMatcher* const*)_upb_array_accessor(msg, UPB_SIZE(12, 24), len); } -UPB_INLINE bool grpc_lookup_v1_HttpKeyBuilder_has_constant_keys(const grpc_lookup_v1_HttpKeyBuilder *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(16, 32)); } -UPB_INLINE size_t grpc_lookup_v1_HttpKeyBuilder_constant_keys_size(const grpc_lookup_v1_HttpKeyBuilder *msg) {return _upb_msg_map_size(msg, UPB_SIZE(16, 32)); } -UPB_INLINE bool grpc_lookup_v1_HttpKeyBuilder_constant_keys_get(const grpc_lookup_v1_HttpKeyBuilder *msg, upb_StringView key, upb_StringView *val) { return _upb_msg_map_get(msg, UPB_SIZE(16, 32), &key, 0, val, 0); } -UPB_INLINE const grpc_lookup_v1_HttpKeyBuilder_ConstantKeysEntry* grpc_lookup_v1_HttpKeyBuilder_constant_keys_next(const grpc_lookup_v1_HttpKeyBuilder *msg, size_t* iter) { return (const grpc_lookup_v1_HttpKeyBuilder_ConstantKeysEntry*)_upb_msg_map_next(msg, UPB_SIZE(16, 32), iter); } - -UPB_INLINE upb_StringView* grpc_lookup_v1_HttpKeyBuilder_mutable_host_patterns(grpc_lookup_v1_HttpKeyBuilder *msg, size_t *len) { - return (upb_StringView*)_upb_array_mutable_accessor(msg, UPB_SIZE(0, 0), len); -} -UPB_INLINE upb_StringView* grpc_lookup_v1_HttpKeyBuilder_resize_host_patterns(grpc_lookup_v1_HttpKeyBuilder *msg, size_t len, upb_Arena *arena) { - return (upb_StringView*)_upb_Array_Resize_accessor2(msg, UPB_SIZE(0, 0), len, UPB_SIZE(3, 4), arena); -} -UPB_INLINE bool grpc_lookup_v1_HttpKeyBuilder_add_host_patterns(grpc_lookup_v1_HttpKeyBuilder *msg, upb_StringView val, upb_Arena *arena) { - return _upb_Array_Append_accessor2(msg, UPB_SIZE(0, 0), UPB_SIZE(3, 4), &val, - arena); -} -UPB_INLINE upb_StringView* grpc_lookup_v1_HttpKeyBuilder_mutable_path_patterns(grpc_lookup_v1_HttpKeyBuilder *msg, size_t *len) { - return (upb_StringView*)_upb_array_mutable_accessor(msg, UPB_SIZE(4, 8), len); -} -UPB_INLINE upb_StringView* grpc_lookup_v1_HttpKeyBuilder_resize_path_patterns(grpc_lookup_v1_HttpKeyBuilder *msg, size_t len, upb_Arena *arena) { - return (upb_StringView*)_upb_Array_Resize_accessor2(msg, UPB_SIZE(4, 8), len, UPB_SIZE(3, 4), arena); -} -UPB_INLINE bool grpc_lookup_v1_HttpKeyBuilder_add_path_patterns(grpc_lookup_v1_HttpKeyBuilder *msg, upb_StringView val, upb_Arena *arena) { - return _upb_Array_Append_accessor2(msg, UPB_SIZE(4, 8), UPB_SIZE(3, 4), &val, - arena); -} -UPB_INLINE grpc_lookup_v1_NameMatcher** grpc_lookup_v1_HttpKeyBuilder_mutable_query_parameters(grpc_lookup_v1_HttpKeyBuilder *msg, size_t *len) { - return (grpc_lookup_v1_NameMatcher**)_upb_array_mutable_accessor(msg, UPB_SIZE(8, 16), len); -} -UPB_INLINE grpc_lookup_v1_NameMatcher** grpc_lookup_v1_HttpKeyBuilder_resize_query_parameters(grpc_lookup_v1_HttpKeyBuilder *msg, size_t len, upb_Arena *arena) { - return (grpc_lookup_v1_NameMatcher**)_upb_Array_Resize_accessor2(msg, UPB_SIZE(8, 16), len, UPB_SIZE(2, 3), arena); -} -UPB_INLINE struct grpc_lookup_v1_NameMatcher* grpc_lookup_v1_HttpKeyBuilder_add_query_parameters(grpc_lookup_v1_HttpKeyBuilder *msg, upb_Arena *arena) { - struct grpc_lookup_v1_NameMatcher* sub = (struct grpc_lookup_v1_NameMatcher*)_upb_Message_New(&grpc_lookup_v1_NameMatcher_msginit, arena); - bool ok = _upb_Array_Append_accessor2( - msg, UPB_SIZE(8, 16), UPB_SIZE(2, 3), &sub, arena); - if (!ok) return NULL; - return sub; -} -UPB_INLINE grpc_lookup_v1_NameMatcher** grpc_lookup_v1_HttpKeyBuilder_mutable_headers(grpc_lookup_v1_HttpKeyBuilder *msg, size_t *len) { - return (grpc_lookup_v1_NameMatcher**)_upb_array_mutable_accessor(msg, UPB_SIZE(12, 24), len); -} -UPB_INLINE grpc_lookup_v1_NameMatcher** grpc_lookup_v1_HttpKeyBuilder_resize_headers(grpc_lookup_v1_HttpKeyBuilder *msg, size_t len, upb_Arena *arena) { - return (grpc_lookup_v1_NameMatcher**)_upb_Array_Resize_accessor2(msg, UPB_SIZE(12, 24), len, UPB_SIZE(2, 3), arena); -} -UPB_INLINE struct grpc_lookup_v1_NameMatcher* grpc_lookup_v1_HttpKeyBuilder_add_headers(grpc_lookup_v1_HttpKeyBuilder *msg, upb_Arena *arena) { - struct grpc_lookup_v1_NameMatcher* sub = (struct grpc_lookup_v1_NameMatcher*)_upb_Message_New(&grpc_lookup_v1_NameMatcher_msginit, arena); - bool ok = _upb_Array_Append_accessor2( - msg, UPB_SIZE(12, 24), UPB_SIZE(2, 3), &sub, arena); - if (!ok) return NULL; - return sub; -} -UPB_INLINE void grpc_lookup_v1_HttpKeyBuilder_constant_keys_clear(grpc_lookup_v1_HttpKeyBuilder *msg) { _upb_msg_map_clear(msg, UPB_SIZE(16, 32)); } -UPB_INLINE bool grpc_lookup_v1_HttpKeyBuilder_constant_keys_set(grpc_lookup_v1_HttpKeyBuilder *msg, upb_StringView key, upb_StringView val, upb_Arena *a) { return _upb_msg_map_set(msg, UPB_SIZE(16, 32), &key, 0, &val, 0, a); } -UPB_INLINE bool grpc_lookup_v1_HttpKeyBuilder_constant_keys_delete(grpc_lookup_v1_HttpKeyBuilder *msg, upb_StringView key) { return _upb_msg_map_delete(msg, UPB_SIZE(16, 32), &key, 0); } -UPB_INLINE grpc_lookup_v1_HttpKeyBuilder_ConstantKeysEntry* grpc_lookup_v1_HttpKeyBuilder_constant_keys_nextmutable(grpc_lookup_v1_HttpKeyBuilder *msg, size_t* iter) { return (grpc_lookup_v1_HttpKeyBuilder_ConstantKeysEntry*)_upb_msg_map_next(msg, UPB_SIZE(16, 32), iter); } - -/* grpc.lookup.v1.HttpKeyBuilder.ConstantKeysEntry */ - -UPB_INLINE upb_StringView grpc_lookup_v1_HttpKeyBuilder_ConstantKeysEntry_key(const grpc_lookup_v1_HttpKeyBuilder_ConstantKeysEntry *msg) { - upb_StringView ret; - _upb_msg_map_key(msg, &ret, 0); - return ret; -} -UPB_INLINE upb_StringView grpc_lookup_v1_HttpKeyBuilder_ConstantKeysEntry_value(const grpc_lookup_v1_HttpKeyBuilder_ConstantKeysEntry *msg) { - upb_StringView ret; - _upb_msg_map_value(msg, &ret, 0); - return ret; -} - -UPB_INLINE void grpc_lookup_v1_HttpKeyBuilder_ConstantKeysEntry_set_value(grpc_lookup_v1_HttpKeyBuilder_ConstantKeysEntry *msg, upb_StringView value) { - _upb_msg_map_set_value(msg, &value, 0); -} - -/* grpc.lookup.v1.RouteLookupConfig */ - -UPB_INLINE grpc_lookup_v1_RouteLookupConfig* grpc_lookup_v1_RouteLookupConfig_new(upb_Arena* arena) { - return (grpc_lookup_v1_RouteLookupConfig*)_upb_Message_New(&grpc_lookup_v1_RouteLookupConfig_msginit, arena); -} -UPB_INLINE grpc_lookup_v1_RouteLookupConfig* grpc_lookup_v1_RouteLookupConfig_parse(const char* buf, size_t size, upb_Arena* arena) { - grpc_lookup_v1_RouteLookupConfig* ret = grpc_lookup_v1_RouteLookupConfig_new(arena); - if (!ret) return NULL; - if (upb_Decode(buf, size, ret, &grpc_lookup_v1_RouteLookupConfig_msginit, NULL, 0, arena) != kUpb_DecodeStatus_Ok) { - return NULL; - } - return ret; -} -UPB_INLINE grpc_lookup_v1_RouteLookupConfig* grpc_lookup_v1_RouteLookupConfig_parse_ex(const char* buf, size_t size, - const upb_ExtensionRegistry* extreg, - int options, upb_Arena* arena) { - grpc_lookup_v1_RouteLookupConfig* ret = grpc_lookup_v1_RouteLookupConfig_new(arena); - if (!ret) return NULL; - if (upb_Decode(buf, size, ret, &grpc_lookup_v1_RouteLookupConfig_msginit, extreg, options, arena) != - kUpb_DecodeStatus_Ok) { - return NULL; - } - return ret; -} -UPB_INLINE char* grpc_lookup_v1_RouteLookupConfig_serialize(const grpc_lookup_v1_RouteLookupConfig* msg, upb_Arena* arena, size_t* len) { - return upb_Encode(msg, &grpc_lookup_v1_RouteLookupConfig_msginit, 0, arena, len); -} -UPB_INLINE char* grpc_lookup_v1_RouteLookupConfig_serialize_ex(const grpc_lookup_v1_RouteLookupConfig* msg, int options, - upb_Arena* arena, size_t* len) { - return upb_Encode(msg, &grpc_lookup_v1_RouteLookupConfig_msginit, options, arena, len); -} -UPB_INLINE bool grpc_lookup_v1_RouteLookupConfig_has_http_keybuilders(const grpc_lookup_v1_RouteLookupConfig *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(44, 72)); } -UPB_INLINE const grpc_lookup_v1_HttpKeyBuilder* const* grpc_lookup_v1_RouteLookupConfig_http_keybuilders(const grpc_lookup_v1_RouteLookupConfig *msg, size_t *len) { return (const grpc_lookup_v1_HttpKeyBuilder* const*)_upb_array_accessor(msg, UPB_SIZE(44, 72), len); } -UPB_INLINE bool grpc_lookup_v1_RouteLookupConfig_has_grpc_keybuilders(const grpc_lookup_v1_RouteLookupConfig *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(48, 80)); } -UPB_INLINE const grpc_lookup_v1_GrpcKeyBuilder* const* grpc_lookup_v1_RouteLookupConfig_grpc_keybuilders(const grpc_lookup_v1_RouteLookupConfig *msg, size_t *len) { return (const grpc_lookup_v1_GrpcKeyBuilder* const*)_upb_array_accessor(msg, UPB_SIZE(48, 80), len); } -UPB_INLINE upb_StringView grpc_lookup_v1_RouteLookupConfig_lookup_service(const grpc_lookup_v1_RouteLookupConfig* msg) { - return *UPB_PTR_AT(msg, UPB_SIZE(16, 16), upb_StringView); -} -UPB_INLINE bool grpc_lookup_v1_RouteLookupConfig_has_lookup_service_timeout(const grpc_lookup_v1_RouteLookupConfig *msg) { return _upb_hasbit(msg, 1); } -UPB_INLINE const struct google_protobuf_Duration* grpc_lookup_v1_RouteLookupConfig_lookup_service_timeout(const grpc_lookup_v1_RouteLookupConfig* msg) { - return *UPB_PTR_AT(msg, UPB_SIZE(32, 48), const struct google_protobuf_Duration*); -} -UPB_INLINE bool grpc_lookup_v1_RouteLookupConfig_has_max_age(const grpc_lookup_v1_RouteLookupConfig *msg) { return _upb_hasbit(msg, 2); } -UPB_INLINE const struct google_protobuf_Duration* grpc_lookup_v1_RouteLookupConfig_max_age(const grpc_lookup_v1_RouteLookupConfig* msg) { - return *UPB_PTR_AT(msg, UPB_SIZE(36, 56), const struct google_protobuf_Duration*); -} -UPB_INLINE bool grpc_lookup_v1_RouteLookupConfig_has_stale_age(const grpc_lookup_v1_RouteLookupConfig *msg) { return _upb_hasbit(msg, 3); } -UPB_INLINE const struct google_protobuf_Duration* grpc_lookup_v1_RouteLookupConfig_stale_age(const grpc_lookup_v1_RouteLookupConfig* msg) { - return *UPB_PTR_AT(msg, UPB_SIZE(40, 64), const struct google_protobuf_Duration*); -} -UPB_INLINE int64_t grpc_lookup_v1_RouteLookupConfig_cache_size_bytes(const grpc_lookup_v1_RouteLookupConfig* msg) { - return *UPB_PTR_AT(msg, UPB_SIZE(8, 8), int64_t); -} -UPB_INLINE upb_StringView const* grpc_lookup_v1_RouteLookupConfig_valid_targets(const grpc_lookup_v1_RouteLookupConfig *msg, size_t *len) { return (upb_StringView const*)_upb_array_accessor(msg, UPB_SIZE(52, 88), len); } -UPB_INLINE upb_StringView grpc_lookup_v1_RouteLookupConfig_default_target(const grpc_lookup_v1_RouteLookupConfig* msg) { - return *UPB_PTR_AT(msg, UPB_SIZE(24, 32), upb_StringView); -} - -UPB_INLINE grpc_lookup_v1_HttpKeyBuilder** grpc_lookup_v1_RouteLookupConfig_mutable_http_keybuilders(grpc_lookup_v1_RouteLookupConfig *msg, size_t *len) { - return (grpc_lookup_v1_HttpKeyBuilder**)_upb_array_mutable_accessor(msg, UPB_SIZE(44, 72), len); -} -UPB_INLINE grpc_lookup_v1_HttpKeyBuilder** grpc_lookup_v1_RouteLookupConfig_resize_http_keybuilders(grpc_lookup_v1_RouteLookupConfig *msg, size_t len, upb_Arena *arena) { - return (grpc_lookup_v1_HttpKeyBuilder**)_upb_Array_Resize_accessor2(msg, UPB_SIZE(44, 72), len, UPB_SIZE(2, 3), arena); -} -UPB_INLINE struct grpc_lookup_v1_HttpKeyBuilder* grpc_lookup_v1_RouteLookupConfig_add_http_keybuilders(grpc_lookup_v1_RouteLookupConfig *msg, upb_Arena *arena) { - struct grpc_lookup_v1_HttpKeyBuilder* sub = (struct grpc_lookup_v1_HttpKeyBuilder*)_upb_Message_New(&grpc_lookup_v1_HttpKeyBuilder_msginit, arena); - bool ok = _upb_Array_Append_accessor2( - msg, UPB_SIZE(44, 72), UPB_SIZE(2, 3), &sub, arena); - if (!ok) return NULL; - return sub; -} -UPB_INLINE grpc_lookup_v1_GrpcKeyBuilder** grpc_lookup_v1_RouteLookupConfig_mutable_grpc_keybuilders(grpc_lookup_v1_RouteLookupConfig *msg, size_t *len) { - return (grpc_lookup_v1_GrpcKeyBuilder**)_upb_array_mutable_accessor(msg, UPB_SIZE(48, 80), len); -} -UPB_INLINE grpc_lookup_v1_GrpcKeyBuilder** grpc_lookup_v1_RouteLookupConfig_resize_grpc_keybuilders(grpc_lookup_v1_RouteLookupConfig *msg, size_t len, upb_Arena *arena) { - return (grpc_lookup_v1_GrpcKeyBuilder**)_upb_Array_Resize_accessor2(msg, UPB_SIZE(48, 80), len, UPB_SIZE(2, 3), arena); -} -UPB_INLINE struct grpc_lookup_v1_GrpcKeyBuilder* grpc_lookup_v1_RouteLookupConfig_add_grpc_keybuilders(grpc_lookup_v1_RouteLookupConfig *msg, upb_Arena *arena) { - struct grpc_lookup_v1_GrpcKeyBuilder* sub = (struct grpc_lookup_v1_GrpcKeyBuilder*)_upb_Message_New(&grpc_lookup_v1_GrpcKeyBuilder_msginit, arena); - bool ok = _upb_Array_Append_accessor2( - msg, UPB_SIZE(48, 80), UPB_SIZE(2, 3), &sub, arena); - if (!ok) return NULL; - return sub; -} -UPB_INLINE void grpc_lookup_v1_RouteLookupConfig_set_lookup_service(grpc_lookup_v1_RouteLookupConfig *msg, upb_StringView value) { - *UPB_PTR_AT(msg, UPB_SIZE(16, 16), upb_StringView) = value; -} -UPB_INLINE void grpc_lookup_v1_RouteLookupConfig_set_lookup_service_timeout(grpc_lookup_v1_RouteLookupConfig *msg, struct google_protobuf_Duration* value) { - _upb_sethas(msg, 1); - *UPB_PTR_AT(msg, UPB_SIZE(32, 48), struct google_protobuf_Duration*) = value; -} -UPB_INLINE struct google_protobuf_Duration* grpc_lookup_v1_RouteLookupConfig_mutable_lookup_service_timeout(grpc_lookup_v1_RouteLookupConfig *msg, upb_Arena *arena) { - struct google_protobuf_Duration* sub = (struct google_protobuf_Duration*)grpc_lookup_v1_RouteLookupConfig_lookup_service_timeout(msg); - if (sub == NULL) { - sub = (struct google_protobuf_Duration*)_upb_Message_New(&google_protobuf_Duration_msginit, arena); - if (!sub) return NULL; - grpc_lookup_v1_RouteLookupConfig_set_lookup_service_timeout(msg, sub); - } - return sub; -} -UPB_INLINE void grpc_lookup_v1_RouteLookupConfig_set_max_age(grpc_lookup_v1_RouteLookupConfig *msg, struct google_protobuf_Duration* value) { - _upb_sethas(msg, 2); - *UPB_PTR_AT(msg, UPB_SIZE(36, 56), struct google_protobuf_Duration*) = value; -} -UPB_INLINE struct google_protobuf_Duration* grpc_lookup_v1_RouteLookupConfig_mutable_max_age(grpc_lookup_v1_RouteLookupConfig *msg, upb_Arena *arena) { - struct google_protobuf_Duration* sub = (struct google_protobuf_Duration*)grpc_lookup_v1_RouteLookupConfig_max_age(msg); - if (sub == NULL) { - sub = (struct google_protobuf_Duration*)_upb_Message_New(&google_protobuf_Duration_msginit, arena); - if (!sub) return NULL; - grpc_lookup_v1_RouteLookupConfig_set_max_age(msg, sub); - } - return sub; -} -UPB_INLINE void grpc_lookup_v1_RouteLookupConfig_set_stale_age(grpc_lookup_v1_RouteLookupConfig *msg, struct google_protobuf_Duration* value) { - _upb_sethas(msg, 3); - *UPB_PTR_AT(msg, UPB_SIZE(40, 64), struct google_protobuf_Duration*) = value; -} -UPB_INLINE struct google_protobuf_Duration* grpc_lookup_v1_RouteLookupConfig_mutable_stale_age(grpc_lookup_v1_RouteLookupConfig *msg, upb_Arena *arena) { - struct google_protobuf_Duration* sub = (struct google_protobuf_Duration*)grpc_lookup_v1_RouteLookupConfig_stale_age(msg); - if (sub == NULL) { - sub = (struct google_protobuf_Duration*)_upb_Message_New(&google_protobuf_Duration_msginit, arena); - if (!sub) return NULL; - grpc_lookup_v1_RouteLookupConfig_set_stale_age(msg, sub); - } - return sub; -} -UPB_INLINE void grpc_lookup_v1_RouteLookupConfig_set_cache_size_bytes(grpc_lookup_v1_RouteLookupConfig *msg, int64_t value) { - *UPB_PTR_AT(msg, UPB_SIZE(8, 8), int64_t) = value; -} -UPB_INLINE upb_StringView* grpc_lookup_v1_RouteLookupConfig_mutable_valid_targets(grpc_lookup_v1_RouteLookupConfig *msg, size_t *len) { - return (upb_StringView*)_upb_array_mutable_accessor(msg, UPB_SIZE(52, 88), len); -} -UPB_INLINE upb_StringView* grpc_lookup_v1_RouteLookupConfig_resize_valid_targets(grpc_lookup_v1_RouteLookupConfig *msg, size_t len, upb_Arena *arena) { - return (upb_StringView*)_upb_Array_Resize_accessor2(msg, UPB_SIZE(52, 88), len, UPB_SIZE(3, 4), arena); -} -UPB_INLINE bool grpc_lookup_v1_RouteLookupConfig_add_valid_targets(grpc_lookup_v1_RouteLookupConfig *msg, upb_StringView val, upb_Arena *arena) { - return _upb_Array_Append_accessor2(msg, UPB_SIZE(52, 88), UPB_SIZE(3, 4), &val, - arena); -} -UPB_INLINE void grpc_lookup_v1_RouteLookupConfig_set_default_target(grpc_lookup_v1_RouteLookupConfig *msg, upb_StringView value) { - *UPB_PTR_AT(msg, UPB_SIZE(24, 32), upb_StringView) = value; -} - -/* grpc.lookup.v1.RouteLookupClusterSpecifier */ - -UPB_INLINE grpc_lookup_v1_RouteLookupClusterSpecifier* grpc_lookup_v1_RouteLookupClusterSpecifier_new(upb_Arena* arena) { - return (grpc_lookup_v1_RouteLookupClusterSpecifier*)_upb_Message_New(&grpc_lookup_v1_RouteLookupClusterSpecifier_msginit, arena); -} -UPB_INLINE grpc_lookup_v1_RouteLookupClusterSpecifier* grpc_lookup_v1_RouteLookupClusterSpecifier_parse(const char* buf, size_t size, upb_Arena* arena) { - grpc_lookup_v1_RouteLookupClusterSpecifier* ret = grpc_lookup_v1_RouteLookupClusterSpecifier_new(arena); - if (!ret) return NULL; - if (upb_Decode(buf, size, ret, &grpc_lookup_v1_RouteLookupClusterSpecifier_msginit, NULL, 0, arena) != kUpb_DecodeStatus_Ok) { - return NULL; - } - return ret; -} -UPB_INLINE grpc_lookup_v1_RouteLookupClusterSpecifier* grpc_lookup_v1_RouteLookupClusterSpecifier_parse_ex(const char* buf, size_t size, - const upb_ExtensionRegistry* extreg, - int options, upb_Arena* arena) { - grpc_lookup_v1_RouteLookupClusterSpecifier* ret = grpc_lookup_v1_RouteLookupClusterSpecifier_new(arena); - if (!ret) return NULL; - if (upb_Decode(buf, size, ret, &grpc_lookup_v1_RouteLookupClusterSpecifier_msginit, extreg, options, arena) != - kUpb_DecodeStatus_Ok) { - return NULL; - } - return ret; -} -UPB_INLINE char* grpc_lookup_v1_RouteLookupClusterSpecifier_serialize(const grpc_lookup_v1_RouteLookupClusterSpecifier* msg, upb_Arena* arena, size_t* len) { - return upb_Encode(msg, &grpc_lookup_v1_RouteLookupClusterSpecifier_msginit, 0, arena, len); -} -UPB_INLINE char* grpc_lookup_v1_RouteLookupClusterSpecifier_serialize_ex(const grpc_lookup_v1_RouteLookupClusterSpecifier* msg, int options, - upb_Arena* arena, size_t* len) { - return upb_Encode(msg, &grpc_lookup_v1_RouteLookupClusterSpecifier_msginit, options, arena, len); -} -UPB_INLINE bool grpc_lookup_v1_RouteLookupClusterSpecifier_has_route_lookup_config(const grpc_lookup_v1_RouteLookupClusterSpecifier *msg) { return _upb_hasbit(msg, 1); } -UPB_INLINE const grpc_lookup_v1_RouteLookupConfig* grpc_lookup_v1_RouteLookupClusterSpecifier_route_lookup_config(const grpc_lookup_v1_RouteLookupClusterSpecifier* msg) { - return *UPB_PTR_AT(msg, UPB_SIZE(4, 8), const grpc_lookup_v1_RouteLookupConfig*); -} - -UPB_INLINE void grpc_lookup_v1_RouteLookupClusterSpecifier_set_route_lookup_config(grpc_lookup_v1_RouteLookupClusterSpecifier *msg, grpc_lookup_v1_RouteLookupConfig* value) { - _upb_sethas(msg, 1); - *UPB_PTR_AT(msg, UPB_SIZE(4, 8), grpc_lookup_v1_RouteLookupConfig*) = value; -} -UPB_INLINE struct grpc_lookup_v1_RouteLookupConfig* grpc_lookup_v1_RouteLookupClusterSpecifier_mutable_route_lookup_config(grpc_lookup_v1_RouteLookupClusterSpecifier *msg, upb_Arena *arena) { - struct grpc_lookup_v1_RouteLookupConfig* sub = (struct grpc_lookup_v1_RouteLookupConfig*)grpc_lookup_v1_RouteLookupClusterSpecifier_route_lookup_config(msg); - if (sub == NULL) { - sub = (struct grpc_lookup_v1_RouteLookupConfig*)_upb_Message_New(&grpc_lookup_v1_RouteLookupConfig_msginit, arena); - if (!sub) return NULL; - grpc_lookup_v1_RouteLookupClusterSpecifier_set_route_lookup_config(msg, sub); - } - return sub; -} - -extern const upb_MiniTable_File src_proto_grpc_lookup_v1_rls_config_proto_upb_file_layout; - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#include "upb/port_undef.inc" - -#endif /* SRC_PROTO_GRPC_LOOKUP_V1_RLS_CONFIG_PROTO_UPB_H_ */ diff --git a/src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.c b/src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.c deleted file mode 100644 index 92c529b67db..00000000000 --- a/src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.c +++ /dev/null @@ -1,99 +0,0 @@ -/* This file was generated by upbc (the upb compiler) from the input - * file: - * - * src/proto/grpc/lookup/v1/rls_config.proto - * - * Do not edit -- your changes will be discarded when the file is - * regenerated. */ - -#include "upb/def.h" -#include "src/proto/grpc/lookup/v1/rls_config.upbdefs.h" -#include "src/proto/grpc/lookup/v1/rls_config.upb.h" - -extern _upb_DefPool_Init google_protobuf_duration_proto_upbdefinit; -static const char descriptor[1816] = {'\n', ')', 's', 'r', 'c', '/', 'p', 'r', 'o', 't', 'o', '/', 'g', 'r', 'p', 'c', '/', 'l', 'o', 'o', 'k', 'u', 'p', '/', 'v', -'1', '/', 'r', 'l', 's', '_', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'p', 'r', 'o', 't', 'o', '\022', '\016', 'g', 'r', 'p', 'c', '.', -'l', 'o', 'o', 'k', 'u', 'p', '.', 'v', '1', '\032', '\036', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', -'f', '/', 'd', 'u', 'r', 'a', 't', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\"', '\\', '\n', '\013', 'N', 'a', 'm', 'e', 'M', -'a', 't', 'c', 'h', 'e', 'r', '\022', '\020', '\n', '\003', 'k', 'e', 'y', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\003', 'k', 'e', 'y', '\022', -'\024', '\n', '\005', 'n', 'a', 'm', 'e', 's', '\030', '\002', ' ', '\003', '(', '\t', 'R', '\005', 'n', 'a', 'm', 'e', 's', '\022', '%', '\n', '\016', -'r', 'e', 'q', 'u', 'i', 'r', 'e', 'd', '_', 'm', 'a', 't', 'c', 'h', '\030', '\003', ' ', '\001', '(', '\010', 'R', '\r', 'r', 'e', 'q', -'u', 'i', 'r', 'e', 'd', 'M', 'a', 't', 'c', 'h', '\"', '\360', '\003', '\n', '\016', 'G', 'r', 'p', 'c', 'K', 'e', 'y', 'B', 'u', 'i', -'l', 'd', 'e', 'r', '\022', '9', '\n', '\005', 'n', 'a', 'm', 'e', 's', '\030', '\001', ' ', '\003', '(', '\013', '2', '#', '.', 'g', 'r', 'p', -'c', '.', 'l', 'o', 'o', 'k', 'u', 'p', '.', 'v', '1', '.', 'G', 'r', 'p', 'c', 'K', 'e', 'y', 'B', 'u', 'i', 'l', 'd', 'e', -'r', '.', 'N', 'a', 'm', 'e', 'R', '\005', 'n', 'a', 'm', 'e', 's', '\022', 'G', '\n', '\n', 'e', 'x', 't', 'r', 'a', '_', 'k', 'e', -'y', 's', '\030', '\003', ' ', '\001', '(', '\013', '2', '(', '.', 'g', 'r', 'p', 'c', '.', 'l', 'o', 'o', 'k', 'u', 'p', '.', 'v', '1', -'.', 'G', 'r', 'p', 'c', 'K', 'e', 'y', 'B', 'u', 'i', 'l', 'd', 'e', 'r', '.', 'E', 'x', 't', 'r', 'a', 'K', 'e', 'y', 's', -'R', '\t', 'e', 'x', 't', 'r', 'a', 'K', 'e', 'y', 's', '\022', '5', '\n', '\007', 'h', 'e', 'a', 'd', 'e', 'r', 's', '\030', '\002', ' ', -'\003', '(', '\013', '2', '\033', '.', 'g', 'r', 'p', 'c', '.', 'l', 'o', 'o', 'k', 'u', 'p', '.', 'v', '1', '.', 'N', 'a', 'm', 'e', -'M', 'a', 't', 'c', 'h', 'e', 'r', 'R', '\007', 'h', 'e', 'a', 'd', 'e', 'r', 's', '\022', 'U', '\n', '\r', 'c', 'o', 'n', 's', 't', -'a', 'n', 't', '_', 'k', 'e', 'y', 's', '\030', '\004', ' ', '\003', '(', '\013', '2', '0', '.', 'g', 'r', 'p', 'c', '.', 'l', 'o', 'o', -'k', 'u', 'p', '.', 'v', '1', '.', 'G', 'r', 'p', 'c', 'K', 'e', 'y', 'B', 'u', 'i', 'l', 'd', 'e', 'r', '.', 'C', 'o', 'n', -'s', 't', 'a', 'n', 't', 'K', 'e', 'y', 's', 'E', 'n', 't', 'r', 'y', 'R', '\014', 'c', 'o', 'n', 's', 't', 'a', 'n', 't', 'K', -'e', 'y', 's', '\032', '8', '\n', '\004', 'N', 'a', 'm', 'e', '\022', '\030', '\n', '\007', 's', 'e', 'r', 'v', 'i', 'c', 'e', '\030', '\001', ' ', -'\001', '(', '\t', 'R', '\007', 's', 'e', 'r', 'v', 'i', 'c', 'e', '\022', '\026', '\n', '\006', 'm', 'e', 't', 'h', 'o', 'd', '\030', '\002', ' ', -'\001', '(', '\t', 'R', '\006', 'm', 'e', 't', 'h', 'o', 'd', '\032', 'Q', '\n', '\t', 'E', 'x', 't', 'r', 'a', 'K', 'e', 'y', 's', '\022', -'\022', '\n', '\004', 'h', 'o', 's', 't', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\004', 'h', 'o', 's', 't', '\022', '\030', '\n', '\007', 's', 'e', -'r', 'v', 'i', 'c', 'e', '\030', '\002', ' ', '\001', '(', '\t', 'R', '\007', 's', 'e', 'r', 'v', 'i', 'c', 'e', '\022', '\026', '\n', '\006', 'm', -'e', 't', 'h', 'o', 'd', '\030', '\003', ' ', '\001', '(', '\t', 'R', '\006', 'm', 'e', 't', 'h', 'o', 'd', '\032', '?', '\n', '\021', 'C', 'o', -'n', 's', 't', 'a', 'n', 't', 'K', 'e', 'y', 's', 'E', 'n', 't', 'r', 'y', '\022', '\020', '\n', '\003', 'k', 'e', 'y', '\030', '\001', ' ', -'\001', '(', '\t', 'R', '\003', 'k', 'e', 'y', '\022', '\024', '\n', '\005', 'v', 'a', 'l', 'u', 'e', '\030', '\002', ' ', '\001', '(', '\t', 'R', '\005', -'v', 'a', 'l', 'u', 'e', ':', '\002', '8', '\001', '\"', '\361', '\002', '\n', '\016', 'H', 't', 't', 'p', 'K', 'e', 'y', 'B', 'u', 'i', 'l', -'d', 'e', 'r', '\022', '#', '\n', '\r', 'h', 'o', 's', 't', '_', 'p', 'a', 't', 't', 'e', 'r', 'n', 's', '\030', '\001', ' ', '\003', '(', -'\t', 'R', '\014', 'h', 'o', 's', 't', 'P', 'a', 't', 't', 'e', 'r', 'n', 's', '\022', '#', '\n', '\r', 'p', 'a', 't', 'h', '_', 'p', -'a', 't', 't', 'e', 'r', 'n', 's', '\030', '\002', ' ', '\003', '(', '\t', 'R', '\014', 'p', 'a', 't', 'h', 'P', 'a', 't', 't', 'e', 'r', -'n', 's', '\022', 'F', '\n', '\020', 'q', 'u', 'e', 'r', 'y', '_', 'p', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', 's', '\030', '\003', ' ', -'\003', '(', '\013', '2', '\033', '.', 'g', 'r', 'p', 'c', '.', 'l', 'o', 'o', 'k', 'u', 'p', '.', 'v', '1', '.', 'N', 'a', 'm', 'e', -'M', 'a', 't', 'c', 'h', 'e', 'r', 'R', '\017', 'q', 'u', 'e', 'r', 'y', 'P', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', 's', '\022', -'5', '\n', '\007', 'h', 'e', 'a', 'd', 'e', 'r', 's', '\030', '\004', ' ', '\003', '(', '\013', '2', '\033', '.', 'g', 'r', 'p', 'c', '.', 'l', -'o', 'o', 'k', 'u', 'p', '.', 'v', '1', '.', 'N', 'a', 'm', 'e', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'R', '\007', 'h', 'e', 'a', -'d', 'e', 'r', 's', '\022', 'U', '\n', '\r', 'c', 'o', 'n', 's', 't', 'a', 'n', 't', '_', 'k', 'e', 'y', 's', '\030', '\005', ' ', '\003', -'(', '\013', '2', '0', '.', 'g', 'r', 'p', 'c', '.', 'l', 'o', 'o', 'k', 'u', 'p', '.', 'v', '1', '.', 'H', 't', 't', 'p', 'K', -'e', 'y', 'B', 'u', 'i', 'l', 'd', 'e', 'r', '.', 'C', 'o', 'n', 's', 't', 'a', 'n', 't', 'K', 'e', 'y', 's', 'E', 'n', 't', -'r', 'y', 'R', '\014', 'c', 'o', 'n', 's', 't', 'a', 'n', 't', 'K', 'e', 'y', 's', '\032', '?', '\n', '\021', 'C', 'o', 'n', 's', 't', -'a', 'n', 't', 'K', 'e', 'y', 's', 'E', 'n', 't', 'r', 'y', '\022', '\020', '\n', '\003', 'k', 'e', 'y', '\030', '\001', ' ', '\001', '(', '\t', -'R', '\003', 'k', 'e', 'y', '\022', '\024', '\n', '\005', 'v', 'a', 'l', 'u', 'e', '\030', '\002', ' ', '\001', '(', '\t', 'R', '\005', 'v', 'a', 'l', -'u', 'e', ':', '\002', '8', '\001', '\"', '\246', '\004', '\n', '\021', 'R', 'o', 'u', 't', 'e', 'L', 'o', 'o', 'k', 'u', 'p', 'C', 'o', 'n', -'f', 'i', 'g', '\022', 'I', '\n', '\020', 'h', 't', 't', 'p', '_', 'k', 'e', 'y', 'b', 'u', 'i', 'l', 'd', 'e', 'r', 's', '\030', '\001', -' ', '\003', '(', '\013', '2', '\036', '.', 'g', 'r', 'p', 'c', '.', 'l', 'o', 'o', 'k', 'u', 'p', '.', 'v', '1', '.', 'H', 't', 't', -'p', 'K', 'e', 'y', 'B', 'u', 'i', 'l', 'd', 'e', 'r', 'R', '\017', 'h', 't', 't', 'p', 'K', 'e', 'y', 'b', 'u', 'i', 'l', 'd', -'e', 'r', 's', '\022', 'I', '\n', '\020', 'g', 'r', 'p', 'c', '_', 'k', 'e', 'y', 'b', 'u', 'i', 'l', 'd', 'e', 'r', 's', '\030', '\002', -' ', '\003', '(', '\013', '2', '\036', '.', 'g', 'r', 'p', 'c', '.', 'l', 'o', 'o', 'k', 'u', 'p', '.', 'v', '1', '.', 'G', 'r', 'p', -'c', 'K', 'e', 'y', 'B', 'u', 'i', 'l', 'd', 'e', 'r', 'R', '\017', 'g', 'r', 'p', 'c', 'K', 'e', 'y', 'b', 'u', 'i', 'l', 'd', -'e', 'r', 's', '\022', '%', '\n', '\016', 'l', 'o', 'o', 'k', 'u', 'p', '_', 's', 'e', 'r', 'v', 'i', 'c', 'e', '\030', '\003', ' ', '\001', -'(', '\t', 'R', '\r', 'l', 'o', 'o', 'k', 'u', 'p', 'S', 'e', 'r', 'v', 'i', 'c', 'e', '\022', 'O', '\n', '\026', 'l', 'o', 'o', 'k', -'u', 'p', '_', 's', 'e', 'r', 'v', 'i', 'c', 'e', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\004', ' ', '\001', '(', '\013', '2', -'\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', -'n', 'R', '\024', 'l', 'o', 'o', 'k', 'u', 'p', 'S', 'e', 'r', 'v', 'i', 'c', 'e', 'T', 'i', 'm', 'e', 'o', 'u', 't', '\022', '2', -'\n', '\007', 'm', 'a', 'x', '_', 'a', 'g', 'e', '\030', '\005', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', -'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\006', 'm', 'a', 'x', 'A', 'g', 'e', -'\022', '6', '\n', '\t', 's', 't', 'a', 'l', 'e', '_', 'a', 'g', 'e', '\030', '\006', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', -'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\010', 's', 't', -'a', 'l', 'e', 'A', 'g', 'e', '\022', '(', '\n', '\020', 'c', 'a', 'c', 'h', 'e', '_', 's', 'i', 'z', 'e', '_', 'b', 'y', 't', 'e', -'s', '\030', '\007', ' ', '\001', '(', '\003', 'R', '\016', 'c', 'a', 'c', 'h', 'e', 'S', 'i', 'z', 'e', 'B', 'y', 't', 'e', 's', '\022', '#', -'\n', '\r', 'v', 'a', 'l', 'i', 'd', '_', 't', 'a', 'r', 'g', 'e', 't', 's', '\030', '\010', ' ', '\003', '(', '\t', 'R', '\014', 'v', 'a', -'l', 'i', 'd', 'T', 'a', 'r', 'g', 'e', 't', 's', '\022', '%', '\n', '\016', 'd', 'e', 'f', 'a', 'u', 'l', 't', '_', 't', 'a', 'r', -'g', 'e', 't', '\030', '\t', ' ', '\001', '(', '\t', 'R', '\r', 'd', 'e', 'f', 'a', 'u', 'l', 't', 'T', 'a', 'r', 'g', 'e', 't', 'J', -'\004', '\010', '\n', '\020', '\013', 'R', '\033', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'p', 'r', 'o', 'c', 'e', 's', 's', 'i', 'n', 'g', -'_', 's', 't', 'r', 'a', 't', 'e', 'g', 'y', '\"', 'p', '\n', '\033', 'R', 'o', 'u', 't', 'e', 'L', 'o', 'o', 'k', 'u', 'p', 'C', -'l', 'u', 's', 't', 'e', 'r', 'S', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', '\022', 'Q', '\n', '\023', 'r', 'o', 'u', 't', 'e', '_', -'l', 'o', 'o', 'k', 'u', 'p', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\001', ' ', '\001', '(', '\013', '2', '!', '.', 'g', 'r', 'p', -'c', '.', 'l', 'o', 'o', 'k', 'u', 'p', '.', 'v', '1', '.', 'R', 'o', 'u', 't', 'e', 'L', 'o', 'o', 'k', 'u', 'p', 'C', 'o', -'n', 'f', 'i', 'g', 'R', '\021', 'r', 'o', 'u', 't', 'e', 'L', 'o', 'o', 'k', 'u', 'p', 'C', 'o', 'n', 'f', 'i', 'g', 'B', 'S', -'\n', '\021', 'i', 'o', '.', 'g', 'r', 'p', 'c', '.', 'l', 'o', 'o', 'k', 'u', 'p', '.', 'v', '1', 'B', '\016', 'R', 'l', 's', 'C', -'o', 'n', 'f', 'i', 'g', 'P', 'r', 'o', 't', 'o', 'P', '\001', 'Z', ',', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'g', 'o', 'l', 'a', -'n', 'g', '.', 'o', 'r', 'g', '/', 'g', 'r', 'p', 'c', '/', 'l', 'o', 'o', 'k', 'u', 'p', '/', 'g', 'r', 'p', 'c', '_', 'l', -'o', 'o', 'k', 'u', 'p', '_', 'v', '1', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3', -}; - -static _upb_DefPool_Init *deps[2] = { - &google_protobuf_duration_proto_upbdefinit, - NULL -}; - -_upb_DefPool_Init src_proto_grpc_lookup_v1_rls_config_proto_upbdefinit = { - deps, - &src_proto_grpc_lookup_v1_rls_config_proto_upb_file_layout, - "src/proto/grpc/lookup/v1/rls_config.proto", - UPB_STRINGVIEW_INIT(descriptor, 1816) -}; diff --git a/src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.h b/src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.h deleted file mode 100644 index 3a7591fa5de..00000000000 --- a/src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.h +++ /dev/null @@ -1,75 +0,0 @@ -/* This file was generated by upbc (the upb compiler) from the input - * file: - * - * src/proto/grpc/lookup/v1/rls_config.proto - * - * Do not edit -- your changes will be discarded when the file is - * regenerated. */ - -#ifndef SRC_PROTO_GRPC_LOOKUP_V1_RLS_CONFIG_PROTO_UPBDEFS_H_ -#define SRC_PROTO_GRPC_LOOKUP_V1_RLS_CONFIG_PROTO_UPBDEFS_H_ - -#include "upb/def.h" -#include "upb/port_def.inc" -#ifdef __cplusplus -extern "C" { -#endif - -#include "upb/def.h" - -#include "upb/port_def.inc" - -extern _upb_DefPool_Init src_proto_grpc_lookup_v1_rls_config_proto_upbdefinit; - -UPB_INLINE const upb_MessageDef *grpc_lookup_v1_NameMatcher_getmsgdef(upb_DefPool *s) { - _upb_DefPool_LoadDefInit(s, &src_proto_grpc_lookup_v1_rls_config_proto_upbdefinit); - return upb_DefPool_FindMessageByName(s, "grpc.lookup.v1.NameMatcher"); -} - -UPB_INLINE const upb_MessageDef *grpc_lookup_v1_GrpcKeyBuilder_getmsgdef(upb_DefPool *s) { - _upb_DefPool_LoadDefInit(s, &src_proto_grpc_lookup_v1_rls_config_proto_upbdefinit); - return upb_DefPool_FindMessageByName(s, "grpc.lookup.v1.GrpcKeyBuilder"); -} - -UPB_INLINE const upb_MessageDef *grpc_lookup_v1_GrpcKeyBuilder_Name_getmsgdef(upb_DefPool *s) { - _upb_DefPool_LoadDefInit(s, &src_proto_grpc_lookup_v1_rls_config_proto_upbdefinit); - return upb_DefPool_FindMessageByName(s, "grpc.lookup.v1.GrpcKeyBuilder.Name"); -} - -UPB_INLINE const upb_MessageDef *grpc_lookup_v1_GrpcKeyBuilder_ExtraKeys_getmsgdef(upb_DefPool *s) { - _upb_DefPool_LoadDefInit(s, &src_proto_grpc_lookup_v1_rls_config_proto_upbdefinit); - return upb_DefPool_FindMessageByName(s, "grpc.lookup.v1.GrpcKeyBuilder.ExtraKeys"); -} - -UPB_INLINE const upb_MessageDef *grpc_lookup_v1_GrpcKeyBuilder_ConstantKeysEntry_getmsgdef(upb_DefPool *s) { - _upb_DefPool_LoadDefInit(s, &src_proto_grpc_lookup_v1_rls_config_proto_upbdefinit); - return upb_DefPool_FindMessageByName(s, "grpc.lookup.v1.GrpcKeyBuilder.ConstantKeysEntry"); -} - -UPB_INLINE const upb_MessageDef *grpc_lookup_v1_HttpKeyBuilder_getmsgdef(upb_DefPool *s) { - _upb_DefPool_LoadDefInit(s, &src_proto_grpc_lookup_v1_rls_config_proto_upbdefinit); - return upb_DefPool_FindMessageByName(s, "grpc.lookup.v1.HttpKeyBuilder"); -} - -UPB_INLINE const upb_MessageDef *grpc_lookup_v1_HttpKeyBuilder_ConstantKeysEntry_getmsgdef(upb_DefPool *s) { - _upb_DefPool_LoadDefInit(s, &src_proto_grpc_lookup_v1_rls_config_proto_upbdefinit); - return upb_DefPool_FindMessageByName(s, "grpc.lookup.v1.HttpKeyBuilder.ConstantKeysEntry"); -} - -UPB_INLINE const upb_MessageDef *grpc_lookup_v1_RouteLookupConfig_getmsgdef(upb_DefPool *s) { - _upb_DefPool_LoadDefInit(s, &src_proto_grpc_lookup_v1_rls_config_proto_upbdefinit); - return upb_DefPool_FindMessageByName(s, "grpc.lookup.v1.RouteLookupConfig"); -} - -UPB_INLINE const upb_MessageDef *grpc_lookup_v1_RouteLookupClusterSpecifier_getmsgdef(upb_DefPool *s) { - _upb_DefPool_LoadDefInit(s, &src_proto_grpc_lookup_v1_rls_config_proto_upbdefinit); - return upb_DefPool_FindMessageByName(s, "grpc.lookup.v1.RouteLookupClusterSpecifier"); -} - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#include "upb/port_undef.inc" - -#endif /* SRC_PROTO_GRPC_LOOKUP_V1_RLS_CONFIG_PROTO_UPBDEFS_H_ */ diff --git a/src/core/ext/xds/xds_client.cc b/src/core/ext/xds/xds_client.cc index ae246b44a74..400f7fbf5d7 100644 --- a/src/core/ext/xds/xds_client.cc +++ b/src/core/ext/xds/xds_client.cc @@ -38,7 +38,6 @@ #include "src/core/ext/xds/xds_channel_args.h" #include "src/core/ext/xds/xds_client_stats.h" #include "src/core/ext/xds/xds_cluster.h" -#include "src/core/ext/xds/xds_cluster_specifier_plugin.h" #include "src/core/ext/xds/xds_endpoint.h" #include "src/core/ext/xds/xds_http_filters.h" #include "src/core/ext/xds/xds_listener.h" @@ -2334,7 +2333,6 @@ std::string XdsClient::DumpClientConfigBinary() { void XdsClientGlobalInit() { g_mu = new Mutex; XdsHttpFilterRegistry::Init(); - XdsClusterSpecifierPluginRegistry::Init(); } // TODO(roth): Find a better way to clear the fallback config that does @@ -2345,7 +2343,6 @@ void XdsClientGlobalShutdown() ABSL_NO_THREAD_SAFETY_ANALYSIS { delete g_mu; g_mu = nullptr; XdsHttpFilterRegistry::Shutdown(); - XdsClusterSpecifierPluginRegistry::Shutdown(); } namespace { diff --git a/src/core/ext/xds/xds_cluster_specifier_plugin.cc b/src/core/ext/xds/xds_cluster_specifier_plugin.cc deleted file mode 100644 index de3f6934f06..00000000000 --- a/src/core/ext/xds/xds_cluster_specifier_plugin.cc +++ /dev/null @@ -1,144 +0,0 @@ -// -// 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_cluster_specifier_plugin.h" - -#include "absl/strings/str_format.h" -#include "envoy/extensions/filters/http/router/v3/router.upb.h" -#include "envoy/extensions/filters/http/router/v3/router.upbdefs.h" -#include "google/protobuf/duration.upb.h" -#include "upb/json_encode.h" - -#include "src/core/ext/filters/client_channel/lb_policy_registry.h" -#include "src/core/ext/xds/upb_utils.h" -#include "src/proto/grpc/lookup/v1/rls_config.upb.h" -#include "src/proto/grpc/lookup/v1/rls_config.upbdefs.h" - -namespace grpc_core { - -const char* kXdsRouteLookupClusterSpecifierPluginConfigName = - "grpc.lookup.v1.RouteLookupClusterSpecifier"; - -void XdsRouteLookupClusterSpecifierPlugin::PopulateSymtab( - upb_DefPool* symtab) const { - grpc_lookup_v1_RouteLookupConfig_getmsgdef(symtab); -} - -absl::StatusOr -XdsRouteLookupClusterSpecifierPlugin::GenerateLoadBalancingPolicyConfig( - upb_StringView serialized_plugin_config, upb_Arena* arena, - upb_DefPool* symtab) const { - const auto* specifier = grpc_lookup_v1_RouteLookupClusterSpecifier_parse( - serialized_plugin_config.data, serialized_plugin_config.size, arena); - if (specifier == nullptr) { - return absl::InvalidArgumentError("Could not parse plugin config"); - } - const auto* plugin_config = - grpc_lookup_v1_RouteLookupClusterSpecifier_route_lookup_config(specifier); - if (plugin_config == nullptr) { - return absl::InvalidArgumentError( - "Could not get route lookup config from route lookup cluster " - "specifier"); - } - upb::Status status; - const upb_MessageDef* msg_type = - grpc_lookup_v1_RouteLookupConfig_getmsgdef(symtab); - size_t json_size = upb_JsonEncode(plugin_config, msg_type, symtab, 0, nullptr, - 0, status.ptr()); - if (json_size == static_cast(-1)) { - return absl::InvalidArgumentError( - absl::StrCat("failed to dump proto to JSON: ", - upb_Status_ErrorMessage(status.ptr()))); - } - void* buf = upb_Arena_Malloc(arena, json_size + 1); - upb_JsonEncode(plugin_config, msg_type, symtab, 0, - reinterpret_cast(buf), json_size + 1, status.ptr()); - Json::Object rls_policy; - grpc_error_handle error = GRPC_ERROR_NONE; - rls_policy["routeLookupConfig"] = - Json::Parse(reinterpret_cast(buf), &error); - GPR_ASSERT(error == GRPC_ERROR_NONE); - Json::Object cds_policy; - cds_policy["cds_experimental"] = Json::Object(); - Json::Array child_policy; - child_policy.emplace_back(std::move(cds_policy)); - rls_policy["childPolicy"] = std::move(child_policy); - rls_policy["childPolicyConfigTargetFieldName"] = "cluster"; - Json::Object policy; - policy["rls_experimental"] = std::move(rls_policy); - Json::Array policies; - policies.emplace_back(std::move(policy)); - return Json(policies); -} - -namespace { - -using PluginRegistryMap = - std::map>; - -PluginRegistryMap* g_plugin_registry = nullptr; - -} // namespace - -void XdsClusterSpecifierPluginRegistry::PopulateSymtab(upb_DefPool* symtab) { - for (const auto& p : *g_plugin_registry) { - p.second->PopulateSymtab(symtab); - } -} - -void XdsClusterSpecifierPluginRegistry::RegisterPlugin( - std::unique_ptr plugin, - absl::string_view config_proto_type_name) { - (*g_plugin_registry)[config_proto_type_name] = std::move(plugin); -} - -absl::StatusOr -XdsClusterSpecifierPluginRegistry::GenerateLoadBalancingPolicyConfig( - absl::string_view proto_type_name, upb_StringView serialized_plugin_config, - upb_Arena* arena, upb_DefPool* symtab) { - auto it = g_plugin_registry->find(proto_type_name); - if (it == g_plugin_registry->end()) { - return absl::InvalidArgumentError( - "Unable to locate the cluster specifier plugin in the registry"); - } - auto lb_policy_config = it->second->GenerateLoadBalancingPolicyConfig( - serialized_plugin_config, arena, symtab); - if (!lb_policy_config.ok()) return lb_policy_config.status(); - grpc_error_handle parse_error = GRPC_ERROR_NONE; - LoadBalancingPolicyRegistry::ParseLoadBalancingConfig(*lb_policy_config, - &parse_error); - if (parse_error != GRPC_ERROR_NONE) { - absl::Status status = absl::InvalidArgumentError(absl::StrCat( - proto_type_name, - " ClusterSpecifierPlugin returned invalid LB policy config: ", - grpc_error_std_string(parse_error))); - GRPC_ERROR_UNREF(parse_error); - return status; - } - return lb_policy_config->Dump(); -} - -void XdsClusterSpecifierPluginRegistry::Init() { - g_plugin_registry = new PluginRegistryMap; - RegisterPlugin(absl::make_unique(), - kXdsRouteLookupClusterSpecifierPluginConfigName); -} - -void XdsClusterSpecifierPluginRegistry::Shutdown() { delete g_plugin_registry; } - -} // namespace grpc_core diff --git a/src/core/ext/xds/xds_cluster_specifier_plugin.h b/src/core/ext/xds/xds_cluster_specifier_plugin.h deleted file mode 100644 index 1d688cfc02e..00000000000 --- a/src/core/ext/xds/xds_cluster_specifier_plugin.h +++ /dev/null @@ -1,81 +0,0 @@ -// -// 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_CLUSTER_SPECIFIER_PLUGIN_H -#define GRPC_CORE_EXT_XDS_XDS_CLUSTER_SPECIFIER_PLUGIN_H - -#include - -#include -#include -#include - -#include "absl/status/statusor.h" -#include "absl/strings/str_cat.h" -#include "absl/strings/string_view.h" -#include "google/protobuf/any.upb.h" -#include "upb/def.h" - -#include - -#include "src/core/lib/channel/channel_stack.h" -#include "src/core/lib/json/json.h" - -namespace grpc_core { - -class XdsClusterSpecifierPluginImpl { - public: - virtual ~XdsClusterSpecifierPluginImpl() = default; - - // Loads the proto message into the upb symtab. - virtual void PopulateSymtab(upb_DefPool* symtab) const = 0; - - // Returns the LB policy config in JSON form. - virtual absl::StatusOr GenerateLoadBalancingPolicyConfig( - upb_StringView serialized_plugin_config, upb_Arena* arena, - upb_DefPool* symtab) const = 0; -}; - -class XdsRouteLookupClusterSpecifierPlugin - : public XdsClusterSpecifierPluginImpl { - void PopulateSymtab(upb_DefPool* symtab) const override; - - absl::StatusOr GenerateLoadBalancingPolicyConfig( - upb_StringView serialized_plugin_config, upb_Arena* arena, - upb_DefPool* symtab) const override; -}; - -class XdsClusterSpecifierPluginRegistry { - public: - static void RegisterPlugin( - std::unique_ptr plugin, - absl::string_view config_proto_type_name); - - static void PopulateSymtab(upb_DefPool* symtab); - - static absl::StatusOr GenerateLoadBalancingPolicyConfig( - absl::string_view proto_type_name, - upb_StringView serialized_plugin_config, upb_Arena* arena, - upb_DefPool* symtab); - - // Global init and shutdown. - static void Init(); - static void Shutdown(); -}; - -} // namespace grpc_core - -#endif // GRPC_CORE_EXT_XDS_XDS_CLUSTER_SPECIFIER_PLUGIN_H diff --git a/src/core/ext/xds/xds_common_types.cc b/src/core/ext/xds/xds_common_types.cc index 37083181321..bfa0ecad173 100644 --- a/src/core/ext/xds/xds_common_types.cc +++ b/src/core/ext/xds/xds_common_types.cc @@ -365,23 +365,23 @@ 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") { +grpc_error_handle ExtractHttpFilterTypeName(const XdsEncodingContext& context, + const google_protobuf_Any* any, + absl::string_view* filter_type) { + *filter_type = UpbStringToAbsl(google_protobuf_Any_type_url(any)); + if (*filter_type == "type.googleapis.com/xds.type.v3.TypedStruct" || + *filter_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( any_value.data, any_value.size, context.arena); if (typed_struct == nullptr) { return GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "could not parse TypedStruct from extension"); + "could not parse TypedStruct from filter config"); } - *extension_type = + *filter_type = UpbStringToAbsl(xds_type_v3_TypedStruct_type_url(typed_struct)); } - *extension_type = absl::StripPrefix(*extension_type, "type.googleapis.com/"); + *filter_type = absl::StripPrefix(*filter_type, "type.googleapis.com/"); return GRPC_ERROR_NONE; } diff --git a/src/core/ext/xds/xds_common_types.h b/src/core/ext/xds/xds_common_types.h index c5e118bd828..df96e8c93ff 100644 --- a/src/core/ext/xds/xds_common_types.h +++ b/src/core/ext/xds/xds_common_types.h @@ -86,9 +86,9 @@ struct CommonTlsContext { CommonTlsContext* common_tls_context); }; -grpc_error_handle ExtractExtensionTypeName(const XdsEncodingContext& context, - const google_protobuf_Any* any, - absl::string_view* extension_type); +grpc_error_handle ExtractHttpFilterTypeName(const XdsEncodingContext& context, + const google_protobuf_Any* any, + absl::string_view* filter_type); } // namespace grpc_core diff --git a/src/core/ext/xds/xds_listener.cc b/src/core/ext/xds/xds_listener.cc index 14847e31d19..24cde3609fe 100644 --- a/src/core/ext/xds/xds_listener.cc +++ b/src/core/ext/xds/xds_listener.cc @@ -332,7 +332,7 @@ grpc_error_handle HttpConnectionManagerParse( } absl::string_view filter_type; grpc_error_handle error = - ExtractExtensionTypeName(context, any, &filter_type); + ExtractHttpFilterTypeName(context, any, &filter_type); if (error != GRPC_ERROR_NONE) return error; const XdsHttpFilterImpl* filter_impl = XdsHttpFilterRegistry::GetFilterForType(filter_type); diff --git a/src/core/ext/xds/xds_route_config.cc b/src/core/ext/xds/xds_route_config.cc index 6720c90a2bc..c894ad6800d 100644 --- a/src/core/ext/xds/xds_route_config.cc +++ b/src/core/ext/xds/xds_route_config.cc @@ -23,7 +23,6 @@ #include "absl/strings/str_split.h" #include "absl/strings/string_view.h" #include "envoy/config/core/v3/base.upb.h" -#include "envoy/config/core/v3/extension.upb.h" #include "envoy/config/route/v3/route.upb.h" #include "envoy/config/route/v3/route.upbdefs.h" #include "envoy/config/route/v3/route_components.upb.h" @@ -40,14 +39,12 @@ #include "src/core/ext/xds/upb_utils.h" #include "src/core/ext/xds/xds_api.h" -#include "src/core/ext/xds/xds_cluster_specifier_plugin.h" #include "src/core/ext/xds/xds_common_types.h" #include "src/core/ext/xds/xds_resource_type.h" #include "src/core/ext/xds/xds_routing.h" #include "src/core/lib/gpr/env.h" #include "src/core/lib/gpr/string.h" #include "src/core/lib/iomgr/error.h" -#include "src/core/lib/transport/error_utils.h" namespace grpc_core { @@ -60,15 +57,6 @@ bool XdsRbacEnabled() { return parse_succeeded && parsed_value; } -// TODO(donnadionne): Remove once RLS is no longer experimental -bool XdsRlsEnabled() { - char* value = gpr_getenv("GRPC_EXPERIMENTAL_XDS_RLS_LB"); - bool parsed_value; - bool parse_succeeded = gpr_parse_bool_value(value, &parsed_value); - gpr_free(value); - return parse_succeeded && parsed_value; -} - // // XdsRouteConfigResource::RetryPolicy // @@ -224,18 +212,11 @@ std::string XdsRouteConfigResource::Route::RouteAction::ToString() const { if (retry_policy.has_value()) { contents.push_back(absl::StrCat("retry_policy=", retry_policy->ToString())); } - if (action.index() == kClusterIndex) { - contents.push_back( - absl::StrFormat("Cluster name: %s", absl::get(action))); - } else if (action.index() == kWeightedClustersIndex) { - auto& action_weighted_clusters = absl::get(action); - for (const ClusterWeight& cluster_weight : action_weighted_clusters) { - contents.push_back(cluster_weight.ToString()); - } - } else if (action.index() == kClusterSpecifierPluginIndex) { - contents.push_back( - absl::StrFormat("Cluster specifier plugin name: %s", - absl::get(action))); + if (!cluster_name.empty()) { + contents.push_back(absl::StrFormat("Cluster name: %s", cluster_name)); + } + for (const ClusterWeight& cluster_weight : weighted_clusters) { + contents.push_back(cluster_weight.ToString()); } if (max_stream_duration.has_value()) { contents.push_back(max_stream_duration->ToString()); @@ -277,78 +258,35 @@ std::string XdsRouteConfigResource::Route::ToString() const { // std::string XdsRouteConfigResource::ToString() const { - std::vector parts; + std::vector vhosts; for (const VirtualHost& vhost : virtual_hosts) { - parts.push_back( + vhosts.push_back( absl::StrCat("vhost={\n" " domains=[", absl::StrJoin(vhost.domains, ", "), "]\n" " routes=[\n")); for (const XdsRouteConfigResource::Route& route : vhost.routes) { - parts.push_back(" {\n"); - parts.push_back(route.ToString()); - parts.push_back("\n }\n"); + vhosts.push_back(" {\n"); + vhosts.push_back(route.ToString()); + vhosts.push_back("\n }\n"); } - parts.push_back(" ]\n"); - parts.push_back(" typed_per_filter_config={\n"); + vhosts.push_back(" ]\n"); + vhosts.push_back(" typed_per_filter_config={\n"); for (const auto& p : vhost.typed_per_filter_config) { const std::string& name = p.first; const auto& config = p.second; - parts.push_back(absl::StrCat(" ", name, "=", config.ToString(), "\n")); + vhosts.push_back( + absl::StrCat(" ", name, "=", config.ToString(), "\n")); } - parts.push_back(" }\n"); - parts.push_back("]\n"); + vhosts.push_back(" }\n"); + vhosts.push_back("]\n"); } - parts.push_back("cluster_specifier_plugins={\n"); - for (const auto& it : cluster_specifier_plugin_map) { - parts.push_back(absl::StrFormat("%s={%s}\n", it.first, it.second)); - } - parts.push_back("}"); - return absl::StrJoin(parts, ""); + return absl::StrJoin(vhosts, ""); } namespace { -grpc_error_handle ClusterSpecifierPluginParse( - const XdsEncodingContext& context, - const envoy_config_route_v3_RouteConfiguration* route_config, - XdsRouteConfigResource* rds_update) { - size_t num_cluster_specifier_plugins; - const envoy_config_route_v3_ClusterSpecifierPlugin* const* - cluster_specifier_plugin = - envoy_config_route_v3_RouteConfiguration_cluster_specifier_plugins( - route_config, &num_cluster_specifier_plugins); - for (size_t i = 0; i < num_cluster_specifier_plugins; ++i) { - const envoy_config_core_v3_TypedExtensionConfig* extension = - envoy_config_route_v3_ClusterSpecifierPlugin_extension( - cluster_specifier_plugin[i]); - std::string name = UpbStringToStdString( - envoy_config_core_v3_TypedExtensionConfig_name(extension)); - const google_protobuf_Any* any = - envoy_config_core_v3_TypedExtensionConfig_typed_config(extension); - if (any == nullptr) { - return GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "could not obtrain TypedExtensionConfig for plugin config"); - } - absl::string_view plugin_type; - grpc_error_handle error = - ExtractExtensionTypeName(context, any, &plugin_type); - if (error != GRPC_ERROR_NONE) return error; - // Find the plugin and generate the policy. - auto lb_policy_config = - XdsClusterSpecifierPluginRegistry::GenerateLoadBalancingPolicyConfig( - plugin_type, google_protobuf_Any_value(any), context.arena, - context.symtab); - if (!lb_policy_config.ok()) { - return absl_status_to_grpc_error(lb_policy_config.status()); - } - rds_update->cluster_specifier_plugin_map[std::move(name)] = - std::move(lb_policy_config.value()); - } - return GRPC_ERROR_NONE; -} - grpc_error_handle RoutePathMatchParse( const envoy_config_route_v3_RouteMatch* match, XdsRouteConfigResource::Route* route, bool* ignore_route) { @@ -585,7 +523,7 @@ grpc_error_handle ParseTypedPerFilterConfig( } } grpc_error_handle error = - ExtractExtensionTypeName(context, any, &filter_type); + ExtractHttpFilterTypeName(context, any, &filter_type); if (error != GRPC_ERROR_NONE) return error; const XdsHttpFilterImpl* filter_impl = XdsHttpFilterRegistry::GetFilterForType(filter_type); @@ -685,27 +623,19 @@ grpc_error_handle RetryPolicyParse( grpc_error_handle RouteActionParse( const XdsEncodingContext& context, const envoy_config_route_v3_Route* route_msg, - const std::map& - cluster_specifier_plugin_map, XdsRouteConfigResource::Route::RouteAction* route, bool* ignore_route) { const envoy_config_route_v3_RouteAction* route_action = envoy_config_route_v3_Route_route(route_msg); // Get the cluster or weighted_clusters in the RouteAction. if (envoy_config_route_v3_RouteAction_has_cluster(route_action)) { - std::string cluster_name = UpbStringToStdString( + route->cluster_name = UpbStringToStdString( envoy_config_route_v3_RouteAction_cluster(route_action)); - if (cluster_name.empty()) { + if (route->cluster_name.empty()) { return GRPC_ERROR_CREATE_FROM_STATIC_STRING( "RouteAction cluster contains empty cluster name."); } - route->action - .emplace( - std::move(cluster_name)); } else if (envoy_config_route_v3_RouteAction_has_weighted_clusters( route_action)) { - std::vector - action_weighted_clusters; const envoy_config_route_v3_WeightedCluster* weighted_cluster = envoy_config_route_v3_RouteAction_weighted_clusters(route_action); uint32_t total_weight = 100; @@ -752,39 +682,18 @@ grpc_error_handle RouteActionParse( &cluster.typed_per_filter_config); if (error != GRPC_ERROR_NONE) return error; } - action_weighted_clusters.emplace_back(std::move(cluster)); + route->weighted_clusters.emplace_back(std::move(cluster)); } if (total_weight != sum_of_weights) { return GRPC_ERROR_CREATE_FROM_STATIC_STRING( "RouteAction weighted_cluster has incorrect total weight"); } - if (action_weighted_clusters.empty()) { + if (route->weighted_clusters.empty()) { return GRPC_ERROR_CREATE_FROM_STATIC_STRING( "RouteAction weighted_cluster has no valid clusters specified."); } - route->action = std::move(action_weighted_clusters); - } else if (XdsRlsEnabled() && - envoy_config_route_v3_RouteAction_has_cluster_specifier_plugin( - route_action)) { - std::string plugin_name = UpbStringToStdString( - envoy_config_route_v3_RouteAction_cluster_specifier_plugin( - route_action)); - if (plugin_name.empty()) { - return GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "RouteAction cluster contains empty cluster specifier plugin name."); - } - if (cluster_specifier_plugin_map.find(plugin_name) == - cluster_specifier_plugin_map.end()) { - return GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "RouteAction cluster contains cluster specifier plugin name not " - "configured."); - } - route->action.emplace( - std::move(plugin_name)); } else { - // No cluster or weighted_clusters or plugin found in RouteAction, ignore - // this route. + // No cluster or weighted_clusters found in RouteAction, ignore this route. *ignore_route = true; } if (!*ignore_route) { @@ -899,12 +808,6 @@ grpc_error_handle XdsRouteConfigResource::Parse( const XdsEncodingContext& context, const envoy_config_route_v3_RouteConfiguration* route_config, XdsRouteConfigResource* rds_update) { - // Get the cluster spcifier plugins - if (XdsRlsEnabled()) { - grpc_error_handle error = - ClusterSpecifierPluginParse(context, route_config, rds_update); - if (error != GRPC_ERROR_NONE) return error; - } // Get the virtual hosts. size_t num_virtual_hosts; const envoy_config_route_v3_VirtualHost* const* virtual_hosts = @@ -959,12 +862,6 @@ grpc_error_handle XdsRouteConfigResource::Parse( return GRPC_ERROR_CREATE_FROM_STATIC_STRING( "No route found in the virtual host."); } - // Build a set of cluster_specifier_plugin configured to make sure each is - // actually referenced by a route action. - std::set cluster_specifier_plugins; - for (auto& plugin : rds_update->cluster_specifier_plugin_map) { - cluster_specifier_plugins.emplace(plugin.first); - } // Loop over the whole list of routes for (size_t j = 0; j < num_routes; ++j) { const envoy_config_route_v3_RouteMatch* match = @@ -992,23 +889,14 @@ grpc_error_handle XdsRouteConfigResource::Parse( route.action.emplace(); auto& route_action = absl::get(route.action); - error = RouteActionParse(context, routes[j], - rds_update->cluster_specifier_plugin_map, - &route_action, &ignore_route); + error = + RouteActionParse(context, routes[j], &route_action, &ignore_route); if (error != GRPC_ERROR_NONE) return error; if (ignore_route) continue; if (route_action.retry_policy == absl::nullopt && retry_policy != nullptr) { route_action.retry_policy = virtual_host_retry_policy; } - // Mark off plugins used in route action. - std::string* cluster_specifier_action = - absl::get_if( - &route_action.action); - if (cluster_specifier_action != nullptr) { - cluster_specifier_plugins.erase(*cluster_specifier_action); - } } else if (envoy_config_route_v3_Route_has_non_forwarding_action( routes[j])) { route.action @@ -1030,12 +918,6 @@ grpc_error_handle XdsRouteConfigResource::Parse( if (vhost.routes.empty()) { return GRPC_ERROR_CREATE_FROM_STATIC_STRING("No valid routes specified."); } - // For plugins not used in route action, delete from the update to prevent - // further use. - for (auto& unused_plugin : cluster_specifier_plugins) { - rds_update->cluster_specifier_plugin_map.erase( - std::string(unused_plugin)); - } } return GRPC_ERROR_NONE; } diff --git a/src/core/ext/xds/xds_route_config.h b/src/core/ext/xds/xds_route_config.h index dd719b0c86c..08803a09815 100644 --- a/src/core/ext/xds/xds_route_config.h +++ b/src/core/ext/xds/xds_route_config.h @@ -30,7 +30,6 @@ #include "re2/re2.h" #include "src/core/ext/xds/xds_client.h" -#include "src/core/ext/xds/xds_cluster_specifier_plugin.h" #include "src/core/ext/xds/xds_common_types.h" #include "src/core/ext/xds/xds_http_filters.h" #include "src/core/ext/xds/xds_resource_type_impl.h" @@ -68,6 +67,8 @@ struct XdsRouteConfigResource { std::string ToString() const; }; + // TODO(donnadionne): When we can use absl::variant<>, consider using that + // for: PathMatcher, HeaderMatcher, cluster_name and weighted_clusters struct Route { // Matchers for this route. struct Matchers { @@ -129,11 +130,10 @@ struct XdsRouteConfigResource { absl::optional retry_policy; // Action for this route. - static constexpr size_t kClusterIndex = 0; - static constexpr size_t kWeightedClustersIndex = 1; - static constexpr size_t kClusterSpecifierPluginIndex = 2; - absl::variant, std::string> - action; + // TODO(roth): When we can use absl::variant<>, consider using that + // here, to enforce the fact that only one of the two fields can be set. + std::string cluster_name; + std::vector weighted_clusters; // Storing the timeout duration from route action: // RouteAction.max_stream_duration.grpc_timeout_header_max or // RouteAction.max_stream_duration.max_stream_duration if the former is @@ -142,7 +142,9 @@ struct XdsRouteConfigResource { bool operator==(const RouteAction& other) const { return hash_policies == other.hash_policies && - retry_policy == other.retry_policy && action == other.action && + retry_policy == other.retry_policy && + cluster_name == other.cluster_name && + weighted_clusters == other.weighted_clusters && max_stream_duration == other.max_stream_duration; } std::string ToString() const; @@ -176,13 +178,9 @@ struct XdsRouteConfigResource { }; std::vector virtual_hosts; - std::map - cluster_specifier_plugin_map; bool operator==(const XdsRouteConfigResource& other) const { - return virtual_hosts == other.virtual_hosts && - cluster_specifier_plugin_map == other.cluster_specifier_plugin_map; + return virtual_hosts == other.virtual_hosts; } std::string ToString() const; @@ -209,7 +207,6 @@ class XdsRouteConfigResourceType void InitUpbSymtab(upb_DefPool* symtab) const override { envoy_config_route_v3_RouteConfiguration_getmsgdef(symtab); - XdsClusterSpecifierPluginRegistry::PopulateSymtab(symtab); } }; diff --git a/src/core/lib/json/json_util.h b/src/core/lib/json/json_util.h index 9582ab21f9e..29de52d8173 100644 --- a/src/core/lib/json/json_util.h +++ b/src/core/lib/json/json_util.h @@ -45,9 +45,9 @@ bool ExtractJsonNumber(const Json& json, absl::string_view field_name, NumericType* output, std::vector* error_list) { static_assert(std::is_integral::value, "Integral required"); - if (json.type() != Json::Type::NUMBER && json.type() != Json::Type::STRING) { - error_list->push_back(GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrCat( - "field:", field_name, " error:type should be NUMBER or STRING"))); + if (json.type() != Json::Type::NUMBER) { + error_list->push_back(GRPC_ERROR_CREATE_FROM_CPP_STRING( + absl::StrCat("field:", field_name, " error:type should be NUMBER"))); return false; } if (!absl::SimpleAtoi(json.string_value(), output)) { diff --git a/src/proto/grpc/lookup/v1/BUILD b/src/proto/grpc/lookup/v1/BUILD index 81cf765b56f..0701ec0e674 100644 --- a/src/proto/grpc/lookup/v1/BUILD +++ b/src/proto/grpc/lookup/v1/BUILD @@ -28,21 +28,7 @@ grpc_proto_library( well_known_protos = True, ) -grpc_proto_library( - name = "rls_config_proto", - srcs = ["rls_config.proto"], - well_known_protos = True, -) - proto_library( name = "rls_proto_descriptor", srcs = ["rls.proto"], ) - -proto_library( - name = "rls_config_proto_descriptor", - srcs = ["rls_config.proto"], - deps = [ - "@com_google_protobuf//:duration_proto", - ], -) diff --git a/src/proto/grpc/testing/xds/v3/BUILD b/src/proto/grpc/testing/xds/v3/BUILD index fe2ee270bf9..2c87a97ea76 100644 --- a/src/proto/grpc/testing/xds/v3/BUILD +++ b/src/proto/grpc/testing/xds/v3/BUILD @@ -197,7 +197,6 @@ grpc_proto_library( well_known_protos = True, deps = [ "base_proto", - "extension_proto", "percent_proto", "range_proto", "regex_proto", diff --git a/src/proto/grpc/testing/xds/v3/route.proto b/src/proto/grpc/testing/xds/v3/route.proto index 02133d8de36..7109fe21db1 100644 --- a/src/proto/grpc/testing/xds/v3/route.proto +++ b/src/proto/grpc/testing/xds/v3/route.proto @@ -19,7 +19,6 @@ syntax = "proto3"; package envoy.config.route.v3; import "src/proto/grpc/testing/xds/v3/base.proto"; -import "src/proto/grpc/testing/xds/v3/extension.proto"; import "src/proto/grpc/testing/xds/v3/regex.proto"; import "src/proto/grpc/testing/xds/v3/percent.proto"; import "src/proto/grpc/testing/xds/v3/range.proto"; @@ -269,13 +268,6 @@ message RouteAction { // :ref:`traffic splitting ` // for additional documentation. WeightedCluster weighted_clusters = 3; - - // Name of the cluster specifier plugin to use to determine the cluster for - // requests on this route. The plugin name must be defined in the associated - // :ref:`envoy_v3_api_field_config.route.v3.RouteConfiguration.cluster_specifier_plugins` - // in the - // :ref:`envoy_v3_api_field_config.core.v3.TypedExtensionConfig.name` field. - string cluster_specifier_plugin = 37; } message HashPolicy { @@ -443,12 +435,6 @@ message HeaderMatcher { message QueryParameterMatcher { } -// Configuration for a cluster specifier plugin. -message ClusterSpecifierPlugin { - // The name of the plugin and its opaque configuration. - core.v3.TypedExtensionConfig extension = 1; -} - // [#protodoc-title: HTTP route configuration] // * Routing :ref:`architecture overview ` // * HTTP :ref:`router filter ` @@ -463,11 +449,6 @@ message RouteConfiguration { // An array of virtual hosts that make up the route table. repeated VirtualHost virtual_hosts = 2; - - // A list of plugins and their configurations which may be used by a - // :ref:`envoy_v3_api_field_config.route.v3.RouteAction.cluster_specifier_plugin` - // within the route. All *extension.name* fields in this list must be unique. - repeated ClusterSpecifierPlugin cluster_specifier_plugins = 12; } message RedirectAction { diff --git a/src/python/grpcio/grpc_core_dependencies.py b/src/python/grpcio/grpc_core_dependencies.py index f1d0e689883..7305945dc3f 100644 --- a/src/python/grpcio/grpc_core_dependencies.py +++ b/src/python/grpcio/grpc_core_dependencies.py @@ -235,7 +235,6 @@ CORE_SOURCE_FILES = [ 'src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c', 'src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c', 'src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c', - 'src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.c', 'src/core/ext/upb-generated/udpa/annotations/migrate.upb.c', 'src/core/ext/upb-generated/udpa/annotations/security.upb.c', 'src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c', @@ -370,7 +369,6 @@ CORE_SOURCE_FILES = [ 'src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c', 'src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c', 'src/core/ext/upbdefs-generated/opencensus/proto/trace/v1/trace_config.upbdefs.c', - 'src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.c', 'src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c', 'src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c', 'src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c', @@ -403,7 +401,6 @@ CORE_SOURCE_FILES = [ 'src/core/ext/xds/xds_client.cc', 'src/core/ext/xds/xds_client_stats.cc', 'src/core/ext/xds/xds_cluster.cc', - 'src/core/ext/xds/xds_cluster_specifier_plugin.cc', 'src/core/ext/xds/xds_common_types.cc', 'src/core/ext/xds/xds_endpoint.cc', 'src/core/ext/xds/xds_http_fault_filter.cc', @@ -1174,7 +1171,6 @@ CORE_SOURCE_FILES = [ 'third_party/upb/upb/decode_fast.c', 'third_party/upb/upb/def.c', 'third_party/upb/upb/encode.c', - 'third_party/upb/upb/json_encode.c', 'third_party/upb/upb/msg.c', 'third_party/upb/upb/reflection.c', 'third_party/upb/upb/table.c', diff --git a/src/upb/gen_build_yaml.py b/src/upb/gen_build_yaml.py index 939d71b3991..d347eb554f4 100755 --- a/src/upb/gen_build_yaml.py +++ b/src/upb/gen_build_yaml.py @@ -36,7 +36,6 @@ try: "third_party/upb/upb/decode.c", "third_party/upb/upb/def.c", "third_party/upb/upb/encode.c", - "third_party/upb/upb/json_encode.c", "third_party/upb/upb/msg.c", "third_party/upb/upb/reflection.c", "third_party/upb/upb/table.c", @@ -53,7 +52,6 @@ try: "third_party/upb/upb/def.h", "third_party/upb/upb/def.hpp", "third_party/upb/upb/encode.h", - "third_party/upb/upb/json_encode.h", "third_party/upb/upb/msg_internal.h", "third_party/upb/upb/msg.h", "third_party/upb/upb/port_def.inc", diff --git a/test/core/client_channel/rls_lb_config_parser_test.cc b/test/core/client_channel/rls_lb_config_parser_test.cc index 7ac0efef283..3089e33c988 100644 --- a/test/core/client_channel/rls_lb_config_parser_test.cc +++ b/test/core/client_channel/rls_lb_config_parser_test.cc @@ -35,16 +35,22 @@ namespace { class RlsConfigParsingTest : public ::testing::Test { public: - static void SetUpTestSuite() { grpc_init(); } + static void SetUpTestSuite() { + gpr_setenv("GRPC_EXPERIMENTAL_ENABLE_RLS_LB_POLICY", "true"); + grpc_init(); + } - static void TearDownTestSuite() { grpc_shutdown_blocking(); } + static void TearDownTestSuite() { + grpc_shutdown_blocking(); + gpr_unsetenv("GRPC_EXPERIMENTAL_ENABLE_RLS_LB_POLICY"); + } }; TEST_F(RlsConfigParsingTest, ValidConfig) { const char* service_config_json = "{\n" " \"loadBalancingConfig\":[{\n" - " \"rls_experimental\":{\n" + " \"rls\":{\n" " \"routeLookupConfig\":{\n" " \"lookupService\":\"rls.example.com:80\",\n" " \"cacheSizeBytes\":1,\n" @@ -82,7 +88,7 @@ TEST_F(RlsConfigParsingTest, TopLevelRequiredFieldsMissing) { const char* service_config_json = "{\n" " \"loadBalancingConfig\":[{\n" - " \"rls_experimental\":{\n" + " \"rls\":{\n" " }\n" " }]\n" "}\n"; @@ -103,7 +109,7 @@ TEST_F(RlsConfigParsingTest, TopLevelFieldsWrongTypes) { const char* service_config_json = "{\n" " \"loadBalancingConfig\":[{\n" - " \"rls_experimental\":{\n" + " \"rls\":{\n" " \"routeLookupConfig\":1,\n" " \"routeLookupChannelServiceConfig\": 1,\n" " \"childPolicy\":1,\n" @@ -129,7 +135,7 @@ TEST_F(RlsConfigParsingTest, TopLevelFieldsInvalidValues) { const char* service_config_json = "{\n" " \"loadBalancingConfig\":[{\n" - " \"rls_experimental\":{\n" + " \"rls\":{\n" " \"childPolicy\":[\n" " {\"unknown\":{}}\n" " ],\n" @@ -154,7 +160,7 @@ TEST_F(RlsConfigParsingTest, InvalidChildPolicyConfig) { const char* service_config_json = "{\n" " \"loadBalancingConfig\":[{\n" - " \"rls_experimental\":{\n" + " \"rls\":{\n" " \"childPolicy\":[\n" " {\"grpclb\":{\"childPolicy\":1}}\n" " ],\n" @@ -178,7 +184,7 @@ TEST_F(RlsConfigParsingTest, InvalidRlsChannelServiceConfig) { const char* service_config_json = "{\n" " \"loadBalancingConfig\":[{\n" - " \"rls_experimental\":{\n" + " \"rls\":{\n" " \"routeLookupChannelServiceConfig\": {\n" " \"loadBalancingPolicy\": \"unknown\"\n" " },\n" @@ -211,7 +217,7 @@ TEST_F(RlsConfigParsingTest, RouteLookupConfigRequiredFieldsMissing) { const char* service_config_json = "{\n" " \"loadBalancingConfig\":[{\n" - " \"rls_experimental\":{\n" + " \"rls\":{\n" " \"routeLookupConfig\":{\n" " }\n" " }\n" @@ -233,7 +239,7 @@ TEST_F(RlsConfigParsingTest, RouteLookupConfigFieldsWrongTypes) { const char* service_config_json = "{\n" " \"loadBalancingConfig\":[{\n" - " \"rls_experimental\":{\n" + " \"rls\":{\n" " \"routeLookupConfig\":{\n" " \"grpcKeybuilders\":1,\n" " \"name\":1,\n" @@ -258,7 +264,7 @@ TEST_F(RlsConfigParsingTest, RouteLookupConfigFieldsWrongTypes) { "field:lookupService error:type should be STRING.*" "field:maxAge error:type should be STRING.*" "field:staleAge error:type should be STRING.*" - "field:cacheSizeBytes error:failed to parse.*" + "field:cacheSizeBytes error:type should be NUMBER.*" "field:defaultTarget error:type should be STRING")); GRPC_ERROR_UNREF(error); } @@ -267,7 +273,7 @@ TEST_F(RlsConfigParsingTest, RouteLookupConfigFieldsInvalidValues) { const char* service_config_json = "{\n" " \"loadBalancingConfig\":[{\n" - " \"rls_experimental\":{\n" + " \"rls\":{\n" " \"routeLookupConfig\":{\n" " \"lookupService\":\"\",\n" " \"cacheSizeBytes\":0\n" @@ -295,7 +301,7 @@ TEST_F(RlsConfigParsingTest, GrpcKeybuilderRequiredFieldsMissing) { const char* service_config_json = "{\n" " \"loadBalancingConfig\":[{\n" - " \"rls_experimental\":{\n" + " \"rls\":{\n" " \"routeLookupConfig\":{\n" " \"grpcKeybuilders\":[\n" " {\n" @@ -322,7 +328,7 @@ TEST_F(RlsConfigParsingTest, GrpcKeybuilderWrongFieldTypes) { const char* service_config_json = "{\n" " \"loadBalancingConfig\":[{\n" - " \"rls_experimental\":{\n" + " \"rls\":{\n" " \"routeLookupConfig\":{\n" " \"grpcKeybuilders\":[\n" " {\n" @@ -356,7 +362,7 @@ TEST_F(RlsConfigParsingTest, GrpcKeybuilderInvalidValues) { const char* service_config_json = "{\n" " \"loadBalancingConfig\":[{\n" - " \"rls_experimental\":{\n" + " \"rls\":{\n" " \"routeLookupConfig\":{\n" " \"grpcKeybuilders\":[\n" " {\n" @@ -397,7 +403,7 @@ TEST_F(RlsConfigParsingTest, GrpcKeybuilderInvalidHeaders) { const char* service_config_json = "{\n" " \"loadBalancingConfig\":[{\n" - " \"rls_experimental\":{\n" + " \"rls\":{\n" " \"routeLookupConfig\":{\n" " \"grpcKeybuilders\":[\n" " {\n" @@ -457,7 +463,7 @@ TEST_F(RlsConfigParsingTest, GrpcKeybuilderNameWrongFieldTypes) { const char* service_config_json = "{\n" " \"loadBalancingConfig\":[{\n" - " \"rls_experimental\":{\n" + " \"rls\":{\n" " \"routeLookupConfig\":{\n" " \"grpcKeybuilders\":[\n" " {\n" @@ -494,7 +500,7 @@ TEST_F(RlsConfigParsingTest, DuplicateMethodNamesInSameKeyBuilder) { const char* service_config_json = "{\n" " \"loadBalancingConfig\":[{\n" - " \"rls_experimental\":{\n" + " \"rls\":{\n" " \"routeLookupConfig\":{\n" " \"grpcKeybuilders\":[\n" " {\n" @@ -531,7 +537,7 @@ TEST_F(RlsConfigParsingTest, DuplicateMethodNamesInDifferentKeyBuilders) { const char* service_config_json = "{\n" " \"loadBalancingConfig\":[{\n" - " \"rls_experimental\":{\n" + " \"rls\":{\n" " \"routeLookupConfig\":{\n" " \"grpcKeybuilders\":[\n" " {\n" diff --git a/test/core/ext/filters/rbac/rbac_service_config_parser_test.cc b/test/core/ext/filters/rbac/rbac_service_config_parser_test.cc index 400c6281c58..9ab1102c4dc 100644 --- a/test/core/ext/filters/rbac/rbac_service_config_parser_test.cc +++ b/test/core/ext/filters/rbac/rbac_service_config_parser_test.cc @@ -410,7 +410,7 @@ TEST(RbacServiceConfigParsingTest, VariousPermissionsAndPrincipalsBadTypes) { "permissions\\[5\\]" CHILD_ERROR_TAG "field:destinationIp error:type should be OBJECT.*" "permissions\\[6\\]" CHILD_ERROR_TAG - "field:destinationPort error:failed to parse.*" + "field:destinationPort error:type should be NUMBER.*" "permissions\\[7\\]" CHILD_ERROR_TAG "field:metadata error:type should be OBJECT.*" "permissions\\[8\\]" CHILD_ERROR_TAG diff --git a/test/core/xds/google_mesh_ca_certificate_provider_factory_test.cc b/test/core/xds/google_mesh_ca_certificate_provider_factory_test.cc index cbbad3c5988..b5ee4fbbb63 100644 --- a/test/core/xds/google_mesh_ca_certificate_provider_factory_test.cc +++ b/test/core/xds/google_mesh_ca_certificate_provider_factory_test.cc @@ -214,7 +214,7 @@ TEST(GoogleMeshCaConfigTest, WrongTypes) { " \"certificate_lifetime\": 400," " \"renewal_grace_period\": 100," " \"key_type\": 123," - " \"key_size\": \"1024A\"," + " \"key_size\": \"1024\"," " \"location\": 123" "}"; grpc_error_handle error = GRPC_ERROR_NONE; @@ -245,7 +245,7 @@ TEST(GoogleMeshCaConfigTest, WrongTypes) { "field:renewal_grace_period error:type should be STRING of the form " "given by google.proto.Duration..*" "field:key_type error:type should be STRING.*" - "field:key_size error:failed to parse.*" + "field:key_size error:type should be NUMBER.*" "field:location error:type should be STRING")); GRPC_ERROR_UNREF(error); } diff --git a/test/cpp/end2end/BUILD b/test/cpp/end2end/BUILD index 32bcf8bea58..2bae92a3b17 100644 --- a/test/cpp/end2end/BUILD +++ b/test/cpp/end2end/BUILD @@ -70,21 +70,6 @@ grpc_cc_library( ], ) -grpc_cc_library( - name = "rls_server", - testonly = True, - srcs = ["rls_server.cc"], - hdrs = ["rls_server.h"], - external_deps = [ - "gtest", - ], - deps = [ - ":counted_service", - "//src/proto/grpc/lookup/v1:rls_proto", - "//test/core/util:grpc_test_util", - ], -) - grpc_cc_test( name = "async_end2end_test", srcs = ["async_end2end_test.cc"], @@ -502,7 +487,6 @@ grpc_cc_test( tags = ["no_test_ios"], deps = [ ":counted_service", - ":rls_server", ":test_service_impl", "//:gpr", "//:grpc", diff --git a/test/cpp/end2end/rls_end2end_test.cc b/test/cpp/end2end/rls_end2end_test.cc index c35766b5ebd..a759ffc5664 100644 --- a/test/cpp/end2end/rls_end2end_test.cc +++ b/test/cpp/end2end/rls_end2end_test.cc @@ -60,11 +60,11 @@ #include "test/core/util/test_config.h" #include "test/core/util/test_lb_policies.h" #include "test/cpp/end2end/counted_service.h" -#include "test/cpp/end2end/rls_server.h" #include "test/cpp/end2end/test_service_impl.h" #include "test/cpp/util/test_config.h" using ::grpc::lookup::v1::RouteLookupRequest; +using ::grpc::lookup::v1::RouteLookupResponse; namespace grpc { namespace testing { @@ -87,6 +87,92 @@ const char* kConstantKey = "constant_key"; const char* kConstantValue = "constant_value"; using BackendService = CountedService; +using RlsService = + CountedService; + +class RlsServiceImpl : public RlsService { + public: + grpc::Status RouteLookup(grpc::ServerContext* context, + const RouteLookupRequest* request, + RouteLookupResponse* response) override { + gpr_log(GPR_INFO, "RLS: Received request: %s", + request->DebugString().c_str()); + // RLS server should see call creds. + EXPECT_THAT(context->client_metadata(), + ::testing::Contains( + ::testing::Pair(kCallCredsMdKey, kCallCredsMdValue))); + IncreaseRequestCount(); + EXPECT_EQ(request->target_type(), "grpc"); + // See if we have a configured response for this request. + ResponseData res; + { + grpc::internal::MutexLock lock(&mu_); + auto it = responses_.find(*request); + if (it == responses_.end()) { + gpr_log(GPR_INFO, "RLS: no matching request, returning INTERNAL"); + unmatched_requests_.push_back(*request); + return Status(StatusCode::INTERNAL, "no response entry"); + } + res = it->second; + } + // Configured response found, so use it. + if (res.response_delay > grpc_core::Duration::Zero()) { + gpr_sleep_until( + grpc_timeout_milliseconds_to_deadline(res.response_delay.millis())); + } + IncreaseResponseCount(); + *response = res.response; + gpr_log(GPR_INFO, "RLS: returning configured response: %s", + response->DebugString().c_str()); + return Status::OK; + } + + void Start() {} + + void Shutdown() {} + + void SetResponse(RouteLookupRequest request, RouteLookupResponse response, + grpc_core::Duration response_delay = grpc_core::Duration()) { + grpc::internal::MutexLock lock(&mu_); + responses_[std::move(request)] = {std::move(response), response_delay}; + } + + void RemoveResponse(const RouteLookupRequest& request) { + grpc::internal::MutexLock lock(&mu_); + responses_.erase(request); + } + + std::vector GetUnmatchedRequests() { + grpc::internal::MutexLock lock(&mu_); + return std::move(unmatched_requests_); + } + + private: + // Sorting thunk for RouteLookupRequest. + struct RlsRequestLessThan { + bool operator()(const RouteLookupRequest& req1, + const RouteLookupRequest& req2) const { + std::map key_map1( + req1.key_map().begin(), req1.key_map().end()); + std::map key_map2( + req2.key_map().begin(), req2.key_map().end()); + if (key_map1 < key_map2) return true; + if (req1.reason() < req2.reason()) return true; + if (req1.stale_header_data() < req2.stale_header_data()) return true; + return false; + } + }; + + struct ResponseData { + RouteLookupResponse response; + grpc_core::Duration response_delay; + }; + + grpc::internal::Mutex mu_; + std::map responses_ + ABSL_GUARDED_BY(&mu_); + std::vector unmatched_requests_ ABSL_GUARDED_BY(&mu_); +}; // Subclass of TestServiceImpl that increments a request counter for // every call to the Echo Rpc. @@ -179,12 +265,7 @@ class RlsEnd2endTest : public ::testing::Test { grpc_core::LocalhostResolves(&localhost_resolves_to_ipv4, &localhost_resolves_to_ipv6); ipv6_only_ = !localhost_resolves_to_ipv4 && localhost_resolves_to_ipv6; - rls_server_ = absl::make_unique>( - "rls", [](grpc::ServerContext* ctx) { - EXPECT_THAT(ctx->client_metadata(), - ::testing::Contains( - ::testing::Pair(kCallCredsMdKey, kCallCredsMdValue))); - }); + rls_server_ = absl::make_unique>("rls"); rls_server_->Start(); resolver_response_generator_ = absl::make_unique(); @@ -235,6 +316,26 @@ class RlsEnd2endTest : public ::testing::Test { return absl::StrCat("ipv4:127.0.0.1:", port); } + static RouteLookupRequest BuildRlsRequest( + std::map key, + RouteLookupRequest::Reason reason = RouteLookupRequest::REASON_MISS, + const char* stale_header_data = "") { + RouteLookupRequest request; + request.set_target_type("grpc"); + request.mutable_key_map()->insert(key.begin(), key.end()); + request.set_reason(reason); + request.set_stale_header_data(stale_header_data); + return request; + } + + static RouteLookupResponse BuildRlsResponse(std::vector targets, + const char* header_data = "") { + RouteLookupResponse response; + response.mutable_targets()->Add(targets.begin(), targets.end()); + response.set_header_data(header_data); + return response; + } + struct RpcOptions { int timeout_ms = 1000; bool wait_for_ready = false; @@ -380,7 +481,7 @@ class RlsEnd2endTest : public ::testing::Test { return absl::StrCat( "{" " \"loadBalancingConfig\":[{" - " \"rls_experimental\":{", + " \"rls\":{", absl::StrJoin(rls_config_parts, ","), " }" " }]" diff --git a/test/cpp/end2end/rls_server.cc b/test/cpp/end2end/rls_server.cc deleted file mode 100644 index c5053792cc4..00000000000 --- a/test/cpp/end2end/rls_server.cc +++ /dev/null @@ -1,103 +0,0 @@ -// -// Copyright 2020 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 "test/cpp/end2end/rls_server.h" - -#include - -#include "src/proto/grpc/lookup/v1/rls.grpc.pb.h" -#include "src/proto/grpc/lookup/v1/rls.pb.h" -#include "test/core/util/test_config.h" - -using ::grpc::lookup::v1::RouteLookupRequest; -using ::grpc::lookup::v1::RouteLookupResponse; - -namespace grpc { -namespace testing { - -::grpc::Status RlsServiceImpl::RouteLookup(grpc::ServerContext* context, - const RouteLookupRequest* request, - RouteLookupResponse* response) { - gpr_log(GPR_INFO, "RLS: Received request: %s", - request->DebugString().c_str()); - if (context_proc_ != nullptr) { - context_proc_(context); - } - IncreaseRequestCount(); - EXPECT_EQ(request->target_type(), "grpc"); - // See if we have a configured response for this request. - ResponseData res; - { - grpc::internal::MutexLock lock(&mu_); - auto it = responses_.find(*request); - if (it == responses_.end()) { - gpr_log(GPR_INFO, "RLS: no matching request, returning INTERNAL"); - unmatched_requests_.push_back(*request); - return Status(StatusCode::INTERNAL, "no response entry"); - } - res = it->second; - } - // Configured response found, so use it. - if (res.response_delay > grpc_core::Duration::Zero()) { - gpr_sleep_until( - grpc_timeout_milliseconds_to_deadline(res.response_delay.millis())); - } - IncreaseResponseCount(); - *response = res.response; - gpr_log(GPR_INFO, "RLS: returning configured response: %s", - response->DebugString().c_str()); - return Status::OK; -} - -void RlsServiceImpl::SetResponse(RouteLookupRequest request, - RouteLookupResponse response, - grpc_core::Duration response_delay) { - grpc::internal::MutexLock lock(&mu_); - responses_[std::move(request)] = {std::move(response), response_delay}; -} - -void RlsServiceImpl::RemoveResponse(const RouteLookupRequest& request) { - grpc::internal::MutexLock lock(&mu_); - responses_.erase(request); -} - -std::vector RlsServiceImpl::GetUnmatchedRequests() { - grpc::internal::MutexLock lock(&mu_); - return std::move(unmatched_requests_); -} - -grpc::lookup::v1::RouteLookupRequest BuildRlsRequest( - std::map key, - grpc::lookup::v1::RouteLookupRequest::Reason reason, - const char* stale_header_data) { - grpc::lookup::v1::RouteLookupRequest request; - request.set_target_type("grpc"); - request.mutable_key_map()->insert(key.begin(), key.end()); - request.set_reason(reason); - request.set_stale_header_data(stale_header_data); - return request; -} - -grpc::lookup::v1::RouteLookupResponse BuildRlsResponse( - std::vector targets, const char* header_data) { - grpc::lookup::v1::RouteLookupResponse response; - response.mutable_targets()->Add(targets.begin(), targets.end()); - response.set_header_data(header_data); - return response; -} - -} // namespace testing -} // namespace grpc diff --git a/test/cpp/end2end/rls_server.h b/test/cpp/end2end/rls_server.h deleted file mode 100644 index 958d19676e3..00000000000 --- a/test/cpp/end2end/rls_server.h +++ /dev/null @@ -1,94 +0,0 @@ -// -// Copyright 2020 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 "absl/types/optional.h" - -#include "src/core/lib/gprpp/time.h" -#include "src/proto/grpc/lookup/v1/rls.grpc.pb.h" -#include "src/proto/grpc/lookup/v1/rls.pb.h" -#include "test/cpp/end2end/counted_service.h" - -namespace grpc { -namespace testing { - -using RlsService = - CountedService; - -class RlsServiceImpl : public RlsService { - public: - using ContextProcessingFunc = std::function; - - explicit RlsServiceImpl(ContextProcessingFunc context_proc = nullptr) - : context_proc_(std::move(context_proc)) {} - - grpc::Status RouteLookup( - grpc::ServerContext* context, - const grpc::lookup::v1::RouteLookupRequest* request, - grpc::lookup::v1::RouteLookupResponse* response) override; - - void Start() {} - - void Shutdown() {} - - void SetResponse(grpc::lookup::v1::RouteLookupRequest request, - grpc::lookup::v1::RouteLookupResponse response, - grpc_core::Duration response_delay = grpc_core::Duration()); - - void RemoveResponse(const grpc::lookup::v1::RouteLookupRequest& request); - - std::vector GetUnmatchedRequests(); - - private: - // Sorting thunk for RouteLookupRequest. - struct RlsRequestLessThan { - bool operator()(const grpc::lookup::v1::RouteLookupRequest& req1, - const grpc::lookup::v1::RouteLookupRequest& req2) const { - std::map key_map1( - req1.key_map().begin(), req1.key_map().end()); - std::map key_map2( - req2.key_map().begin(), req2.key_map().end()); - if (key_map1 < key_map2) return true; - if (req1.reason() < req2.reason()) return true; - if (req1.stale_header_data() < req2.stale_header_data()) return true; - return false; - } - }; - - struct ResponseData { - grpc::lookup::v1::RouteLookupResponse response; - grpc_core::Duration response_delay; - }; - - ContextProcessingFunc context_proc_; - grpc::internal::Mutex mu_; - std::map - responses_ ABSL_GUARDED_BY(&mu_); - std::vector unmatched_requests_ - ABSL_GUARDED_BY(&mu_); -}; - -grpc::lookup::v1::RouteLookupRequest BuildRlsRequest( - std::map key, - grpc::lookup::v1::RouteLookupRequest::Reason reason = - grpc::lookup::v1::RouteLookupRequest::REASON_MISS, - const char* stale_header_data = ""); - -grpc::lookup::v1::RouteLookupResponse BuildRlsResponse( - std::vector targets, const char* header_data = ""); - -} // namespace testing -} // namespace grpc diff --git a/test/cpp/end2end/xds/BUILD b/test/cpp/end2end/xds/BUILD index 4a69b5c8953..19c53146c08 100644 --- a/test/cpp/end2end/xds/BUILD +++ b/test/cpp/end2end/xds/BUILD @@ -77,8 +77,6 @@ grpc_cc_test( "//:grpc++", "//:grpc_resolver_fake", "//:grpcpp_csds", - "//src/proto/grpc/lookup/v1:rls_config_proto", - "//src/proto/grpc/lookup/v1:rls_proto", "//src/proto/grpc/testing:echo_messages_proto", "//src/proto/grpc/testing:echo_proto", "//src/proto/grpc/testing/duplicate:echo_duplicate_proto", @@ -98,7 +96,6 @@ grpc_cc_test( "//src/proto/grpc/testing/xds/v3:tls_proto", "//test/core/util:grpc_test_util", "//test/cpp/end2end:counted_service", - "//test/cpp/end2end:rls_server", "//test/cpp/end2end:test_service_impl", "//test/cpp/util:test_config", "//test/cpp/util:test_util", diff --git a/test/cpp/end2end/xds/xds_end2end_test.cc b/test/cpp/end2end/xds/xds_end2end_test.cc index ccbcf3735bc..af7e9d8d216 100644 --- a/test/cpp/end2end/xds/xds_end2end_test.cc +++ b/test/cpp/end2end/xds/xds_end2end_test.cc @@ -80,9 +80,6 @@ #include "src/core/lib/security/credentials/fake/fake_credentials.h" #include "src/cpp/client/secure_credentials.h" #include "src/cpp/server/secure_server_credentials.h" -#include "src/proto/grpc/lookup/v1/rls.grpc.pb.h" -#include "src/proto/grpc/lookup/v1/rls.pb.h" -#include "src/proto/grpc/lookup/v1/rls_config.pb.h" #include "src/proto/grpc/testing/echo.grpc.pb.h" #include "src/proto/grpc/testing/xds/ads_for_test.grpc.pb.h" #include "src/proto/grpc/testing/xds/cds_for_test.grpc.pb.h" @@ -106,7 +103,6 @@ #include "test/core/util/resolve_localhost_ip46.h" #include "test/core/util/test_config.h" #include "test/cpp/end2end/counted_service.h" -#include "test/cpp/end2end/rls_server.h" #include "test/cpp/end2end/test_service_impl.h" #include "test/cpp/end2end/xds/xds_server.h" #include "test/cpp/util/test_config.h" @@ -157,9 +153,6 @@ using ClientStats = LrsServiceImpl::ClientStats; using ::grpc::experimental::ExternalCertificateVerifier; using ::grpc::experimental::IdentityKeyCertPair; using ::grpc::experimental::StaticDataCertificateProvider; -using ::grpc::lookup::v1::RouteLookupClusterSpecifier; -using ::grpc::lookup::v1::RouteLookupConfig; -using ::grpc::lookup::v1::RouteLookupRequest; constexpr char kDefaultLocalityRegion[] = "xds_default_locality_region"; constexpr char kDefaultLocalityZone[] = "xds_default_locality_zone"; @@ -184,18 +177,6 @@ constexpr char kClientKeyPath[] = "src/core/tsi/test_creds/client.key"; constexpr char kBadClientCertPath[] = "src/core/tsi/test_creds/badclient.pem"; constexpr char kBadClientKeyPath[] = "src/core/tsi/test_creds/badclient.key"; -constexpr char kRlsTestKey[] = "test_key"; -constexpr char kRlsTestKey1[] = "key1"; -constexpr char kRlsTestValue[] = "test_value"; -constexpr char kRlsHostKey[] = "host_key"; -constexpr char kRlsServiceKey[] = "service_key"; -constexpr char kRlsServiceValue[] = "grpc.testing.EchoTestService"; -constexpr char kRlsMethodKey[] = "method_key"; -constexpr char kRlsMethodValue[] = "Echo"; -constexpr char kRlsConstantKey[] = "constant_key"; -constexpr char kRlsConstantValue[] = "constant_value"; -constexpr char kRlsClusterSpecifierPluginInstanceName[] = "rls_plugin_instance"; - template class BackendServiceImpl : public CountedService> { @@ -7512,302 +7493,6 @@ TEST_P(CdsTest, RingHashPolicyHasInvalidRingSizeMinGreaterThanMax) { "min_ring_size cannot be greater than max_ring_size.")); } -class RlsTest : public XdsEnd2endTest { - protected: - class RlsServerThread : public ServerThread { - public: - explicit RlsServerThread(XdsEnd2endTest* test_obj) - : ServerThread(test_obj, /*use_xds_enabled_server=*/false), - rls_service_(new RlsServiceImpl()) {} - - RlsServiceImpl* rls_service() { return rls_service_.get(); } - - private: - void RegisterAllServices(ServerBuilder* builder) override { - builder->RegisterService(rls_service_.get()); - } - - void StartAllServices() override { rls_service_->Start(); } - - void ShutdownAllServices() override { rls_service_->Shutdown(); } - - const char* Type() override { return "Rls"; } - - std::shared_ptr rls_service_; - }; - - RlsTest() : XdsEnd2endTest(4) { - rls_server_ = absl::make_unique(this); - rls_server_->Start(); - } - - void SetUp() override { - XdsEnd2endTest::SetUp(); - StartAllBackends(); - } - - void TearDown() override { - rls_server_->Shutdown(); - XdsEnd2endTest::TearDown(); - } - - std::unique_ptr rls_server_; -}; - -TEST_P(RlsTest, XdsRoutingClusterSpecifierPlugin) { - gpr_setenv("GRPC_EXPERIMENTAL_XDS_RLS_LB", "true"); - const char* kNewClusterName = "new_cluster"; - const char* kNewEdsServiceName = "new_eds_service_name"; - const size_t kNumEchoRpcs = 5; - // Populate new EDS resources. - EdsResourceArgs args({ - {"locality0", CreateEndpointsForBackends(0, 1)}, - }); - EdsResourceArgs args1({ - {"locality0", CreateEndpointsForBackends(1, 2)}, - }); - balancer_->ads_service()->SetEdsResource(BuildEdsResource(args)); - balancer_->ads_service()->SetEdsResource( - BuildEdsResource(args1, kNewEdsServiceName)); - // Populate new CDS resources. - Cluster new_cluster = default_cluster_; - new_cluster.set_name(kNewClusterName); - new_cluster.mutable_eds_cluster_config()->set_service_name( - kNewEdsServiceName); - balancer_->ads_service()->SetCdsResource(new_cluster); - // Prepare the RLSLookupConfig and configure all the keys; change route - // configurations to use cluster specifier plugin. - rls_server_->rls_service()->SetResponse( - BuildRlsRequest({{kRlsTestKey, kRlsTestValue}, - {kRlsHostKey, kServerName}, - {kRlsServiceKey, kRlsServiceValue}, - {kRlsMethodKey, kRlsMethodValue}, - {kRlsConstantKey, kRlsConstantValue}}), - BuildRlsResponse({kNewClusterName})); - RouteLookupConfig route_lookup_config; - auto* key_builder = route_lookup_config.add_grpc_keybuilders(); - auto* name = key_builder->add_names(); - name->set_service(kRlsServiceValue); - name->set_method(kRlsMethodValue); - auto* header = key_builder->add_headers(); - header->set_key(kRlsTestKey); - header->add_names(kRlsTestKey1); - header->add_names("key2"); - auto* extra_keys = key_builder->mutable_extra_keys(); - extra_keys->set_host(kRlsHostKey); - extra_keys->set_service(kRlsServiceKey); - extra_keys->set_method(kRlsMethodKey); - (*key_builder->mutable_constant_keys())[kRlsConstantKey] = kRlsConstantValue; - route_lookup_config.set_lookup_service( - absl::StrCat("localhost:", rls_server_->port())); - route_lookup_config.set_cache_size_bytes(5000); - RouteLookupClusterSpecifier rls; - *rls.mutable_route_lookup_config() = std::move(route_lookup_config); - RouteConfiguration new_route_config = default_route_config_; - auto* plugin = new_route_config.add_cluster_specifier_plugins(); - plugin->mutable_extension()->set_name(kRlsClusterSpecifierPluginInstanceName); - plugin->mutable_extension()->mutable_typed_config()->PackFrom(rls); - auto* default_route = - new_route_config.mutable_virtual_hosts(0)->mutable_routes(0); - default_route->mutable_route()->set_cluster_specifier_plugin( - kRlsClusterSpecifierPluginInstanceName); - SetRouteConfiguration(balancer_.get(), new_route_config); - auto rpc_options = RpcOptions().set_metadata({{kRlsTestKey1, kRlsTestValue}}); - WaitForAllBackends(1, 2, WaitForBackendOptions(), rpc_options); - CheckRpcSendOk(kNumEchoRpcs, rpc_options); - // Make sure RPCs all go to the correct backend. - EXPECT_EQ(kNumEchoRpcs, backends_[1]->backend_service()->request_count()); - gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_XDS_RLS_LB"); -} - -TEST_P(RlsTest, XdsRoutingClusterSpecifierPluginNacksUndefinedSpecifier) { - gpr_setenv("GRPC_EXPERIMENTAL_XDS_RLS_LB", "true"); - const char* kNewClusterName = "new_cluster"; - const char* kNewEdsServiceName = "new_eds_service_name"; - // Populate new EDS resources. - EdsResourceArgs args({ - {"locality0", CreateEndpointsForBackends(0, 1)}, - }); - EdsResourceArgs args1({ - {"locality0", CreateEndpointsForBackends(1, 2)}, - }); - balancer_->ads_service()->SetEdsResource(BuildEdsResource(args)); - balancer_->ads_service()->SetEdsResource( - BuildEdsResource(args1, kNewEdsServiceName)); - // Populate new CDS resources. - Cluster new_cluster = default_cluster_; - new_cluster.set_name(kNewClusterName); - new_cluster.mutable_eds_cluster_config()->set_service_name( - kNewEdsServiceName); - balancer_->ads_service()->SetCdsResource(new_cluster); - RouteConfiguration new_route_config = default_route_config_; - auto* default_route = - new_route_config.mutable_virtual_hosts(0)->mutable_routes(0); - // Set Cluster Specifier Plugin to something that does not exist. - default_route->mutable_route()->set_cluster_specifier_plugin( - kRlsClusterSpecifierPluginInstanceName); - SetRouteConfiguration(balancer_.get(), new_route_config); - const auto response_state = WaitForRdsNack(); - ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK"; - EXPECT_THAT(response_state->error_message, - ::testing::HasSubstr("RouteAction cluster contains cluster " - "specifier plugin name not configured.")); - gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_XDS_RLS_LB"); -} - -TEST_P(RlsTest, XdsRoutingClusterSpecifierPluginNacksUnknownSpecifierProto) { - // TODO(donnadionne): Doug is working on adding a new is_optional field to - // ClusterSpecifierPlugin in envoyproxy/envoy#20301. Once that goes in, the - // behavior we want in this case is that if is_optional is true, then we - // ignore that plugin and ignore any routes that refer to that plugin. - // However, if is_optional is false, then we want to NACK. - gpr_setenv("GRPC_EXPERIMENTAL_XDS_RLS_LB", "true"); - const char* kNewClusterName = "new_cluster"; - const char* kNewEdsServiceName = "new_eds_service_name"; - // Populate new EDS resources. - EdsResourceArgs args({ - {"locality0", CreateEndpointsForBackends(0, 1)}, - }); - EdsResourceArgs args1({ - {"locality0", CreateEndpointsForBackends(1, 2)}, - }); - balancer_->ads_service()->SetEdsResource(BuildEdsResource(args)); - balancer_->ads_service()->SetEdsResource( - BuildEdsResource(args1, kNewEdsServiceName)); - // Populate new CDS resources. - Cluster new_cluster = default_cluster_; - new_cluster.set_name(kNewClusterName); - new_cluster.mutable_eds_cluster_config()->set_service_name( - kNewEdsServiceName); - balancer_->ads_service()->SetCdsResource(new_cluster); - // Prepare the RLSLookupConfig: change route configurations to use cluster - // specifier plugin. - RouteLookupConfig route_lookup_config; - RouteConfiguration new_route_config = default_route_config_; - auto* plugin = new_route_config.add_cluster_specifier_plugins(); - plugin->mutable_extension()->set_name(kRlsClusterSpecifierPluginInstanceName); - // Instead of grpc.lookup.v1.RouteLookupClusterSpecifier, let's say we - // mistakenly packed the inner RouteLookupConfig instead. - plugin->mutable_extension()->mutable_typed_config()->PackFrom( - route_lookup_config); - auto* default_route = - new_route_config.mutable_virtual_hosts(0)->mutable_routes(0); - default_route->mutable_route()->set_cluster_specifier_plugin( - kRlsClusterSpecifierPluginInstanceName); - SetRouteConfiguration(balancer_.get(), new_route_config); - const auto response_state = WaitForRdsNack(); - ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK"; - EXPECT_THAT( - response_state->error_message, - ::testing::HasSubstr( - "Unable to locate the cluster specifier plugin in the registry")); - gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_XDS_RLS_LB"); -} - -TEST_P(RlsTest, XdsRoutingRlsClusterSpecifierPluginNacksRequiredMatch) { - gpr_setenv("GRPC_EXPERIMENTAL_XDS_RLS_LB", "true"); - const char* kNewClusterName = "new_cluster"; - const char* kNewEdsServiceName = "new_eds_service_name"; - // Populate new EDS resources. - EdsResourceArgs args({ - {"locality0", CreateEndpointsForBackends(0, 1)}, - }); - EdsResourceArgs args1({ - {"locality0", CreateEndpointsForBackends(1, 2)}, - }); - balancer_->ads_service()->SetEdsResource(BuildEdsResource(args)); - balancer_->ads_service()->SetEdsResource( - BuildEdsResource(args1, kNewEdsServiceName)); - // Populate new CDS resources. - Cluster new_cluster = default_cluster_; - new_cluster.set_name(kNewClusterName); - new_cluster.mutable_eds_cluster_config()->set_service_name( - kNewEdsServiceName); - balancer_->ads_service()->SetCdsResource(new_cluster); - // Prepare the RLSLookupConfig and configure all the keys; add required_match - // field which should not be there. - RouteLookupConfig route_lookup_config; - auto* key_builder = route_lookup_config.add_grpc_keybuilders(); - auto* name = key_builder->add_names(); - name->set_service(kRlsServiceValue); - name->set_method(kRlsMethodValue); - auto* header = key_builder->add_headers(); - header->set_key(kRlsTestKey); - header->add_names(kRlsTestKey1); - header->set_required_match(true); - route_lookup_config.set_lookup_service( - absl::StrCat("localhost:", rls_server_->port())); - route_lookup_config.set_cache_size_bytes(5000); - RouteLookupClusterSpecifier rls; - *rls.mutable_route_lookup_config() = std::move(route_lookup_config); - RouteConfiguration new_route_config = default_route_config_; - auto* plugin = new_route_config.add_cluster_specifier_plugins(); - plugin->mutable_extension()->set_name(kRlsClusterSpecifierPluginInstanceName); - plugin->mutable_extension()->mutable_typed_config()->PackFrom(rls); - auto* default_route = - new_route_config.mutable_virtual_hosts(0)->mutable_routes(0); - default_route->mutable_route()->set_cluster_specifier_plugin( - kRlsClusterSpecifierPluginInstanceName); - SetRouteConfiguration(balancer_.get(), new_route_config); - const auto response_state = WaitForRdsNack(); - ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK"; - EXPECT_THAT( - response_state->error_message, - ::testing::HasSubstr("field:requiredMatch error:must not be present")); - gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_XDS_RLS_LB"); -} - -TEST_P(RlsTest, XdsRoutingClusterSpecifierPluginDisabled) { - const char* kNewClusterName = "new_cluster"; - const char* kNewEdsServiceName = "new_eds_service_name"; - // Populate new EDS resources. - EdsResourceArgs args({ - {"locality0", CreateEndpointsForBackends(0, 1)}, - }); - EdsResourceArgs args1({ - {"locality0", CreateEndpointsForBackends(1, 2)}, - }); - balancer_->ads_service()->SetEdsResource(BuildEdsResource(args)); - balancer_->ads_service()->SetEdsResource( - BuildEdsResource(args1, kNewEdsServiceName)); - // Populate new CDS resources. - Cluster new_cluster = default_cluster_; - new_cluster.set_name(kNewClusterName); - new_cluster.mutable_eds_cluster_config()->set_service_name( - kNewEdsServiceName); - balancer_->ads_service()->SetCdsResource(new_cluster); - // Prepare the RLSLookupConfig and configure all the keys; change route - // configurations to use cluster specifier plugin. - RouteLookupConfig route_lookup_config; - auto* key_builder = route_lookup_config.add_grpc_keybuilders(); - auto* name = key_builder->add_names(); - name->set_service(kRlsServiceValue); - name->set_method(kRlsMethodValue); - auto* header = key_builder->add_headers(); - header->set_key(kRlsTestKey); - header->add_names(kRlsTestKey1); - route_lookup_config.set_lookup_service( - absl::StrCat("localhost:", rls_server_->port())); - route_lookup_config.set_cache_size_bytes(5000); - RouteLookupClusterSpecifier rls; - *rls.mutable_route_lookup_config() = std::move(route_lookup_config); - RouteConfiguration new_route_config = default_route_config_; - auto* plugin = new_route_config.add_cluster_specifier_plugins(); - plugin->mutable_extension()->set_name(kRlsClusterSpecifierPluginInstanceName); - plugin->mutable_extension()->mutable_typed_config()->PackFrom(rls); - auto* route = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0); - route->mutable_route()->set_cluster_specifier_plugin( - kRlsClusterSpecifierPluginInstanceName); - auto* default_route = new_route_config.mutable_virtual_hosts(0)->add_routes(); - default_route->mutable_match()->set_prefix(""); - default_route->mutable_route()->set_cluster(kDefaultClusterName); - SetRouteConfiguration(balancer_.get(), new_route_config); - // Ensure we ignore the cluster specifier plugin and send traffic according to - // the default route. - auto rpc_options = RpcOptions().set_metadata({{kRlsTestKey1, kRlsTestValue}}); - WaitForAllBackends(0, 1, WaitForBackendOptions(), rpc_options); -} - class XdsSecurityTest : public BasicTest { protected: void SetUp() override { @@ -13780,14 +13465,6 @@ INSTANTIATE_TEST_SUITE_P( TestType().set_enable_rds_testing().set_use_v2()), &TestTypeName); -// Rls tests depend on XdsResolver. -INSTANTIATE_TEST_SUITE_P( - XdsTest, RlsTest, - ::testing::Values(TestType(), TestType().set_enable_rds_testing(), - // Also test with xDS v2. - TestType().set_enable_rds_testing().set_use_v2()), - &TestTypeName); - // CDS depends on XdsResolver. INSTANTIATE_TEST_SUITE_P( XdsTest, CdsTest, diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal index 61bb989f88c..1625b8c33de 100644 --- a/tools/doxygen/Doxyfile.c++.internal +++ b/tools/doxygen/Doxyfile.c++.internal @@ -1510,8 +1510,6 @@ src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c \ src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h \ src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c \ src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h \ -src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.c \ -src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.h \ src/core/ext/upb-generated/udpa/annotations/migrate.upb.c \ src/core/ext/upb-generated/udpa/annotations/migrate.upb.h \ src/core/ext/upb-generated/udpa/annotations/security.upb.c \ @@ -1780,8 +1778,6 @@ src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c \ src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.h \ src/core/ext/upbdefs-generated/opencensus/proto/trace/v1/trace_config.upbdefs.c \ src/core/ext/upbdefs-generated/opencensus/proto/trace/v1/trace_config.upbdefs.h \ -src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.c \ -src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.h \ src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c \ src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.h \ src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c \ @@ -1849,8 +1845,6 @@ src/core/ext/xds/xds_client_stats.cc \ src/core/ext/xds/xds_client_stats.h \ src/core/ext/xds/xds_cluster.cc \ src/core/ext/xds/xds_cluster.h \ -src/core/ext/xds/xds_cluster_specifier_plugin.cc \ -src/core/ext/xds/xds_cluster_specifier_plugin.h \ src/core/ext/xds/xds_common_types.cc \ src/core/ext/xds/xds_common_types.h \ src/core/ext/xds/xds_endpoint.cc \ diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal index e0964b3c0c0..ec96d23da06 100644 --- a/tools/doxygen/Doxyfile.core.internal +++ b/tools/doxygen/Doxyfile.core.internal @@ -1300,8 +1300,6 @@ src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c \ src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h \ src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c \ src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h \ -src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.c \ -src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.h \ src/core/ext/upb-generated/udpa/annotations/migrate.upb.c \ src/core/ext/upb-generated/udpa/annotations/migrate.upb.h \ src/core/ext/upb-generated/udpa/annotations/security.upb.c \ @@ -1570,8 +1568,6 @@ src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c \ src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.h \ src/core/ext/upbdefs-generated/opencensus/proto/trace/v1/trace_config.upbdefs.c \ src/core/ext/upbdefs-generated/opencensus/proto/trace/v1/trace_config.upbdefs.h \ -src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.c \ -src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.h \ src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c \ src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.h \ src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c \ @@ -1639,8 +1635,6 @@ src/core/ext/xds/xds_client_stats.cc \ src/core/ext/xds/xds_client_stats.h \ src/core/ext/xds/xds_cluster.cc \ src/core/ext/xds/xds_cluster.h \ -src/core/ext/xds/xds_cluster_specifier_plugin.cc \ -src/core/ext/xds/xds_cluster_specifier_plugin.h \ src/core/ext/xds/xds_common_types.cc \ src/core/ext/xds/xds_common_types.h \ src/core/ext/xds/xds_endpoint.cc \ From 43a9ad8ac0248be955aab2fd0e2f7134bf0a2311 Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Tue, 22 Mar 2022 13:59:34 -0700 Subject: [PATCH 6/7] health checking: cancel stream if response message fails to parse (#29138) * health checking: cancel stream if response message fails to parse * clang-format --- .../health/health_check_client.cc | 53 ++++++++----------- .../subchannel_stream_client.cc | 17 +++++- .../client_channel/subchannel_stream_client.h | 7 ++- 3 files changed, 43 insertions(+), 34 deletions(-) diff --git a/src/core/ext/filters/client_channel/health/health_check_client.cc b/src/core/ext/filters/client_channel/health/health_check_client.cc index 5cf197563ca..5adbd772f69 100644 --- a/src/core/ext/filters/client_channel/health/health_check_client.cc +++ b/src/core/ext/filters/client_channel/health/health_check_client.cc @@ -26,41 +26,15 @@ #include #include "src/core/lib/debug/trace.h" -#include "src/core/lib/gprpp/sync.h" -#include "src/core/lib/resource_quota/api.h" #include "src/core/lib/slice/slice_internal.h" -#include "src/core/lib/transport/error_utils.h" #include "src/proto/grpc/health/v1/health.upb.h" -#define HEALTH_CHECK_INITIAL_CONNECT_BACKOFF_SECONDS 1 -#define HEALTH_CHECK_RECONNECT_BACKOFF_MULTIPLIER 1.6 -#define HEALTH_CHECK_RECONNECT_MAX_BACKOFF_SECONDS 120 -#define HEALTH_CHECK_RECONNECT_JITTER 0.2 - namespace grpc_core { TraceFlag grpc_health_check_client_trace(false, "health_check_client"); namespace { -// Returns true if healthy. -absl::StatusOr DecodeResponse(char* message, size_t size) { - // If message is empty, assume unhealthy. - if (size == 0) { - return absl::InvalidArgumentError("health check response was empty"); - } - // Deserialize message. - upb::Arena arena; - auto* response_struct = grpc_health_v1_HealthCheckResponse_parse( - reinterpret_cast(message), size, arena.ptr()); - if (response_struct == nullptr) { - // Can't parse message; assume unhealthy. - return absl::InvalidArgumentError("cannot parse health check response"); - } - int32_t status = grpc_health_v1_HealthCheckResponse_status(response_struct); - return status == grpc_health_v1_HealthCheckResponse_SERVING; -} - class HealthStreamEventHandler : public SubchannelStreamClient::CallEventHandler { public: @@ -101,18 +75,22 @@ class HealthStreamEventHandler return request_slice; } - void RecvMessageReadyLocked(SubchannelStreamClient* client, char* message, - size_t size) override { - auto healthy = DecodeResponse(message, size); + absl::Status RecvMessageReadyLocked( + SubchannelStreamClient* client, + absl::string_view serialized_message) override { + auto healthy = DecodeResponse(serialized_message); if (!healthy.ok()) { SetHealthStatusLocked(client, GRPC_CHANNEL_TRANSIENT_FAILURE, healthy.status().ToString().c_str()); - } else if (!*healthy) { + return healthy.status(); + } + if (!*healthy) { SetHealthStatusLocked(client, GRPC_CHANNEL_TRANSIENT_FAILURE, "backend unhealthy"); } else { SetHealthStatusLocked(client, GRPC_CHANNEL_READY, "OK"); } + return absl::OkStatus(); } void RecvTrailingMetadataReadyLocked(SubchannelStreamClient* client, @@ -132,6 +110,21 @@ class HealthStreamEventHandler } private: + // Returns true if healthy. + static absl::StatusOr DecodeResponse( + absl::string_view serialized_message) { + // Deserialize message. + upb::Arena arena; + auto* response = grpc_health_v1_HealthCheckResponse_parse( + serialized_message.data(), serialized_message.size(), arena.ptr()); + if (response == nullptr) { + // Can't parse message; assume unhealthy. + return absl::InvalidArgumentError("cannot parse health check response"); + } + int32_t status = grpc_health_v1_HealthCheckResponse_status(response); + return status == grpc_health_v1_HealthCheckResponse_SERVING; + } + void SetHealthStatusLocked(SubchannelStreamClient* client, grpc_connectivity_state state, const char* reason) { diff --git a/src/core/ext/filters/client_channel/subchannel_stream_client.cc b/src/core/ext/filters/client_channel/subchannel_stream_client.cc index 17fd26c6514..a596e044568 100644 --- a/src/core/ext/filters/client_channel/subchannel_stream_client.cc +++ b/src/core/ext/filters/client_channel/subchannel_stream_client.cc @@ -391,9 +391,22 @@ void SubchannelStreamClient::CallState::DoneReadingRecvMessage( { MutexLock lock(&subchannel_stream_client_->mu_); if (subchannel_stream_client_->event_handler_ != nullptr) { - subchannel_stream_client_->event_handler_->RecvMessageReadyLocked( - subchannel_stream_client_.get(), + absl::string_view serialized_message( reinterpret_cast(recv_message), recv_message_buffer_.length); + absl::Status status = + subchannel_stream_client_->event_handler_->RecvMessageReadyLocked( + subchannel_stream_client_.get(), serialized_message); + if (!status.ok()) { + if (GPR_UNLIKELY(subchannel_stream_client_->tracer_ != nullptr)) { + gpr_log(GPR_INFO, + "%s %p: SubchannelStreamClient CallState %p: failed to " + "parse response message: %s", + subchannel_stream_client_->tracer_, + subchannel_stream_client_.get(), this, + status.ToString().c_str()); + } + Cancel(); + } } } seen_response_.store(true, std::memory_order_release); diff --git a/src/core/ext/filters/client_channel/subchannel_stream_client.h b/src/core/ext/filters/client_channel/subchannel_stream_client.h index 65277eeecdd..b48ab223e4c 100644 --- a/src/core/ext/filters/client_channel/subchannel_stream_client.h +++ b/src/core/ext/filters/client_channel/subchannel_stream_client.h @@ -21,6 +21,9 @@ #include +#include "absl/status/status.h" +#include "absl/strings/string_view.h" + #include "src/core/ext/filters/client_channel/subchannel.h" #include "src/core/lib/backoff/backoff.h" #include "src/core/lib/gprpp/orphanable.h" @@ -73,8 +76,8 @@ class SubchannelStreamClient virtual grpc_slice EncodeSendMessageLocked() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&SubchannelStreamClient::mu_) = 0; // Called whenever a message is received from the server. - virtual void RecvMessageReadyLocked(SubchannelStreamClient* client, - char* message, size_t size) + virtual absl::Status RecvMessageReadyLocked( + SubchannelStreamClient* client, absl::string_view serialized_message) ABSL_EXCLUSIVE_LOCKS_REQUIRED(&SubchannelStreamClient::mu_) = 0; // Called when a stream fails. virtual void RecvTrailingMetadataReadyLocked(SubchannelStreamClient* client, From 76a52f769666b1ee9deccad808ef392f89cfbe11 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Tue, 22 Mar 2022 17:42:14 -0700 Subject: [PATCH 7/7] Revert "Revert "HTTP2: Add graceful goaway (#29050)" (#29187)" (#29190) * Revert "Revert "HTTP2: Add graceful goaway (#29050)" (#29187)" This reverts commit 882f64e376f6d91b368775ef92525220277e0273. * Make sure fds are added to pollsets before the main test contents --- CMakeLists.txt | 37 ++ build_autogenerated.yaml | 11 + .../chttp2/transport/chttp2_transport.cc | 122 ++++- .../ext/transport/chttp2/transport/internal.h | 5 +- .../ext/transport/chttp2/transport/parsing.cc | 8 + .../ext/transport/chttp2/transport/writing.cc | 5 +- src/core/lib/surface/server.cc | 1 - test/core/transport/chttp2/BUILD | 13 + .../chttp2/graceful_shutdown_test.cc | 424 ++++++++++++++++++ .../transport/chttp2/simple_request.headers | 12 + tools/run_tests/generated/tests.json | 24 + 11 files changed, 647 insertions(+), 15 deletions(-) create mode 100644 test/core/transport/chttp2/graceful_shutdown_test.cc create mode 100644 test/core/transport/chttp2/simple_request.headers diff --git a/CMakeLists.txt b/CMakeLists.txt index ca5471ce3c8..efa7230862a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -864,6 +864,7 @@ if(gRPC_BUILD_TESTS) add_dependencies(buildtests_cxx global_config_test) add_dependencies(buildtests_cxx google_c2p_resolver_test) add_dependencies(buildtests_cxx google_mesh_ca_certificate_provider_factory_test) + add_dependencies(buildtests_cxx graceful_shutdown_test) add_dependencies(buildtests_cxx grpc_authorization_engine_test) add_dependencies(buildtests_cxx grpc_authorization_policy_provider_test) add_dependencies(buildtests_cxx grpc_authz_end2end_test) @@ -10690,6 +10691,42 @@ target_link_libraries(google_mesh_ca_certificate_provider_factory_test ) +endif() +if(gRPC_BUILD_TESTS) + +add_executable(graceful_shutdown_test + test/core/end2end/cq_verifier.cc + test/core/transport/chttp2/graceful_shutdown_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(graceful_shutdown_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(graceful_shutdown_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util +) + + endif() if(gRPC_BUILD_TESTS) diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index b7992335411..28993cf44fd 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -5826,6 +5826,17 @@ targets: - test/core/xds/google_mesh_ca_certificate_provider_factory_test.cc deps: - grpc_test_util +- name: graceful_shutdown_test + gtest: true + build: test + language: c++ + headers: + - test/core/end2end/cq_verifier.h + src: + - test/core/end2end/cq_verifier.cc + - test/core/transport/chttp2/graceful_shutdown_test.cc + deps: + - grpc_test_util - name: grpc_authorization_engine_test gtest: true build: test diff --git a/src/core/ext/transport/chttp2/transport/chttp2_transport.cc b/src/core/ext/transport/chttp2/transport/chttp2_transport.cc index 1d6facdd176..eb91e1f10cb 100644 --- a/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +++ b/src/core/ext/transport/chttp2/transport/chttp2_transport.cc @@ -1006,8 +1006,8 @@ static void write_action_end_locked(void* tp, grpc_error_handle error) { closed = true; } - if (t->sent_goaway_state == GRPC_CHTTP2_GOAWAY_SEND_SCHEDULED) { - t->sent_goaway_state = GRPC_CHTTP2_GOAWAY_SENT; + if (t->sent_goaway_state == GRPC_CHTTP2_FINAL_GOAWAY_SEND_SCHEDULED) { + t->sent_goaway_state = GRPC_CHTTP2_FINAL_GOAWAY_SENT; closed = true; if (grpc_chttp2_stream_map_size(&t->stream_map) == 0) { close_transport_locked( @@ -1759,18 +1759,120 @@ void grpc_chttp2_ack_ping(grpc_chttp2_transport* t, uint64_t id) { } } +namespace { + +// Fire and forget (deletes itself on completion). Does a graceful shutdown by +// sending a GOAWAY frame with the last stream id set to 2^31-1, sending a ping +// and waiting for an ack (effective waiting for an RTT) and then sending a +// final GOAWAY freame with an updated last stream identifier. This helps ensure +// that a connection can be cleanly shut down without losing requests. +// In the event, that the client does not respond to the ping for some reason, +// we add a 20 second deadline, after which we send the second goaway. +class GracefulGoaway : public grpc_core::RefCounted { + public: + static void Start(grpc_chttp2_transport* t) { new GracefulGoaway(t); } + + ~GracefulGoaway() override { + GRPC_CHTTP2_UNREF_TRANSPORT(t_, "graceful goaway"); + } + + private: + explicit GracefulGoaway(grpc_chttp2_transport* t) : t_(t) { + t->sent_goaway_state = GRPC_CHTTP2_GRACEFUL_GOAWAY; + GRPC_CHTTP2_REF_TRANSPORT(t_, "graceful goaway"); + grpc_chttp2_goaway_append((1u << 31) - 1, 0, grpc_empty_slice(), &t->qbuf); + send_ping_locked( + t, nullptr, GRPC_CLOSURE_INIT(&on_ping_ack_, OnPingAck, this, nullptr)); + grpc_chttp2_initiate_write(t, GRPC_CHTTP2_INITIATE_WRITE_GOAWAY_SENT); + Ref().release(); // Ref for the timer + grpc_timer_init( + &timer_, + grpc_core::ExecCtx::Get()->Now() + grpc_core::Duration::Seconds(20), + GRPC_CLOSURE_INIT(&on_timer_, OnTimer, this, nullptr)); + } + + void MaybeSendFinalGoawayLocked() { + if (t_->sent_goaway_state != GRPC_CHTTP2_GRACEFUL_GOAWAY) { + // We already sent the final GOAWAY. + return; + } + if (t_->destroying || t_->closed_with_error != GRPC_ERROR_NONE) { + GRPC_CHTTP2_IF_TRACING(gpr_log( + GPR_INFO, + "transport:%p %s peer:%s Transport already shutting down. " + "Graceful GOAWAY abandoned.", + t_, t_->is_client ? "CLIENT" : "SERVER", t_->peer_string.c_str())); + return; + } + // Ping completed. Send final goaway. + GRPC_CHTTP2_IF_TRACING( + gpr_log(GPR_INFO, + "transport:%p %s peer:%s Graceful shutdown: Ping received. " + "Sending final GOAWAY with stream_id:%d", + t_, t_->is_client ? "CLIENT" : "SERVER", + t_->peer_string.c_str(), t_->last_new_stream_id)); + t_->sent_goaway_state = GRPC_CHTTP2_FINAL_GOAWAY_SEND_SCHEDULED; + grpc_chttp2_goaway_append(t_->last_new_stream_id, 0, grpc_empty_slice(), + &t_->qbuf); + grpc_chttp2_initiate_write(t_, GRPC_CHTTP2_INITIATE_WRITE_GOAWAY_SENT); + } + + static void OnPingAck(void* arg, grpc_error_handle /* error */) { + auto* self = static_cast(arg); + self->t_->combiner->Run( + GRPC_CLOSURE_INIT(&self->on_ping_ack_, OnPingAckLocked, self, nullptr), + GRPC_ERROR_NONE); + } + + static void OnPingAckLocked(void* arg, grpc_error_handle /* error */) { + auto* self = static_cast(arg); + grpc_timer_cancel(&self->timer_); + self->MaybeSendFinalGoawayLocked(); + self->Unref(); + } + + static void OnTimer(void* arg, grpc_error_handle error) { + auto* self = static_cast(arg); + if (error != GRPC_ERROR_NONE) { + self->Unref(); + return; + } + self->t_->combiner->Run( + GRPC_CLOSURE_INIT(&self->on_timer_, OnTimerLocked, self, nullptr), + GRPC_ERROR_NONE); + } + + static void OnTimerLocked(void* arg, grpc_error_handle /* error */) { + auto* self = static_cast(arg); + self->MaybeSendFinalGoawayLocked(); + self->Unref(); + } + + grpc_chttp2_transport* t_; + grpc_closure on_ping_ack_; + grpc_timer timer_; + grpc_closure on_timer_; +}; + +} // namespace + static void send_goaway(grpc_chttp2_transport* t, grpc_error_handle error) { - // We want to log this irrespective of whether http tracing is enabled - gpr_log(GPR_DEBUG, "%s: Sending goaway err=%s", t->peer_string.c_str(), - grpc_error_std_string(error).c_str()); - t->sent_goaway_state = GRPC_CHTTP2_GOAWAY_SEND_SCHEDULED; grpc_http2_error_code http_error; std::string message; grpc_error_get_status(error, grpc_core::Timestamp::InfFuture(), nullptr, &message, &http_error, nullptr); - grpc_chttp2_goaway_append( - t->last_new_stream_id, static_cast(http_error), - grpc_slice_from_cpp_string(std::move(message)), &t->qbuf); + if (!t->is_client && http_error == GRPC_HTTP2_NO_ERROR) { + // Do a graceful shutdown. + GracefulGoaway::Start(t); + } else { + // We want to log this irrespective of whether http tracing is enabled + gpr_log(GPR_DEBUG, "%s: Sending goaway err=%s", t->peer_string.c_str(), + grpc_error_std_string(error).c_str()); + t->sent_goaway_state = GRPC_CHTTP2_FINAL_GOAWAY_SEND_SCHEDULED; + grpc_chttp2_goaway_append( + t->last_new_stream_id, static_cast(http_error), + grpc_slice_from_cpp_string(std::move(message)), &t->qbuf); + } grpc_chttp2_initiate_write(t, GRPC_CHTTP2_INITIATE_WRITE_GOAWAY_SENT); GRPC_ERROR_UNREF(error); } @@ -1999,7 +2101,7 @@ static void remove_stream(grpc_chttp2_transport* t, uint32_t id, if (grpc_chttp2_stream_map_size(&t->stream_map) == 0) { post_benign_reclaimer(t); - if (t->sent_goaway_state == GRPC_CHTTP2_GOAWAY_SENT) { + if (t->sent_goaway_state == GRPC_CHTTP2_FINAL_GOAWAY_SENT) { close_transport_locked( t, GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING( "Last stream closed after sending GOAWAY", &error, 1)); diff --git a/src/core/ext/transport/chttp2/transport/internal.h b/src/core/ext/transport/chttp2/transport/internal.h index fe2b437552f..48c62ef1d77 100644 --- a/src/core/ext/transport/chttp2/transport/internal.h +++ b/src/core/ext/transport/chttp2/transport/internal.h @@ -196,8 +196,9 @@ typedef enum { typedef enum { GRPC_CHTTP2_NO_GOAWAY_SEND, - GRPC_CHTTP2_GOAWAY_SEND_SCHEDULED, - GRPC_CHTTP2_GOAWAY_SENT, + GRPC_CHTTP2_GRACEFUL_GOAWAY, + GRPC_CHTTP2_FINAL_GOAWAY_SEND_SCHEDULED, + GRPC_CHTTP2_FINAL_GOAWAY_SENT, } grpc_chttp2_sent_goaway_state; typedef struct grpc_chttp2_write_cb { diff --git a/src/core/ext/transport/chttp2/transport/parsing.cc b/src/core/ext/transport/chttp2/transport/parsing.cc index 1864a416a1e..7cac0850834 100644 --- a/src/core/ext/transport/chttp2/transport/parsing.cc +++ b/src/core/ext/transport/chttp2/transport/parsing.cc @@ -479,6 +479,14 @@ static grpc_error_handle init_header_frame_parser(grpc_chttp2_transport* t, t->settings[GRPC_ACKED_SETTINGS] [GRPC_CHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS])) { return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Max stream count exceeded"); + } else if (t->sent_goaway_state == GRPC_CHTTP2_FINAL_GOAWAY_SENT) { + GRPC_CHTTP2_IF_TRACING(gpr_log( + GPR_INFO, + "transport:%p SERVER peer:%s Final GOAWAY sent. Ignoring new " + "grpc_chttp2_stream request id=%d, last grpc_chttp2_stream id=%d", + t, t->peer_string.c_str(), t->incoming_stream_id, + t->last_new_stream_id)); + return init_header_skip_frame_parser(t, priority_type); } t->last_new_stream_id = t->incoming_stream_id; s = t->incoming_stream = diff --git a/src/core/ext/transport/chttp2/transport/writing.cc b/src/core/ext/transport/chttp2/transport/writing.cc index 0c7b6760d6d..7a89986bfa7 100644 --- a/src/core/ext/transport/chttp2/transport/writing.cc +++ b/src/core/ext/transport/chttp2/transport/writing.cc @@ -87,9 +87,10 @@ static void maybe_initiate_ping(grpc_chttp2_transport* t) { ? grpc_core::Duration::Hours(2) : grpc_core::Duration::Seconds(1); /* A second is added to deal with network delays and timing imprecision */ - } else { + } else if (t->sent_goaway_state != GRPC_CHTTP2_GRACEFUL_GOAWAY) { // The gRPC keepalive spec doesn't call for any throttling on the server - // side, but we are adding some throttling for protection anyway. + // side, but we are adding some throttling for protection anyway, unless + // we are doing a graceful GOAWAY in which case we don't want to wait. next_allowed_ping_interval = t->keepalive_time == grpc_core::Duration::Infinity() ? grpc_core::Duration::Seconds(20) diff --git a/src/core/lib/surface/server.cc b/src/core/lib/surface/server.cc index a276d9c6d50..4c0220837ee 100644 --- a/src/core/lib/surface/server.cc +++ b/src/core/lib/surface/server.cc @@ -479,7 +479,6 @@ class ChannelBroadcaster { GRPC_ERROR_CREATE_FROM_STATIC_STRING("Server shutdown"), GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_OK) : GRPC_ERROR_NONE; - op->set_accept_stream = true; sc->slice = grpc_slice_from_copied_string("Server shutdown"); op->disconnect_with_error = send_disconnect; elem = diff --git a/test/core/transport/chttp2/BUILD b/test/core/transport/chttp2/BUILD index ffaa0e1a331..31e5c556c74 100644 --- a/test/core/transport/chttp2/BUILD +++ b/test/core/transport/chttp2/BUILD @@ -98,6 +98,19 @@ grpc_cc_test( ], ) +grpc_cc_test( + name = "graceful_shutdown_test", + srcs = ["graceful_shutdown_test.cc"], + external_deps = ["gtest"], + language = "C++", + deps = [ + "//:gpr", + "//:grpc", + "//test/core/end2end:cq_verifier", + "//test/core/util:grpc_test_util", + ], +) + grpc_cc_test( name = "hpack_encoder_test", srcs = ["hpack_encoder_test.cc"], diff --git a/test/core/transport/chttp2/graceful_shutdown_test.cc b/test/core/transport/chttp2/graceful_shutdown_test.cc new file mode 100644 index 00000000000..89184651bd0 --- /dev/null +++ b/test/core/transport/chttp2/graceful_shutdown_test.cc @@ -0,0 +1,424 @@ +// +// +// 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 +#include + +#include + +#include + +#include "absl/synchronization/mutex.h" +#include "absl/synchronization/notification.h" + +#include +#include +#include + +#include "src/core/ext/transport/chttp2/transport/chttp2_transport.h" +#include "src/core/ext/transport/chttp2/transport/frame_goaway.h" +#include "src/core/ext/transport/chttp2/transport/frame_ping.h" +#include "src/core/lib/channel/channel_stack_builder.h" +#include "src/core/lib/config/core_configuration.h" +#include "src/core/lib/gprpp/host_port.h" +#include "src/core/lib/iomgr/endpoint_pair.h" +#include "src/core/lib/slice/slice.h" +#include "src/core/lib/slice/slice_string_helpers.h" +#include "src/core/lib/surface/channel.h" +#include "src/core/lib/surface/server.h" +#include "test/core/end2end/cq_verifier.h" +#include "test/core/util/port.h" +#include "test/core/util/test_config.h" +#include "test/core/util/test_tcp_server.h" + +namespace grpc_core { +namespace { + +void* Tag(intptr_t t) { return reinterpret_cast(t); } + +class GracefulShutdownTest : public ::testing::Test { + protected: + GracefulShutdownTest() { SetupAndStart(); } + + ~GracefulShutdownTest() override { ShutdownAndDestroy(); } + + // Sets up the client and server + void SetupAndStart() { + ExecCtx exec_ctx; + cq_ = grpc_completion_queue_create_for_next(nullptr); + cqv_ = cq_verifier_create(cq_); + grpc_arg server_args[] = { + grpc_channel_arg_integer_create( + const_cast(GRPC_ARG_HTTP2_BDP_PROBE), 0), + grpc_channel_arg_integer_create( + const_cast(GRPC_ARG_KEEPALIVE_TIME_MS), INT_MAX)}; + grpc_channel_args server_channel_args = {GPR_ARRAY_SIZE(server_args), + server_args}; + // Create server + server_ = grpc_server_create(&server_channel_args, nullptr); + auto* core_server = Server::FromC(server_); + grpc_server_register_completion_queue(server_, cq_, nullptr); + grpc_server_start(server_); + fds_ = grpc_iomgr_create_endpoint_pair("fixture", nullptr); + auto* transport = grpc_create_chttp2_transport(core_server->channel_args(), + fds_.server, false); + grpc_endpoint_add_to_pollset(fds_.server, grpc_cq_pollset(cq_)); + GPR_ASSERT(core_server->SetupTransport(transport, nullptr, + core_server->channel_args(), + nullptr) == GRPC_ERROR_NONE); + grpc_chttp2_transport_start_reading(transport, nullptr, nullptr, nullptr); + // Start polling on the client + absl::Notification client_poller_thread_started_notification; + client_poll_thread_ = absl::make_unique( + [this, &client_poller_thread_started_notification]() { + grpc_completion_queue* client_cq = + grpc_completion_queue_create_for_next(nullptr); + { + ExecCtx exec_ctx; + grpc_endpoint_add_to_pollset(fds_.client, + grpc_cq_pollset(client_cq)); + grpc_endpoint_add_to_pollset(fds_.server, + grpc_cq_pollset(client_cq)); + } + client_poller_thread_started_notification.Notify(); + while (!shutdown_) { + GPR_ASSERT(grpc_completion_queue_next( + client_cq, grpc_timeout_milliseconds_to_deadline(10), + nullptr) + .type == GRPC_QUEUE_TIMEOUT); + } + grpc_completion_queue_destroy(client_cq); + }); + client_poller_thread_started_notification.WaitForNotification(); + // Write connection prefix and settings frame + constexpr char kPrefix[] = + "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n\x00\x00\x00\x04\x00\x00\x00\x00\x00"; + Write(absl::string_view(kPrefix, sizeof(kPrefix) - 1)); + // Start reading on the client + grpc_slice_buffer_init(&read_buffer_); + GRPC_CLOSURE_INIT(&on_read_done_, OnReadDone, this, nullptr); + grpc_endpoint_read(fds_.client, &read_buffer_, &on_read_done_, false); + } + + // Shuts down and destroys the client and server. + void ShutdownAndDestroy() { + shutdown_ = true; + ExecCtx exec_ctx; + grpc_endpoint_shutdown( + fds_.client, GRPC_ERROR_CREATE_FROM_STATIC_STRING("Client shutdown")); + ExecCtx::Get()->Flush(); + client_poll_thread_->join(); + GPR_ASSERT(read_end_notification_.WaitForNotificationWithTimeout( + absl::Seconds(5))); + grpc_endpoint_destroy(fds_.client); + ExecCtx::Get()->Flush(); + // Shutdown and destroy server + grpc_server_shutdown_and_notify(server_, cq_, Tag(1000)); + CQ_EXPECT_COMPLETION(cqv_, Tag(1000), true); + cq_verify(cqv_); + grpc_server_destroy(server_); + cq_verifier_destroy(cqv_); + grpc_completion_queue_destroy(cq_); + } + + static void OnReadDone(void* arg, grpc_error_handle error) { + GracefulShutdownTest* self = static_cast(arg); + if (error == GRPC_ERROR_NONE) { + { + absl::MutexLock lock(&self->mu_); + for (size_t i = 0; i < self->read_buffer_.count; ++i) { + absl::StrAppend(&self->read_bytes_, + StringViewFromSlice(self->read_buffer_.slices[i])); + } + self->read_cv_.SignalAll(); + } + grpc_slice_buffer_reset_and_unref(&self->read_buffer_); + grpc_endpoint_read(self->fds_.client, &self->read_buffer_, + &self->on_read_done_, false); + } else { + grpc_slice_buffer_destroy(&self->read_buffer_); + self->read_end_notification_.Notify(); + } + } + + // Waits for \a bytes to show up in read_bytes_ + void WaitForReadBytes(absl::string_view bytes) { + std::atomic done{false}; + { + absl::MutexLock lock(&mu_); + while (!absl::StrContains(read_bytes_, bytes)) { + read_cv_.WaitWithTimeout(&mu_, absl::Seconds(5)); + } + } + done = true; + } + + void WaitForGoaway(uint32_t last_stream_id) { + grpc_slice_buffer buffer; + grpc_slice_buffer_init(&buffer); + grpc_chttp2_goaway_append(last_stream_id, 0, grpc_empty_slice(), &buffer); + std::string expected_bytes; + for (size_t i = 0; i < buffer.count; ++i) { + absl::StrAppend(&expected_bytes, StringViewFromSlice(buffer.slices[i])); + } + grpc_slice_buffer_destroy(&buffer); + WaitForReadBytes(expected_bytes); + } + + void WaitForPing(uint64_t opaque_data) { + grpc_slice ping_slice = grpc_chttp2_ping_create(0, opaque_data); + WaitForReadBytes(StringViewFromSlice(ping_slice)); + } + + void SendPingAck(uint64_t opaque_data) { + grpc_slice ping_slice = grpc_chttp2_ping_create(1, opaque_data); + Write(StringViewFromSlice(ping_slice)); + } + + // This is a blocking call. It waits for the write callback to be invoked + // before returning. (In other words, do not call this from a thread that + // should not be blocked, for example, a polling thread.) + void Write(absl::string_view bytes) { + ExecCtx exec_ctx; + grpc_slice slice = + StaticSlice::FromStaticBuffer(bytes.data(), bytes.size()).TakeCSlice(); + grpc_slice_buffer buffer; + grpc_slice_buffer_init(&buffer); + grpc_slice_buffer_add(&buffer, slice); + WriteBuffer(&buffer); + grpc_slice_buffer_destroy(&buffer); + } + + void WriteBuffer(grpc_slice_buffer* buffer) { + absl::Notification on_write_done_notification_; + GRPC_CLOSURE_INIT(&on_write_done_, OnWriteDone, + &on_write_done_notification_, nullptr); + grpc_endpoint_write(fds_.client, buffer, &on_write_done_, nullptr); + ExecCtx::Get()->Flush(); + GPR_ASSERT(on_write_done_notification_.WaitForNotificationWithTimeout( + absl::Seconds(5))); + } + + static void OnWriteDone(void* arg, grpc_error_handle error) { + GPR_ASSERT(error == GRPC_ERROR_NONE); + absl::Notification* on_write_done_notification_ = + static_cast(arg); + on_write_done_notification_->Notify(); + } + + grpc_endpoint_pair fds_; + grpc_server* server_ = nullptr; + grpc_completion_queue* cq_ = nullptr; + cq_verifier* cqv_ = nullptr; + std::unique_ptr client_poll_thread_; + std::atomic shutdown_{false}; + grpc_closure on_read_done_; + absl::Mutex mu_; + absl::CondVar read_cv_; + absl::Notification read_end_notification_; + grpc_slice_buffer read_buffer_; + std::string read_bytes_ ABSL_GUARDED_BY(mu_); + grpc_closure on_write_done_; +}; + +TEST_F(GracefulShutdownTest, GracefulGoaway) { + // Initiate shutdown on the server + grpc_server_shutdown_and_notify(server_, cq_, Tag(1)); + // Wait for first goaway + WaitForGoaway((1u << 31) - 1); + // Wait for the ping + WaitForPing(0); + // Reply to the ping + SendPingAck(0); + // Wait for final goaway + WaitForGoaway(0); + // The shutdown should successfully complete. + CQ_EXPECT_COMPLETION(cqv_, Tag(1), true); + cq_verify(cqv_); +} + +TEST_F(GracefulShutdownTest, RequestStartedBeforeFinalGoaway) { + grpc_call_error error; + grpc_call* s; + grpc_call_details call_details; + grpc_metadata_array request_metadata_recv; + grpc_call_details_init(&call_details); + grpc_metadata_array_init(&request_metadata_recv); + error = grpc_server_request_call(server_, &s, &call_details, + &request_metadata_recv, cq_, cq_, Tag(100)); + GPR_ASSERT(GRPC_CALL_OK == error); + // Initiate shutdown on the server + grpc_server_shutdown_and_notify(server_, cq_, Tag(1)); + // Wait for first goaway + WaitForGoaway((1u << 31) - 1); + // Wait for the ping + WaitForPing(0); + // Start a request + constexpr char kRequestFrame[] = + "\x00\x00\xbe\x01\x05\x00\x00\x00\x01" + "\x10\x05:path\x08/foo/bar" + "\x10\x07:scheme\x04http" + "\x10\x07:method\x04POST" + "\x10\x0a:authority\x09localhost" + "\x10\x0c" + "content-type\x10" + "application/grpc" + "\x10\x14grpc-accept-encoding\x15identity,deflate,gzip" + "\x10\x02te\x08trailers" + "\x10\x0auser-agent\x17grpc-c/0.12.0.0 (linux)"; + Write(absl::string_view(kRequestFrame, sizeof(kRequestFrame) - 1)); + // Reply to the ping + SendPingAck(0); + // Wait for final goaway with last stream ID 1 to show that the HTTP2 + // transport accepted the stream. + WaitForGoaway(1); + // TODO(yashykt): The surface layer automatically cancels calls received after + // shutdown has been called. Once that is fixed, this should be a success. + CQ_EXPECT_COMPLETION(cqv_, Tag(100), 0); + // The shutdown should successfully complete. + CQ_EXPECT_COMPLETION(cqv_, Tag(1), true); + cq_verify(cqv_); + grpc_metadata_array_destroy(&request_metadata_recv); + grpc_call_details_destroy(&call_details); +} + +TEST_F(GracefulShutdownTest, RequestStartedAfterFinalGoawayIsIgnored) { + // Start a request before shutdown to make sure that the connection stays + // alive. + grpc_call_error error; + grpc_call* s; + grpc_call_details call_details; + grpc_metadata_array request_metadata_recv; + grpc_call_details_init(&call_details); + grpc_metadata_array_init(&request_metadata_recv); + error = grpc_server_request_call(server_, &s, &call_details, + &request_metadata_recv, cq_, cq_, Tag(100)); + GPR_ASSERT(GRPC_CALL_OK == error); + // Send the request from the client. + constexpr char kRequestFrame[] = + "\x00\x00\xbe\x01\x05\x00\x00\x00\x01" + "\x10\x05:path\x08/foo/bar" + "\x10\x07:scheme\x04http" + "\x10\x07:method\x04POST" + "\x10\x0a:authority\x09localhost" + "\x10\x0c" + "content-type\x10" + "application/grpc" + "\x10\x14grpc-accept-encoding\x15identity,deflate,gzip" + "\x10\x02te\x08trailers" + "\x10\x0auser-agent\x17grpc-c/0.12.0.0 (linux)"; + Write(absl::string_view(kRequestFrame, sizeof(kRequestFrame) - 1)); + CQ_EXPECT_COMPLETION(cqv_, Tag(100), 1); + cq_verify(cqv_); + + // Initiate shutdown on the server + grpc_server_shutdown_and_notify(server_, cq_, Tag(1)); + // Wait for first goaway + WaitForGoaway((1u << 31) - 1); + // Wait for the ping + WaitForPing(0); + // Reply to the ping + SendPingAck(0); + // Wait for final goaway + WaitForGoaway(1); + + // Send another request from the client which should be ignored. + constexpr char kNewRequestFrame[] = + "\x00\x00\xbe\x01\x05\x00\x00\x00\x03" + "\x10\x05:path\x08/foo/bar" + "\x10\x07:scheme\x04http" + "\x10\x07:method\x04POST" + "\x10\x0a:authority\x09localhost" + "\x10\x0c" + "content-type\x10" + "application/grpc" + "\x10\x14grpc-accept-encoding\x15identity,deflate,gzip" + "\x10\x02te\x08trailers" + "\x10\x0auser-agent\x17grpc-c/0.12.0.0 (linux)"; + Write(absl::string_view(kNewRequestFrame, sizeof(kNewRequestFrame) - 1)); + + // Finish the accepted request. + grpc_op ops[3]; + grpc_op* op; + memset(ops, 0, sizeof(ops)); + op = ops; + op->op = GRPC_OP_SEND_INITIAL_METADATA; + op->data.send_initial_metadata.count = 0; + op->flags = 0; + op->reserved = nullptr; + op++; + op->op = GRPC_OP_SEND_STATUS_FROM_SERVER; + op->data.send_status_from_server.trailing_metadata_count = 0; + op->data.send_status_from_server.status = GRPC_STATUS_UNIMPLEMENTED; + grpc_slice status_details = grpc_slice_from_static_string("xyz"); + op->data.send_status_from_server.status_details = &status_details; + op->flags = 0; + op->reserved = nullptr; + op++; + op->op = GRPC_OP_RECV_CLOSE_ON_SERVER; + int was_cancelled = 2; + op->data.recv_close_on_server.cancelled = &was_cancelled; + op->flags = 0; + op->reserved = nullptr; + op++; + error = grpc_call_start_batch(s, ops, static_cast(op - ops), Tag(101), + nullptr); + GPR_ASSERT(GRPC_CALL_OK == error); + CQ_EXPECT_COMPLETION(cqv_, Tag(101), true); + // The shutdown should successfully complete. + CQ_EXPECT_COMPLETION(cqv_, Tag(1), true); + cq_verify(cqv_); + grpc_call_unref(s); + grpc_metadata_array_destroy(&request_metadata_recv); + grpc_call_details_destroy(&call_details); +} + +// Make sure that the graceful goaway eventually makes progress even if a client +// does not respond to the ping. +TEST_F(GracefulShutdownTest, UnresponsiveClient) { + absl::Time initial_time = absl::Now(); + // Initiate shutdown on the server + grpc_server_shutdown_and_notify(server_, cq_, Tag(1)); + // Wait for first goaway + WaitForGoaway((1u << 31) - 1); + // Wait for the ping + WaitForPing(0); + // Wait for final goaway without sending a ping ACK. + WaitForGoaway(0); + EXPECT_GE(absl::Now() - initial_time, + absl::Seconds(20) - + absl::Seconds( + 1) /* clock skew between threads due to time caching */); + // The shutdown should successfully complete. + CQ_EXPECT_COMPLETION(cqv_, Tag(1), true); + cq_verify(cqv_); +} + +} // namespace +} // namespace grpc_core + +int main(int argc, char** argv) { + ::testing::InitGoogleTest(&argc, argv); + grpc::testing::TestEnvironment env(argc, argv); + grpc_init(); + int result = RUN_ALL_TESTS(); + grpc_shutdown(); + return result; +} diff --git a/test/core/transport/chttp2/simple_request.headers b/test/core/transport/chttp2/simple_request.headers new file mode 100644 index 00000000000..6ca29e21a82 --- /dev/null +++ b/test/core/transport/chttp2/simple_request.headers @@ -0,0 +1,12 @@ +# headers used in graceful_shutdown_test.cc +# use tools/codegen/core/gen_header_frame.py to generate the binary strings +# contained in the source code +:path: /foo/bar +:scheme: http +:method: POST +:authority: localhost +content-type: application/grpc +grpc-accept-encoding: identity,deflate,gzip +te: trailers +user-agent: grpc-c/0.12.0.0 (linux) + diff --git a/tools/run_tests/generated/tests.json b/tools/run_tests/generated/tests.json index 3e67534a1a8..58fd973c97a 100644 --- a/tools/run_tests/generated/tests.json +++ b/tools/run_tests/generated/tests.json @@ -4427,6 +4427,30 @@ ], "uses_polling": true }, + { + "args": [], + "benchmark": false, + "ci_platforms": [ + "linux", + "mac", + "posix", + "windows" + ], + "cpu_cost": 1.0, + "exclude_configs": [], + "exclude_iomgrs": [], + "flaky": false, + "gtest": true, + "language": "c++", + "name": "graceful_shutdown_test", + "platforms": [ + "linux", + "mac", + "posix", + "windows" + ], + "uses_polling": true + }, { "args": [], "benchmark": false,