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

            
34
const absl::string_view getZoneName(const envoy::config::core::v3::Node& node,
35
10705
                                    absl::string_view zone_name) {
36
10705
  if (zone_name.empty()) {
37
154
    return node.locality().zone();
38
154
  }
39
10551
  return zone_name;
40
10705
}
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
10705
      : node_(buildLocalNode(node, zone_name, cluster_name, node_name)), address_(address),
52
10705
        context_provider_(node_, node_context_params),
53
10705
        zone_stat_name_storage_(getZoneName(node_, zone_name), symbol_table),
54
10705
        zone_stat_name_(zone_stat_name_storage_.statName()),
55
10705
        dynamic_update_callback_handle_(context_provider_.addDynamicContextUpdateCallback(
56
10705
            [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
10705
            })) {}
62

            
63
3362
  Network::Address::InstanceConstSharedPtr address() const override { return address_; }
64
59
  const std::string& zoneName() const override { return node_.locality().zone(); }
65
12647
  const Stats::StatName& zoneStatName() const override { return zone_stat_name_; }
66
25204
  const std::string& clusterName() const override { return node_.cluster(); }
67
14259
  const std::string& nodeName() const override { return node_.id(); }
68
44244
  const envoy::config::core::v3::Node& node() const override { return node_; }
69
1743
  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