Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 56 additions & 18 deletions source/common/filter/config_discovery_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ class DynamicFilterConfigProviderImplBase : public Config::DynamicExtensionConfi
/**
* Implementation of a filter config provider using discovery subscriptions.
**/
template <class Factory, class FactoryCb>
template <class FactoryCb>
class DynamicFilterConfigProviderImpl : public DynamicFilterConfigProviderImplBase,
public DynamicFilterConfigProvider<FactoryCb> {
public:
Expand Down Expand Up @@ -92,15 +92,6 @@ class DynamicFilterConfigProviderImpl : public DynamicFilterConfigProviderImplBa
}
}

// DynamicFilterConfigProviderImplBase
void validateMessage(const std::string& config_name, const Protobuf::Message& message,
const std::string& factory_name) const override {
auto* factory = Registry::FactoryRegistry<Factory>::getFactory(factory_name);
bool is_terminal_filter = factory->isTerminalFilterByProto(message, factory_context_);
Config::Utility::validateTerminalFilters(config_name, factory_name, filter_chain_type_,
is_terminal_filter, last_filter_in_filter_chain_);
}

// Config::ExtensionConfigProvider
const std::string& name() override { return DynamicFilterConfigProviderImplBase::name(); }
absl::optional<FactoryCb> config() override { return tls_->config_; }
Expand All @@ -126,11 +117,12 @@ class DynamicFilterConfigProviderImpl : public DynamicFilterConfigProviderImplBa
}
}

protected:
const std::string& getStatPrefix() const { return stat_prefix_; }
Server::Configuration::FactoryContext& getFactoryContext() const { return factory_context_; }

private:
FactoryCb instantiateFilterFactory(const Protobuf::Message& message) const {
auto* factory = Registry::FactoryRegistry<Factory>::getFactoryByType(message.GetTypeName());
return factory->createFilterFactoryFromProto(message, stat_prefix_, factory_context_);
}
virtual FactoryCb instantiateFilterFactory(const Protobuf::Message& message) const PURE;

void update(absl::optional<FactoryCb> config, Config::ConfigAppliedCb applied_on_all_threads) {
// This call must not capture 'this' as it is invoked on all workers asynchronously.
Expand Down Expand Up @@ -165,6 +157,29 @@ class DynamicFilterConfigProviderImpl : public DynamicFilterConfigProviderImplBa
ThreadLocal::TypedSlot<ThreadLocalConfig> tls_;
};

// Implementation of a HTTP dynamic filter config provider.
class HttpDynamicFilterConfigProviderImpl
: public DynamicFilterConfigProviderImpl<Http::FilterFactoryCb> {
public:
using DynamicFilterConfigProviderImpl::DynamicFilterConfigProviderImpl;
void validateMessage(const std::string& config_name, const Protobuf::Message& message,
const std::string& factory_name) const override {
auto* factory =
Registry::FactoryRegistry<Server::Configuration::NamedHttpFilterConfigFactory>::getFactory(
factory_name);
const bool is_terminal_filter = factory->isTerminalFilterByProto(message, getFactoryContext());
Config::Utility::validateTerminalFilters(config_name, factory_name, filter_chain_type_,
is_terminal_filter, last_filter_in_filter_chain_);
}

private:
Http::FilterFactoryCb instantiateFilterFactory(const Protobuf::Message& message) const override {
auto* factory = Registry::FactoryRegistry<Server::Configuration::NamedHttpFilterConfigFactory>::
getFactoryByType(message.GetTypeName());
return factory->createFilterFactoryFromProto(message, getStatPrefix(), getFactoryContext());
}
};

/**
* All extension config discovery stats. @see stats_macros.h
*/
Expand Down Expand Up @@ -289,7 +304,7 @@ class FilterConfigProviderManagerImplBase : Logger::Loggable<Logger::Id::filter>
/**
* An implementation of FilterConfigProviderManager.
*/
template <class Factory, class FactoryCb>
template <class FactoryCb>
class FilterConfigProviderManagerImpl : public FilterConfigProviderManagerImplBase,
public FilterConfigProviderManager<FactoryCb>,
public Singleton::Instance {
Expand Down Expand Up @@ -332,7 +347,7 @@ class FilterConfigProviderManagerImpl : public FilterConfigProviderManagerImplBa
last_filter_in_filter_chain, filter_chain_type, require_type_urls);
}

auto provider = std::make_unique<DynamicFilterConfigProviderImpl<Factory, FactoryCb>>(
auto provider = createFilterConfigProviderImpl(
subscription, require_type_urls, factory_context, std::move(default_config),
last_filter_in_filter_chain, filter_chain_type, provider_stat_prefix);

Expand All @@ -358,11 +373,20 @@ class FilterConfigProviderManagerImpl : public FilterConfigProviderManagerImplBa
Server::Configuration::FactoryContext& factory_context,
bool last_filter_in_filter_chain, const std::string& filter_chain_type,
const absl::flat_hash_set<std::string>& require_type_urls) const PURE;

private:
virtual std::unique_ptr<DynamicFilterConfigProviderImpl<FactoryCb>>
createFilterConfigProviderImpl(FilterConfigSubscriptionSharedPtr& subscription,
const absl::flat_hash_set<std::string>& require_type_urls,
Server::Configuration::FactoryContext& factory_context,
ProtobufTypes::MessagePtr&& default_config,
bool last_filter_in_filter_chain,
const std::string& filter_chain_type,
absl::string_view stat_prefix) PURE;
};

class HttpFilterConfigProviderManagerImpl
: public FilterConfigProviderManagerImpl<Server::Configuration::NamedHttpFilterConfigFactory,
Http::FilterFactoryCb> {
: public FilterConfigProviderManagerImpl<Http::FilterFactoryCb> {
public:
std::tuple<ProtobufTypes::MessagePtr, std::string>
getMessage(const envoy::config::core::v3::TypedExtensionConfig& filter_config,
Expand All @@ -376,6 +400,20 @@ class HttpFilterConfigProviderManagerImpl
Server::Configuration::FactoryContext& factory_context,
bool last_filter_in_filter_chain, const std::string& filter_chain_type,
const absl::flat_hash_set<std::string>& require_type_urls) const override;

private:
std::unique_ptr<DynamicFilterConfigProviderImpl<Http::FilterFactoryCb>>
createFilterConfigProviderImpl(FilterConfigSubscriptionSharedPtr& subscription,
const absl::flat_hash_set<std::string>& require_type_urls,
Server::Configuration::FactoryContext& factory_context,
ProtobufTypes::MessagePtr&& default_config,
bool last_filter_in_filter_chain,
const std::string& filter_chain_type,
absl::string_view stat_prefix) override {
return std::make_unique<HttpDynamicFilterConfigProviderImpl>(
subscription, require_type_urls, factory_context, std::move(default_config),
last_filter_in_filter_chain, filter_chain_type, stat_prefix);
}
};

} // namespace Filter
Expand Down