|
|
|
@ -371,6 +371,12 @@ XdsApi::XdsApi(XdsClient* client, TraceFlag* tracer, |
|
|
|
|
|
|
|
|
|
namespace { |
|
|
|
|
|
|
|
|
|
// Works for both std::string and absl::string_view.
|
|
|
|
|
template <typename T> |
|
|
|
|
inline upb_strview StdStringToUpbString(const T& str) { |
|
|
|
|
return upb_strview_make(str.data(), str.size()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void PopulateMetadataValue(upb_arena* arena, google_protobuf_Value* value_pb, |
|
|
|
|
const Json& value); |
|
|
|
|
|
|
|
|
@ -388,7 +394,7 @@ void PopulateMetadata(upb_arena* arena, google_protobuf_Struct* metadata_pb, |
|
|
|
|
google_protobuf_Value* value = google_protobuf_Value_new(arena); |
|
|
|
|
PopulateMetadataValue(arena, value, p.second); |
|
|
|
|
google_protobuf_Struct_fields_set( |
|
|
|
|
metadata_pb, upb_strview_makez(p.first.c_str()), value, arena); |
|
|
|
|
metadata_pb, StdStringToUpbString(p.first), value, arena); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -404,7 +410,7 @@ void PopulateMetadataValue(upb_arena* arena, google_protobuf_Value* value_pb, |
|
|
|
|
break; |
|
|
|
|
case Json::Type::STRING: |
|
|
|
|
google_protobuf_Value_set_string_value( |
|
|
|
|
value_pb, upb_strview_makez(value.string_value().c_str())); |
|
|
|
|
value_pb, StdStringToUpbString(value.string_value())); |
|
|
|
|
break; |
|
|
|
|
case Json::Type::JSON_TRUE: |
|
|
|
|
google_protobuf_Value_set_bool_value(value_pb, true); |
|
|
|
@ -468,11 +474,11 @@ void PopulateNode(upb_arena* arena, const XdsBootstrap* bootstrap, |
|
|
|
|
if (node != nullptr) { |
|
|
|
|
if (!node->id.empty()) { |
|
|
|
|
envoy_config_core_v3_Node_set_id(node_msg, |
|
|
|
|
upb_strview_makez(node->id.c_str())); |
|
|
|
|
StdStringToUpbString(node->id)); |
|
|
|
|
} |
|
|
|
|
if (!node->cluster.empty()) { |
|
|
|
|
envoy_config_core_v3_Node_set_cluster( |
|
|
|
|
node_msg, upb_strview_makez(node->cluster.c_str())); |
|
|
|
|
node_msg, StdStringToUpbString(node->cluster)); |
|
|
|
|
} |
|
|
|
|
if (!node->metadata.object_value().empty()) { |
|
|
|
|
google_protobuf_Struct* metadata = |
|
|
|
@ -483,8 +489,8 @@ void PopulateNode(upb_arena* arena, const XdsBootstrap* bootstrap, |
|
|
|
|
google_protobuf_Struct* metadata = |
|
|
|
|
envoy_config_core_v3_Node_mutable_metadata(node_msg, arena); |
|
|
|
|
google_protobuf_Value* value = google_protobuf_Value_new(arena); |
|
|
|
|
google_protobuf_Value_set_string_value( |
|
|
|
|
value, upb_strview_make(server_name.data(), server_name.size())); |
|
|
|
|
google_protobuf_Value_set_string_value(value, |
|
|
|
|
StdStringToUpbString(server_name)); |
|
|
|
|
google_protobuf_Struct_fields_set( |
|
|
|
|
metadata, upb_strview_makez("PROXYLESS_CLIENT_HOSTNAME"), value, |
|
|
|
|
arena); |
|
|
|
@ -495,15 +501,15 @@ void PopulateNode(upb_arena* arena, const XdsBootstrap* bootstrap, |
|
|
|
|
envoy_config_core_v3_Node_mutable_locality(node_msg, arena); |
|
|
|
|
if (!node->locality_region.empty()) { |
|
|
|
|
envoy_config_core_v3_Locality_set_region( |
|
|
|
|
locality, upb_strview_makez(node->locality_region.c_str())); |
|
|
|
|
locality, StdStringToUpbString(node->locality_region)); |
|
|
|
|
} |
|
|
|
|
if (!node->locality_zone.empty()) { |
|
|
|
|
envoy_config_core_v3_Locality_set_zone( |
|
|
|
|
locality, upb_strview_makez(node->locality_zone.c_str())); |
|
|
|
|
locality, StdStringToUpbString(node->locality_zone)); |
|
|
|
|
} |
|
|
|
|
if (!node->locality_subzone.empty()) { |
|
|
|
|
envoy_config_core_v3_Locality_set_sub_zone( |
|
|
|
|
locality, upb_strview_makez(node->locality_subzone.c_str())); |
|
|
|
|
locality, StdStringToUpbString(node->locality_subzone)); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -511,8 +517,7 @@ void PopulateNode(upb_arena* arena, const XdsBootstrap* bootstrap, |
|
|
|
|
PopulateBuildVersion(arena, node_msg, build_version); |
|
|
|
|
} |
|
|
|
|
envoy_config_core_v3_Node_set_user_agent_name( |
|
|
|
|
node_msg, |
|
|
|
|
upb_strview_make(user_agent_name.data(), user_agent_name.size())); |
|
|
|
|
node_msg, StdStringToUpbString(user_agent_name)); |
|
|
|
|
envoy_config_core_v3_Node_set_user_agent_version( |
|
|
|
|
node_msg, upb_strview_makez(grpc_version_string())); |
|
|
|
|
envoy_config_core_v3_Node_add_client_features( |
|
|
|
@ -739,16 +744,16 @@ grpc_slice XdsApi::CreateAdsRequest( |
|
|
|
|
absl::string_view real_type_url = |
|
|
|
|
TypeUrlExternalToInternal(use_v3_, type_url); |
|
|
|
|
envoy_service_discovery_v3_DiscoveryRequest_set_type_url( |
|
|
|
|
request, upb_strview_make(real_type_url.data(), real_type_url.size())); |
|
|
|
|
request, StdStringToUpbString(real_type_url)); |
|
|
|
|
// Set version_info.
|
|
|
|
|
if (!version.empty()) { |
|
|
|
|
envoy_service_discovery_v3_DiscoveryRequest_set_version_info( |
|
|
|
|
request, upb_strview_make(version.data(), version.size())); |
|
|
|
|
request, StdStringToUpbString(version)); |
|
|
|
|
} |
|
|
|
|
// Set nonce.
|
|
|
|
|
if (!nonce.empty()) { |
|
|
|
|
envoy_service_discovery_v3_DiscoveryRequest_set_response_nonce( |
|
|
|
|
request, upb_strview_make(nonce.data(), nonce.size())); |
|
|
|
|
request, StdStringToUpbString(nonce)); |
|
|
|
|
} |
|
|
|
|
// Set error_detail if it's a NACK.
|
|
|
|
|
if (error != GRPC_ERROR_NONE) { |
|
|
|
@ -776,8 +781,7 @@ grpc_slice XdsApi::CreateAdsRequest( |
|
|
|
|
// Add resource_names.
|
|
|
|
|
for (const auto& resource_name : resource_names) { |
|
|
|
|
envoy_service_discovery_v3_DiscoveryRequest_add_resource_names( |
|
|
|
|
request, upb_strview_make(resource_name.data(), resource_name.size()), |
|
|
|
|
arena.ptr()); |
|
|
|
|
request, StdStringToUpbString(resource_name), arena.ptr()); |
|
|
|
|
} |
|
|
|
|
MaybeLogDiscoveryRequest(client_, tracer_, request, build_version_); |
|
|
|
|
return SerializeDiscoveryRequest(arena.ptr(), request); |
|
|
|
@ -1214,19 +1218,19 @@ grpc_error* RoutePathMatchParse(const envoy_config_route_v3_RouteMatch* match, |
|
|
|
|
XdsApi::RdsUpdate::RdsRoute* rds_route, |
|
|
|
|
bool* ignore_route) { |
|
|
|
|
if (envoy_config_route_v3_RouteMatch_has_prefix(match)) { |
|
|
|
|
upb_strview prefix = envoy_config_route_v3_RouteMatch_prefix(match); |
|
|
|
|
absl::string_view prefix = |
|
|
|
|
UpbStringToAbsl(envoy_config_route_v3_RouteMatch_prefix(match)); |
|
|
|
|
// Empty prefix "" is accepted.
|
|
|
|
|
if (prefix.size > 0) { |
|
|
|
|
if (prefix.size() > 0) { |
|
|
|
|
// Prefix "/" is accepted.
|
|
|
|
|
if (prefix.data[0] != '/') { |
|
|
|
|
if (prefix[0] != '/') { |
|
|
|
|
// Prefix which does not start with a / will never match anything, so
|
|
|
|
|
// ignore this route.
|
|
|
|
|
*ignore_route = true; |
|
|
|
|
return GRPC_ERROR_NONE; |
|
|
|
|
} |
|
|
|
|
std::vector<absl::string_view> prefix_elements = |
|
|
|
|
absl::StrSplit(absl::string_view(prefix.data, prefix.size).substr(1), |
|
|
|
|
absl::MaxSplits('/', 2)); |
|
|
|
|
absl::StrSplit(prefix.substr(1), absl::MaxSplits('/', 2)); |
|
|
|
|
if (prefix_elements.size() > 2) { |
|
|
|
|
// Prefix cannot have more than 2 slashes.
|
|
|
|
|
*ignore_route = true; |
|
|
|
@ -1239,24 +1243,23 @@ grpc_error* RoutePathMatchParse(const envoy_config_route_v3_RouteMatch* match, |
|
|
|
|
} |
|
|
|
|
rds_route->matchers.path_matcher.type = XdsApi::RdsUpdate::RdsRoute:: |
|
|
|
|
Matchers::PathMatcher::PathMatcherType::PREFIX; |
|
|
|
|
rds_route->matchers.path_matcher.string_matcher = |
|
|
|
|
UpbStringToStdString(prefix); |
|
|
|
|
rds_route->matchers.path_matcher.string_matcher = std::string(prefix); |
|
|
|
|
} else if (envoy_config_route_v3_RouteMatch_has_path(match)) { |
|
|
|
|
upb_strview path = envoy_config_route_v3_RouteMatch_path(match); |
|
|
|
|
if (path.size == 0) { |
|
|
|
|
absl::string_view path = |
|
|
|
|
UpbStringToAbsl(envoy_config_route_v3_RouteMatch_path(match)); |
|
|
|
|
if (path.size() == 0) { |
|
|
|
|
// Path that is empty will never match anything, so ignore this route.
|
|
|
|
|
*ignore_route = true; |
|
|
|
|
return GRPC_ERROR_NONE; |
|
|
|
|
} |
|
|
|
|
if (path.data[0] != '/') { |
|
|
|
|
if (path[0] != '/') { |
|
|
|
|
// Path which does not start with a / will never match anything, so
|
|
|
|
|
// ignore this route.
|
|
|
|
|
*ignore_route = true; |
|
|
|
|
return GRPC_ERROR_NONE; |
|
|
|
|
} |
|
|
|
|
std::vector<absl::string_view> path_elements = |
|
|
|
|
absl::StrSplit(absl::string_view(path.data, path.size).substr(1), |
|
|
|
|
absl::MaxSplits('/', 2)); |
|
|
|
|
absl::StrSplit(path.substr(1), absl::MaxSplits('/', 2)); |
|
|
|
|
if (path_elements.size() != 2) { |
|
|
|
|
// Path not in the required format of /service/method will never match
|
|
|
|
|
// anything, so ignore this route.
|
|
|
|
@ -1275,15 +1278,14 @@ grpc_error* RoutePathMatchParse(const envoy_config_route_v3_RouteMatch* match, |
|
|
|
|
} |
|
|
|
|
rds_route->matchers.path_matcher.type = XdsApi::RdsUpdate::RdsRoute:: |
|
|
|
|
Matchers::PathMatcher::PathMatcherType::PATH; |
|
|
|
|
rds_route->matchers.path_matcher.string_matcher = |
|
|
|
|
UpbStringToStdString(path); |
|
|
|
|
rds_route->matchers.path_matcher.string_matcher = std::string(path); |
|
|
|
|
} else if (envoy_config_route_v3_RouteMatch_has_safe_regex(match)) { |
|
|
|
|
const envoy_type_matcher_v3_RegexMatcher* regex_matcher = |
|
|
|
|
envoy_config_route_v3_RouteMatch_safe_regex(match); |
|
|
|
|
GPR_ASSERT(regex_matcher != nullptr); |
|
|
|
|
const std::string matcher = UpbStringToStdString( |
|
|
|
|
std::string matcher = UpbStringToStdString( |
|
|
|
|
envoy_type_matcher_v3_RegexMatcher_regex(regex_matcher)); |
|
|
|
|
std::unique_ptr<RE2> regex = absl::make_unique<RE2>(matcher); |
|
|
|
|
std::unique_ptr<RE2> regex = absl::make_unique<RE2>(std::move(matcher)); |
|
|
|
|
if (!regex->ok()) { |
|
|
|
|
return GRPC_ERROR_CREATE_FROM_STATIC_STRING( |
|
|
|
|
"Invalid regex string specified in path matcher."); |
|
|
|
@ -1413,13 +1415,12 @@ grpc_error* RouteActionParse(const envoy_config_route_v3_Route* route, |
|
|
|
|
envoy_config_route_v3_Route_route(route); |
|
|
|
|
// Get the cluster or weighted_clusters in the RouteAction.
|
|
|
|
|
if (envoy_config_route_v3_RouteAction_has_cluster(route_action)) { |
|
|
|
|
const upb_strview cluster_name = |
|
|
|
|
envoy_config_route_v3_RouteAction_cluster(route_action); |
|
|
|
|
if (cluster_name.size == 0) { |
|
|
|
|
rds_route->cluster_name = UpbStringToStdString( |
|
|
|
|
envoy_config_route_v3_RouteAction_cluster(route_action)); |
|
|
|
|
if (rds_route->cluster_name.size() == 0) { |
|
|
|
|
return GRPC_ERROR_CREATE_FROM_STATIC_STRING( |
|
|
|
|
"RouteAction cluster contains empty cluster name."); |
|
|
|
|
} |
|
|
|
|
rds_route->cluster_name = UpbStringToStdString(cluster_name); |
|
|
|
|
} else if (envoy_config_route_v3_RouteAction_has_weighted_clusters( |
|
|
|
|
route_action)) { |
|
|
|
|
const envoy_config_route_v3_WeightedCluster* weighted_cluster = |
|
|
|
@ -1587,8 +1588,9 @@ grpc_error* LdsResponseParse( |
|
|
|
|
envoy_service_discovery_v3_DiscoveryResponse_resources(response, &size); |
|
|
|
|
for (size_t i = 0; i < size; ++i) { |
|
|
|
|
// Check the type_url of the resource.
|
|
|
|
|
const upb_strview type_url = google_protobuf_Any_type_url(resources[i]); |
|
|
|
|
if (!IsLds(UpbStringToAbsl(type_url))) { |
|
|
|
|
absl::string_view type_url = |
|
|
|
|
UpbStringToAbsl(google_protobuf_Any_type_url(resources[i])); |
|
|
|
|
if (!IsLds(type_url)) { |
|
|
|
|
return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Resource is not LDS."); |
|
|
|
|
} |
|
|
|
|
// Decode the listener.
|
|
|
|
@ -1601,10 +1603,9 @@ grpc_error* LdsResponseParse( |
|
|
|
|
return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Can't decode listener."); |
|
|
|
|
} |
|
|
|
|
// Check listener name. Ignore unexpected listeners.
|
|
|
|
|
const upb_strview name = envoy_config_listener_v3_Listener_name(listener); |
|
|
|
|
const upb_strview expected_name = |
|
|
|
|
upb_strview_makez(expected_server_name.c_str()); |
|
|
|
|
if (!upb_strview_eql(name, expected_name)) continue; |
|
|
|
|
absl::string_view name = |
|
|
|
|
UpbStringToAbsl(envoy_config_listener_v3_Listener_name(listener)); |
|
|
|
|
if (name != expected_server_name) continue; |
|
|
|
|
// Get api_listener and decode it to http_connection_manager.
|
|
|
|
|
const envoy_config_listener_v3_ApiListener* api_listener = |
|
|
|
|
envoy_config_listener_v3_Listener_api_listener(listener); |
|
|
|
@ -1679,8 +1680,9 @@ grpc_error* RdsResponseParse( |
|
|
|
|
envoy_service_discovery_v3_DiscoveryResponse_resources(response, &size); |
|
|
|
|
for (size_t i = 0; i < size; ++i) { |
|
|
|
|
// Check the type_url of the resource.
|
|
|
|
|
const upb_strview type_url = google_protobuf_Any_type_url(resources[i]); |
|
|
|
|
if (!IsRds(UpbStringToAbsl(type_url))) { |
|
|
|
|
absl::string_view type_url = |
|
|
|
|
UpbStringToAbsl(google_protobuf_Any_type_url(resources[i])); |
|
|
|
|
if (!IsRds(type_url)) { |
|
|
|
|
return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Resource is not RDS."); |
|
|
|
|
} |
|
|
|
|
// Decode the route_config.
|
|
|
|
@ -1693,11 +1695,9 @@ grpc_error* RdsResponseParse( |
|
|
|
|
return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Can't decode route_config."); |
|
|
|
|
} |
|
|
|
|
// Check route_config_name. Ignore unexpected route_config.
|
|
|
|
|
const upb_strview route_config_name = |
|
|
|
|
envoy_config_route_v3_RouteConfiguration_name(route_config); |
|
|
|
|
absl::string_view route_config_name_strview(route_config_name.data, |
|
|
|
|
route_config_name.size); |
|
|
|
|
if (expected_route_configuration_names.find(route_config_name_strview) == |
|
|
|
|
absl::string_view route_config_name = UpbStringToAbsl( |
|
|
|
|
envoy_config_route_v3_RouteConfiguration_name(route_config)); |
|
|
|
|
if (expected_route_configuration_names.find(route_config_name) == |
|
|
|
|
expected_route_configuration_names.end()) { |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
@ -1725,8 +1725,9 @@ grpc_error* CdsResponseParse( |
|
|
|
|
for (size_t i = 0; i < size; ++i) { |
|
|
|
|
XdsApi::CdsUpdate cds_update; |
|
|
|
|
// Check the type_url of the resource.
|
|
|
|
|
const upb_strview type_url = google_protobuf_Any_type_url(resources[i]); |
|
|
|
|
if (!IsCds(UpbStringToAbsl(type_url))) { |
|
|
|
|
absl::string_view type_url = |
|
|
|
|
UpbStringToAbsl(google_protobuf_Any_type_url(resources[i])); |
|
|
|
|
if (!IsCds(type_url)) { |
|
|
|
|
return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Resource is not CDS."); |
|
|
|
|
} |
|
|
|
|
// Decode the cluster.
|
|
|
|
@ -1739,10 +1740,9 @@ grpc_error* CdsResponseParse( |
|
|
|
|
} |
|
|
|
|
MaybeLogCluster(client, tracer, cluster); |
|
|
|
|
// Ignore unexpected cluster names.
|
|
|
|
|
upb_strview cluster_name = envoy_config_cluster_v3_Cluster_name(cluster); |
|
|
|
|
absl::string_view cluster_name_strview(cluster_name.data, |
|
|
|
|
cluster_name.size); |
|
|
|
|
if (expected_cluster_names.find(cluster_name_strview) == |
|
|
|
|
std::string cluster_name = |
|
|
|
|
UpbStringToStdString(envoy_config_cluster_v3_Cluster_name(cluster)); |
|
|
|
|
if (expected_cluster_names.find(cluster_name) == |
|
|
|
|
expected_cluster_names.end()) { |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
@ -1787,8 +1787,7 @@ grpc_error* CdsResponseParse( |
|
|
|
|
} |
|
|
|
|
cds_update.lrs_load_reporting_server_name.emplace(""); |
|
|
|
|
} |
|
|
|
|
cds_update_map->emplace(UpbStringToStdString(cluster_name), |
|
|
|
|
std::move(cds_update)); |
|
|
|
|
cds_update_map->emplace(std::move(cluster_name), std::move(cds_update)); |
|
|
|
|
} |
|
|
|
|
return GRPC_ERROR_NONE; |
|
|
|
|
} |
|
|
|
@ -1810,19 +1809,15 @@ grpc_error* ServerAddressParseAndAppend( |
|
|
|
|
envoy_config_endpoint_v3_Endpoint_address(endpoint); |
|
|
|
|
const envoy_config_core_v3_SocketAddress* socket_address = |
|
|
|
|
envoy_config_core_v3_Address_socket_address(address); |
|
|
|
|
upb_strview address_strview = |
|
|
|
|
envoy_config_core_v3_SocketAddress_address(socket_address); |
|
|
|
|
std::string address_str = UpbStringToStdString( |
|
|
|
|
envoy_config_core_v3_SocketAddress_address(socket_address)); |
|
|
|
|
uint32_t port = envoy_config_core_v3_SocketAddress_port_value(socket_address); |
|
|
|
|
if (GPR_UNLIKELY(port >> 16) != 0) { |
|
|
|
|
return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Invalid port."); |
|
|
|
|
} |
|
|
|
|
// Populate grpc_resolved_address.
|
|
|
|
|
grpc_resolved_address addr; |
|
|
|
|
char* address_str = static_cast<char*>(gpr_malloc(address_strview.size + 1)); |
|
|
|
|
memcpy(address_str, address_strview.data, address_strview.size); |
|
|
|
|
address_str[address_strview.size] = '\0'; |
|
|
|
|
grpc_string_to_sockaddr(&addr, address_str, port); |
|
|
|
|
gpr_free(address_str); |
|
|
|
|
grpc_string_to_sockaddr(&addr, address_str.c_str(), port); |
|
|
|
|
// Append the address to the list.
|
|
|
|
|
list->emplace_back(addr, nullptr); |
|
|
|
|
return GRPC_ERROR_NONE; |
|
|
|
@ -1845,12 +1840,14 @@ grpc_error* LocalityParse( |
|
|
|
|
const envoy_config_core_v3_Locality* locality = |
|
|
|
|
envoy_config_endpoint_v3_LocalityLbEndpoints_locality( |
|
|
|
|
locality_lb_endpoints); |
|
|
|
|
upb_strview region = envoy_config_core_v3_Locality_region(locality); |
|
|
|
|
upb_strview zone = envoy_config_core_v3_Locality_region(locality); |
|
|
|
|
upb_strview sub_zone = envoy_config_core_v3_Locality_sub_zone(locality); |
|
|
|
|
std::string region = |
|
|
|
|
UpbStringToStdString(envoy_config_core_v3_Locality_region(locality)); |
|
|
|
|
std::string zone = |
|
|
|
|
UpbStringToStdString(envoy_config_core_v3_Locality_region(locality)); |
|
|
|
|
std::string sub_zone = |
|
|
|
|
UpbStringToStdString(envoy_config_core_v3_Locality_sub_zone(locality)); |
|
|
|
|
output_locality->name = MakeRefCounted<XdsLocalityName>( |
|
|
|
|
UpbStringToStdString(region), UpbStringToStdString(zone), |
|
|
|
|
UpbStringToStdString(sub_zone)); |
|
|
|
|
std::move(region), std::move(zone), std::move(sub_zone)); |
|
|
|
|
// Parse the addresses.
|
|
|
|
|
size_t size; |
|
|
|
|
const envoy_config_endpoint_v3_LbEndpoint* const* lb_endpoints = |
|
|
|
@ -1873,10 +1870,10 @@ grpc_error* DropParseAndAppend( |
|
|
|
|
drop_overload, |
|
|
|
|
XdsApi::DropConfig* drop_config) { |
|
|
|
|
// Get the category.
|
|
|
|
|
upb_strview category = |
|
|
|
|
std::string category = UpbStringToStdString( |
|
|
|
|
envoy_config_endpoint_v3_ClusterLoadAssignment_Policy_DropOverload_category( |
|
|
|
|
drop_overload); |
|
|
|
|
if (category.size == 0) { |
|
|
|
|
drop_overload)); |
|
|
|
|
if (category.size() == 0) { |
|
|
|
|
return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Empty drop category name"); |
|
|
|
|
} |
|
|
|
|
// Get the drop rate (per million).
|
|
|
|
@ -1903,7 +1900,7 @@ grpc_error* DropParseAndAppend( |
|
|
|
|
} |
|
|
|
|
// Cap numerator to 1000000.
|
|
|
|
|
numerator = GPR_MIN(numerator, 1000000); |
|
|
|
|
drop_config->AddCategory(UpbStringToStdString(category), numerator); |
|
|
|
|
drop_config->AddCategory(std::move(category), numerator); |
|
|
|
|
return GRPC_ERROR_NONE; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -1919,8 +1916,9 @@ grpc_error* EdsResponseParse( |
|
|
|
|
for (size_t i = 0; i < size; ++i) { |
|
|
|
|
XdsApi::EdsUpdate eds_update; |
|
|
|
|
// Check the type_url of the resource.
|
|
|
|
|
upb_strview type_url = google_protobuf_Any_type_url(resources[i]); |
|
|
|
|
if (!IsEds(UpbStringToAbsl(type_url))) { |
|
|
|
|
absl::string_view type_url = |
|
|
|
|
UpbStringToAbsl(google_protobuf_Any_type_url(resources[i])); |
|
|
|
|
if (!IsEds(type_url)) { |
|
|
|
|
return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Resource is not EDS."); |
|
|
|
|
} |
|
|
|
|
// Get the cluster_load_assignment.
|
|
|
|
@ -1937,12 +1935,10 @@ grpc_error* EdsResponseParse( |
|
|
|
|
MaybeLogClusterLoadAssignment(client, tracer, cluster_load_assignment); |
|
|
|
|
// Check the cluster name (which actually means eds_service_name). Ignore
|
|
|
|
|
// unexpected names.
|
|
|
|
|
upb_strview cluster_name = |
|
|
|
|
std::string eds_service_name = UpbStringToStdString( |
|
|
|
|
envoy_config_endpoint_v3_ClusterLoadAssignment_cluster_name( |
|
|
|
|
cluster_load_assignment); |
|
|
|
|
absl::string_view cluster_name_strview(cluster_name.data, |
|
|
|
|
cluster_name.size); |
|
|
|
|
if (expected_eds_service_names.find(cluster_name_strview) == |
|
|
|
|
cluster_load_assignment)); |
|
|
|
|
if (expected_eds_service_names.find(eds_service_name) == |
|
|
|
|
expected_eds_service_names.end()) { |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
@ -1984,8 +1980,7 @@ grpc_error* EdsResponseParse( |
|
|
|
|
if (error != GRPC_ERROR_NONE) return error; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
eds_update_map->emplace(UpbStringToStdString(cluster_name), |
|
|
|
|
std::move(eds_update)); |
|
|
|
|
eds_update_map->emplace(std::move(eds_service_name), std::move(eds_update)); |
|
|
|
|
} |
|
|
|
|
return GRPC_ERROR_NONE; |
|
|
|
|
} |
|
|
|
@ -2025,16 +2020,12 @@ XdsApi::AdsParseResult XdsApi::ParseAdsResponse( |
|
|
|
|
} |
|
|
|
|
MaybeLogDiscoveryResponse(client_, tracer_, response); |
|
|
|
|
// Record the type_url, the version_info, and the nonce of the response.
|
|
|
|
|
upb_strview type_url_strview = |
|
|
|
|
envoy_service_discovery_v3_DiscoveryResponse_type_url(response); |
|
|
|
|
result.type_url = |
|
|
|
|
TypeUrlInternalToExternal(UpbStringToAbsl(type_url_strview)); |
|
|
|
|
upb_strview version_info = |
|
|
|
|
envoy_service_discovery_v3_DiscoveryResponse_version_info(response); |
|
|
|
|
result.version = UpbStringToStdString(version_info); |
|
|
|
|
upb_strview nonce_strview = |
|
|
|
|
envoy_service_discovery_v3_DiscoveryResponse_nonce(response); |
|
|
|
|
result.nonce = UpbStringToStdString(nonce_strview); |
|
|
|
|
result.type_url = TypeUrlInternalToExternal(UpbStringToAbsl( |
|
|
|
|
envoy_service_discovery_v3_DiscoveryResponse_type_url(response))); |
|
|
|
|
result.version = UpbStringToStdString( |
|
|
|
|
envoy_service_discovery_v3_DiscoveryResponse_version_info(response)); |
|
|
|
|
result.nonce = UpbStringToStdString( |
|
|
|
|
envoy_service_discovery_v3_DiscoveryResponse_nonce(response)); |
|
|
|
|
// Parse the response according to the resource type.
|
|
|
|
|
if (IsLds(result.type_url)) { |
|
|
|
|
result.parse_error = |
|
|
|
@ -2217,15 +2208,15 @@ void LocalityStatsPopulate( |
|
|
|
|
arena); |
|
|
|
|
if (!locality_name.region().empty()) { |
|
|
|
|
envoy_config_core_v3_Locality_set_region( |
|
|
|
|
locality, upb_strview_makez(locality_name.region().c_str())); |
|
|
|
|
locality, StdStringToUpbString(locality_name.region())); |
|
|
|
|
} |
|
|
|
|
if (!locality_name.zone().empty()) { |
|
|
|
|
envoy_config_core_v3_Locality_set_zone( |
|
|
|
|
locality, upb_strview_makez(locality_name.zone().c_str())); |
|
|
|
|
locality, StdStringToUpbString(locality_name.zone())); |
|
|
|
|
} |
|
|
|
|
if (!locality_name.sub_zone().empty()) { |
|
|
|
|
envoy_config_core_v3_Locality_set_sub_zone( |
|
|
|
|
locality, upb_strview_makez(locality_name.sub_zone().c_str())); |
|
|
|
|
locality, StdStringToUpbString(locality_name.sub_zone())); |
|
|
|
|
} |
|
|
|
|
// Set total counts.
|
|
|
|
|
envoy_config_endpoint_v3_UpstreamLocalityStats_set_total_successful_requests( |
|
|
|
@ -2244,7 +2235,7 @@ void LocalityStatsPopulate( |
|
|
|
|
envoy_config_endpoint_v3_UpstreamLocalityStats_add_load_metric_stats( |
|
|
|
|
output, arena); |
|
|
|
|
envoy_config_endpoint_v3_EndpointLoadMetricStats_set_metric_name( |
|
|
|
|
load_metric, upb_strview_make(metric_name.data(), metric_name.size())); |
|
|
|
|
load_metric, StdStringToUpbString(metric_name)); |
|
|
|
|
envoy_config_endpoint_v3_EndpointLoadMetricStats_set_num_requests_finished_with_metric( |
|
|
|
|
load_metric, metric_value.num_requests_finished_with_metric); |
|
|
|
|
envoy_config_endpoint_v3_EndpointLoadMetricStats_set_total_metric_value( |
|
|
|
@ -2270,13 +2261,11 @@ grpc_slice XdsApi::CreateLrsRequest( |
|
|
|
|
request, arena.ptr()); |
|
|
|
|
// Set the cluster name.
|
|
|
|
|
envoy_config_endpoint_v3_ClusterStats_set_cluster_name( |
|
|
|
|
cluster_stats, |
|
|
|
|
upb_strview_make(cluster_name.data(), cluster_name.size())); |
|
|
|
|
cluster_stats, StdStringToUpbString(cluster_name)); |
|
|
|
|
// Set EDS service name, if non-empty.
|
|
|
|
|
if (!eds_service_name.empty()) { |
|
|
|
|
envoy_config_endpoint_v3_ClusterStats_set_cluster_service_name( |
|
|
|
|
cluster_stats, |
|
|
|
|
upb_strview_make(eds_service_name.data(), eds_service_name.size())); |
|
|
|
|
cluster_stats, StdStringToUpbString(eds_service_name)); |
|
|
|
|
} |
|
|
|
|
// Add locality stats.
|
|
|
|
|
for (const auto& p : load_report.locality_stats) { |
|
|
|
@ -2291,13 +2280,13 @@ grpc_slice XdsApi::CreateLrsRequest( |
|
|
|
|
// Add dropped requests.
|
|
|
|
|
uint64_t total_dropped_requests = 0; |
|
|
|
|
for (const auto& p : load_report.dropped_requests) { |
|
|
|
|
const char* category = p.first.c_str(); |
|
|
|
|
const std::string& category = p.first; |
|
|
|
|
const uint64_t count = p.second; |
|
|
|
|
envoy_config_endpoint_v3_ClusterStats_DroppedRequests* dropped_requests = |
|
|
|
|
envoy_config_endpoint_v3_ClusterStats_add_dropped_requests( |
|
|
|
|
cluster_stats, arena.ptr()); |
|
|
|
|
envoy_config_endpoint_v3_ClusterStats_DroppedRequests_set_category( |
|
|
|
|
dropped_requests, upb_strview_makez(category)); |
|
|
|
|
dropped_requests, StdStringToUpbString(category)); |
|
|
|
|
envoy_config_endpoint_v3_ClusterStats_DroppedRequests_set_dropped_count( |
|
|
|
|
dropped_requests, count); |
|
|
|
|
total_dropped_requests += count; |
|
|
|
@ -2343,7 +2332,7 @@ grpc_error* XdsApi::ParseLrsResponse(const grpc_slice& encoded_response, |
|
|
|
|
envoy_service_load_stats_v3_LoadStatsResponse_clusters(decoded_response, |
|
|
|
|
&size); |
|
|
|
|
for (size_t i = 0; i < size; ++i) { |
|
|
|
|
cluster_names->emplace(clusters[i].data, clusters[i].size); |
|
|
|
|
cluster_names->emplace(UpbStringToStdString(clusters[i])); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
// Get the load report interval.
|
|
|
|
|