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 21 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 FactoryCtx> class FilterConfigProviderManager {
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, FactoryCtx& factory_context,
const std::string& stat_prefix, bool last_filter_in_filter_chain,
const std::string& filter_chain_type) PURE;

Expand Down
56 changes: 12 additions & 44 deletions source/common/filter/config_discovery_impl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -16,19 +16,24 @@
namespace Envoy {
namespace Filter {

constexpr absl::string_view HttpStatPrefix = "http_filter.";
void validateProtoConfigDefaultFactoryHelper(const bool null_default_factory,
absl::string_view filter_config_name,
absl::string_view type_url) {
if (null_default_factory) {
throw EnvoyException(fmt::format("Error: cannot find filter factory {} for default filter "
"configuration with type URL {}.",
filter_config_name, type_url));
}
}

namespace {
void validateTypeUrlHelper(const std::string& type_url,
const absl::flat_hash_set<std::string> require_type_urls) {
void validateProtoConfigTypeUrlHelper(absl::string_view type_url,
const absl::flat_hash_set<std::string>& require_type_urls) {
if (!require_type_urls.contains(type_url)) {
throw EnvoyException(fmt::format("Error: filter config has type URL {} but expect {}.",
type_url, absl::StrJoin(require_type_urls, ", ")));
}
}

} // namespace

DynamicFilterConfigProviderImplBase::DynamicFilterConfigProviderImplBase(
FilterConfigSubscriptionSharedPtr& subscription,
const absl::flat_hash_set<std::string>& require_type_urls, bool last_filter_in_filter_chain,
Expand All @@ -53,7 +58,7 @@ DynamicFilterConfigProviderImplBase::~DynamicFilterConfigProviderImplBase() {
}

void DynamicFilterConfigProviderImplBase::validateTypeUrl(const std::string& type_url) const {
validateTypeUrlHelper(type_url, require_type_urls_);
validateProtoConfigTypeUrlHelper(type_url, require_type_urls_);
}

const std::string& DynamicFilterConfigProviderImplBase::name() { return subscription_->name(); }
Expand Down Expand Up @@ -232,42 +237,5 @@ 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(
const ProtobufWkt::Any& proto_config, const std::string& filter_config_name,
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 {
auto* default_factory =
Config::Utility::getFactoryByType<Server::Configuration::NamedHttpFilterConfigFactory>(
proto_config);
if (default_factory == nullptr) {
throw EnvoyException(fmt::format("Error: cannot find 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);
Config::Utility::validateTerminalFilters(
filter_config_name, default_factory->name(), filter_chain_type,
default_factory->isTerminalFilterByProto(*message, factory_context),
last_filter_in_filter_chain);
return message;
}

} // namespace Filter
} // namespace Envoy
Loading