1
#pragma once
2

            
3
#include <memory>
4
#include <string>
5

            
6
#include "envoy/rds/route_config_provider.h"
7
#include "envoy/rds/route_config_update_receiver.h"
8
#include "envoy/server/factory_context.h"
9
#include "envoy/thread_local/thread_local.h"
10

            
11
#include "source/common/rds/rds_route_config_subscription.h"
12

            
13
namespace Envoy {
14
namespace Rds {
15

            
16
/**
17
 * Implementation of RouteConfigProvider that fetches the route configuration dynamically using
18
 * the subscription.
19
 */
20
class RdsRouteConfigProviderImpl : public RouteConfigProvider,
21
                                   Logger::Loggable<Logger::Id::router> {
22
public:
23
  RdsRouteConfigProviderImpl(RdsRouteConfigSubscriptionSharedPtr&& subscription,
24
                             Server::Configuration::ServerFactoryContext& factory_context);
25

            
26
  ~RdsRouteConfigProviderImpl() override;
27

            
28
919
  RdsRouteConfigSubscription& subscription() { return *subscription_; }
29

            
30
  // RouteConfigProvider
31
759
  ConfigConstSharedPtr config() const override { return tls_->config_; }
32

            
33
  const absl::optional<ConfigInfo>& configInfo() const override;
34
47
  SystemTime lastUpdated() const override { return config_update_info_->lastUpdated(); }
35
  absl::Status onConfigUpdate() override;
36

            
37
private:
38
  struct ThreadLocalConfig : public ThreadLocal::ThreadLocalObject {
39
    ThreadLocalConfig(std::shared_ptr<const Config> initial_config)
40
706
        : config_(std::move(initial_config)) {}
41
    ConfigConstSharedPtr config_;
42
  };
43

            
44
  RdsRouteConfigSubscriptionSharedPtr subscription_;
45
  RouteConfigUpdatePtr& config_update_info_;
46
  ThreadLocal::TypedSlot<ThreadLocalConfig> tls_;
47
};
48

            
49
} // namespace Rds
50
} // namespace Envoy