Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Listener ECDS: Adding config provider manager implemantion for listener filter #20560

Merged
merged 27 commits into from
May 2, 2022
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
42591c4
Listener ECDS: Adding FilterConfigProviderManagerImpl class implemant…
yanjunxiang-google Mar 28, 2022
c97c715
fixing format error
yanjunxiang-google Mar 28, 2022
c473f29
switching to use tls_inspector listener filter in the test
yanjunxiang-google Mar 29, 2022
9b50205
addressing comments
yanjunxiang-google Mar 29, 2022
7829692
fixing test code
yanjunxiang-google Mar 30, 2022
5df2374
Merge branch 'main' of https://github.com/envoyproxy/envoy into ecds_…
yanjunxiang-google Apr 1, 2022
e7a217b
adding UDP listener filter support also refactoring ECDS tests
yanjunxiang-google Apr 3, 2022
39f434b
fixing format
yanjunxiang-google Apr 3, 2022
fe77b12
removing unused validate.proto
yanjunxiang-google Apr 3, 2022
4fd9312
fixing CI error
yanjunxiang-google Apr 3, 2022
cea0a65
abstract the FilterConfigProviderManagerImpl class
yanjunxiang-google Apr 7, 2022
817c9dd
fixing CI error
yanjunxiang-google Apr 8, 2022
4266bea
using string_view reference instead of enum as non-typed template pa…
yanjunxiang-google Apr 8, 2022
35cca65
address comments: adding typed test
yanjunxiang-google Apr 13, 2022
026f16e
fix CI error
yanjunxiang-google Apr 13, 2022
ca4c8a7
fixing CI GCC anonymous namespace error
yanjunxiang-google Apr 13, 2022
46e45c7
fixing clang tidy issue
yanjunxiang-google Apr 13, 2022
56fb733
addressing comments, moving statPrefix out of the template parameters
yanjunxiang-google Apr 14, 2022
1a8dd74
addressing comments
yanjunxiang-google Apr 14, 2022
99a590a
clean up test code
yanjunxiang-google Apr 21, 2022
7dfbd75
fix format
yanjunxiang-google Apr 21, 2022
8931395
addressing comments
yanjunxiang-google Apr 24, 2022
743de2a
adding a TODO comments
yanjunxiang-google Apr 24, 2022
ad043b8
fixing CI error
yanjunxiang-google Apr 24, 2022
105153a
reduce duplicated code
yanjunxiang-google Apr 24, 2022
eeff8c0
addressing comments
yanjunxiang-google Apr 25, 2022
2de5f43
addressing comments
yanjunxiang-google Apr 25, 2022
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
4 changes: 2 additions & 2 deletions envoy/filter/config_provider_manager.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ using DynamicFilterConfigProviderPtr = std::unique_ptr<DynamicFilterConfigProvid
* The FilterConfigProviderManager exposes the ability to get an FilterConfigProvider
* for both static and dynamic filter config providers.
*/
template <class FactoryCb> class FilterConfigProviderManager {
template <class FactoryCb, class FactoryCt> class FilterConfigProviderManager {
yanjunxiang-google marked this conversation as resolved.
Show resolved Hide resolved
yanjunxiang-google marked this conversation as resolved.
Show resolved Hide resolved
public:
virtual ~FilterConfigProviderManager() = default;

Expand All @@ -40,7 +40,7 @@ template <class FactoryCb> class FilterConfigProviderManager {
*/
virtual DynamicFilterConfigProviderPtr<FactoryCb> createDynamicFilterConfigProvider(
const envoy::config::core::v3::ExtensionConfigSource& config_source,
const std::string& filter_config_name, Server::Configuration::FactoryContext& factory_context,
const std::string& filter_config_name, FactoryCt& factory_context,
const std::string& stat_prefix, bool last_filter_in_filter_chain,
const std::string& filter_chain_type) PURE;

Expand Down
36 changes: 24 additions & 12 deletions source/common/filter/config_discovery_impl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ namespace Envoy {
namespace Filter {

constexpr absl::string_view HttpStatPrefix = "http_filter.";
constexpr absl::string_view ListenerStatPrefix = "listener_filter.";

namespace {
void validateTypeUrlHelper(const std::string& type_url,
Expand Down Expand Up @@ -232,18 +233,6 @@ void FilterConfigProviderManagerImplBase::applyLastOrDefaultConfig(
}
}

std::tuple<ProtobufTypes::MessagePtr, std::string> HttpFilterConfigProviderManagerImpl::getMessage(
const envoy::config::core::v3::TypedExtensionConfig& filter_config,
Server::Configuration::ServerFactoryContext& factory_context) const {
auto& factory =
Config::Utility::getAndCheckFactory<Server::Configuration::NamedHttpFilterConfigFactory>(
filter_config);
ProtobufTypes::MessagePtr message = Config::Utility::translateAnyToFactoryConfig(
filter_config.typed_config(),
factory_context.messageValidationContext().dynamicValidationVisitor(), factory);
return {std::move(message), factory.name()};
}

absl::string_view HttpFilterConfigProviderManagerImpl::statPrefix() const { return HttpStatPrefix; }

ProtobufTypes::MessagePtr HttpFilterConfigProviderManagerImpl::getDefaultConfig(
Expand All @@ -269,5 +258,28 @@ ProtobufTypes::MessagePtr HttpFilterConfigProviderManagerImpl::getDefaultConfig(
return message;
}

absl::string_view ListenerFilterConfigProviderManagerImpl::statPrefix() const {
return ListenerStatPrefix;
}

ProtobufTypes::MessagePtr ListenerFilterConfigProviderManagerImpl::getDefaultConfig(
const ProtobufWkt::Any& proto_config, const std::string& filter_config_name,
Server::Configuration::FactoryContext& factory_context, bool, const std::string&,
const absl::flat_hash_set<std::string>& require_type_urls) const {
auto* default_factory =
Config::Utility::getFactoryByType<Server::Configuration::NamedListenerFilterConfigFactory>(
proto_config);
if (default_factory == nullptr) {
throw EnvoyException(
fmt::format("Error: cannot find listener filter factory {} for default filter "
"configuration with type URL {}.",
filter_config_name, proto_config.type_url()));
}
validateTypeUrlHelper(Config::Utility::getFactoryType(proto_config), require_type_urls);
ProtobufTypes::MessagePtr message = Config::Utility::translateAnyToFactoryConfig(
proto_config, factory_context.messageValidationVisitor(), *default_factory);
return message;
yanjunxiang-google marked this conversation as resolved.
Show resolved Hide resolved
}

} // namespace Filter
} // namespace Envoy
108 changes: 92 additions & 16 deletions source/common/filter/config_discovery_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -77,8 +77,7 @@ class DynamicFilterConfigProviderImpl : public DynamicFilterConfigProviderImplBa
absl::string_view stat_prefix)
: DynamicFilterConfigProviderImplBase(subscription, require_type_urls,
last_filter_in_filter_chain, filter_chain_type),
stat_prefix_(stat_prefix), factory_context_(factory_context),
main_config_(std::make_shared<MainConfig>()),
stat_prefix_(stat_prefix), main_config_(std::make_shared<MainConfig>()),
default_configuration_(std::move(default_config)), tls_(factory_context.threadLocal()) {
tls_.set([](Event::Dispatcher&) { return std::make_shared<ThreadLocalConfig>(); });
};
Expand Down Expand Up @@ -119,7 +118,6 @@ class DynamicFilterConfigProviderImpl : public DynamicFilterConfigProviderImplBa

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

private:
virtual FactoryCb instantiateFilterFactory(const Protobuf::Message& message) const PURE;
Expand Down Expand Up @@ -151,7 +149,6 @@ class DynamicFilterConfigProviderImpl : public DynamicFilterConfigProviderImplBa
};

const std::string stat_prefix_;
Server::Configuration::FactoryContext& factory_context_;
std::shared_ptr<MainConfig> main_config_;
const ProtobufTypes::MessagePtr default_configuration_;
ThreadLocal::TypedSlot<ThreadLocalConfig> tls_;
Expand All @@ -161,13 +158,23 @@ class DynamicFilterConfigProviderImpl : public DynamicFilterConfigProviderImplBa
class HttpDynamicFilterConfigProviderImpl
: public DynamicFilterConfigProviderImpl<Http::FilterFactoryCb> {
public:
using DynamicFilterConfigProviderImpl::DynamicFilterConfigProviderImpl;
HttpDynamicFilterConfigProviderImpl(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)
: DynamicFilterConfigProviderImpl(subscription, require_type_urls, factory_context,
std::move(default_config), last_filter_in_filter_chain,
filter_chain_type, stat_prefix),
factory_context_(factory_context) {}
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());
const 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_);
}
Expand All @@ -176,8 +183,40 @@ class HttpDynamicFilterConfigProviderImpl
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());
return factory->createFilterFactoryFromProto(message, getStatPrefix(), factory_context_);
}

