diff --git a/src/core/ext/filters/client_channel/xds/xds_api.cc b/src/core/ext/filters/client_channel/xds/xds_api.cc index d41c25e2d26..076160c76d9 100644 --- a/src/core/ext/filters/client_channel/xds/xds_api.cc +++ b/src/core/ext/filters/client_channel/xds/xds_api.cc @@ -185,7 +185,8 @@ void PopulateMetadataValue(upb_arena* arena, google_protobuf_Value* value_pb, } void PopulateNode(upb_arena* arena, const XdsBootstrap::Node* node, - const char* build_version, envoy_api_v2_core_Node* node_msg) { + const char* build_version, const std::string& server_name, + envoy_api_v2_core_Node* node_msg) { if (node != nullptr) { if (!node->id.empty()) { envoy_api_v2_core_Node_set_id(node_msg, @@ -200,6 +201,18 @@ void PopulateNode(upb_arena* arena, const XdsBootstrap::Node* node, envoy_api_v2_core_Node_mutable_metadata(node_msg, arena); PopulateMetadata(arena, metadata, node->metadata.object_value()); } + if (!server_name.empty()) { + google_protobuf_Struct* metadata = + envoy_api_v2_core_Node_mutable_metadata(node_msg, arena); + google_protobuf_Struct_FieldsEntry* field = + google_protobuf_Struct_add_fields(metadata, arena); + google_protobuf_Struct_FieldsEntry_set_key( + field, upb_strview_makez("PROXYLESS_CLIENT_HOSTNAME")); + google_protobuf_Value* value = + google_protobuf_Struct_FieldsEntry_mutable_value(field, arena); + google_protobuf_Value_set_string_value( + value, upb_strview_make(server_name.data(), server_name.size())); + } if (!node->locality_region.empty() || !node->locality_zone.empty() || !node->locality_subzone.empty()) { envoy_api_v2_core_Locality* locality = @@ -260,7 +273,7 @@ envoy_api_v2_DiscoveryRequest* CreateDiscoveryRequest( if (build_version != nullptr) { 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, build_version, "", node_msg); } return request; } @@ -960,15 +973,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_, node_msg); - // Add cluster stats. There is only one because we only use one server name in - // one channel. - envoy_api_v2_endpoint_ClusterStats* cluster_stats = - envoy_service_load_stats_v2_LoadStatsRequest_add_cluster_stats( - request, arena.ptr()); - // Set the cluster name. - envoy_api_v2_endpoint_ClusterStats_set_cluster_name( - cluster_stats, upb_strview_makez(server_name.c_str())); + PopulateNode(arena.ptr(), node_, build_version_, server_name, node_msg); return SerializeLrsRequest(request, arena.ptr()); } diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index b3b0867fc1b..76a59661334 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -751,7 +751,12 @@ class LrsServiceImpl : public LrsService { IncreaseRequestCount(); // Send response. LoadStatsResponse response; - auto server_name = request.cluster_stats()[0].cluster_name(); + std::string server_name; + auto it = request.node().metadata().fields().find( + "PROXYLESS_CLIENT_HOSTNAME"); + if (it != request.node().metadata().fields().end()) { + server_name = it->second.string_value(); + } GPR_ASSERT(server_name != ""); response.add_clusters(server_name); response.mutable_load_reporting_interval()->set_seconds(