|
|
|
@ -22,6 +22,8 @@ |
|
|
|
|
#include <cctype> |
|
|
|
|
#include <cstdlib> |
|
|
|
|
|
|
|
|
|
#include "absl/strings/str_cat.h" |
|
|
|
|
|
|
|
|
|
#include <grpc/impl/codegen/log.h> |
|
|
|
|
#include <grpc/support/alloc.h> |
|
|
|
|
#include <grpc/support/string_util.h> |
|
|
|
@ -123,6 +125,10 @@ const char* XdsApi::kCdsTypeUrl = "type.googleapis.com/envoy.api.v2.Cluster"; |
|
|
|
|
const char* XdsApi::kEdsTypeUrl = |
|
|
|
|
"type.googleapis.com/envoy.api.v2.ClusterLoadAssignment"; |
|
|
|
|
|
|
|
|
|
XdsApi::XdsApi(const XdsBootstrap::Node* node) |
|
|
|
|
: node_(node), |
|
|
|
|
user_agent_name_(absl::StrCat("gRPC C-core ", GPR_PLATFORM_STRING)) {} |
|
|
|
|
|
|
|
|
|
namespace { |
|
|
|
|
|
|
|
|
|
void PopulateMetadataValue(upb_arena* arena, google_protobuf_Value* value_pb, |
|
|
|
@ -185,7 +191,8 @@ void PopulateMetadataValue(upb_arena* arena, google_protobuf_Value* value_pb, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void PopulateNode(upb_arena* arena, const XdsBootstrap::Node* node, |
|
|
|
|
const char* build_version, const std::string& server_name, |
|
|
|
|
const std::string& user_agent_name, |
|
|
|
|
const std::string& server_name, |
|
|
|
|
envoy_api_v2_core_Node* node_msg) { |
|
|
|
|
if (node != nullptr) { |
|
|
|
|
if (!node->id.empty()) { |
|
|
|
@ -231,8 +238,15 @@ void PopulateNode(upb_arena* arena, const XdsBootstrap::Node* node, |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
envoy_api_v2_core_Node_set_build_version(node_msg, |
|
|
|
|
upb_strview_makez(build_version)); |
|
|
|
|
std::string build_version = |
|
|
|
|
absl::StrCat(user_agent_name, " ", grpc_version_string()); |
|
|
|
|
envoy_api_v2_core_Node_set_build_version( |
|
|
|
|
node_msg, upb_strview_make(build_version.data(), build_version.size())); |
|
|
|
|
envoy_api_v2_core_Node_set_user_agent_name( |
|
|
|
|
node_msg, |
|
|
|
|
upb_strview_make(user_agent_name.data(), user_agent_name.size())); |
|
|
|
|
envoy_api_v2_core_Node_set_user_agent_version( |
|
|
|
|
node_msg, upb_strview_makez(grpc_version_string())); |
|
|
|
|
envoy_api_v2_core_Node_add_client_features( |
|
|
|
|
node_msg, upb_strview_makez("envoy.lb.does_not_support_overprovisioning"), |
|
|
|
|
arena); |
|
|
|
@ -241,7 +255,7 @@ void PopulateNode(upb_arena* arena, const XdsBootstrap::Node* node, |
|
|
|
|
envoy_api_v2_DiscoveryRequest* CreateDiscoveryRequest( |
|
|
|
|
upb_arena* arena, const char* type_url, const std::string& version, |
|
|
|
|
const std::string& nonce, grpc_error* error, const XdsBootstrap::Node* node, |
|
|
|
|
const char* build_version) { |
|
|
|
|
const std::string& user_agent_name) { |
|
|
|
|
// Create a request.
|
|
|
|
|
envoy_api_v2_DiscoveryRequest* request = |
|
|
|
|
envoy_api_v2_DiscoveryRequest_new(arena); |
|
|
|
@ -273,10 +287,10 @@ envoy_api_v2_DiscoveryRequest* CreateDiscoveryRequest( |
|
|
|
|
GRPC_ERROR_UNREF(error); |
|
|
|
|
} |
|
|
|
|
// Populate node.
|
|
|
|
|
if (build_version != nullptr) { |
|
|
|
|
if (!user_agent_name.empty()) { |
|
|
|
|
envoy_api_v2_core_Node* node_msg = |
|
|
|
|
envoy_api_v2_DiscoveryRequest_mutable_node(request, arena); |
|
|
|
|
PopulateNode(arena, node, build_version, "", node_msg); |
|
|
|
|
PopulateNode(arena, node, user_agent_name, "", node_msg); |
|
|
|
|
} |
|
|
|
|
return request; |
|
|
|
|
} |
|
|
|
@ -297,7 +311,7 @@ grpc_slice XdsApi::CreateUnsupportedTypeNackRequest(const std::string& type_url, |
|
|
|
|
upb::Arena arena; |
|
|
|
|
envoy_api_v2_DiscoveryRequest* request = CreateDiscoveryRequest( |
|
|
|
|
arena.ptr(), type_url.c_str(), /*version=*/"", nonce, error, |
|
|
|
|
/*node=*/nullptr, /*build_version=*/nullptr); |
|
|
|
|
/*node=*/nullptr, /*user_agent_name=*/""); |
|
|
|
|
return SerializeDiscoveryRequest(arena.ptr(), request); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -309,7 +323,7 @@ grpc_slice XdsApi::CreateLdsRequest(const std::string& server_name, |
|
|
|
|
envoy_api_v2_DiscoveryRequest* request = |
|
|
|
|
CreateDiscoveryRequest(arena.ptr(), kLdsTypeUrl, version, nonce, error, |
|
|
|
|
populate_node ? node_ : nullptr, |
|
|
|
|
populate_node ? build_version_ : nullptr); |
|
|
|
|
populate_node ? user_agent_name_ : ""); |
|
|
|
|
// Add resource_name.
|
|
|
|
|
envoy_api_v2_DiscoveryRequest_add_resource_names( |
|
|
|
|
request, upb_strview_make(server_name.data(), server_name.size()), |
|
|
|
@ -325,7 +339,7 @@ grpc_slice XdsApi::CreateRdsRequest(const std::string& route_config_name, |
|
|
|
|
envoy_api_v2_DiscoveryRequest* request = |
|
|
|
|
CreateDiscoveryRequest(arena.ptr(), kRdsTypeUrl, version, nonce, error, |
|
|
|
|
populate_node ? node_ : nullptr, |
|
|
|
|
populate_node ? build_version_ : nullptr); |
|
|
|
|
populate_node ? user_agent_name_ : ""); |
|
|
|
|
// Add resource_name.
|
|
|
|
|
envoy_api_v2_DiscoveryRequest_add_resource_names( |
|
|
|
|
request, |
|
|
|
@ -342,7 +356,7 @@ grpc_slice XdsApi::CreateCdsRequest(const std::set<StringView>& cluster_names, |
|
|
|
|
envoy_api_v2_DiscoveryRequest* request = |
|
|
|
|
CreateDiscoveryRequest(arena.ptr(), kCdsTypeUrl, version, nonce, error, |
|
|
|
|
populate_node ? node_ : nullptr, |
|
|
|
|
populate_node ? build_version_ : nullptr); |
|
|
|
|
populate_node ? user_agent_name_ : ""); |
|
|
|
|
// Add resource_names.
|
|
|
|
|
for (const auto& cluster_name : cluster_names) { |
|
|
|
|
envoy_api_v2_DiscoveryRequest_add_resource_names( |
|
|
|
@ -359,7 +373,7 @@ grpc_slice XdsApi::CreateEdsRequest( |
|
|
|
|
envoy_api_v2_DiscoveryRequest* request = |
|
|
|
|
CreateDiscoveryRequest(arena.ptr(), kEdsTypeUrl, version, nonce, error, |
|
|
|
|
populate_node ? node_ : nullptr, |
|
|
|
|
populate_node ? build_version_ : nullptr); |
|
|
|
|
populate_node ? user_agent_name_ : ""); |
|
|
|
|
// Add resource_names.
|
|
|
|
|
for (const auto& eds_service_name : eds_service_names) { |
|
|
|
|
envoy_api_v2_DiscoveryRequest_add_resource_names( |
|
|
|
@ -976,7 +990,7 @@ grpc_slice XdsApi::CreateLrsInitialRequest(const std::string& server_name) { |
|
|
|
|
envoy_api_v2_core_Node* node_msg = |
|
|
|
|
envoy_service_load_stats_v2_LoadStatsRequest_mutable_node(request, |
|
|
|
|
arena.ptr()); |
|
|
|
|
PopulateNode(arena.ptr(), node_, build_version_, server_name, node_msg); |
|
|
|
|
PopulateNode(arena.ptr(), node_, user_agent_name_, server_name, node_msg); |
|
|
|
|
return SerializeLrsRequest(request, arena.ptr()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|