Line data Source code
1 : #pragma once 2 : 3 : #include <string> 4 : 5 : #include "envoy/config/core/v3/base.pb.h" 6 : #include "envoy/local_info/local_info.h" 7 : 8 : #include "source/common/config/context_provider_impl.h" 9 : #include "source/common/stats/symbol_table.h" 10 : 11 : namespace Envoy { 12 : namespace LocalInfo { 13 : 14 : namespace { 15 : 16 : const envoy::config::core::v3::Node buildLocalNode(const envoy::config::core::v3::Node& node, 17 : absl::string_view zone_name, 18 : absl::string_view cluster_name, 19 248 : absl::string_view node_name) { 20 248 : envoy::config::core::v3::Node local_node; 21 248 : local_node.MergeFrom(node); 22 248 : if (!zone_name.empty()) { 23 98 : local_node.mutable_locality()->set_zone(std::string(zone_name)); 24 98 : } 25 248 : if (!cluster_name.empty()) { 26 98 : local_node.set_cluster(std::string(cluster_name)); 27 98 : } 28 248 : if (!node_name.empty()) { 29 98 : local_node.set_id(std::string(node_name)); 30 98 : } 31 248 : return local_node; 32 248 : } 33 : 34 : const absl::string_view getZoneName(const envoy::config::core::v3::Node& node, 35 248 : absl::string_view zone_name) { 36 248 : if (zone_name.empty()) { 37 150 : return node.locality().zone(); 38 150 : } 39 98 : return zone_name; 40 248 : } 41 : 42 : } // namespace 43 : 44 : class LocalInfoImpl : public LocalInfo { 45 : public: 46 : LocalInfoImpl(Stats::SymbolTable& symbol_table, const envoy::config::core::v3::Node& node, 47 : const Protobuf::RepeatedPtrField<std::string>& node_context_params, 48 : const Network::Address::InstanceConstSharedPtr& address, 49 : absl::string_view zone_name, absl::string_view cluster_name, 50 : absl::string_view node_name) 51 : : node_(buildLocalNode(node, zone_name, cluster_name, node_name)), address_(address), 52 : context_provider_(node_, node_context_params), 53 : zone_stat_name_storage_(getZoneName(node_, zone_name), symbol_table), 54 : zone_stat_name_(zone_stat_name_storage_.statName()), 55 : dynamic_update_callback_handle_(context_provider_.addDynamicContextUpdateCallback( 56 0 : [this](absl::string_view resource_type_url) { 57 0 : (*node_.mutable_dynamic_parameters()) 58 0 : [toStdStringView(resource_type_url)] // NOLINT(std::string_view) 59 0 : .CopyFrom(context_provider_.dynamicContext(resource_type_url)); 60 248 : })) {} 61 : 62 166 : Network::Address::InstanceConstSharedPtr address() const override { return address_; } 63 0 : const std::string& zoneName() const override { return node_.locality().zone(); } 64 169 : const Stats::StatName& zoneStatName() const override { return zone_stat_name_; } 65 361 : const std::string& clusterName() const override { return node_.cluster(); } 66 230 : const std::string& nodeName() const override { return node_.id(); } 67 1146 : const envoy::config::core::v3::Node& node() const override { return node_; } 68 29 : const Config::ContextProvider& contextProvider() const override { return context_provider_; } 69 0 : Config::ContextProvider& contextProvider() override { return context_provider_; } 70 : 71 : private: 72 : envoy::config::core::v3::Node node_; 73 : const Network::Address::InstanceConstSharedPtr address_; 74 : Config::ContextProviderImpl context_provider_; 75 : const Stats::StatNameManagedStorage zone_stat_name_storage_; 76 : const Stats::StatName zone_stat_name_; 77 : Common::CallbackHandlePtr dynamic_update_callback_handle_; 78 : }; 79 : 80 : } // namespace LocalInfo 81 : } // namespace Envoy