Server::Configuration::FactoryContext& factory_context_;
};

// Implementation of a listener dynamic filter config provider.
class ListenerDynamicFilterConfigProviderImpl
yanjunxiang-google marked this conversation as resolved.
Show resolved Hide resolved
: public DynamicFilterConfigProviderImpl<Network::ListenerFilterFactoryCb> {
public:
ListenerDynamicFilterConfigProviderImpl(
FilterConfigSubscriptionSharedPtr& subscription,
const absl::flat_hash_set<std::string>& require_type_urls,
Server::Configuration::ListenerFactoryContext& factory_context,
ProtobufTypes::MessagePtr&& default_config, bool last_filter_in_filter_chain,
const std::string& filter_chain_type, absl::string_view stat_prefix)
: DynamicFilterConfigProviderImpl(subscription, require_type_urls, factory_context,
std::move(default_config), last_filter_in_filter_chain,
filter_chain_type, stat_prefix),
factory_context_(factory_context) {}

void validateMessage(const std::string&, const Protobuf::Message&,
const std::string&) const override {}

private:
Network::ListenerFilterFactoryCb
instantiateFilterFactory(const Protobuf::Message& message) const override {
auto* factory =
Registry::FactoryRegistry<Server::Configuration::NamedListenerFilterConfigFactory>::
getFactoryByType(message.GetTypeName());
return factory->createListenerFilterFactoryFromProto(message, nullptr, factory_context_);
yanjunxiang-google marked this conversation as resolved.
Show resolved Hide resolved
}

Server::Configuration::ListenerFactoryContext& factory_context_;
yanjunxiang-google marked this conversation as resolved.
Show resolved Hide resolved
};

