1
#pragma once
2

            
3
#include "envoy/config/core/v3/config_source.pb.h"
4
#include "envoy/config/dynamic_extension_config_provider.h"
5
#include "envoy/init/manager.h"
6
#include "envoy/server/filter_config.h"
7
#include "envoy/upstream/cluster_manager.h"
8

            
9
#include "absl/types/optional.h"
10

            
11
namespace Envoy {
12
namespace Filter {
13

            
14
template <class FactoryCb>
15
using FilterConfigProvider = Envoy::Config::ExtensionConfigProvider<FactoryCb>;
16
template <class FactoryCb>
17
using FilterConfigProviderPtr = std::unique_ptr<FilterConfigProvider<FactoryCb>>;
18
template <class FactoryCb>
19
using DynamicFilterConfigProvider = Envoy::Config::DynamicExtensionConfigProvider<FactoryCb>;
20
template <class FactoryCb>
21
using DynamicFilterConfigProviderPtr = std::unique_ptr<DynamicFilterConfigProvider<FactoryCb>>;
22

            
23
// Network filter config provider aliases
24
using NetworkFilterFactoriesList = std::vector<FilterConfigProviderPtr<Network::FilterFactoryCb>>;
25

            
26
// Listener filter config provider aliases
27
using ListenerFilterFactoriesList =
28
    std::vector<FilterConfigProviderPtr<Network::ListenerFilterFactoryCb>>;
29
using QuicListenerFilterFactoriesList =
30
    std::vector<FilterConfigProviderPtr<Network::QuicListenerFilterFactoryCb>>;
31

            
32
/**
33
 * The FilterConfigProviderManager exposes the ability to get an FilterConfigProvider
34
 * for both static and dynamic filter config providers.
35
 */
36
template <class FactoryCb, class FactoryCtx> class FilterConfigProviderManager {
37
public:
38
66245
  virtual ~FilterConfigProviderManager() = default;
39

            
40
  /**
41
   * Get an FilterConfigProviderPtr for a filter config. The config providers may share
42
   * the underlying subscriptions to the filter config discovery service.
43
   * @param config_source supplies the extension configuration source for the filter configs.
44
   * @param filter_config_name the filter config resource name.
45
   * @param factory_context is the context to use for the filter config provider.
46
   * @param last_filter_in_filter_chain indicates whether this filter is the last filter in the
47
   * configured chain
48
   * @param filter_chain_type is the filter chain type
49
   * @param listener_filter_matcher is the filter matcher for TCP listener filter. nullptr for other
50
   * filter types.
51
   */
52
  virtual DynamicFilterConfigProviderPtr<FactoryCb> createDynamicFilterConfigProvider(
53
      const envoy::config::core::v3::ExtensionConfigSource& config_source,
54
      const std::string& filter_config_name,
55
      Server::Configuration::ServerFactoryContext& server_context, FactoryCtx& factory_context,
56
      Upstream::ClusterManager& cluster_manager, bool last_filter_in_filter_chain,
57
      const std::string& filter_chain_type,
58
      const Network::ListenerFilterMatcherSharedPtr& listener_filter_matcher) PURE;
59

            
60
  /**
61
   * Get an FilterConfigProviderPtr for a statically inlined filter config.
62
   * @param config is a fully resolved filter instantiation factory.
63
   * @param filter_config_name is the name of the filter configuration resource.
64
   */
65
  virtual FilterConfigProviderPtr<FactoryCb>
66
  createStaticFilterConfigProvider(const FactoryCb& config,
67
                                   const std::string& filter_config_name) PURE;
68

            
69
  /**
70
   * Get the stat prefix for the scope of the filter provider manager.
71
   */
72
  virtual absl::string_view statPrefix() const PURE;
73
};
74

            
75
} // namespace Filter
76
} // namespace Envoy