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
10721
                                                   absl::string_view node_name) {
20
10721
  envoy::config::core::v3::Node local_node;
21
10721
  local_node.MergeFrom(node);
22
10721
  if (!zone_name.empty()) {
23
10567
    local_node.mutable_locality()->set_zone(std::string(zone_name));
24
10567
  }
25
10721
  if (!cluster_name.empty()) {
26
10586
    local_node.set_cluster(std::string(cluster_name));
27
10586
  }
28
10721
  if (!node_name.empty()) {
29
10584
    local_node.set_id(std::string(node_name));
30
10584
  }
31
10721
  return local_node;
32
10721
}
33

            
34
const absl::string_view getZoneName(const envoy::config::core::v3::Node& node,
35
10721
                                    absl::string_view zone_name) {
36
10721
  if (zone_name.empty()) {
37
154
    return node.locality().zone();
38
154
  }
39
10567
  return zone_name;
40
10721
}
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
10721
      : node_(buildLocalNode(node, zone_name, cluster_name, node_name)), address_(address),
52
10721
        context_provider_(node_, node_context_params),
53
10721
        zone_stat_name_storage_(getZoneName(node_, zone_name), symbol_table),
54
10721
        zone_stat_name_(zone_stat_name_storage_.statName()),
55
10721
        dynamic_update_callback_handle_(context_provider_.addDynamicContextUpdateCallback(
56
10721
            [this](absl::string_view resource_type_url) {
57
17
              (*node_.mutable_dynamic_parameters())
58
17
                  [toStdStringView(resource_type_url)] // NOLINT(std::string_view)
59
17
                      .CopyFrom(context_provider_.dynamicContext(resource_type_url));
60
17
              return absl::OkStatus();
61
10721
            })) {}
62

            
63
3304
  Network::Address::InstanceConstSharedPtr address() const override { return address_; }
64
57
  const std::string& zoneName() const override { return node_.locality().zone(); }
65
12640
  const Stats::StatName& zoneStatName() const override { return zone_stat_name_; }
66
25273
  const std::string& clusterName() const override { return node_.cluster(); }
67
14221
  const std::string& nodeName() const override { return node_.id(); }
68
44065
  const envoy::config::core::v3::Node& node() const override { return node_; }
69
1698
  const Config::ContextProvider& contextProvider() const override { return context_provider_; }
70
17
  Config::ContextProvider& contextProvider() override { return context_provider_; }
71

            
72
private:
73
  envoy::config::core::v3::Node node_;
74
  const Network::Address::InstanceConstSharedPtr address_;
75
  Config::ContextProviderImpl context_provider_;
76
  const Stats::StatNameManagedStorage zone_stat_name_storage_;
77
  const Stats::StatName zone_stat_name_;
78
  Common::CallbackHandlePtr dynamic_update_callback_handle_;
79
};
80

            
81
} // namespace LocalInfo
82
} // namespace Envoy