diff --git a/library/common/BUILD b/library/common/BUILD index 93c8071483..0466044dc7 100644 --- a/library/common/BUILD +++ b/library/common/BUILD @@ -35,7 +35,7 @@ envoy_cc_library( "//library/common/event:provisional_dispatcher_lib", "//library/common/http:client_lib", "//library/common/http:header_utility_lib", - "//library/common/network:configurator_lib", + "//library/common/network:connectivity_manager_lib", "//library/common/stats:utility_lib", "//library/common/types:c_types_lib", "@envoy//envoy/server:lifecycle_notifier_interface", diff --git a/library/common/engine.cc b/library/common/engine.cc index e342fa07f6..bf250b52ba 100644 --- a/library/common/engine.cc +++ b/library/common/engine.cc @@ -110,11 +110,11 @@ envoy_status_t Engine::main(const std::string config, const std::string log_leve Envoy::Server::ServerLifecycleNotifier::Stage::PostInit, [this]() -> void { ASSERT(Thread::MainThread::isMainOrTestThread()); - network_configurator_ = - Network::ConfiguratorFactory{server_->serverFactoryContext()}.get(); + connectivity_manager_ = + Network::ConnectivityManagerFactory{server_->serverFactoryContext()}.get(); Envoy::Network::Android::Utility::setAlternateGetifaddrs(); - auto v4_interfaces = network_configurator_->enumerateV4Interfaces(); - auto v6_interfaces = network_configurator_->enumerateV6Interfaces(); + auto v4_interfaces = connectivity_manager_->enumerateV4Interfaces(); + auto v6_interfaces = connectivity_manager_->enumerateV6Interfaces(); logInterfaces("netconf_get_v4_interfaces", v4_interfaces); logInterfaces("netconf_get_v6_interfaces", v6_interfaces); client_scope_ = server_->serverFactoryContext().scope().createScope("pulse."); @@ -140,7 +140,7 @@ envoy_status_t Engine::main(const std::string config, const std::string log_leve // Ensure destructors run on Envoy's main thread. postinit_callback_handler_.reset(nullptr); - network_configurator_.reset(); + connectivity_manager_.reset(); client_scope_.reset(); stat_name_set_.reset(); log_delegate_ptr_.reset(nullptr); @@ -295,10 +295,10 @@ Http::Client& Engine::httpClient() { return *http_client_; } -Network::Configurator& Engine::networkConfigurator() { +Network::ConnectivityManager& Engine::networkConnectivityManager() { RELEASE_ASSERT(dispatcher_->isThreadSafe(), - "networkConfigurator must be accessed from dispatcher's context"); - return *network_configurator_; + "networkConnectivityManager must be accessed from dispatcher's context"); + return *connectivity_manager_; } void Engine::flushStats() { diff --git a/library/common/engine.h b/library/common/engine.h index f4a551bd32..825ae4082a 100644 --- a/library/common/engine.h +++ b/library/common/engine.h @@ -10,7 +10,7 @@ #include "library/common/common/lambda_logger_delegate.h" #include "library/common/engine_common.h" #include "library/common/http/client.h" -#include "library/common/network/configurator.h" +#include "library/common/network/connectivity_manager.h" #include "library/common/types/c_types.h" namespace Envoy { @@ -58,9 +58,9 @@ class Engine : public Logger::Loggable { /** * Accessor for the network configuraator. Must be called from the dispatcher's context. - * @return Network::Configurator&, the network configurator. + * @return Network::ConnectivityManager&, the network connectivity_manager. */ - Network::Configurator& networkConfigurator(); + Network::ConnectivityManager& networkConnectivityManager(); /** * Increment a counter with a given string of elements and by the given count. @@ -145,7 +145,7 @@ class Engine : public Logger::Loggable { Thread::MutexBasicLockable mutex_; Thread::CondVar cv_; Http::ClientPtr http_client_; - Network::ConfiguratorSharedPtr network_configurator_; + Network::ConnectivityManagerSharedPtr connectivity_manager_; Event::ProvisionalDispatcherPtr dispatcher_; // Used by the cerr logger to ensure logs don't overwrite each other. absl::Mutex log_mutex_; diff --git a/library/common/extensions/filters/http/network_configuration/BUILD b/library/common/extensions/filters/http/network_configuration/BUILD index f4429e2d34..0e0bc8b28e 100644 --- a/library/common/extensions/filters/http/network_configuration/BUILD +++ b/library/common/extensions/filters/http/network_configuration/BUILD @@ -22,7 +22,7 @@ envoy_cc_extension( deps = [ ":filter_cc_proto", "//library/common/http:internal_headers_lib", - "//library/common/network:configurator_lib", + "//library/common/network:connectivity_manager_lib", "//library/common/stream_info:extra_stream_info_lib", "//library/common/types:c_types_lib", "@envoy//envoy/http:codes_interface", diff --git a/library/common/extensions/filters/http/network_configuration/config.cc b/library/common/extensions/filters/http/network_configuration/config.cc index 944235b0b3..6a7f8c146e 100644 --- a/library/common/extensions/filters/http/network_configuration/config.cc +++ b/library/common/extensions/filters/http/network_configuration/config.cc @@ -12,14 +12,14 @@ Http::FilterFactoryCb NetworkConfigurationFilterFactory::createFilterFactoryFrom proto_config, const std::string&, Server::Configuration::FactoryContext& context) { - auto network_configurator = Network::ConfiguratorFactory{context}.get(); + auto connectivity_manager = Network::ConnectivityManagerFactory{context}.get(); bool enable_drain_post_dns_refresh = proto_config.enable_drain_post_dns_refresh(); bool enable_interface_binding = proto_config.enable_interface_binding(); - return [network_configurator, enable_drain_post_dns_refresh, + return [connectivity_manager, enable_drain_post_dns_refresh, enable_interface_binding](Http::FilterChainFactoryCallbacks& callbacks) -> void { callbacks.addStreamFilter(std::make_shared( - network_configurator, enable_drain_post_dns_refresh, enable_interface_binding)); + connectivity_manager, enable_drain_post_dns_refresh, enable_interface_binding)); }; } diff --git a/library/common/extensions/filters/http/network_configuration/filter.cc b/library/common/extensions/filters/http/network_configuration/filter.cc index 9eed2c045a..da7ed50300 100644 --- a/library/common/extensions/filters/http/network_configuration/filter.cc +++ b/library/common/extensions/filters/http/network_configuration/filter.cc @@ -20,19 +20,19 @@ void NetworkConfigurationFilter::setDecoderFilterCallbacks( StreamInfo::FilterState::StateType::Mutable, StreamInfo::FilterState::LifeSpan::Request); auto options = std::make_shared(); - network_configurator_->setInterfaceBindingEnabled(enable_interface_binding_); - network_configurator_->setDrainPostDnsRefreshEnabled(enable_drain_post_dns_refresh_); - extra_stream_info_->configuration_key_ = network_configurator_->addUpstreamSocketOptions(options); + connectivity_manager_->setInterfaceBindingEnabled(enable_interface_binding_); + connectivity_manager_->setDrainPostDnsRefreshEnabled(enable_drain_post_dns_refresh_); + extra_stream_info_->configuration_key_ = connectivity_manager_->addUpstreamSocketOptions(options); decoder_callbacks_->addUpstreamSocketOptions(options); } Http::FilterHeadersStatus NetworkConfigurationFilter::encodeHeaders(Http::ResponseHeaderMap&, bool) { ENVOY_LOG(debug, "NetworkConfigurationFilter::encodeHeaders"); - // Report request status to network configurator, so that socket configuration may be adapted - // to current network conditions. Receiving headers from upstream always means some level of - // network transmission was successful, so we unconditionally set network_fault to false. - network_configurator_->reportNetworkUsage(extra_stream_info_->configuration_key_.value(), + // Report request status to network connectivity_manager, so that socket configuration may be + // adapted to current network conditions. Receiving headers from upstream always means some level + // of network transmission was successful, so we unconditionally set network_fault to false. + connectivity_manager_->reportNetworkUsage(extra_stream_info_->configuration_key_.value(), false /* network_fault */); return Http::FilterHeadersStatus::Continue; @@ -45,16 +45,16 @@ Http::LocalErrorStatus NetworkConfigurationFilter::onLocalReply(const LocalReply // Envoy uses local replies to report various local errors, including networking failures (which // Envoy Mobile later surfaces as errors). As a proxy for the many different types of network // errors, this code interprets any local error where a stream received no bytes from the upstream - // as a network fault. This status is passed to the configurator below when we report network - // usage, where it may be factored into future socket configuration. + // as a network fault. This status is passed to the connectivity_manager below when we report + // network usage, where it may be factored into future socket configuration. bool network_fault = !success_status && (!decoder_callbacks_->streamInfo().upstreamInfo() || !decoder_callbacks_->streamInfo() .upstreamInfo() ->upstreamTiming() .first_upstream_rx_byte_received_.has_value()); - // Report request status to network configurator, so that socket configuration may be adapted - // to current network conditions. - network_configurator_->reportNetworkUsage(extra_stream_info_->configuration_key_.value(), + // Report request status to network connectivity_manager, so that socket configuration may be + // adapted to current network conditions. + connectivity_manager_->reportNetworkUsage(extra_stream_info_->configuration_key_.value(), network_fault); return Http::LocalErrorStatus::ContinueAndResetStream; diff --git a/library/common/extensions/filters/http/network_configuration/filter.h b/library/common/extensions/filters/http/network_configuration/filter.h index cd628d2bdf..20d28bbc83 100644 --- a/library/common/extensions/filters/http/network_configuration/filter.h +++ b/library/common/extensions/filters/http/network_configuration/filter.h @@ -6,7 +6,7 @@ #include "source/extensions/filters/http/common/pass_through_filter.h" #include "library/common/extensions/filters/http/network_configuration/filter.pb.h" -#include "library/common/network/configurator.h" +#include "library/common/network/connectivity_manager.h" #include "library/common/stream_info/extra_stream_info.h" #include "library/common/types/c_types.h" @@ -21,9 +21,9 @@ namespace NetworkConfiguration { class NetworkConfigurationFilter final : public Http::PassThroughFilter, public Logger::Loggable { public: - NetworkConfigurationFilter(Network::ConfiguratorSharedPtr network_configurator, + NetworkConfigurationFilter(Network::ConnectivityManagerSharedPtr connectivity_manager, bool enable_drain_post_dns_refresh, bool enable_interface_binding) - : network_configurator_(network_configurator), + : connectivity_manager_(connectivity_manager), extra_stream_info_(nullptr), // always set in setDecoderFilterCallbacks enable_drain_post_dns_refresh_(enable_drain_post_dns_refresh), enable_interface_binding_(enable_interface_binding) {} @@ -36,7 +36,7 @@ class NetworkConfigurationFilter final : public Http::PassThroughFilter, Http::LocalErrorStatus onLocalReply(const LocalReplyData&) override; private: - Network::ConfiguratorSharedPtr network_configurator_; + Network::ConnectivityManagerSharedPtr connectivity_manager_; StreamInfo::ExtraStreamInfo* extra_stream_info_; bool enable_drain_post_dns_refresh_; bool enable_interface_binding_; diff --git a/library/common/extensions/filters/http/network_configuration/filter.proto b/library/common/extensions/filters/http/network_configuration/filter.proto index 88ff62ca9e..15f52002ef 100644 --- a/library/common/extensions/filters/http/network_configuration/filter.proto +++ b/library/common/extensions/filters/http/network_configuration/filter.proto @@ -3,11 +3,11 @@ syntax = "proto3"; package envoymobile.extensions.filters.http.network_configuration; message NetworkConfiguration { - // If set to true, the filter will permit the NetworkConfigurator to provide upstream + // If set to true, the filter will permit the NetworkConnectivityManager to provide upstream // socket option that MAY bind a connection to a specific network interface. bool enable_interface_binding = 1; - // If set to true, the filter will permit the NetworkConfigurator to drain connections + // If set to true, the filter will permit the NetworkConnectivityManager to drain connections // when a DNS refresh is externally triggered. bool enable_drain_post_dns_refresh = 2; } diff --git a/library/common/extensions/retry/options/network_configuration/BUILD b/library/common/extensions/retry/options/network_configuration/BUILD index 1e05c51134..fd373a4080 100644 --- a/library/common/extensions/retry/options/network_configuration/BUILD +++ b/library/common/extensions/retry/options/network_configuration/BUILD @@ -21,7 +21,7 @@ envoy_cc_extension( repository = "@envoy", deps = [ ":predicate_cc_proto", - "//library/common/network:configurator_lib", + "//library/common/network:connectivity_manager_lib", "//library/common/stream_info:extra_stream_info_lib", "@envoy//envoy/upstream:retry_interface", ], diff --git a/library/common/extensions/retry/options/network_configuration/predicate.cc b/library/common/extensions/retry/options/network_configuration/predicate.cc index c5aa06c43b..7f6816728c 100644 --- a/library/common/extensions/retry/options/network_configuration/predicate.cc +++ b/library/common/extensions/retry/options/network_configuration/predicate.cc @@ -11,8 +11,9 @@ NetworkConfigurationRetryOptionsPredicate::NetworkConfigurationRetryOptionsPredi const envoymobile::extensions::retry::options::network_configuration:: NetworkConfigurationOptionsPredicate&, Upstream::RetryExtensionFactoryContext& context) { - network_configurator_ = Network::ConfiguratorHandle{context.singletonManager()}.get(); - RELEASE_ASSERT(network_configurator_ != nullptr, "unexpected nullptr network configurator"); + connectivity_manager_ = Network::ConnectivityManagerHandle{context.singletonManager()}.get(); + RELEASE_ASSERT(connectivity_manager_ != nullptr, + "unexpected nullptr network connectivity_manager"); } Upstream::RetryOptionsPredicate::UpdateOptionsReturn @@ -53,25 +54,26 @@ NetworkConfigurationRetryOptionsPredicate::updateOptions( // As a proxy for the many different types of network errors, this code interprets any failure // where a stream received no bytes from the upstream as a network fault. This status is passed to - // the configurator below when we report network usage, where it may be factored into future - // socket configuration. + // the connectivity_manager below when we report network usage, where it may be factored into + // future socket configuration. bool network_fault = !stream_info.upstreamInfo() || !stream_info.upstreamInfo()->upstreamTiming().first_upstream_rx_byte_received_.has_value(); - // Report request status to network configurator, so that socket configuration may be adapted - // to current network conditions. - network_configurator_->reportNetworkUsage(extra_stream_info->configuration_key_.value(), + // Report request status to network connectivity_manager, so that socket configuration may be + // adapted to current network conditions. + connectivity_manager_->reportNetworkUsage(extra_stream_info->configuration_key_.value(), network_fault); // Update socket configuration for next retry attempt. - extra_stream_info->configuration_key_ = network_configurator_->addUpstreamSocketOptions(options); + extra_stream_info->configuration_key_ = connectivity_manager_->addUpstreamSocketOptions(options); // The options returned here replace any existing socket options used for a prior attempt. At - // present, all socket options set in Envoy Mobile are provided by the NetworkConfigurator, so - // it's safe to simply replace them. + // present, all socket options set in Envoy Mobile are provided by the NetworkConnectivityManager, + // so it's safe to simply replace them. // TODO(goaway): If additional socket options are ever provided by a source other than the - // NetworkConfigurator, we need to account for the potential presence of those options here. + // NetworkConnectivityManager, we need to account for the potential presence of those options + // here. return Upstream::RetryOptionsPredicate::UpdateOptionsReturn{options}; } diff --git a/library/common/extensions/retry/options/network_configuration/predicate.h b/library/common/extensions/retry/options/network_configuration/predicate.h index 6bc2fc5bbe..ab09da57ec 100644 --- a/library/common/extensions/retry/options/network_configuration/predicate.h +++ b/library/common/extensions/retry/options/network_configuration/predicate.h @@ -6,7 +6,7 @@ #include "library/common/extensions/retry/options/network_configuration/predicate.pb.h" #include "library/common/extensions/retry/options/network_configuration/predicate.pb.validate.h" -#include "library/common/network/configurator.h" +#include "library/common/network/connectivity_manager.h" namespace Envoy { namespace Extensions { @@ -25,7 +25,7 @@ class NetworkConfigurationRetryOptionsPredicate : public Upstream::RetryOptionsP updateOptions(const Upstream::RetryOptionsPredicate::UpdateOptionsParameters&) const override; private: - Network::ConfiguratorSharedPtr network_configurator_; + Network::ConnectivityManagerSharedPtr connectivity_manager_; }; } // namespace Options diff --git a/library/common/http/BUILD b/library/common/http/BUILD index d846333a9f..f420aa77f2 100644 --- a/library/common/http/BUILD +++ b/library/common/http/BUILD @@ -19,7 +19,7 @@ envoy_cc_library( "//library/common/extensions/filters/http/network_configuration:network_configuration_filter_lib", "//library/common/http:header_utility_lib", "//library/common/jni:android_jni_utility_lib", - "//library/common/network:configurator_lib", + "//library/common/network:connectivity_manager_lib", "//library/common/network:synthetic_address_lib", "//library/common/stream_info:extra_stream_info_lib", "//library/common/types:c_types_lib", diff --git a/library/common/http/client.cc b/library/common/http/client.cc index 3cd006b842..e0fa32c0e4 100644 --- a/library/common/http/client.cc +++ b/library/common/http/client.cc @@ -14,7 +14,7 @@ #include "library/common/http/header_utility.h" #include "library/common/http/headers.h" #include "library/common/jni/android_jni_utility.h" -#include "library/common/network/configurator.h" +#include "library/common/network/connectivity_manager.h" #include "library/common/stream_info/extra_stream_info.h" namespace Envoy { diff --git a/library/common/main_interface.cc b/library/common/main_interface.cc index b9fcb4851e..b2e7404326 100644 --- a/library/common/main_interface.cc +++ b/library/common/main_interface.cc @@ -9,7 +9,7 @@ #include "library/common/engine_handle.h" #include "library/common/extensions/filters/http/platform_bridge/c_types.h" #include "library/common/http/client.h" -#include "library/common/network/configurator.h" +#include "library/common/network/connectivity_manager.h" // NOLINT(namespace-envoy) @@ -66,9 +66,10 @@ envoy_status_t reset_stream(envoy_engine_t engine, envoy_stream_t stream) { } envoy_status_t set_preferred_network(envoy_engine_t engine, envoy_network_t network) { - envoy_netconf_t configuration_key = Envoy::Network::Configurator::setPreferredNetwork(network); + envoy_netconf_t configuration_key = + Envoy::Network::ConnectivityManager::setPreferredNetwork(network); Envoy::EngineHandle::runOnEngineDispatcher(engine, [configuration_key](auto& engine) -> void { - engine.networkConfigurator().refreshDns(configuration_key, true); + engine.networkConnectivityManager().refreshDns(configuration_key, true); }); // TODO(snowp): Should this return failure ever? return ENVOY_SUCCESS; @@ -191,5 +192,5 @@ void terminate_engine(envoy_engine_t engine) { Envoy::EngineHandle::terminateEng envoy_status_t reset_connectivity_state(envoy_engine_t e) { return Envoy::EngineHandle::runOnEngineDispatcher( - e, [](auto& engine) { engine.networkConfigurator().resetConnectivityState(); }); + e, [](auto& engine) { engine.networkConnectivityManager().resetConnectivityState(); }); } diff --git a/library/common/network/BUILD b/library/common/network/BUILD index e7d023b0b1..66f9a76d50 100644 --- a/library/common/network/BUILD +++ b/library/common/network/BUILD @@ -5,9 +5,9 @@ licenses(["notice"]) # Apache 2 envoy_package() envoy_cc_library( - name = "configurator_lib", + name = "connectivity_manager_lib", srcs = [ - "configurator.cc", + "connectivity_manager.cc", "android.cc", ] + select({ "//bazel:include_ifaddrs": [ @@ -19,7 +19,7 @@ envoy_cc_library( }), hdrs = [ "android.h", - "configurator.h", + "connectivity_manager.h", ], copts = select({ "//bazel:include_ifaddrs": ["-DINCLUDE_IFADDRS"], diff --git a/library/common/network/configurator.cc b/library/common/network/connectivity_manager.cc similarity index 84% rename from library/common/network/configurator.cc rename to library/common/network/connectivity_manager.cc index 4cbe43521e..8d9cebbf7b 100644 --- a/library/common/network/configurator.cc +++ b/library/common/network/connectivity_manager.cc @@ -1,4 +1,4 @@ -#include "library/common/network/configurator.h" +#include "library/common/network/connectivity_manager.h" #include @@ -66,7 +66,7 @@ constexpr absl::string_view WwanPrefix = ""; namespace Envoy { namespace Network { -SINGLETON_MANAGER_REGISTRATION(network_configurator); +SINGLETON_MANAGER_REGISTRATION(connectivity_manager); constexpr absl::string_view BaseDnsCache = "base_dns_cache"; @@ -76,11 +76,11 @@ constexpr unsigned int InitialFaultThreshold = 1; // L7 bytes) before switching socket mode. constexpr unsigned int MaxFaultThreshold = 3; -Configurator::NetworkState Configurator::network_state_{1, ENVOY_NET_GENERIC, MaxFaultThreshold, - DefaultPreferredNetworkMode, - Thread::MutexBasicLockable{}}; +ConnectivityManager::NetworkState ConnectivityManager::network_state_{ + 1, ENVOY_NET_GENERIC, MaxFaultThreshold, DefaultPreferredNetworkMode, + Thread::MutexBasicLockable{}}; -envoy_netconf_t Configurator::setPreferredNetwork(envoy_network_t network) { +envoy_netconf_t ConnectivityManager::setPreferredNetwork(envoy_network_t network) { Thread::LockGuard lock{network_state_.mutex_}; // TODO(goaway): Re-enable this guard. There's some concern that this will miss network updates @@ -101,28 +101,29 @@ envoy_netconf_t Configurator::setPreferredNetwork(envoy_network_t network) { return network_state_.configuration_key_; } -envoy_network_t Configurator::getPreferredNetwork() { +envoy_network_t ConnectivityManager::getPreferredNetwork() { Thread::LockGuard lock{network_state_.mutex_}; return network_state_.network_; } -envoy_socket_mode_t Configurator::getSocketMode() { +envoy_socket_mode_t ConnectivityManager::getSocketMode() { Thread::LockGuard lock{network_state_.mutex_}; return network_state_.socket_mode_; } -envoy_netconf_t Configurator::getConfigurationKey() { +envoy_netconf_t ConnectivityManager::getConfigurationKey() { Thread::LockGuard lock{network_state_.mutex_}; return network_state_.configuration_key_; } -// This call contains the main heuristic that will determine if the network configurator switches -// socket modes: If the configuration_key isn't current, don't do anything. If there was no fault -// (i.e. success) reset remaining_faults_ to MaxFaultTreshold. If there was a network fault, +// This call contains the main heuristic that will determine if the network connectivity_manager +// switches socket modes: If the configuration_key isn't current, don't do anything. If there was no +// fault (i.e. success) reset remaining_faults_ to MaxFaultTreshold. If there was a network fault, // decrement remaining_faults_. // - At 0, increment configuration_key, reset remaining_faults_ to InitialFaultThreshold and // toggle socket_mode_. -void Configurator::reportNetworkUsage(envoy_netconf_t configuration_key, bool network_fault) { +void ConnectivityManager::reportNetworkUsage(envoy_netconf_t configuration_key, + bool network_fault) { ENVOY_LOG(debug, "reportNetworkUsage(configuration_key: {}, network_fault: {})", configuration_key, network_fault); @@ -180,7 +181,7 @@ void Configurator::reportNetworkUsage(envoy_netconf_t configuration_key, bool ne } } -void Configurator::onDnsResolutionComplete( +void ConnectivityManager::onDnsResolutionComplete( const std::string& resolved_host, const Extensions::Common::DynamicForwardProxy::DnsHostInfoSharedPtr&, Network::DnsResolver::ResolutionStatus) { @@ -203,7 +204,7 @@ void Configurator::onDnsResolutionComplete( } } -void Configurator::setDrainPostDnsRefreshEnabled(bool enabled) { +void ConnectivityManager::setDrainPostDnsRefreshEnabled(bool enabled) { enable_drain_post_dns_refresh_ = enabled; if (!enabled) { hosts_to_drain_.clear(); @@ -217,9 +218,11 @@ void Configurator::setDrainPostDnsRefreshEnabled(bool enabled) { } } -void Configurator::setInterfaceBindingEnabled(bool enabled) { enable_interface_binding_ = enabled; } +void ConnectivityManager::setInterfaceBindingEnabled(bool enabled) { + enable_interface_binding_ = enabled; +} -void Configurator::refreshDns(envoy_netconf_t configuration_key, bool drain_connections) { +void ConnectivityManager::refreshDns(envoy_netconf_t configuration_key, bool drain_connections) { { Thread::LockGuard lock{network_state_.mutex_}; @@ -249,7 +252,7 @@ void Configurator::refreshDns(envoy_netconf_t configuration_key, bool drain_conn } } -Extensions::Common::DynamicForwardProxy::DnsCacheSharedPtr Configurator::dnsCache() { +Extensions::Common::DynamicForwardProxy::DnsCacheSharedPtr ConnectivityManager::dnsCache() { auto cache = dns_cache_manager_->lookUpCacheByName(BaseDnsCache); if (!cache) { ENVOY_LOG_EVENT(warn, "netconf_dns_cache_missing", BaseDnsCache); @@ -257,7 +260,7 @@ Extensions::Common::DynamicForwardProxy::DnsCacheSharedPtr Configurator::dnsCach return cache; } -void Configurator::resetConnectivityState() { +void ConnectivityManager::resetConnectivityState() { envoy_netconf_t configuration_key; { Thread::LockGuard lock{network_state_.mutex_}; @@ -269,16 +272,17 @@ void Configurator::resetConnectivityState() { refreshDns(configuration_key, true); } -std::vector Configurator::enumerateV4Interfaces() { +std::vector ConnectivityManager::enumerateV4Interfaces() { return enumerateInterfaces(AF_INET, 0, 0); } -std::vector Configurator::enumerateV6Interfaces() { +std::vector ConnectivityManager::enumerateV6Interfaces() { return enumerateInterfaces(AF_INET6, 0, 0); } -Socket::OptionsSharedPtr Configurator::getUpstreamSocketOptions(envoy_network_t network, - envoy_socket_mode_t socket_mode) { +Socket::OptionsSharedPtr +ConnectivityManager::getUpstreamSocketOptions(envoy_network_t network, + envoy_socket_mode_t socket_mode) { if (enable_interface_binding_ && socket_mode == AlternateBoundInterfaceMode && network != ENVOY_NET_GENERIC) { return getAlternateInterfaceSocketOptions(network); @@ -296,7 +300,8 @@ Socket::OptionsSharedPtr Configurator::getUpstreamSocketOptions(envoy_network_t return options; } -Socket::OptionsSharedPtr Configurator::getAlternateInterfaceSocketOptions(envoy_network_t network) { +Socket::OptionsSharedPtr +ConnectivityManager::getAlternateInterfaceSocketOptions(envoy_network_t network) { auto v4_pair = getActiveAlternateInterface(network, AF_INET); auto v6_pair = getActiveAlternateInterface(network, AF_INET6); ENVOY_LOG(debug, "found active alternate interface (ipv4): {} {}", std::get<0>(v4_pair), @@ -331,7 +336,7 @@ Socket::OptionsSharedPtr Configurator::getAlternateInterfaceSocketOptions(envoy_ return options; } -envoy_netconf_t Configurator::addUpstreamSocketOptions(Socket::OptionsSharedPtr options) { +envoy_netconf_t ConnectivityManager::addUpstreamSocketOptions(Socket::OptionsSharedPtr options) { envoy_netconf_t configuration_key; envoy_network_t network; envoy_socket_mode_t socket_mode; @@ -348,8 +353,8 @@ envoy_netconf_t Configurator::addUpstreamSocketOptions(Socket::OptionsSharedPtr return configuration_key; } -InterfacePair Configurator::getActiveAlternateInterface(envoy_network_t network, - unsigned short family) { +InterfacePair ConnectivityManager::getActiveAlternateInterface(envoy_network_t network, + unsigned short family) { // Attempt to derive an active interface that differs from the passed network parameter. if (network == ENVOY_NET_WWAN) { // Network is cellular, so look for a WiFi interface. @@ -384,9 +389,9 @@ InterfacePair Configurator::getActiveAlternateInterface(envoy_network_t network, } std::vector -Configurator::enumerateInterfaces([[maybe_unused]] unsigned short family, - [[maybe_unused]] unsigned int select_flags, - [[maybe_unused]] unsigned int reject_flags) { +ConnectivityManager::enumerateInterfaces([[maybe_unused]] unsigned short family, + [[maybe_unused]] unsigned int select_flags, + [[maybe_unused]] unsigned int reject_flags) { std::vector pairs{}; if (!Api::OsSysCallsSingleton::get().supportsGetifaddrs()) { @@ -415,19 +420,19 @@ Configurator::enumerateInterfaces([[maybe_unused]] unsigned short family, return pairs; } -ConfiguratorSharedPtr ConfiguratorFactory::get() { - return context_.singletonManager().getTyped( - SINGLETON_MANAGER_REGISTERED_NAME(network_configurator), [&] { +ConnectivityManagerSharedPtr ConnectivityManagerFactory::get() { + return context_.singletonManager().getTyped( + SINGLETON_MANAGER_REGISTERED_NAME(connectivity_manager), [&] { Extensions::Common::DynamicForwardProxy::DnsCacheManagerFactoryImpl cache_manager_factory{ context_}; - return std::make_shared(context_.clusterManager(), - cache_manager_factory.get()); + return std::make_shared(context_.clusterManager(), + cache_manager_factory.get()); }); } -ConfiguratorSharedPtr ConfiguratorHandle::get() { - return singleton_manager_.getTyped( - SINGLETON_MANAGER_REGISTERED_NAME(network_configurator)); +ConnectivityManagerSharedPtr ConnectivityManagerHandle::get() { + return singleton_manager_.getTyped( + SINGLETON_MANAGER_REGISTERED_NAME(connectivity_manager)); } } // namespace Network diff --git a/library/common/network/configurator.h b/library/common/network/connectivity_manager.h similarity index 84% rename from library/common/network/configurator.h rename to library/common/network/connectivity_manager.h index 326f698bb8..ca6492c5d2 100644 --- a/library/common/network/configurator.h +++ b/library/common/network/connectivity_manager.h @@ -21,14 +21,14 @@ * 1. When network type changes, a refreshDNS call will be scheduled on the event dispatcher, along * with a configuration key of this type. If network type changes again before that refresh * executes, the refresh is now stale, another refresh task will have been queued, and it should no - * longer execute. The configuration key allows the configurator to determine if the refreshDNS call - * is representative of current configuration. + * longer execute. The configuration key allows the connectivity_manager to determine if the + * refreshDNS call is representative of current configuration. * 2. When a request is configured with a certain set of socket options and begins, it is given a * configuration key. The heuristic in reportNetworkUsage relies on characteristics of the * request/response to make future decisions about socket options, but needs to be able to correctly * associate these metrics with their original configuration. If network state changes while the - * request/response are in-flight, the configurator can determine the relevance of associated - * metrics through the configuration key. + * request/response are in-flight, the connectivity_manager can determine the relevance of + * associated metrics through the configuration key. * * Additionally, in the future, more advanced heuristics may maintain multiple parallel * configurations across different interfaces/network types. In these more complicated scenarios, a @@ -38,14 +38,16 @@ typedef uint16_t envoy_netconf_t; /** - * These values specify the behavior of the network configurator with respect to the upstream - * socket options it supplies. + * These values specify the behavior of the network connectivity_manager with respect to the + * upstream socket options it supplies. */ typedef enum { - // In this mode, the configurator will provide socket options that result in the creation of a + // In this mode, the connectivity_manager will provide socket options that result in the creation + // of a // distinct connection pool for a given value of preferred network. DefaultPreferredNetworkMode = 0, - // In this mode, the configurator will provide socket options that intentionally attempt to + // In this mode, the connectivity_manager will provide socket options that intentionally attempt + // to // override the current preferred network type with an alternative, via interface-binding socket // options. Note this mode is experimental, and it will not be enabled at all unless // enable_interface_binding_ is set to true. @@ -74,12 +76,13 @@ using InterfacePair = std::pair, - public Extensions::Common::DynamicForwardProxy::DnsCache::UpdateCallbacks, - public Singleton::Instance { +class ConnectivityManager + : public Logger::Loggable, + public Extensions::Common::DynamicForwardProxy::DnsCache::UpdateCallbacks, + public Singleton::Instance { public: - Configurator(Upstream::ClusterManager& cluster_manager, - DnsCacheManagerSharedPtr dns_cache_manager) + ConnectivityManager(Upstream::ClusterManager& cluster_manager, + DnsCacheManagerSharedPtr dns_cache_manager) : cluster_manager_(cluster_manager), dns_cache_manager_(dns_cache_manager) {} // Extensions::Common::DynamicForwardProxy::DnsCache::UpdateCallbacks @@ -211,36 +214,37 @@ class Configurator : public Logger::Loggable, static NetworkState network_state_; }; -using ConfiguratorSharedPtr = std::shared_ptr; +using ConnectivityManagerSharedPtr = std::shared_ptr; /** - * Provides access to the singleton Configurator. + * Provides access to the singleton ConnectivityManager. */ -class ConfiguratorFactory { +class ConnectivityManagerFactory { public: - ConfiguratorFactory(Server::Configuration::CommonFactoryContext& context) : context_(context) {} + ConnectivityManagerFactory(Server::Configuration::CommonFactoryContext& context) + : context_(context) {} /** - * @returns singleton Configurator instance. + * @returns singleton ConnectivityManager instance. */ - ConfiguratorSharedPtr get(); + ConnectivityManagerSharedPtr get(); private: Server::Configuration::CommonFactoryContext& context_; }; /** - * Provides nullable access to the singleton Configurator. + * Provides nullable access to the singleton ConnectivityManager. */ -class ConfiguratorHandle { +class ConnectivityManagerHandle { public: - ConfiguratorHandle(Singleton::Manager& singleton_manager) + ConnectivityManagerHandle(Singleton::Manager& singleton_manager) : singleton_manager_(singleton_manager) {} /** - * @returns singleton Configurator instance. Can be nullptr if it hasn't been created. + * @returns singleton ConnectivityManager instance. Can be nullptr if it hasn't been created. */ - ConfiguratorSharedPtr get(); + ConnectivityManagerSharedPtr get(); private: Singleton::Manager& singleton_manager_; diff --git a/library/common/stream_info/BUILD b/library/common/stream_info/BUILD index 234996748f..565a2b1018 100644 --- a/library/common/stream_info/BUILD +++ b/library/common/stream_info/BUILD @@ -10,7 +10,7 @@ envoy_cc_library( hdrs = ["extra_stream_info.h"], repository = "@envoy", deps = [ - "//library/common/network:configurator_lib", + "//library/common/network:connectivity_manager_lib", "//library/common/types:c_types_lib", "@envoy//envoy/stream_info:stream_info_interface", "@envoy//source/common/stream_info:utility_lib", diff --git a/library/common/stream_info/extra_stream_info.h b/library/common/stream_info/extra_stream_info.h index 8afe4bf77f..2e7f60b66f 100644 --- a/library/common/stream_info/extra_stream_info.h +++ b/library/common/stream_info/extra_stream_info.h @@ -4,7 +4,7 @@ #include "source/common/stream_info/utility.h" -#include "library/common/network/configurator.h" +#include "library/common/network/connectivity_manager.h" #include "library/common/types/c_types.h" namespace Envoy { diff --git a/test/common/extensions/retry/options/network_configuration/BUILD b/test/common/extensions/retry/options/network_configuration/BUILD index f9251e7a75..1a25974f6b 100644 --- a/test/common/extensions/retry/options/network_configuration/BUILD +++ b/test/common/extensions/retry/options/network_configuration/BUILD @@ -15,7 +15,7 @@ envoy_extension_cc_test( repository = "@envoy", deps = [ "//library/common/extensions/retry/options/network_configuration:config", - "//library/common/network:configurator_lib", + "//library/common/network:connectivity_manager_lib", "@envoy//source/common/upstream:retry_factory_lib", "@envoy//test/mocks/server:factory_context_mocks", "@envoy//test/mocks/stream_info:stream_info_mocks", diff --git a/test/common/extensions/retry/options/network_configuration/predicate_test.cc b/test/common/extensions/retry/options/network_configuration/predicate_test.cc index 3d420d8573..32e26c2247 100644 --- a/test/common/extensions/retry/options/network_configuration/predicate_test.cc +++ b/test/common/extensions/retry/options/network_configuration/predicate_test.cc @@ -9,7 +9,7 @@ #include "gmock/gmock.h" #include "gtest/gtest.h" #include "library/common/extensions/retry/options/network_configuration/config.h" -#include "library/common/network/configurator.h" +#include "library/common/network/connectivity_manager.h" using namespace testing; @@ -25,8 +25,8 @@ TEST(NetworkConfigurationRetryOptionsPredicateTest, PredicateTest) { Upstream::RetryExtensionFactoryContextImpl retry_extension_factory_context{ *mock_factory_context.singleton_manager_}; - auto configurator = Network::ConfiguratorFactory(mock_factory_context).get(); - ASSERT_NE(nullptr, configurator); + auto connectivity_manager = Network::ConnectivityManagerFactory(mock_factory_context).get(); + ASSERT_NE(nullptr, connectivity_manager); auto factory = Registry::FactoryRegistry::getFactory( "envoy.retry_options_predicates.network_configuration"); @@ -39,7 +39,7 @@ TEST(NetworkConfigurationRetryOptionsPredicateTest, PredicateTest) { predicate->updateOptions({mock_stream_info, nullptr}).new_upstream_socket_options_); } -TEST(NetworkConfigurationRetryOptionsPredicateTest, PredicateTestWithoutConfigurator) { +TEST(NetworkConfigurationRetryOptionsPredicateTest, PredicateTestWithoutConnectivityManager) { NiceMock mock_factory_context; Upstream::RetryExtensionFactoryContextImpl retry_extension_factory_context{ *mock_factory_context.singleton_manager_}; @@ -50,7 +50,7 @@ TEST(NetworkConfigurationRetryOptionsPredicateTest, PredicateTestWithoutConfigur auto proto_config = factory->createEmptyConfigProto(); EXPECT_DEATH(factory->createOptionsPredicate(*proto_config, retry_extension_factory_context), - "unexpected nullptr network configurator"); + "unexpected nullptr network connectivity_manager"); } } // namespace diff --git a/test/common/network/BUILD b/test/common/network/BUILD index 41db4e965f..e0ee38f035 100644 --- a/test/common/network/BUILD +++ b/test/common/network/BUILD @@ -5,11 +5,11 @@ licenses(["notice"]) # Apache 2 envoy_package() envoy_cc_test( - name = "configurator_test", - srcs = ["configurator_test.cc"], + name = "connectivity_manager_test", + srcs = ["connectivity_manager_test.cc"], repository = "@envoy", deps = [ - "//library/common/network:configurator_lib", + "//library/common/network:connectivity_manager_lib", "@envoy//test/extensions/common/dynamic_forward_proxy:mocks", "@envoy//test/mocks/upstream:cluster_manager_mocks", ], diff --git a/test/common/network/configurator_test.cc b/test/common/network/configurator_test.cc deleted file mode 100644 index 9703632ed2..0000000000 --- a/test/common/network/configurator_test.cc +++ /dev/null @@ -1,208 +0,0 @@ -#include - -#include "test/extensions/common/dynamic_forward_proxy/mocks.h" -#include "test/mocks/upstream/cluster_manager.h" - -#include "gtest/gtest.h" -#include "library/common/network/configurator.h" - -using testing::_; -using testing::Ref; -using testing::Return; - -namespace Envoy { -namespace Network { - -class ConfiguratorTest : public testing::Test { -public: - ConfiguratorTest() - : dns_cache_manager_( - new NiceMock()), - dns_cache_(dns_cache_manager_->dns_cache_), - configurator_(std::make_shared(cm_, dns_cache_manager_)) { - ON_CALL(*dns_cache_manager_, lookUpCacheByName(_)).WillByDefault(Return(dns_cache_)); - // Toggle network to reset network state. - Configurator::setPreferredNetwork(ENVOY_NET_GENERIC); - Configurator::setPreferredNetwork(ENVOY_NET_WLAN); - } - - std::shared_ptr> - dns_cache_manager_; - std::shared_ptr dns_cache_; - NiceMock cm_{}; - ConfiguratorSharedPtr configurator_; -}; - -TEST_F(ConfiguratorTest, SetPreferredNetworkWithNewNetworkChangesConfigurationKey) { - envoy_netconf_t original_key = configurator_->getConfigurationKey(); - envoy_netconf_t new_key = Configurator::setPreferredNetwork(ENVOY_NET_WWAN); - EXPECT_NE(original_key, new_key); - EXPECT_EQ(new_key, configurator_->getConfigurationKey()); -} - -TEST_F(ConfiguratorTest, - DISABLED_SetPreferredNetworkWithUnchangedNetworkReturnsStaleConfigurationKey) { - envoy_netconf_t original_key = configurator_->getConfigurationKey(); - envoy_netconf_t stale_key = Configurator::setPreferredNetwork(ENVOY_NET_WLAN); - EXPECT_NE(original_key, stale_key); - EXPECT_EQ(original_key, configurator_->getConfigurationKey()); -} - -TEST_F(ConfiguratorTest, RefreshDnsForCurrentConfigurationTriggersDnsRefresh) { - EXPECT_CALL(*dns_cache_, forceRefreshHosts()); - envoy_netconf_t configuration_key = configurator_->getConfigurationKey(); - configurator_->refreshDns(configuration_key, false); -} - -TEST_F(ConfiguratorTest, RefreshDnsForStaleConfigurationDoesntTriggerDnsRefresh) { - EXPECT_CALL(*dns_cache_, forceRefreshHosts()).Times(0); - envoy_netconf_t configuration_key = configurator_->getConfigurationKey(); - configurator_->refreshDns(configuration_key - 1, false); -} - -TEST_F(ConfiguratorTest, WhenDrainPostDnsRefreshEnabledDrainsPostDnsRefresh) { - EXPECT_CALL(*dns_cache_, addUpdateCallbacks_(Ref(*configurator_))); - configurator_->setDrainPostDnsRefreshEnabled(true); - - auto host_info = std::make_shared(); - EXPECT_CALL(*dns_cache_, iterateHostMap(_)) - .WillOnce( - Invoke([&](Extensions::Common::DynamicForwardProxy::DnsCache::IterateHostMapCb callback) { - callback("cached.example.com", host_info); - callback("cached2.example.com", host_info); - callback("cached3.example.com", host_info); - })); - - EXPECT_CALL(*dns_cache_, forceRefreshHosts()); - envoy_netconf_t configuration_key = configurator_->getConfigurationKey(); - configurator_->refreshDns(configuration_key, true); - - EXPECT_CALL(cm_, drainConnections(_)); - configurator_->onDnsResolutionComplete( - "cached.example.com", - std::make_shared(), - Network::DnsResolver::ResolutionStatus::Success); - configurator_->onDnsResolutionComplete( - "not-cached.example.com", - std::make_shared(), - Network::DnsResolver::ResolutionStatus::Success); - configurator_->onDnsResolutionComplete( - "not-cached2.example.com", - std::make_shared(), - Network::DnsResolver::ResolutionStatus::Success); -} - -TEST_F(ConfiguratorTest, WhenDrainPostDnsNotEnabledDoesntDrainPostDnsRefresh) { - configurator_->setDrainPostDnsRefreshEnabled(false); - - EXPECT_CALL(*dns_cache_, forceRefreshHosts()); - envoy_netconf_t configuration_key = configurator_->getConfigurationKey(); - configurator_->refreshDns(configuration_key, true); - - EXPECT_CALL(cm_, drainConnections(_)).Times(0); - configurator_->onDnsResolutionComplete( - "example.com", std::make_shared(), - Network::DnsResolver::ResolutionStatus::Success); -} - -TEST_F(ConfiguratorTest, - ReportNetworkUsageDoesntAlterNetworkConfigurationWhenBoundInterfacesAreDisabled) { - envoy_netconf_t configuration_key = configurator_->getConfigurationKey(); - configurator_->setInterfaceBindingEnabled(false); - EXPECT_EQ(DefaultPreferredNetworkMode, configurator_->getSocketMode()); - - configurator_->reportNetworkUsage(configuration_key, true /* network_fault */); - configurator_->reportNetworkUsage(configuration_key, true /* network_fault */); - configurator_->reportNetworkUsage(configuration_key, true /* network_fault */); - - EXPECT_EQ(configuration_key, configurator_->getConfigurationKey()); - EXPECT_EQ(DefaultPreferredNetworkMode, configurator_->getSocketMode()); -} - -TEST_F(ConfiguratorTest, ReportNetworkUsageTriggersOverrideAfterFirstFaultAfterNetworkUpdate) { - envoy_netconf_t configuration_key = configurator_->getConfigurationKey(); - configurator_->setInterfaceBindingEnabled(true); - EXPECT_EQ(DefaultPreferredNetworkMode, configurator_->getSocketMode()); - - configurator_->reportNetworkUsage(configuration_key, true /* network_fault */); - - EXPECT_NE(configuration_key, configurator_->getConfigurationKey()); - EXPECT_EQ(AlternateBoundInterfaceMode, configurator_->getSocketMode()); -} - -TEST_F(ConfiguratorTest, ReportNetworkUsageDisablesOverrideAfterFirstFaultAfterOverride) { - envoy_netconf_t configuration_key = configurator_->getConfigurationKey(); - configurator_->setInterfaceBindingEnabled(true); - EXPECT_EQ(DefaultPreferredNetworkMode, configurator_->getSocketMode()); - - configurator_->reportNetworkUsage(configuration_key, true /* network_fault */); - - EXPECT_NE(configuration_key, configurator_->getConfigurationKey()); - configuration_key = configurator_->getConfigurationKey(); - EXPECT_EQ(AlternateBoundInterfaceMode, configurator_->getSocketMode()); - - configurator_->reportNetworkUsage(configuration_key, true /* network_fault */); - - EXPECT_NE(configuration_key, configurator_->getConfigurationKey()); - EXPECT_EQ(DefaultPreferredNetworkMode, configurator_->getSocketMode()); -} - -TEST_F(ConfiguratorTest, ReportNetworkUsageDisablesOverrideAfterThirdFaultAfterSuccess) { - envoy_netconf_t configuration_key = configurator_->getConfigurationKey(); - configurator_->setInterfaceBindingEnabled(true); - EXPECT_EQ(DefaultPreferredNetworkMode, configurator_->getSocketMode()); - - configurator_->reportNetworkUsage(configuration_key, false /* network_fault */); - configurator_->reportNetworkUsage(configuration_key, true /* network_fault */); - - EXPECT_EQ(configuration_key, configurator_->getConfigurationKey()); - EXPECT_EQ(DefaultPreferredNetworkMode, configurator_->getSocketMode()); - - configurator_->reportNetworkUsage(configuration_key, true /* network_fault */); - configurator_->reportNetworkUsage(configuration_key, true /* network_fault */); - - EXPECT_NE(configuration_key, configurator_->getConfigurationKey()); - EXPECT_EQ(AlternateBoundInterfaceMode, configurator_->getSocketMode()); -} - -TEST_F(ConfiguratorTest, ReportNetworkUsageDisregardsCallsWithStaleConfigurationKey) { - envoy_netconf_t stale_key = configurator_->getConfigurationKey(); - envoy_netconf_t current_key = Configurator::setPreferredNetwork(ENVOY_NET_WWAN); - EXPECT_NE(stale_key, current_key); - - configurator_->setInterfaceBindingEnabled(true); - EXPECT_EQ(DefaultPreferredNetworkMode, configurator_->getSocketMode()); - - configurator_->reportNetworkUsage(stale_key, true /* network_fault */); - configurator_->reportNetworkUsage(stale_key, true /* network_fault */); - configurator_->reportNetworkUsage(stale_key, true /* network_fault */); - - EXPECT_EQ(current_key, configurator_->getConfigurationKey()); - EXPECT_EQ(DefaultPreferredNetworkMode, configurator_->getSocketMode()); - - configurator_->reportNetworkUsage(stale_key, false /* network_fault */); - configurator_->reportNetworkUsage(current_key, true /* network_fault */); - - EXPECT_NE(current_key, configurator_->getConfigurationKey()); - EXPECT_EQ(AlternateBoundInterfaceMode, configurator_->getSocketMode()); -} - -TEST_F(ConfiguratorTest, EnumerateInterfacesFiltersByFlags) { - // Select loopback. - auto loopbacks = configurator_->enumerateInterfaces(AF_INET, IFF_LOOPBACK, 0); - EXPECT_EQ(loopbacks.size(), 1); - EXPECT_EQ(std::get(loopbacks[0]).rfind("lo", 0), 0); - - // Reject loopback. - auto nonloopbacks = configurator_->enumerateInterfaces(AF_INET, 0, IFF_LOOPBACK); - for (const auto& interface : nonloopbacks) { - EXPECT_NE(std::get(interface).rfind("lo", 0), 0); - } - - // Select AND reject loopback. - auto empty = configurator_->enumerateInterfaces(AF_INET, IFF_LOOPBACK, IFF_LOOPBACK); - EXPECT_EQ(empty.size(), 0); -} - -} // namespace Network -} // namespace Envoy diff --git a/test/common/network/connectivity_manager_test.cc b/test/common/network/connectivity_manager_test.cc new file mode 100644 index 0000000000..9545ff4ad4 --- /dev/null +++ b/test/common/network/connectivity_manager_test.cc @@ -0,0 +1,209 @@ +#include + +#include "test/extensions/common/dynamic_forward_proxy/mocks.h" +#include "test/mocks/upstream/cluster_manager.h" + +#include "gtest/gtest.h" +#include "library/common/network/connectivity_manager.h" + +using testing::_; +using testing::Ref; +using testing::Return; + +namespace Envoy { +namespace Network { + +class ConnectivityManagerTest : public testing::Test { +public: + ConnectivityManagerTest() + : dns_cache_manager_( + new NiceMock()), + dns_cache_(dns_cache_manager_->dns_cache_), + connectivity_manager_(std::make_shared(cm_, dns_cache_manager_)) { + ON_CALL(*dns_cache_manager_, lookUpCacheByName(_)).WillByDefault(Return(dns_cache_)); + // Toggle network to reset network state. + ConnectivityManager::setPreferredNetwork(ENVOY_NET_GENERIC); + ConnectivityManager::setPreferredNetwork(ENVOY_NET_WLAN); + } + + std::shared_ptr> + dns_cache_manager_; + std::shared_ptr dns_cache_; + NiceMock cm_{}; + ConnectivityManagerSharedPtr connectivity_manager_; +}; + +TEST_F(ConnectivityManagerTest, SetPreferredNetworkWithNewNetworkChangesConfigurationKey) { + envoy_netconf_t original_key = connectivity_manager_->getConfigurationKey(); + envoy_netconf_t new_key = ConnectivityManager::setPreferredNetwork(ENVOY_NET_WWAN); + EXPECT_NE(original_key, new_key); + EXPECT_EQ(new_key, connectivity_manager_->getConfigurationKey()); +} + +TEST_F(ConnectivityManagerTest, + DISABLED_SetPreferredNetworkWithUnchangedNetworkReturnsStaleConfigurationKey) { + envoy_netconf_t original_key = connectivity_manager_->getConfigurationKey(); + envoy_netconf_t stale_key = ConnectivityManager::setPreferredNetwork(ENVOY_NET_WLAN); + EXPECT_NE(original_key, stale_key); + EXPECT_EQ(original_key, connectivity_manager_->getConfigurationKey()); +} + +TEST_F(ConnectivityManagerTest, RefreshDnsForCurrentConfigurationTriggersDnsRefresh) { + EXPECT_CALL(*dns_cache_, forceRefreshHosts()); + envoy_netconf_t configuration_key = connectivity_manager_->getConfigurationKey(); + connectivity_manager_->refreshDns(configuration_key, false); +} + +TEST_F(ConnectivityManagerTest, RefreshDnsForStaleConfigurationDoesntTriggerDnsRefresh) { + EXPECT_CALL(*dns_cache_, forceRefreshHosts()).Times(0); + envoy_netconf_t configuration_key = connectivity_manager_->getConfigurationKey(); + connectivity_manager_->refreshDns(configuration_key - 1, false); +} + +TEST_F(ConnectivityManagerTest, WhenDrainPostDnsRefreshEnabledDrainsPostDnsRefresh) { + EXPECT_CALL(*dns_cache_, addUpdateCallbacks_(Ref(*connectivity_manager_))); + connectivity_manager_->setDrainPostDnsRefreshEnabled(true); + + auto host_info = std::make_shared(); + EXPECT_CALL(*dns_cache_, iterateHostMap(_)) + .WillOnce( + Invoke([&](Extensions::Common::DynamicForwardProxy::DnsCache::IterateHostMapCb callback) { + callback("cached.example.com", host_info); + callback("cached2.example.com", host_info); + callback("cached3.example.com", host_info); + })); + + EXPECT_CALL(*dns_cache_, forceRefreshHosts()); + envoy_netconf_t configuration_key = connectivity_manager_->getConfigurationKey(); + connectivity_manager_->refreshDns(configuration_key, true); + + EXPECT_CALL(cm_, drainConnections(_)); + connectivity_manager_->onDnsResolutionComplete( + "cached.example.com", + std::make_shared(), + Network::DnsResolver::ResolutionStatus::Success); + connectivity_manager_->onDnsResolutionComplete( + "not-cached.example.com", + std::make_shared(), + Network::DnsResolver::ResolutionStatus::Success); + connectivity_manager_->onDnsResolutionComplete( + "not-cached2.example.com", + std::make_shared(), + Network::DnsResolver::ResolutionStatus::Success); +} + +TEST_F(ConnectivityManagerTest, WhenDrainPostDnsNotEnabledDoesntDrainPostDnsRefresh) { + connectivity_manager_->setDrainPostDnsRefreshEnabled(false); + + EXPECT_CALL(*dns_cache_, forceRefreshHosts()); + envoy_netconf_t configuration_key = connectivity_manager_->getConfigurationKey(); + connectivity_manager_->refreshDns(configuration_key, true); + + EXPECT_CALL(cm_, drainConnections(_)).Times(0); + connectivity_manager_->onDnsResolutionComplete( + "example.com", std::make_shared(), + Network::DnsResolver::ResolutionStatus::Success); +} + +TEST_F(ConnectivityManagerTest, + ReportNetworkUsageDoesntAlterNetworkConfigurationWhenBoundInterfacesAreDisabled) { + envoy_netconf_t configuration_key = connectivity_manager_->getConfigurationKey(); + connectivity_manager_->setInterfaceBindingEnabled(false); + EXPECT_EQ(DefaultPreferredNetworkMode, connectivity_manager_->getSocketMode()); + + connectivity_manager_->reportNetworkUsage(configuration_key, true /* network_fault */); + connectivity_manager_->reportNetworkUsage(configuration_key, true /* network_fault */); + connectivity_manager_->reportNetworkUsage(configuration_key, true /* network_fault */); + + EXPECT_EQ(configuration_key, connectivity_manager_->getConfigurationKey()); + EXPECT_EQ(DefaultPreferredNetworkMode, connectivity_manager_->getSocketMode()); +} + +TEST_F(ConnectivityManagerTest, + ReportNetworkUsageTriggersOverrideAfterFirstFaultAfterNetworkUpdate) { + envoy_netconf_t configuration_key = connectivity_manager_->getConfigurationKey(); + connectivity_manager_->setInterfaceBindingEnabled(true); + EXPECT_EQ(DefaultPreferredNetworkMode, connectivity_manager_->getSocketMode()); + + connectivity_manager_->reportNetworkUsage(configuration_key, true /* network_fault */); + + EXPECT_NE(configuration_key, connectivity_manager_->getConfigurationKey()); + EXPECT_EQ(AlternateBoundInterfaceMode, connectivity_manager_->getSocketMode()); +} + +TEST_F(ConnectivityManagerTest, ReportNetworkUsageDisablesOverrideAfterFirstFaultAfterOverride) { + envoy_netconf_t configuration_key = connectivity_manager_->getConfigurationKey(); + connectivity_manager_->setInterfaceBindingEnabled(true); + EXPECT_EQ(DefaultPreferredNetworkMode, connectivity_manager_->getSocketMode()); + + connectivity_manager_->reportNetworkUsage(configuration_key, true /* network_fault */); + + EXPECT_NE(configuration_key, connectivity_manager_->getConfigurationKey()); + configuration_key = connectivity_manager_->getConfigurationKey(); + EXPECT_EQ(AlternateBoundInterfaceMode, connectivity_manager_->getSocketMode()); + + connectivity_manager_->reportNetworkUsage(configuration_key, true /* network_fault */); + + EXPECT_NE(configuration_key, connectivity_manager_->getConfigurationKey()); + EXPECT_EQ(DefaultPreferredNetworkMode, connectivity_manager_->getSocketMode()); +} + +TEST_F(ConnectivityManagerTest, ReportNetworkUsageDisablesOverrideAfterThirdFaultAfterSuccess) { + envoy_netconf_t configuration_key = connectivity_manager_->getConfigurationKey(); + connectivity_manager_->setInterfaceBindingEnabled(true); + EXPECT_EQ(DefaultPreferredNetworkMode, connectivity_manager_->getSocketMode()); + + connectivity_manager_->reportNetworkUsage(configuration_key, false /* network_fault */); + connectivity_manager_->reportNetworkUsage(configuration_key, true /* network_fault */); + + EXPECT_EQ(configuration_key, connectivity_manager_->getConfigurationKey()); + EXPECT_EQ(DefaultPreferredNetworkMode, connectivity_manager_->getSocketMode()); + + connectivity_manager_->reportNetworkUsage(configuration_key, true /* network_fault */); + connectivity_manager_->reportNetworkUsage(configuration_key, true /* network_fault */); + + EXPECT_NE(configuration_key, connectivity_manager_->getConfigurationKey()); + EXPECT_EQ(AlternateBoundInterfaceMode, connectivity_manager_->getSocketMode()); +} + +TEST_F(ConnectivityManagerTest, ReportNetworkUsageDisregardsCallsWithStaleConfigurationKey) { + envoy_netconf_t stale_key = connectivity_manager_->getConfigurationKey(); + envoy_netconf_t current_key = ConnectivityManager::setPreferredNetwork(ENVOY_NET_WWAN); + EXPECT_NE(stale_key, current_key); + + connectivity_manager_->setInterfaceBindingEnabled(true); + EXPECT_EQ(DefaultPreferredNetworkMode, connectivity_manager_->getSocketMode()); + + connectivity_manager_->reportNetworkUsage(stale_key, true /* network_fault */); + connectivity_manager_->reportNetworkUsage(stale_key, true /* network_fault */); + connectivity_manager_->reportNetworkUsage(stale_key, true /* network_fault */); + + EXPECT_EQ(current_key, connectivity_manager_->getConfigurationKey()); + EXPECT_EQ(DefaultPreferredNetworkMode, connectivity_manager_->getSocketMode()); + + connectivity_manager_->reportNetworkUsage(stale_key, false /* network_fault */); + connectivity_manager_->reportNetworkUsage(current_key, true /* network_fault */); + + EXPECT_NE(current_key, connectivity_manager_->getConfigurationKey()); + EXPECT_EQ(AlternateBoundInterfaceMode, connectivity_manager_->getSocketMode()); +} + +TEST_F(ConnectivityManagerTest, EnumerateInterfacesFiltersByFlags) { + // Select loopback. + auto loopbacks = connectivity_manager_->enumerateInterfaces(AF_INET, IFF_LOOPBACK, 0); + EXPECT_EQ(loopbacks.size(), 1); + EXPECT_EQ(std::get(loopbacks[0]).rfind("lo", 0), 0); + + // Reject loopback. + auto nonloopbacks = connectivity_manager_->enumerateInterfaces(AF_INET, 0, IFF_LOOPBACK); + for (const auto& interface : nonloopbacks) { + EXPECT_NE(std::get(interface).rfind("lo", 0), 0); + } + + // Select AND reject loopback. + auto empty = connectivity_manager_->enumerateInterfaces(AF_INET, IFF_LOOPBACK, IFF_LOOPBACK); + EXPECT_EQ(empty.size(), 0); +} + +} // namespace Network +} // namespace Envoy