1
#pragma once
2

            
3
#include "envoy/config/context_provider.h"
4

            
5
#include "source/common/common/callback_impl.h"
6
#include "source/common/common/stl_helpers.h"
7
#include "source/common/common/thread.h"
8
#include "source/common/config/xds_context_params.h"
9

            
10
namespace Envoy {
11
namespace Config {
12

            
13
class ContextProviderImpl : public ContextProvider {
14
public:
15
  ContextProviderImpl(const envoy::config::core::v3::Node& node,
16
                      const Protobuf::RepeatedPtrField<std::string>& node_context_params)
17
10723
      : node_context_(XdsContextParams::encodeNodeContext(node, node_context_params)) {}
18

            
19
  // Config::ContextProvider
20
70
  const xds::core::v3::ContextParams& nodeContext() const override { return node_context_; }
21
  const xds::core::v3::ContextParams&
22
23
  dynamicContext(absl::string_view resource_type_url) const override {
23
23
    ASSERT_IS_MAIN_OR_TEST_THREAD();
24
23
    auto it = dynamic_context_.find(resource_type_url);
25
23
    if (it != dynamic_context_.end()) {
26
22
      return it->second;
27
22
    }
28
1
    return xds::core::v3::ContextParams::default_instance();
29
23
  };
30
  absl::Status setDynamicContextParam(absl::string_view resource_type_url, absl::string_view key,
31
16
                                      absl::string_view value) override {
32
16
    ASSERT_IS_MAIN_OR_TEST_THREAD();
33
16
    (*dynamic_context_[resource_type_url]
34
16
          .mutable_params())[toStdStringView(key)] = // NOLINT(std::string_view)
35
16
        toStdStringView(value);                      // NOLINT(std::string_view)
36
16
    return update_cb_helper_.runCallbacks(resource_type_url);
37
16
  }
38
  absl::Status unsetDynamicContextParam(absl::string_view resource_type_url,
39
5
                                        absl::string_view key) override {
40
5
    ASSERT_IS_MAIN_OR_TEST_THREAD();
41
5
    dynamic_context_[resource_type_url].mutable_params()->erase(
42
5
        toStdStringView(key)); // NOLINT(std::string_view)
43
5
    return update_cb_helper_.runCallbacks(resource_type_url);
44
5
  }
45
  ABSL_MUST_USE_RESULT Common::CallbackHandlePtr
46
12352
  addDynamicContextUpdateCallback(UpdateNotificationCb callback) const override {
47
12352
    ASSERT_IS_MAIN_OR_TEST_THREAD();
48
12352
    return update_cb_helper_.add(callback);
49
12352
  };
50

            
51
private:
52
  const xds::core::v3::ContextParams node_context_;
53
  // Map from resource type URL to dynamic context parameters.
54
  absl::flat_hash_map<std::string, xds::core::v3::ContextParams> dynamic_context_;
55
  mutable Common::CallbackManager<absl::Status, absl::string_view> update_cb_helper_;
56
};
57

            
58
} // namespace Config
59
} // namespace Envoy