C++ xDS interop test server changes (#25633)

* C++ xDS interop test server changes
pull/25627/head
Yash Tibrewal 4 years ago committed by GitHub
parent d4ef8084f4
commit 8eb2e13a6e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 5
      CMakeLists.txt
  2. 5
      build_autogenerated.yaml
  3. 2
      test/cpp/interop/BUILD
  4. 7
      test/cpp/interop/xds_interop_client.cc
  5. 99
      test/cpp/interop/xds_interop_server.cc

@ -16155,6 +16155,10 @@ endif()
if(gRPC_BUILD_TESTS)
add_executable(xds_interop_server
${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/health/v1/health.pb.cc
${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/health/v1/health.grpc.pb.cc
${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/health/v1/health.pb.h
${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/health/v1/health.grpc.pb.h
${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/empty.pb.cc
${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/empty.grpc.pb.cc
${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/empty.pb.h
@ -16167,6 +16171,7 @@ add_executable(xds_interop_server
${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/test.grpc.pb.cc
${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/test.pb.h
${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/test.grpc.pb.h
test/cpp/end2end/test_health_check_service_impl.cc
test/cpp/interop/xds_interop_server.cc
third_party/googletest/googletest/src/gtest-all.cc
third_party/googletest/googlemock/src/gmock-all.cc

@ -8374,11 +8374,14 @@ targets:
build: test
run: false
language: c++
headers: []
headers:
- test/cpp/end2end/test_health_check_service_impl.h
src:
- src/proto/grpc/health/v1/health.proto
- src/proto/grpc/testing/empty.proto
- src/proto/grpc/testing/messages.proto
- src/proto/grpc/testing/test.proto
- test/cpp/end2end/test_health_check_service_impl.cc
- test/cpp/interop/xds_interop_server.cc
deps:
- grpc_test_util

@ -239,6 +239,7 @@ grpc_cc_binary(
grpc_cc_binary(
name = "xds_interop_server",
testonly = True,
srcs = [
"xds_interop_server.cc",
],
@ -251,6 +252,7 @@ grpc_cc_binary(
"//src/proto/grpc/testing:messages_proto",
"//src/proto/grpc/testing:test_proto",
"//test/core/util:grpc_test_util",
"//test/cpp/end2end:test_health_check_service_impl",
"//test/cpp/util:test_config",
],
)

@ -59,8 +59,9 @@ ABSL_FLAG(std::string, rpc, "UnaryCall",
ABSL_FLAG(std::string, metadata, "", "metadata to send with the RPC.");
ABSL_FLAG(std::string, expect_status, "OK",
"RPC status for the test RPC to be considered successful");
ABSL_FLAG(std::string, security, "none",
"If set to \"secure\", XdsCredentials are used");
ABSL_FLAG(
bool, secure_mode, false,
"If true, XdsCredentials are used, InsecureChannelCredentials otherwise");
using grpc::Channel;
using grpc::ClientAsyncResponseReader;
@ -464,7 +465,7 @@ void RunTestLoop(std::chrono::duration<double> duration_per_query,
RpcConfigurationsQueue* rpc_configs_queue) {
TestClient client(
grpc::CreateChannel(absl::GetFlag(FLAGS_server),
absl::GetFlag(FLAGS_security) == "secure"
absl::GetFlag(FLAGS_secure_mode)
? grpc::experimental::XdsCredentials(
grpc::InsecureChannelCredentials())
: grpc::InsecureChannelCredentials()),

@ -19,13 +19,17 @@
#include <grpc/grpc.h>
#include <grpc/support/log.h>
#include <grpc/support/time.h>
#include <grpcpp/health_check_service_interface.h>
#include <grpcpp/server.h>
#include <grpcpp/server_builder.h>
#include <grpcpp/server_context.h>
#include <grpcpp/xds_server_builder.h>
#include <sstream>
#include "absl/flags/flag.h"
#include "absl/strings/str_cat.h"
#include "absl/synchronization/mutex.h"
#include "src/core/lib/gpr/string.h"
#include "src/core/lib/iomgr/gethostname.h"
#include "src/core/lib/transport/byte_stream.h"
@ -33,24 +37,33 @@
#include "src/proto/grpc/testing/messages.pb.h"
#include "src/proto/grpc/testing/test.grpc.pb.h"
#include "test/core/util/test_config.h"
#include "test/cpp/end2end/test_health_check_service_impl.h"
#include "test/cpp/util/test_config.h"
ABSL_FLAG(int32_t, port, 50051, "Server port.");
ABSL_FLAG(int32_t, port, 8080, "Server port for service.");
ABSL_FLAG(int32_t, maintenance_port, 8081,
"Server port for maintenance if --security is \"secure\".");
ABSL_FLAG(std::string, server_id, "cpp_server",
"Server ID to include in responses.");
ABSL_FLAG(bool, secure_mode, false,
"If true, XdsServerCredentials are used, InsecureServerCredentials "
"otherwise");
using grpc::Server;
using grpc::ServerBuilder;
using grpc::ServerContext;
using grpc::Status;
using grpc::experimental::XdsServerBuilder;
using grpc::testing::Empty;
using grpc::testing::HealthCheckServiceImpl;
using grpc::testing::SimpleRequest;
using grpc::testing::SimpleResponse;
using grpc::testing::TestService;
using grpc::testing::XdsUpdateHealthService;
class TestServiceImpl : public TestService::Service {
public:
explicit TestServiceImpl(const std::string& i) : hostname_(i) {}
explicit TestServiceImpl(const std::string& hostname) : hostname_(hostname) {}
Status UnaryCall(ServerContext* context, const SimpleRequest* /*request*/,
SimpleResponse* response) override {
@ -70,17 +83,71 @@ class TestServiceImpl : public TestService::Service {
std::string hostname_;
};
void RunServer(const int port, const std::string& hostname) {
std::ostringstream server_address;
server_address << "0.0.0.0:" << port;
class XdsUpdateHealthServiceImpl : public XdsUpdateHealthService::Service {
public:
explicit XdsUpdateHealthServiceImpl(
HealthCheckServiceImpl* health_check_service)
: health_check_service_(health_check_service) {}
Status SetServing(ServerContext* /* context */, const Empty* /* request */,
Empty* /* response */) override {
health_check_service_->SetAll(
grpc::health::v1::HealthCheckResponse::SERVING);
return Status::OK;
}
Status SetNotServing(ServerContext* /* context */, const Empty* /* request */,
Empty* /* response */) override {
health_check_service_->SetAll(
grpc::health::v1::HealthCheckResponse::NOT_SERVING);
return Status::OK;
}
private:
HealthCheckServiceImpl* const health_check_service_;
};
void RunServer(bool secure_mode, const int port, const int maintenance_port,
const std::string& hostname) {
std::unique_ptr<Server> xds_enabled_server;
std::unique_ptr<Server> server;
TestServiceImpl service(hostname);
HealthCheckServiceImpl health_check_service;
health_check_service.SetStatus(
"", grpc::health::v1::HealthCheckResponse::SERVING);
health_check_service.SetStatus(
"grpc.testing.TestService",
grpc::health::v1::HealthCheckResponse::SERVING);
health_check_service.SetStatus(
"grpc.testing.XdsUpdateHealthService",
grpc::health::v1::HealthCheckResponse::SERVING);
XdsUpdateHealthServiceImpl update_health_service(&health_check_service);
ServerBuilder builder;
builder.RegisterService(&service);
builder.AddListeningPort(server_address.str(),
grpc::InsecureServerCredentials());
std::unique_ptr<Server> server(builder.BuildAndStart());
gpr_log(GPR_INFO, "Server listening on %s", server_address.str().c_str());
if (secure_mode) {
XdsServerBuilder xds_builder;
xds_builder.RegisterService(&service);
xds_builder.AddListeningPort(absl::StrCat("0.0.0.0:", port),
grpc::experimental::XdsServerCredentials(
grpc::InsecureServerCredentials()));
xds_enabled_server = xds_builder.BuildAndStart();
gpr_log(GPR_INFO, "Server starting on 0.0.0.0:%d", port);
builder.RegisterService(&health_check_service);
builder.RegisterService(&update_health_service);
builder.AddListeningPort(absl::StrCat("0.0.0.0:", maintenance_port),
grpc::InsecureServerCredentials());
server = builder.BuildAndStart();
gpr_log(GPR_INFO, "Maintenance server listening on 0.0.0.0:%d",
maintenance_port);
} else {
builder.RegisterService(&service);
builder.RegisterService(&health_check_service);
builder.RegisterService(&update_health_service);
builder.AddListeningPort(absl::StrCat("0.0.0.0:", port),
grpc::InsecureServerCredentials());
server = builder.BuildAndStart();
gpr_log(GPR_INFO, "Server listening on 0.0.0.0:%d", port);
}
server->Wait();
}
@ -94,12 +161,18 @@ int main(int argc, char** argv) {
std::cout << "Failed to get hostname, terminating" << std::endl;
return 1;
}
if (absl::GetFlag(FLAGS_port) == 0) {
int port = absl::GetFlag(FLAGS_port);
if (port == 0) {
std::cout << "Invalid port, terminating" << std::endl;
return 1;
}
RunServer(absl::GetFlag(FLAGS_port), hostname);
int maintenance_port = absl::GetFlag(FLAGS_maintenance_port);
if (maintenance_port == 0) {
std::cout << "Invalid maintenance port, terminating" << std::endl;
return 1;
}
grpc::EnableDefaultHealthCheckService(false);
RunServer(absl::GetFlag(FLAGS_secure_mode), port, maintenance_port, hostname);
return 0;
}

Loading…
Cancel
Save