1
#pragma once
2

            
3
#include <cstdint>
4
#include <functional>
5
#include <memory>
6
#include <queue>
7
#include <string>
8

            
9
#include "envoy/admin/v3/config_dump.pb.h"
10
#include "envoy/config/core/v3/config_source.pb.h"
11
#include "envoy/config/route/v3/route.pb.h"
12
#include "envoy/config/route/v3/route.pb.validate.h"
13
#include "envoy/config/subscription.h"
14
#include "envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.pb.h"
15
#include "envoy/http/codes.h"
16
#include "envoy/local_info/local_info.h"
17
#include "envoy/router/rds.h"
18
#include "envoy/router/route_config_provider_manager.h"
19
#include "envoy/router/route_config_update_receiver.h"
20
#include "envoy/server/admin.h"
21
#include "envoy/server/filter_config.h"
22
#include "envoy/singleton/instance.h"
23
#include "envoy/stats/scope.h"
24
#include "envoy/thread_local/thread_local.h"
25

            
26
#include "source/common/common/callback_impl.h"
27
#include "source/common/common/cleanup.h"
28
#include "source/common/common/logger.h"
29
#include "source/common/init/manager_impl.h"
30
#include "source/common/init/target_impl.h"
31
#include "source/common/init/watcher_impl.h"
32
#include "source/common/protobuf/utility.h"
33
#include "source/common/rds/common/proto_traits_impl.h"
34
#include "source/common/rds/rds_route_config_provider_impl.h"
35
#include "source/common/rds/rds_route_config_subscription.h"
36
#include "source/common/rds/route_config_provider_manager.h"
37
#include "source/common/rds/route_config_update_receiver_impl.h"
38
#include "source/common/rds/static_route_config_provider_impl.h"
39

            
40
#include "absl/container/node_hash_map.h"
41
#include "absl/container/node_hash_set.h"
42

            
43
namespace Envoy {
44
namespace Router {
45

            
46
using ProtoTraitsImpl =
47
    Rds::Common::ProtoTraitsImpl<envoy::config::route::v3::RouteConfiguration, 1>;
48

            
49
class RouteConfigProviderManagerImpl : public RouteConfigProviderManager,
50
                                       public Singleton::Instance {
51
public:
52
  RouteConfigProviderManagerImpl(OptRef<Server::Admin> admin);
53

            
54
  std::unique_ptr<envoy::admin::v3::RoutesConfigDump>
55
5
  dumpRouteConfigs(const Matchers::StringMatcher& name_matcher) const {
56
5
    return manager_.dumpRouteConfigs(name_matcher);
57
5
  }
58

            
59
  // RouteConfigProviderManager
60
  RouteConfigProviderSharedPtr createRdsRouteConfigProvider(
61
      const envoy::extensions::filters::network::http_connection_manager::v3::Rds& rds,
62
      Server::Configuration::ServerFactoryContext& factory_context, const std::string& stat_prefix,
63
      Init::Manager& init_manager) override;
64

            
65
  RouteConfigProviderPtr
66
  createStaticRouteConfigProvider(const envoy::config::route::v3::RouteConfiguration& route_config,
67
                                  Server::Configuration::ServerFactoryContext& factory_context,
68
                                  ProtobufMessage::ValidationVisitor& validator) override;
69

            
70
private:
71
  ProtoTraitsImpl proto_traits_;
72
  Rds::RouteConfigProviderManager manager_;
73
};
74

            
75
using RouteConfigProviderManagerImplPtr = std::unique_ptr<RouteConfigProviderManagerImpl>;
76

            
77
// Allows loose coupling of this file and rds.h
78
class RdsFactory : public Envoy::Config::UntypedFactory {
79
public:
80
1016
  std::string category() const override { return "envoy.rds_factory"; }
81

            
82
  virtual RouteConfigProviderSharedPtr createRdsRouteConfigProvider(
83
      const envoy::extensions::filters::network::http_connection_manager::v3::Rds& rds,
84
      Server::Configuration::ServerFactoryContext& factory_context, const std::string& stat_prefix,
85
      Init::Manager& init_manager, ProtoTraitsImpl& proto_traits,
86
      Rds::RouteConfigProviderManager& manager) PURE;
87
};
88

            
89
} // namespace Router
90
} // namespace Envoy