/**
Expand Down Expand Up @@ -304,14 +343,14 @@ class FilterConfigProviderManagerImplBase : Logger::Loggable<Logger::Id::filter>
/**
* An implementation of FilterConfigProviderManager.
*/
template <class FactoryCb>
template <class Factory, class FactoryCb, class FactoryCt>
class FilterConfigProviderManagerImpl : public FilterConfigProviderManagerImplBase,
public FilterConfigProviderManager<FactoryCb>,
public FilterConfigProviderManager<FactoryCb, FactoryCt>,
public Singleton::Instance {
public:
DynamicFilterConfigProviderPtr<FactoryCb> createDynamicFilterConfigProvider(
const envoy::config::core::v3::ExtensionConfigSource& config_source,
const std::string& filter_config_name, Server::Configuration::FactoryContext& factory_context,
const std::string& filter_config_name, FactoryCt& factory_context,
const std::string& stat_prefix, bool last_filter_in_filter_chain,
const std::string& filter_chain_type) override {
std::string subscription_stat_prefix;
Expand Down Expand Up @@ -365,6 +404,16 @@ class FilterConfigProviderManagerImpl : public FilterConfigProviderManagerImplBa
return std::make_unique<StaticFilterConfigProviderImpl<FactoryCb>>(config, filter_config_name);
}

std::tuple<ProtobufTypes::MessagePtr, std::string>
getMessage(const envoy::config::core::v3::TypedExtensionConfig& filter_config,
Server::Configuration::ServerFactoryContext& factory_context) const override {
auto& factory = Config::Utility::getAndCheckFactory<Factory>(filter_config);
ProtobufTypes::MessagePtr message = Config::Utility::translateAnyToFactoryConfig(
filter_config.typed_config(),
factory_context.messageValidationContext().dynamicValidationVisitor(), factory);
return {std::move(message), factory.name()};
}

absl::string_view statPrefix() const override PURE;

protected:
Expand All @@ -378,20 +427,18 @@ class FilterConfigProviderManagerImpl : public FilterConfigProviderManagerImplBa
virtual std::unique_ptr<DynamicFilterConfigProviderImpl<FactoryCb>>
createFilterConfigProviderImpl(FilterConfigSubscriptionSharedPtr& subscription,
const absl::flat_hash_set<std::string>& require_type_urls,
Server::Configuration::FactoryContext& factory_context,
FactoryCt& 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<Http::FilterFactoryCb> {
: public FilterConfigProviderManagerImpl<Server::Configuration::NamedHttpFilterConfigFactory,
Http::FilterFactoryCb,
Server::Configuration::FactoryContext> {
public:
std::tuple<ProtobufTypes::MessagePtr, std::string>
getMessage(const envoy::config::core::v3::TypedExtensionConfig& filter_config,
Server::Configuration::ServerFactoryContext& factory_context) const override;

absl::string_view statPrefix() const override;

protected:
Expand All @@ -416,5 +463,34 @@ class HttpFilterConfigProviderManagerImpl
}
};

class ListenerFilterConfigProviderManagerImpl
: public FilterConfigProviderManagerImpl<
Server::Configuration::NamedListenerFilterConfigFactory, Network::ListenerFilterFactoryCb,
Server::Configuration::ListenerFactoryContext> {
public:
absl::string_view statPrefix() const override;

protected:
ProtobufTypes::MessagePtr
getDefaultConfig(const ProtobufWkt::Any& proto_config, const std::string& filter_config_name,
Server::Configuration::FactoryContext& factory_context, bool,
const std::string& filter_chain_type,
const absl::flat_hash_set<std::string>& require_type_urls) const override;

private:
std::unique_ptr<DynamicFilterConfigProviderImpl<Network::ListenerFilterFactoryCb>>
createFilterConfigProviderImpl(FilterConfigSubscriptionSharedPtr& subscription,
const absl::flat_hash_set<std::string>& require_type_urls,
Server::Configuration::ListenerFactoryContext& 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<ListenerDynamicFilterConfigProviderImpl>(
subscription, require_type_urls, factory_context, std::move(default_config),
last_filter_in_filter_chain, filter_chain_type, stat_prefix);
}
};

} // namespace Filter
} // namespace Envoy
1 change: 1 addition & 0 deletions source/extensions/filters/listener/tls_inspector/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ envoy_cc_extension(
extra_visibility = [
"//test/integration:__subpackages__",
],
visibility = ["//visibility:public"],
yanjunxiang-google marked this conversation as resolved.
Show resolved Hide resolved
deps = [
"//envoy/registry",
"//envoy/server:filter_config_interface",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,9 @@ namespace Extensions {
namespace NetworkFilters {
namespace HttpConnectionManager {

using FilterConfigProviderManager = Filter::FilterConfigProviderManager<Http::FilterFactoryCb>;
using FilterConfigProviderManager =
Filter::FilterConfigProviderManager<Http::FilterFactoryCb,
Server::Configuration::FactoryContext>;

/**
* Config registration for the HTTP connection manager filter. @see NamedNetworkFilterConfigFactory.
Expand Down
1 change: 1 addition & 0 deletions test/common/filter/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ envoy_cc_test(
"//source/common/filter:config_discovery_lib",
"//source/common/json:json_loader_lib",
"//source/extensions/filters/http/router:config",
"//source/extensions/filters/listener/tls_inspector:config",
"//test/integration/filters:add_body_filter_config_lib",
"//test/mocks/local_info:local_info_mocks",
"//test/mocks/protobuf:protobuf_mocks",
Expand Down
Loading