From 214e3f3622a62b3d05c8a0c2d78132ff4c31133f Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Thu, 14 Apr 2022 11:22:39 -0700 Subject: [PATCH] xds_end2end_test: Move RLS tests to their own file (#29290) * move some code around * remove num_backends parameter from XdsEnd2endTest * remove use_xds_enabled_server param from XdsEnd2endTest * remove xds_resource_does_not_exist_timeout_ms param from XdsEnd2endTest * remove client_load_reporting_interval_seconds param from XdsEnd2endTest * start moving CreateAndStartBackends() into individual tests * finish moving CreateAndStartBackends() into individual tests * remove unused variable * remove SetEdsResourceWithDelay * fix test flake * clang-tidy * clang-format * move test framework to its own library * fix build * clang-format * fix windows build * rename TestType to XdsTestType * move BackendServiceImpl inside of BackendServerThread * clang-format * move AdminServerThread to CSDS test suite * move RLS tests to their own file * remove unnecessary deps * generate_projects --- CMakeLists.txt | 186 +++++++++- build_autogenerated.yaml | 61 +++- test/cpp/end2end/xds/BUILD | 27 +- test/cpp/end2end/xds/xds_end2end_test.cc | 310 ---------------- test/cpp/end2end/xds/xds_rls_end2end_test.cc | 361 +++++++++++++++++++ tools/run_tests/generated/tests.json | 22 ++ 6 files changed, 641 insertions(+), 326 deletions(-) create mode 100644 test/cpp/end2end/xds/xds_rls_end2end_test.cc diff --git a/CMakeLists.txt b/CMakeLists.txt index a28b69ccbfd..c32663b3181 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1191,6 +1191,9 @@ if(gRPC_BUILD_TESTS) endif() add_dependencies(buildtests_cxx xds_interop_client) add_dependencies(buildtests_cxx xds_interop_server) + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_cxx xds_rls_end2end_test) + endif() add_custom_target(buildtests DEPENDS buildtests_c buildtests_cxx) @@ -17368,14 +17371,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 @@ -17524,7 +17519,6 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/tls.grpc.pb.cc ${_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 - 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_end2end_test_lib.cc @@ -17879,6 +17873,180 @@ target_link_libraries(xds_interop_server endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + + add_executable(xds_rls_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 + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/ads_for_test.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/ads_for_test.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/ads_for_test.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/ads_for_test.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/eds_for_test.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/eds_for_test.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/eds_for_test.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/eds_for_test.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/lrs_for_test.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/lrs_for_test.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/lrs_for_test.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/lrs_for_test.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/address.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/address.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/address.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/address.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/ads.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/ads.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/ads.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/ads.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/base.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/base.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/base.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/base.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/cluster.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/cluster.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/cluster.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/cluster.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/config_source.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/config_source.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/config_source.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/config_source.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/discovery.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/discovery.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/discovery.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/discovery.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/endpoint.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/endpoint.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/endpoint.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/endpoint.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/expr.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/expr.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/expr.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/expr.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/extension.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/extension.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/extension.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/extension.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/http_connection_manager.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/http_connection_manager.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/http_connection_manager.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/http_connection_manager.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/http_filter_rbac.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/http_filter_rbac.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/http_filter_rbac.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/http_filter_rbac.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/listener.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/listener.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/listener.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/listener.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/load_report.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/load_report.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/load_report.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/load_report.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/lrs.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/lrs.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/lrs.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/lrs.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/metadata.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/metadata.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/metadata.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/metadata.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/path.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/path.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/path.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/path.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/percent.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/percent.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/percent.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/percent.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/protocol.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/protocol.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/protocol.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/protocol.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/range.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/range.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/range.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/range.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/rbac.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/rbac.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/rbac.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/rbac.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/regex.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/regex.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/regex.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/regex.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/route.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/route.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/route.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/route.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/router.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/router.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/router.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/router.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/string.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/string.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/string.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/string.grpc.pb.h + test/cpp/end2end/rls_server.cc + test/cpp/end2end/test_service_impl.cc + test/cpp/end2end/xds/xds_end2end_test_lib.cc + test/cpp/end2end/xds/xds_rls_end2end_test.cc + test/cpp/end2end/xds/xds_server.cc + test/cpp/util/tls_test_utils.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc + ) + + target_include_directories(xds_rls_end2end_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_RE2_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_XXHASH_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} + ) + + target_link_libraries(xds_rls_end2end_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++_test_util + ) + + +endif() +endif() diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index e5d11fa98e3..92ef7fca10a 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -8465,14 +8465,11 @@ targets: language: c++ headers: - test/cpp/end2end/counted_service.h - - test/cpp/end2end/rls_server.h - test/cpp/end2end/test_service_impl.h - test/cpp/end2end/xds/xds_end2end_test_lib.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 @@ -8510,7 +8507,6 @@ targets: - src/proto/grpc/testing/xds/v3/router.proto - src/proto/grpc/testing/xds/v3/string.proto - src/proto/grpc/testing/xds/v3/tls.proto - - 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_end2end_test_lib.cc @@ -8627,6 +8623,63 @@ targets: - grpcpp_channelz - grpc_test_util - grpc++_test_config +- name: xds_rls_end2end_test + gtest: true + build: test + language: c++ + headers: + - test/cpp/end2end/counted_service.h + - test/cpp/end2end/rls_server.h + - test/cpp/end2end/test_service_impl.h + - test/cpp/end2end/xds/xds_end2end_test_lib.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 + - src/proto/grpc/testing/simple_messages.proto + - src/proto/grpc/testing/xds/ads_for_test.proto + - src/proto/grpc/testing/xds/eds_for_test.proto + - src/proto/grpc/testing/xds/lrs_for_test.proto + - src/proto/grpc/testing/xds/v3/address.proto + - src/proto/grpc/testing/xds/v3/ads.proto + - src/proto/grpc/testing/xds/v3/base.proto + - src/proto/grpc/testing/xds/v3/cluster.proto + - src/proto/grpc/testing/xds/v3/config_source.proto + - src/proto/grpc/testing/xds/v3/discovery.proto + - src/proto/grpc/testing/xds/v3/endpoint.proto + - src/proto/grpc/testing/xds/v3/expr.proto + - src/proto/grpc/testing/xds/v3/extension.proto + - src/proto/grpc/testing/xds/v3/http_connection_manager.proto + - src/proto/grpc/testing/xds/v3/http_filter_rbac.proto + - src/proto/grpc/testing/xds/v3/listener.proto + - src/proto/grpc/testing/xds/v3/load_report.proto + - src/proto/grpc/testing/xds/v3/lrs.proto + - src/proto/grpc/testing/xds/v3/metadata.proto + - src/proto/grpc/testing/xds/v3/path.proto + - src/proto/grpc/testing/xds/v3/percent.proto + - src/proto/grpc/testing/xds/v3/protocol.proto + - src/proto/grpc/testing/xds/v3/range.proto + - src/proto/grpc/testing/xds/v3/rbac.proto + - src/proto/grpc/testing/xds/v3/regex.proto + - src/proto/grpc/testing/xds/v3/route.proto + - src/proto/grpc/testing/xds/v3/router.proto + - src/proto/grpc/testing/xds/v3/string.proto + - test/cpp/end2end/rls_server.cc + - test/cpp/end2end/test_service_impl.cc + - test/cpp/end2end/xds/xds_end2end_test_lib.cc + - test/cpp/end2end/xds/xds_rls_end2end_test.cc + - test/cpp/end2end/xds/xds_server.cc + - test/cpp/util/tls_test_utils.cc + deps: + - grpc++_test_util + platforms: + - linux + - posix + - mac external_proto_libraries: - destination: third_party/envoy-api hash: c5807010b67033330915ca5a20483e30538ae5e689aa14b3631d6284beca4630 diff --git a/test/cpp/end2end/xds/BUILD b/test/cpp/end2end/xds/BUILD index c788365bde9..32ed8b1bf67 100644 --- a/test/cpp/end2end/xds/BUILD +++ b/test/cpp/end2end/xds/BUILD @@ -112,8 +112,6 @@ grpc_cc_test( "//:grpc", "//:grpc++", "//:grpc_resolver_fake", - "//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", @@ -132,7 +130,6 @@ grpc_cc_test( "//src/proto/grpc/testing/xds/v3:router_proto", "//src/proto/grpc/testing/xds/v3:tls_proto", "//test/core/util:grpc_test_util", - "//test/cpp/end2end:rls_server", "//test/cpp/util:test_config", "//test/cpp/util:test_util", "//test/cpp/util:tls_test_utils", @@ -190,6 +187,30 @@ grpc_cc_test( ], ) +grpc_cc_test( + name = "xds_rls_end2end_test", + size = "large", + srcs = ["xds_rls_end2end_test.cc"], + external_deps = [ + "gtest", + ], + linkstatic = True, # Fixes dyld error on MacOS + tags = [ + "no_test_ios", + "no_windows", + ], # TODO(jtattermusch): fix test on windows + deps = [ + ":xds_end2end_test_lib", + "//:gpr", + "//:grpc", + "//:grpc++", + "//src/proto/grpc/lookup/v1:rls_config_proto", + "//src/proto/grpc/lookup/v1:rls_proto", + "//test/core/util:grpc_test_util", + "//test/cpp/end2end:rls_server", + ], +) + grpc_cc_test( name = "xds_credentials_end2end_test", srcs = ["xds_credentials_end2end_test.cc"], diff --git a/test/cpp/end2end/xds/xds_end2end_test.cc b/test/cpp/end2end/xds/xds_end2end_test.cc index 505d5836096..d130aa77151 100644 --- a/test/cpp/end2end/xds/xds_end2end_test.cc +++ b/test/cpp/end2end/xds/xds_end2end_test.cc @@ -82,9 +82,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 "src/proto/grpc/testing/xds/v3/tls.grpc.pb.h" #include "test/core/util/port.h" #include "test/core/util/test_config.h" -#include "test/cpp/end2end/rls_server.h" #include "test/cpp/end2end/xds/xds_end2end_test_lib.h" #include "test/cpp/util/test_config.h" #include "test/cpp/util/tls_test_utils.h" @@ -140,8 +136,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; constexpr char kLbDropType[] = "lb"; constexpr char kThrottleDropType[] = "throttle"; @@ -151,18 +145,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"; - // Based on StaticDataCertificateProvider, but provides alternate certificates // if the certificate name is not empty. class FakeCertificateProvider final : public grpc_tls_certificate_provider { @@ -6044,290 +6026,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: - const char* Type() override { return "Rls"; } - - void RegisterAllServices(ServerBuilder* builder) override { - builder->RegisterService(rls_service_.get()); - } - - void StartAllServices() override { rls_service_->Start(); } - - void ShutdownAllServices() override { rls_service_->Shutdown(); } - - std::shared_ptr rls_service_; - }; - - RlsTest() { - rls_server_ = absl::make_unique(this); - rls_server_->Start(); - } - - void TearDown() override { - rls_server_->Shutdown(); - XdsEnd2endTest::TearDown(); - } - - std::unique_ptr rls_server_; -}; - -TEST_P(RlsTest, XdsRoutingClusterSpecifierPlugin) { - ScopedExperimentalEnvVar env_var("GRPC_EXPERIMENTAL_XDS_RLS_LB"); - CreateAndStartBackends(2); - 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()); -} - -TEST_P(RlsTest, XdsRoutingClusterSpecifierPluginNacksUndefinedSpecifier) { - ScopedExperimentalEnvVar env_var("GRPC_EXPERIMENTAL_XDS_RLS_LB"); - 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(absl::StrCat( - "RouteAction cluster contains cluster specifier plugin " - "name not configured: ", - kRlsClusterSpecifierPluginInstanceName))); -} - -TEST_P(RlsTest, XdsRoutingClusterSpecifierPluginNacksDuplicateSpecifier) { - ScopedExperimentalEnvVar env_var("GRPC_EXPERIMENTAL_XDS_RLS_LB"); - // Prepare the RLSLookupConfig: 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* duplicate_plugin = new_route_config.add_cluster_specifier_plugins(); - duplicate_plugin->mutable_extension()->set_name( - kRlsClusterSpecifierPluginInstanceName); - duplicate_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(absl::StrCat( - "Duplicated definition of cluster_specifier_plugin ", - kRlsClusterSpecifierPluginInstanceName))); -} - -TEST_P(RlsTest, - XdsRoutingClusterSpecifierPluginNacksUnknownSpecifierProtoNotOptional) { - ScopedExperimentalEnvVar env_var("GRPC_EXPERIMENTAL_XDS_RLS_LB"); - // 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("Unknown ClusterSpecifierPlugin type " - "grpc.lookup.v1.RouteLookupConfig")); -} - -TEST_P(RlsTest, - XdsRoutingClusterSpecifierPluginIgnoreUnknownSpecifierProtoOptional) { - ScopedExperimentalEnvVar env_var("GRPC_EXPERIMENTAL_XDS_RLS_LB"); - CreateAndStartBackends(1); - EdsResourceArgs args({{"locality0", CreateEndpointsForBackends()}}); - balancer_->ads_service()->SetEdsResource(BuildEdsResource(args)); - // 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); - plugin->set_is_optional(true); - 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. - WaitForAllBackends(); -} - -TEST_P(RlsTest, XdsRoutingRlsClusterSpecifierPluginNacksRequiredMatch) { - ScopedExperimentalEnvVar env_var("GRPC_EXPERIMENTAL_XDS_RLS_LB"); - // 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")); -} - -TEST_P(RlsTest, XdsRoutingClusterSpecifierPluginDisabled) { - CreateAndStartBackends(1); - // Populate new EDS resources. - EdsResourceArgs args({{"locality0", CreateEndpointsForBackends()}}); - balancer_->ads_service()->SetEdsResource(BuildEdsResource(args)); - // 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 XdsEnd2endTest { protected: void SetUp() override { @@ -11235,14 +10933,6 @@ INSTANTIATE_TEST_SUITE_P( XdsTestType().set_enable_rds_testing().set_use_v2()), &XdsTestType::Name); -// Rls tests depend on XdsResolver. -INSTANTIATE_TEST_SUITE_P( - XdsTest, RlsTest, - ::testing::Values(XdsTestType(), XdsTestType().set_enable_rds_testing(), - // Also test with xDS v2. - XdsTestType().set_enable_rds_testing().set_use_v2()), - &XdsTestType::Name); - // CDS depends on XdsResolver. INSTANTIATE_TEST_SUITE_P( XdsTest, CdsTest, diff --git a/test/cpp/end2end/xds/xds_rls_end2end_test.cc b/test/cpp/end2end/xds/xds_rls_end2end_test.cc new file mode 100644 index 00000000000..8b2919fa2ed --- /dev/null +++ b/test/cpp/end2end/xds/xds_rls_end2end_test.cc @@ -0,0 +1,361 @@ +// Copyright 2017 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 "absl/memory/memory.h" +#include "absl/strings/str_cat.h" + +#include "src/core/ext/filters/client_channel/backup_poller.h" +#include "src/core/lib/gpr/env.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 "test/cpp/end2end/rls_server.h" +#include "test/cpp/end2end/xds/xds_end2end_test_lib.h" + +namespace grpc { +namespace testing { +namespace { + +using ::grpc::lookup::v1::RouteLookupClusterSpecifier; +using ::grpc::lookup::v1::RouteLookupConfig; + +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"; + +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: + const char* Type() override { return "Rls"; } + + void RegisterAllServices(ServerBuilder* builder) override { + builder->RegisterService(rls_service_.get()); + } + + void StartAllServices() override { rls_service_->Start(); } + + void ShutdownAllServices() override { rls_service_->Shutdown(); } + + std::shared_ptr rls_service_; + }; + + RlsTest() { + rls_server_ = absl::make_unique(this); + rls_server_->Start(); + } + + void TearDown() override { + rls_server_->Shutdown(); + XdsEnd2endTest::TearDown(); + } + + std::unique_ptr rls_server_; +}; + +// Test both with and without RDS. +INSTANTIATE_TEST_SUITE_P( + XdsTest, RlsTest, + ::testing::Values(XdsTestType(), XdsTestType().set_enable_rds_testing(), + // Also test with xDS v2. + XdsTestType().set_enable_rds_testing().set_use_v2()), + &XdsTestType::Name); + +TEST_P(RlsTest, XdsRoutingClusterSpecifierPlugin) { + ScopedExperimentalEnvVar env_var("GRPC_EXPERIMENTAL_XDS_RLS_LB"); + CreateAndStartBackends(2); + 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()); +} + +TEST_P(RlsTest, XdsRoutingClusterSpecifierPluginNacksUndefinedSpecifier) { + ScopedExperimentalEnvVar env_var("GRPC_EXPERIMENTAL_XDS_RLS_LB"); + 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(absl::StrCat( + "RouteAction cluster contains cluster specifier plugin " + "name not configured: ", + kRlsClusterSpecifierPluginInstanceName))); +} + +TEST_P(RlsTest, XdsRoutingClusterSpecifierPluginNacksDuplicateSpecifier) { + ScopedExperimentalEnvVar env_var("GRPC_EXPERIMENTAL_XDS_RLS_LB"); + // Prepare the RLSLookupConfig: 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* duplicate_plugin = new_route_config.add_cluster_specifier_plugins(); + duplicate_plugin->mutable_extension()->set_name( + kRlsClusterSpecifierPluginInstanceName); + duplicate_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(absl::StrCat( + "Duplicated definition of cluster_specifier_plugin ", + kRlsClusterSpecifierPluginInstanceName))); +} + +TEST_P(RlsTest, + XdsRoutingClusterSpecifierPluginNacksUnknownSpecifierProtoNotOptional) { + ScopedExperimentalEnvVar env_var("GRPC_EXPERIMENTAL_XDS_RLS_LB"); + // 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("Unknown ClusterSpecifierPlugin type " + "grpc.lookup.v1.RouteLookupConfig")); +} + +TEST_P(RlsTest, + XdsRoutingClusterSpecifierPluginIgnoreUnknownSpecifierProtoOptional) { + ScopedExperimentalEnvVar env_var("GRPC_EXPERIMENTAL_XDS_RLS_LB"); + CreateAndStartBackends(1); + EdsResourceArgs args({{"locality0", CreateEndpointsForBackends()}}); + balancer_->ads_service()->SetEdsResource(BuildEdsResource(args)); + // 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); + plugin->set_is_optional(true); + 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. + WaitForAllBackends(); +} + +TEST_P(RlsTest, XdsRoutingRlsClusterSpecifierPluginNacksRequiredMatch) { + ScopedExperimentalEnvVar env_var("GRPC_EXPERIMENTAL_XDS_RLS_LB"); + // 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")); +} + +TEST_P(RlsTest, XdsRoutingClusterSpecifierPluginDisabled) { + CreateAndStartBackends(1); + // Populate new EDS resources. + EdsResourceArgs args({{"locality0", CreateEndpointsForBackends()}}); + balancer_->ads_service()->SetEdsResource(BuildEdsResource(args)); + // 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); +} + +} // namespace +} // namespace testing +} // namespace grpc + +int main(int argc, char** argv) { + grpc::testing::TestEnvironment env(&argc, argv); + ::testing::InitGoogleTest(&argc, argv); + // Make the backup poller poll very frequently in order to pick up + // updates from all the subchannels's FDs. + GPR_GLOBAL_CONFIG_SET(grpc_client_channel_backup_poll_interval_ms, 1); +#if TARGET_OS_IPHONE + // Workaround Apple CFStream bug + gpr_setenv("grpc_cfstream", "0"); +#endif + grpc_init(); + const auto result = RUN_ALL_TESTS(); + grpc_shutdown(); + return result; +} diff --git a/tools/run_tests/generated/tests.json b/tools/run_tests/generated/tests.json index 5e53409a6cd..41396ac45fc 100644 --- a/tools/run_tests/generated/tests.json +++ b/tools/run_tests/generated/tests.json @@ -7707,6 +7707,28 @@ ], "uses_polling": true }, + { + "args": [], + "benchmark": false, + "ci_platforms": [ + "linux", + "mac", + "posix" + ], + "cpu_cost": 1.0, + "exclude_configs": [], + "exclude_iomgrs": [], + "flaky": false, + "gtest": true, + "language": "c++", + "name": "xds_rls_end2end_test", + "platforms": [ + "linux", + "mac", + "posix" + ], + "uses_polling": true + }, { "args": [], "boringssl": true,