diff --git a/CODEOWNERS b/CODEOWNERS index ca849987e710e..dbe3a283e3550 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -291,6 +291,7 @@ extensions/filters/http/oauth2 @derekargueta @snowp /*/extensions/clusters/logical_dns/ @UNOWNED @UNOWNED /*/extensions/clusters/common/ @UNOWNED @UNOWNED /*/extensions/clusters/eds/ @UNOWNED @UNOWNED +/*/source/extensions/listener_managers/listener_manager @UNOWNED @UNOWNED # URL Pattern Match and Rewrite Library /*/extensions/path/uri_template_lib @alyssawilk @yanjunxiang-google diff --git a/source/common/config/well_known_names.h b/source/common/config/well_known_names.h index da1085ed239a8..af429199ed1e2 100644 --- a/source/common/config/well_known_names.h +++ b/source/common/config/well_known_names.h @@ -173,5 +173,15 @@ class TagNameValues { using TagNames = ConstSingleton; +// This class holds extension points which will always be built into Envoy in +// server mode, but may be excluded from Envoy Mobile. +class ServerBuiltInExtensionValues { +public: + // Extension point for the default listener. + const std::string DEFAULT_LISTENER = "envoy.listener_manager_impl.default"; +}; + +using ServerExtensionValues = ConstSingleton; + } // namespace Config } // namespace Envoy diff --git a/source/exe/BUILD b/source/exe/BUILD index cc0796ed99007..390bd8a4d84d0 100644 --- a/source/exe/BUILD +++ b/source/exe/BUILD @@ -89,6 +89,9 @@ envoy_cc_library( name = "envoy_main_common_lib", deps = [ ":main_common_lib", + # This is compiled as an extension so Envoy Mobile doesn't have to link it in. + # Envoy requires it. + "//source/extensions/listener_managers/listener_manager:listener_manager_lib", "//source/common/version:version_linkstamp", ], ) diff --git a/source/extensions/bootstrap/internal_listener/BUILD b/source/extensions/bootstrap/internal_listener/BUILD index 8eff9ec555eb5..30f003f9e72b3 100644 --- a/source/extensions/bootstrap/internal_listener/BUILD +++ b/source/extensions/bootstrap/internal_listener/BUILD @@ -30,7 +30,7 @@ envoy_cc_extension( deps = [ ":thread_local_registry", "//envoy/server:bootstrap_extension_config_interface", - "//source/server:listener_manager_lib", + "//source/extensions/listener_managers/listener_manager:listener_manager_lib", "@envoy_api//envoy/extensions/bootstrap/internal_listener/v3:pkg_cc_proto", ], alwayslink = 1, diff --git a/source/extensions/listener_managers/listener_manager/BUILD b/source/extensions/listener_managers/listener_manager/BUILD new file mode 100644 index 0000000000000..0dd385ad35247 --- /dev/null +++ b/source/extensions/listener_managers/listener_manager/BUILD @@ -0,0 +1,83 @@ +load( + "//bazel:envoy_build_system.bzl", + "envoy_cc_extension", + "envoy_extension_package", + "envoy_select_enable_http3", +) + +licenses(["notice"]) # Apache 2 + +envoy_extension_package() + +envoy_cc_extension( + name = "listener_manager_lib", + srcs = [ + "listener_impl.cc", + "listener_manager_impl.cc", + ], + hdrs = [ + "listener_impl.h", + "listener_manager_impl.h", + ], + # any changes to this should be reviewed by mobile maintainers + # to ensure that listener code doesn't leak back into Envoy Mobile. + extra_visibility = [ + "//source/server/admin:__subpackages__", + "//source/server/config_validation:__subpackages__", + "//test:__subpackages__", + ], + deps = [ + "//source/server:listener_manager_factory_lib", + "//source/server:api_listener_lib", + "//source/server:active_raw_udp_listener_config", + "//source/server:configuration_lib", + "//source/server:drain_manager_lib", + "//source/server:filter_chain_manager_lib", + "//source/server:lds_api_lib", + "//source/server:transport_socket_config_lib", + "//envoy/access_log:access_log_interface", + "//envoy/config:typed_metadata_interface", + "//envoy/network:connection_interface", + "//envoy/network:listener_interface", + "//envoy/server:api_listener_interface", + "//envoy/server:filter_config_interface", + "//envoy/server:listener_manager_interface", + "//envoy/server:transport_socket_config_interface", + "//envoy/server:worker_interface", + "//source/common/access_log:access_log_lib", + "//source/common/common:basic_resource_lib", + "//source/common/common:empty_string", + "//source/common/config:utility_lib", + "//source/common/config:metadata_lib", + "//source/common/http:conn_manager_lib", + "//source/common/init:manager_lib", + "//source/common/init:target_lib", + "//source/common/network:connection_balancer_lib", + "//source/common/network:filter_matcher_lib", + "//source/common/network:listen_socket_lib", + "//source/common/network:listener_lib", + "//source/common/network:resolver_lib", + "//source/common/network:socket_option_factory_lib", + "//source/common/network:udp_packet_writer_handler_lib", + "//source/common/network:utility_lib", + "//source/common/protobuf:utility_lib", + "//source/common/stream_info:stream_info_lib", + "//source/common/quic:quic_stat_names_lib", + "//source/extensions/filters/network/http_connection_manager:config", + "//source/extensions/upstreams/http/generic:config", + "//source/extensions/udp_packet_writer/default:config", + "@envoy_api//envoy/admin/v3:pkg_cc_proto", + "@envoy_api//envoy/config/core/v3:pkg_cc_proto", + "@envoy_api//envoy/config/listener/v3:pkg_cc_proto", + "@envoy_api//envoy/extensions/filters/listener/proxy_protocol/v3:pkg_cc_proto", + "@envoy_api//envoy/extensions/transport_sockets/raw_buffer/v3:pkg_cc_proto", + "@envoy_api//envoy/extensions/udp_packet_writer/v3:pkg_cc_proto", + ] + envoy_select_enable_http3([ + "//source/common/quic:active_quic_listener_lib", + "//source/common/quic:client_connection_factory_lib", + "//source/common/quic:quic_factory_lib", + "//source/common/quic:quic_transport_socket_factory_lib", + "//source/common/quic:udp_gso_batch_writer_lib", + "//source/extensions/udp_packet_writer/gso:config", + ]), +) diff --git a/source/server/listener_impl.cc b/source/extensions/listener_managers/listener_manager/listener_impl.cc similarity index 99% rename from source/server/listener_impl.cc rename to source/extensions/listener_managers/listener_manager/listener_impl.cc index 63522b90f1e8c..3e7ab8f811574 100644 --- a/source/server/listener_impl.cc +++ b/source/extensions/listener_managers/listener_manager/listener_impl.cc @@ -1,4 +1,4 @@ -#include "source/server/listener_impl.h" +#include "source/extensions/listener_managers/listener_manager/listener_impl.h" #include @@ -27,11 +27,11 @@ #include "source/common/network/utility.h" #include "source/common/protobuf/utility.h" #include "source/common/runtime/runtime_features.h" +#include "source/extensions/listener_managers/listener_manager/listener_manager_impl.h" #include "source/server/active_raw_udp_listener_config.h" #include "source/server/configuration_impl.h" #include "source/server/drain_manager_impl.h" #include "source/server/filter_chain_manager_impl.h" -#include "source/server/listener_manager_impl.h" #include "source/server/transport_socket_config_impl.h" #ifdef ENVOY_ENABLE_QUIC @@ -301,9 +301,7 @@ Stats::Scope& ListenerFactoryContextBaseImpl::listenerScope() { return *listener bool ListenerFactoryContextBaseImpl::isQuicListener() const { return is_quic_; } Network::DrainDecision& ListenerFactoryContextBaseImpl::drainDecision() { return *this; } Server::DrainManager& ListenerFactoryContextBaseImpl::drainManager() { return *drain_manager_; } - -// Must be overridden -Init::Manager& ListenerFactoryContextBaseImpl::initManager() { PANIC("not implemented"); } +Init::Manager& ListenerFactoryContextBaseImpl::initManager() { return server_.initManager(); } ListenerImpl::ListenerImpl(const envoy::config::listener::v3::Listener& config, const std::string& version_info, ListenerManagerImpl& parent, @@ -774,11 +772,10 @@ void ListenerImpl::buildConnectionBalancer(const Network::Address::Instance& add // Not in place listener update. if (config_.has_connection_balance_config()) { switch (config_.connection_balance_config().balance_type_case()) { - case envoy::config::listener::v3::Listener_ConnectionBalanceConfig::kExactBalance: { + case envoy::config::listener::v3::Listener_ConnectionBalanceConfig::kExactBalance: connection_balancers_.emplace(address.asString(), std::make_shared()); break; - } case envoy::config::listener::v3::Listener_ConnectionBalanceConfig::kExtendBalance: { const std::string connection_balance_library_type{TypeUtil::typeUrlToDescriptorFullName( config_.connection_balance_config().extend_balance().typed_config().type_url())}; diff --git a/source/server/listener_impl.h b/source/extensions/listener_managers/listener_manager/listener_impl.h similarity index 100% rename from source/server/listener_impl.h rename to source/extensions/listener_managers/listener_manager/listener_impl.h diff --git a/source/server/listener_manager_impl.cc b/source/extensions/listener_managers/listener_manager/listener_manager_impl.cc similarity index 99% rename from source/server/listener_manager_impl.cc rename to source/extensions/listener_managers/listener_manager/listener_manager_impl.cc index c08489506f4fb..8b93af0ac96f5 100644 --- a/source/server/listener_manager_impl.cc +++ b/source/extensions/listener_managers/listener_manager/listener_manager_impl.cc @@ -1,4 +1,4 @@ -#include "source/server/listener_manager_impl.h" +#include "source/extensions/listener_managers/listener_manager/listener_manager_impl.h" #include diff --git a/source/server/listener_manager_impl.h b/source/extensions/listener_managers/listener_manager/listener_manager_impl.h similarity index 98% rename from source/server/listener_manager_impl.h rename to source/extensions/listener_managers/listener_manager/listener_manager_impl.h index 9dba8f34d4506..c8d6ac92f90f1 100644 --- a/source/server/listener_manager_impl.h +++ b/source/extensions/listener_managers/listener_manager/listener_manager_impl.h @@ -18,12 +18,13 @@ #include "envoy/server/worker.h" #include "envoy/stats/scope.h" +#include "source/common/config/well_known_names.h" #include "source/common/filter/config_discovery_impl.h" #include "source/common/quic/quic_stat_names.h" +#include "source/extensions/listener_managers/listener_manager/listener_impl.h" #include "source/server/filter_chain_factory_context_callback.h" #include "source/server/filter_chain_manager_impl.h" #include "source/server/lds_api.h" -#include "source/server/listener_impl.h" #include "source/server/listener_manager_factory.h" namespace Envoy { @@ -363,7 +364,9 @@ class DefaultListenerManagerFactoryImpl : public ListenerManagerFactory { return std::make_unique(server, std::move(factory), worker_factory, enable_dispatcher_stats, quic_stat_names); } - std::string name() const override { return "envoy.listener_manager_impl.default"; } + std::string name() const override { + return Config::ServerExtensionValues::get().DEFAULT_LISTENER; + } }; } // namespace Server diff --git a/source/server/BUILD b/source/server/BUILD index a4a61bd8efa57..c40ad62578ace 100644 --- a/source/server/BUILD +++ b/source/server/BUILD @@ -3,7 +3,6 @@ load( "envoy_cc_library", "envoy_package", "envoy_proto_library", - "envoy_select_enable_http3", "envoy_select_hot_restart", ) @@ -324,7 +323,6 @@ envoy_cc_library( hdrs = envoy_select_hot_restart(["hot_restarting_parent.h"]), deps = [ ":hot_restarting_base", - ":listener_manager_lib", "//source/common/memory:stats_lib", "//source/common/stats:stat_merger_lib", "//source/common/stats:symbol_table_lib", @@ -437,74 +435,39 @@ envoy_cc_library( ], ) -# TODO(junr03): actually separate this lib from the listener and api listener lib. -# this can be done if the parent_ in the listener and the api listener becomes the ListenerManager interface. -# the issue right now is that the listener's reach into the listener manager's server_ instance variable. envoy_cc_library( - name = "listener_manager_lib", + name = "api_listener_lib", srcs = [ "api_listener_impl.cc", - "listener_impl.cc", - "listener_manager_impl.cc", ], hdrs = [ "api_listener_impl.h", - "listener_impl.h", - "listener_manager_impl.h", ], deps = [ - ":listener_manager_factory_lib", - "active_raw_udp_listener_config", ":configuration_lib", - ":drain_manager_lib", ":filter_chain_manager_lib", ":lds_api_lib", ":transport_socket_config_lib", - "//envoy/access_log:access_log_interface", - "//envoy/config:typed_metadata_interface", "//envoy/network:connection_interface", "//envoy/network:listener_interface", - "//envoy/server:api_listener_interface", "//envoy/server:filter_config_interface", + "//envoy/server:instance_interface", "//envoy/server:listener_manager_interface", "//envoy/server:transport_socket_config_interface", - "//envoy/server:worker_interface", - "//source/common/access_log:access_log_lib", "//source/common/common:basic_resource_lib", "//source/common/common:empty_string", - "//source/common/config:utility_lib", "//source/common/config:metadata_lib", - "//source/common/http:conn_manager_lib", + "//source/common/config:utility_lib", "//source/common/init:manager_lib", "//source/common/init:target_lib", - "//source/common/network:connection_balancer_lib", - "//source/common/network:filter_matcher_lib", - "//source/common/network:listen_socket_lib", - "//source/common/network:listener_lib", - "//source/common/network:resolver_lib", - "//source/common/network:socket_option_factory_lib", - "//source/common/network:udp_packet_writer_handler_lib", "//source/common/network:utility_lib", - "//source/common/protobuf:utility_lib", "//source/common/stream_info:stream_info_lib", - "//source/common/quic:quic_stat_names_lib", "//source/extensions/filters/network/http_connection_manager:config", - "//source/extensions/upstreams/http/generic:config", "//source/extensions/udp_packet_writer/default:config", - "@envoy_api//envoy/admin/v3:pkg_cc_proto", + "//source/extensions/upstreams/http/generic:config", "@envoy_api//envoy/config/core/v3:pkg_cc_proto", "@envoy_api//envoy/config/listener/v3:pkg_cc_proto", - "@envoy_api//envoy/extensions/filters/listener/proxy_protocol/v3:pkg_cc_proto", - "@envoy_api//envoy/extensions/transport_sockets/raw_buffer/v3:pkg_cc_proto", - "@envoy_api//envoy/extensions/udp_packet_writer/v3:pkg_cc_proto", - ] + envoy_select_enable_http3([ - "//source/common/quic:active_quic_listener_lib", - "//source/common/quic:client_connection_factory_lib", - "//source/common/quic:quic_factory_lib", - "//source/common/quic:quic_transport_socket_factory_lib", - "//source/common/quic:udp_gso_batch_writer_lib", - "//source/extensions/udp_packet_writer/gso:config", - ]), + ], alwayslink = True, ) @@ -586,11 +549,12 @@ envoy_cc_library( ], deps = [ ":active_raw_udp_listener_config", + ":api_listener_lib", ":configuration_lib", ":connection_handler_lib", ":guarddog_lib", ":listener_hooks_lib", - ":listener_manager_lib", + ":listener_manager_factory_lib", ":regex_engine_lib", ":ssl_context_manager_lib", ":worker_lib", diff --git a/source/server/admin/BUILD b/source/server/admin/BUILD index 0c526edc73ded..7aeac01ff1618 100644 --- a/source/server/admin/BUILD +++ b/source/server/admin/BUILD @@ -76,8 +76,8 @@ envoy_cc_library( "//source/common/router:scoped_config_lib", "//source/common/stats:isolated_store_lib", "//source/extensions/access_loggers/common:file_access_log_lib", + "//source/extensions/listener_managers/listener_manager:listener_manager_lib", "//source/extensions/request_id/uuid:config", - "//source/server:listener_manager_lib", ], ) diff --git a/source/server/admin/admin.cc b/source/server/admin/admin.cc index 9b58a1e0b9b5e..595ff4c36734d 100644 --- a/source/server/admin/admin.cc +++ b/source/server/admin/admin.cc @@ -32,9 +32,9 @@ #include "source/common/protobuf/protobuf.h" #include "source/common/protobuf/utility.h" #include "source/common/router/config_impl.h" +#include "source/extensions/listener_managers/listener_manager/listener_impl.h" #include "source/extensions/request_id/uuid/config.h" #include "source/server/admin/utils.h" -#include "source/server/listener_impl.h" #include "absl/strings/str_join.h" #include "absl/strings/str_replace.h" diff --git a/source/server/config_validation/BUILD b/source/server/config_validation/BUILD index 52326bdd8cb5a..3f086dba5e46e 100644 --- a/source/server/config_validation/BUILD +++ b/source/server/config_validation/BUILD @@ -99,6 +99,7 @@ envoy_cc_library( "//source/common/stats:stats_lib", "//source/common/thread_local:thread_local_lib", "//source/common/version:version_lib", + "//source/extensions/listener_managers/listener_manager:listener_manager_lib", "//source/server:configuration_lib", "//source/server:server_lib", "//source/server/admin:admin_lib", diff --git a/source/server/config_validation/server.cc b/source/server/config_validation/server.cc index 795eda570261b..697cb3de93aa7 100644 --- a/source/server/config_validation/server.cc +++ b/source/server/config_validation/server.cc @@ -6,6 +6,7 @@ #include "source/common/common/utility.h" #include "source/common/config/utility.h" +#include "source/common/config/well_known_names.h" #include "source/common/event/real_time_system.h" #include "source/common/local_info/local_info_impl.h" #include "source/common/protobuf/utility.h" @@ -102,9 +103,11 @@ void ValidationInstance::initialize(const Options& options, Configuration::InitialImpl initial_config(bootstrap_); initial_config.initAdminAccessLog(bootstrap_, *this); admin_ = std::make_unique(initial_config.admin().address()); - listener_manager_ = std::make_unique( - *this, std::make_unique(*this), *this, false, - quic_stat_names_); + listener_manager_ = + Config::Utility::getAndCheckFactoryByName( + Config::ServerExtensionValues::get().DEFAULT_LISTENER) + .createListenerManager(*this, std::make_unique(*this), + *this, false, quic_stat_names_); thread_local_.registerThread(*dispatcher_, true); Runtime::LoaderPtr runtime_ptr = component_factory.createRuntime(*this, initial_config); diff --git a/source/server/config_validation/server.h b/source/server/config_validation/server.h index 9db6c4a3afe03..c7757b0f9c4f4 100644 --- a/source/server/config_validation/server.h +++ b/source/server/config_validation/server.h @@ -24,11 +24,13 @@ #include "source/common/runtime/runtime_impl.h" #include "source/common/secret/secret_manager_impl.h" #include "source/common/thread_local/thread_local_impl.h" + +// TODO(alyssawilk) address +#include "source/extensions/listener_managers/listener_manager/listener_manager_impl.h" #include "source/server/config_validation/admin.h" #include "source/server/config_validation/api.h" #include "source/server/config_validation/cluster_manager.h" #include "source/server/config_validation/dns.h" -#include "source/server/listener_manager_impl.h" #include "source/server/server.h" #include "absl/types/optional.h" @@ -235,7 +237,7 @@ class ValidationInstance final : Logger::Loggable, LocalInfo::LocalInfoPtr local_info_; AccessLog::AccessLogManagerImpl access_log_manager_; std::unique_ptr cluster_manager_factory_; - std::unique_ptr listener_manager_; + std::unique_ptr listener_manager_; std::unique_ptr overload_manager_; MutexTracer* mutex_tracer_; Grpc::ContextImpl grpc_context_; diff --git a/source/server/hot_restarting_parent.cc b/source/server/hot_restarting_parent.cc index 7c289fa14364b..727fd2c598192 100644 --- a/source/server/hot_restarting_parent.cc +++ b/source/server/hot_restarting_parent.cc @@ -7,7 +7,6 @@ #include "source/common/stats/stat_merger.h" #include "source/common/stats/symbol_table.h" #include "source/common/stats/utility.h" -#include "source/server/listener_impl.h" namespace Envoy { namespace Server { diff --git a/source/server/listener_manager_factory.h b/source/server/listener_manager_factory.h index 705ea77373975..fb773e9936efc 100644 --- a/source/server/listener_manager_factory.h +++ b/source/server/listener_manager_factory.h @@ -9,12 +9,14 @@ namespace Envoy { namespace Server { + class ListenerManagerFactory : public Config::UntypedFactory { public: virtual std::unique_ptr createListenerManager(Instance& server, std::unique_ptr&& factory, WorkerFactory& worker_factory, bool enable_dispatcher_stats, Quic::QuicStatNames& quic_stat_names) PURE; + std::string category() const override { return "envoy.listener_manager_impl"; } }; diff --git a/source/server/server.cc b/source/server/server.cc index 77f39aca19ce5..a9cc87522c176 100644 --- a/source/server/server.cc +++ b/source/server/server.cc @@ -32,6 +32,7 @@ #include "source/common/config/grpc_mux_impl.h" #include "source/common/config/new_grpc_mux_impl.h" #include "source/common/config/utility.h" +#include "source/common/config/well_known_names.h" #include "source/common/config/xds_mux/grpc_mux_impl.h" #include "source/common/config/xds_resource.h" #include "source/common/http/codes.h" @@ -625,7 +626,7 @@ void InstanceImpl::initialize(Network::Address::InstanceConstSharedPtr local_add // Workers get created first so they register for thread local updates. listener_manager_ = Config::Utility::getAndCheckFactoryByName( - "envoy.listener_manager_impl.default") + Config::ServerExtensionValues::get().DEFAULT_LISTENER) .createListenerManager(*this, nullptr, worker_factory_, bootstrap_.enable_dispatcher_stats(), quic_stat_names_); diff --git a/test/extensions/listener_managers/listener_manager/BUILD b/test/extensions/listener_managers/listener_manager/BUILD new file mode 100644 index 0000000000000..4beb2f0ed5c71 --- /dev/null +++ b/test/extensions/listener_managers/listener_manager/BUILD @@ -0,0 +1,91 @@ +load( + "//bazel:envoy_build_system.bzl", + "envoy_cc_test", + "envoy_cc_test_library", + "envoy_package", +) + +licenses(["notice"]) # Apache 2 + +envoy_package() + +envoy_cc_test_library( + name = "listener_manager_impl_test_lib", + hdrs = ["listener_manager_impl_test.h"], + data = ["//test/extensions/transport_sockets/tls/test_data:certs"], + deps = [ + "//source/common/init:manager_lib", + "//source/extensions/common/matcher:trie_matcher_lib", + "//source/extensions/listener_managers/listener_manager:listener_manager_lib", + "//test/mocks/init:init_mocks", + "//test/mocks/matcher:matcher_mocks", + "//test/mocks/network:network_mocks", + "//test/mocks/server:drain_manager_mocks", + "//test/mocks/server:guard_dog_mocks", + "//test/mocks/server:instance_mocks", + "//test/mocks/server:listener_component_factory_mocks", + "//test/mocks/server:worker_factory_mocks", + "//test/mocks/server:worker_mocks", + "//test/mocks/stream_info:stream_info_mocks", + "//test/test_common:environment_lib", + "//test/test_common:simulated_time_system_lib", + "//test/test_common:test_runtime_lib", + "//test/test_common:test_time_lib", + "//test/test_common:threadsafe_singleton_injector_lib", + "@envoy_api//envoy/admin/v3:pkg_cc_proto", + "@envoy_api//envoy/config/core/v3:pkg_cc_proto", + "@envoy_api//envoy/config/listener/v3:pkg_cc_proto", + ], +) + +envoy_cc_test( + name = "listener_manager_impl_test", + srcs = ["listener_manager_impl_test.cc"], + deps = [ + ":listener_manager_impl_test_lib", + "//source/common/api:os_sys_calls_lib", + "//source/common/config:metadata_lib", + "//source/common/network:addr_family_aware_socket_option_lib", + "//source/common/network:listen_socket_lib", + "//source/common/network:socket_option_lib", + "//source/common/network:utility_lib", + "//source/common/protobuf", + "//source/extensions/filters/listener/original_dst:config", + "//source/extensions/filters/listener/proxy_protocol:config", + "//source/extensions/filters/listener/tls_inspector:config", + "//source/extensions/filters/network/http_connection_manager:config", + "//source/extensions/filters/network/tcp_proxy:config", + "//source/extensions/request_id/uuid:config", + "//source/extensions/transport_sockets/raw_buffer:config", + "//source/extensions/transport_sockets/tls:config", + "//source/extensions/transport_sockets/tls:ssl_socket_lib", + "//source/server:active_raw_udp_listener_config", + "//test/integration/filters:test_listener_filter_lib", + "//test/server:utility_lib", + "//test/test_common:network_utility_lib", + "//test/test_common:registry_lib", + "//test/test_common:test_runtime_lib", + "@envoy_api//envoy/admin/v3:pkg_cc_proto", + "@envoy_api//envoy/config/core/v3:pkg_cc_proto", + "@envoy_api//envoy/config/listener/v3:pkg_cc_proto", + ], +) + +# Stand-alone quic test because of FIPS. +envoy_cc_test( + name = "listener_manager_impl_quic_only_test", + srcs = ["listener_manager_impl_quic_only_test.cc"], + tags = ["nofips"], + deps = [ + ":listener_manager_impl_test_lib", + "//source/extensions/filters/http/router:config", + "//source/extensions/request_id/uuid:config", + "//source/extensions/transport_sockets/raw_buffer:config", + "//source/extensions/transport_sockets/tls:config", + "//test/integration/filters:test_network_filter_lib", + "//test/server:utility_lib", + "//test/test_common:threadsafe_singleton_injector_lib", + "@envoy_api//envoy/config/core/v3:pkg_cc_proto", + "@envoy_api//envoy/config/listener/v3:pkg_cc_proto", + ], +) diff --git a/test/server/listener_manager_impl_quic_only_test.cc b/test/extensions/listener_managers/listener_manager/listener_manager_impl_quic_only_test.cc similarity index 99% rename from test/server/listener_manager_impl_quic_only_test.cc rename to test/extensions/listener_managers/listener_manager/listener_manager_impl_quic_only_test.cc index a308b76313862..a21e106c13129 100644 --- a/test/server/listener_manager_impl_quic_only_test.cc +++ b/test/extensions/listener_managers/listener_manager/listener_manager_impl_quic_only_test.cc @@ -5,7 +5,7 @@ #include "source/common/quic/quic_transport_socket_factory.h" #endif -#include "test/server/listener_manager_impl_test.h" +#include "test/extensions/listener_managers/listener_manager/listener_manager_impl_test.h" #include "test/server/utility.h" #include "test/test_common/threadsafe_singleton_injector.h" diff --git a/test/server/listener_manager_impl_test.cc b/test/extensions/listener_managers/listener_manager/listener_manager_impl_test.cc similarity index 98% rename from test/server/listener_manager_impl_test.cc rename to test/extensions/listener_managers/listener_manager/listener_manager_impl_test.cc index 5f28229ce0ff3..7e4dd29914cfc 100644 --- a/test/server/listener_manager_impl_test.cc +++ b/test/extensions/listener_managers/listener_manager/listener_manager_impl_test.cc @@ -1,4 +1,4 @@ -#include "test/server/listener_manager_impl_test.h" +#include "test/extensions/listener_managers/listener_manager/listener_manager_impl_test.h" #include #include @@ -5660,11 +5660,56 @@ TEST_P(ListenerManagerImplWithRealFiltersTest, OriginalDstFilter) { Network::Address::IpVersion::v4); EXPECT_CALL(server_.api_.random_, uuid()); EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, default_bind_type, _, 0)); + + Configuration::ListenerFactoryContext* listener_factory_context = nullptr; + // Extract listener_factory_context to unit test functions. + ON_CALL(listener_factory_, createListenerFilterFactoryList(_, _)) + .WillByDefault( + Invoke([&listener_factory_context, this]( + const Protobuf::RepeatedPtrField& + filters, + Configuration::ListenerFactoryContext& context) + -> Filter::ListenerFilterFactoriesList { + listener_factory_context = &context; + return ProdListenerComponentFactory::createListenerFilterFactoryListImpl( + filters, context, *listener_factory_.getTcpListenerConfigProviderManager()); + })); + addOrUpdateListener(parseListenerFromV3Yaml(yaml)); EXPECT_EQ(1U, manager_->listeners().size()); - Network::ListenerConfig& listener = manager_->listeners().back().get(); + // Unit test PerListenerFactoryContextImpl for coverage. + ASSERT_TRUE(listener_factory_context != nullptr); + ListenerFactoryContextBaseImpl& parent_context = + static_cast(listener_factory_context)->parentFactoryContext(); + EXPECT_EQ(&listener_factory_context->timeSource(), &listener_factory_context->api().timeSource()); + EXPECT_EQ(&listener_factory_context->initManager(), &listener.initManager()); + EXPECT_EQ(&listener_factory_context->lifecycleNotifier(), &server_.lifecycleNotifier()); + EXPECT_EQ(&listener_factory_context->messageValidationContext(), + &listener_factory_context->getServerFactoryContext().messageValidationContext()); + EXPECT_EQ(&listener_factory_context->mainThreadDispatcher(), + &parent_context.mainThreadDispatcher()); + EXPECT_EQ(&listener_factory_context->options(), &parent_context.options()); + EXPECT_EQ(&listener_factory_context->grpcContext(), &parent_context.grpcContext()); + EXPECT_EQ(listener_factory_context->healthCheckFailed(), parent_context.healthCheckFailed()); + EXPECT_EQ(&listener_factory_context->httpContext(), &parent_context.httpContext()); + EXPECT_EQ(&listener_factory_context->routerContext(), &parent_context.routerContext()); + EXPECT_EQ(&listener_factory_context->overloadManager(), &parent_context.overloadManager()); + EXPECT_EQ(listener_factory_context->admin().has_value(), parent_context.admin().has_value()); + EXPECT_EQ(&listener_factory_context->listenerTypedMetadata(), + &parent_context.listenerTypedMetadata()); + EXPECT_EQ(listener_factory_context->processContext().has_value(), + parent_context.processContext().has_value()); + EXPECT_EQ(&listener_factory_context->getTransportSocketFactoryContext(), + &parent_context.getTransportSocketFactoryContext()); + EXPECT_EQ(listener_factory_context->isQuicListener(), parent_context.isQuicListener()); + + // Unit test ListenerFactoryContextBaseImpl for coverage. + EXPECT_EQ(&parent_context.timeSource(), &listener_factory_context->api().timeSource()); + EXPECT_EQ(&parent_context.messageValidationContext(), &server_.messageValidationContext()); + EXPECT_EQ(&parent_context.lifecycleNotifier(), &server_.lifecycleNotifier()); + Network::FilterChainFactory& filterChainFactory = listener.filterChainFactory(); Network::MockListenerFilterManager manager; diff --git a/test/server/listener_manager_impl_test.h b/test/extensions/listener_managers/listener_manager/listener_manager_impl_test.h similarity index 99% rename from test/server/listener_manager_impl_test.h rename to test/extensions/listener_managers/listener_manager/listener_manager_impl_test.h index 43bb40a5f4110..d426a774d167a 100644 --- a/test/server/listener_manager_impl_test.h +++ b/test/extensions/listener_managers/listener_manager/listener_manager_impl_test.h @@ -9,8 +9,9 @@ #include "source/common/network/listen_socket_impl.h" #include "source/common/network/socket_option_impl.h" +#include "source/extensions/listener_managers/listener_manager/listener_impl.h" +#include "source/extensions/listener_managers/listener_manager/listener_manager_impl.h" #include "source/server/configuration_impl.h" -#include "source/server/listener_manager_impl.h" #include "test/mocks/network/mocks.h" #include "test/mocks/server/drain_manager.h" diff --git a/test/integration/BUILD b/test/integration/BUILD index c02abfb629bac..d33c2ee6f8448 100644 --- a/test/integration/BUILD +++ b/test/integration/BUILD @@ -845,7 +845,7 @@ envoy_cc_test_library( deps = [ "//test/mocks/runtime:runtime_mocks", "//test/mocks/protobuf:protobuf_mocks", - "//source/server:listener_manager_lib", + "//source/extensions/listener_managers/listener_manager:listener_manager_lib", "//envoy/api:api_interface", "//envoy/grpc:status", "//envoy/http:codec_interface", diff --git a/test/server/BUILD b/test/server/BUILD index 5d4f485718c95..5ee555853a1f0 100644 --- a/test/server/BUILD +++ b/test/server/BUILD @@ -21,8 +21,8 @@ envoy_cc_test( srcs = ["api_listener_test.cc"], deps = [ ":utility_lib", + "//source/extensions/listener_managers/listener_manager:listener_manager_lib", "//source/extensions/request_id/uuid:config", - "//source/server:listener_manager_lib", "//test/mocks/network:network_mocks", "//test/mocks/server:instance_mocks", "//test/mocks/server:listener_component_factory_mocks", @@ -268,87 +268,6 @@ envoy_cc_test( ], ) -envoy_cc_test_library( - name = "listener_manager_impl_test_lib", - hdrs = ["listener_manager_impl_test.h"], - data = ["//test/extensions/transport_sockets/tls/test_data:certs"], - deps = [ - "//source/common/init:manager_lib", - "//source/extensions/common/matcher:trie_matcher_lib", - "//source/server:listener_manager_lib", - "//test/mocks/init:init_mocks", - "//test/mocks/matcher:matcher_mocks", - "//test/mocks/network:network_mocks", - "//test/mocks/server:drain_manager_mocks", - "//test/mocks/server:guard_dog_mocks", - "//test/mocks/server:instance_mocks", - "//test/mocks/server:listener_component_factory_mocks", - "//test/mocks/server:worker_factory_mocks", - "//test/mocks/server:worker_mocks", - "//test/mocks/stream_info:stream_info_mocks", - "//test/test_common:environment_lib", - "//test/test_common:simulated_time_system_lib", - "//test/test_common:test_runtime_lib", - "//test/test_common:test_time_lib", - "//test/test_common:threadsafe_singleton_injector_lib", - "@envoy_api//envoy/admin/v3:pkg_cc_proto", - "@envoy_api//envoy/config/core/v3:pkg_cc_proto", - "@envoy_api//envoy/config/listener/v3:pkg_cc_proto", - ], -) - -envoy_cc_test( - name = "listener_manager_impl_test", - srcs = ["listener_manager_impl_test.cc"], - deps = [ - ":listener_manager_impl_test_lib", - ":utility_lib", - "//source/common/api:os_sys_calls_lib", - "//source/common/config:metadata_lib", - "//source/common/network:addr_family_aware_socket_option_lib", - "//source/common/network:listen_socket_lib", - "//source/common/network:socket_option_lib", - "//source/common/network:utility_lib", - "//source/common/protobuf", - "//source/extensions/filters/listener/original_dst:config", - "//source/extensions/filters/listener/proxy_protocol:config", - "//source/extensions/filters/listener/tls_inspector:config", - "//source/extensions/filters/network/http_connection_manager:config", - "//source/extensions/filters/network/tcp_proxy:config", - "//source/extensions/request_id/uuid:config", - "//source/extensions/transport_sockets/raw_buffer:config", - "//source/extensions/transport_sockets/tls:config", - "//source/extensions/transport_sockets/tls:ssl_socket_lib", - "//source/server:active_raw_udp_listener_config", - "//test/integration/filters:test_listener_filter_lib", - "//test/test_common:network_utility_lib", - "//test/test_common:registry_lib", - "//test/test_common:test_runtime_lib", - "@envoy_api//envoy/admin/v3:pkg_cc_proto", - "@envoy_api//envoy/config/core/v3:pkg_cc_proto", - "@envoy_api//envoy/config/listener/v3:pkg_cc_proto", - ], -) - -# Stand-alone quic test because of FIPS. -envoy_cc_test( - name = "listener_manager_impl_quic_only_test", - srcs = ["listener_manager_impl_quic_only_test.cc"], - tags = ["nofips"], - deps = [ - ":listener_manager_impl_test_lib", - ":utility_lib", - "//source/extensions/filters/http/router:config", - "//source/extensions/request_id/uuid:config", - "//source/extensions/transport_sockets/raw_buffer:config", - "//source/extensions/transport_sockets/tls:config", - "//test/integration/filters:test_network_filter_lib", - "//test/test_common:threadsafe_singleton_injector_lib", - "@envoy_api//envoy/config/core/v3:pkg_cc_proto", - "@envoy_api//envoy/config/listener/v3:pkg_cc_proto", - ], -) - envoy_cc_test( name = "filter_chain_manager_impl_test", srcs = ["filter_chain_manager_impl_test.cc"], @@ -363,11 +282,11 @@ envoy_cc_test( "//source/common/network:utility_lib", "//source/common/protobuf", "//source/extensions/filters/network/http_connection_manager:config", + "//source/extensions/listener_managers/listener_manager:listener_manager_lib", "//source/extensions/transport_sockets/raw_buffer:config", "//source/extensions/transport_sockets/tls:config", "//source/extensions/transport_sockets/tls:ssl_socket_lib", "//source/server:filter_chain_manager_lib", - "//source/server:listener_manager_lib", "//test/mocks/network:network_mocks", "//test/mocks/server:drain_manager_mocks", "//test/mocks/server:factory_context_mocks", diff --git a/test/server/filter_chain_manager_impl_test.cc b/test/server/filter_chain_manager_impl_test.cc index f3db9f5db0332..fc844269a8ce9 100644 --- a/test/server/filter_chain_manager_impl_test.cc +++ b/test/server/filter_chain_manager_impl_test.cc @@ -17,10 +17,10 @@ #include "source/common/network/socket_option_impl.h" #include "source/common/network/utility.h" #include "source/common/protobuf/protobuf.h" +#include "source/extensions/listener_managers/listener_manager/listener_impl.h" #include "source/extensions/transport_sockets/tls/ssl_socket.h" #include "source/server/configuration_impl.h" #include "source/server/filter_chain_manager_impl.h" -#include "source/server/listener_manager_impl.h" #include "test/mocks/network/mocks.h" #include "test/mocks/server/drain_manager.h" diff --git a/tools/code_format/config.yaml b/tools/code_format/config.yaml index d0f87cda7a634..8c25fb49a8920 100644 --- a/tools/code_format/config.yaml +++ b/tools/code_format/config.yaml @@ -310,3 +310,4 @@ visibility_excludes: - source/extensions/path/match/uri_template/BUILD - source/extensions/path/rewrite/uri_template/BUILD - source/extensions/quic/connection_id_generator/BUILD +- source/extensions/listener_managers/listener_manager/BUILD diff --git a/tools/extensions/extensions_schema.yaml b/tools/extensions/extensions_schema.yaml index 3d787139db2ab..d1fedfc3c1868 100644 --- a/tools/extensions/extensions_schema.yaml +++ b/tools/extensions/extensions_schema.yaml @@ -76,6 +76,7 @@ categories: - envoy.internal_redirect_predicates - envoy.io_socket - envoy.http.original_ip_detection +- envoy.listener_manager_impl - envoy.matching.common_inputs - envoy.matching.input_matchers - envoy.tls.key_providers