From e77841e11994791994c0155052c054a15b31efc9 Mon Sep 17 00:00:00 2001 From: alyssawilk Date: Thu, 9 Feb 2023 17:03:35 -0500 Subject: [PATCH] mobile: adding a config knob for building without listeners (#25443) Risk Level: low Testing: common CI, manual testing Docs Changes: n/a Release Notes: n/a part of envoyproxy/envoy-mobile#2711 Signed-off-by: Alyssa Wilk --- .bazelrc | 1 + .github/workflows/core.yml | 1 + bazel/BUILD | 5 ++++ bazel/envoy_build_system.bzl | 2 ++ bazel/envoy_mobile_copts.bzl | 3 +- bazel/envoy_select.bzl | 7 +++++ mobile/envoy_build_config/BUILD | 11 +++++-- .../envoy_build_config/extension_registry.cc | 30 ++++++++++++------- mobile/library/common/engine_common.cc | 29 +++++++++++++++++- 9 files changed, 74 insertions(+), 15 deletions(-) diff --git a/.bazelrc b/.bazelrc index 5a60d3852599..e364ea8a9b02 100644 --- a/.bazelrc +++ b/.bazelrc @@ -21,6 +21,7 @@ build --tool_java_runtime_version=remotejdk_11 build --platform_mappings=bazel/platform_mappings # silence absl logspam. build --copt=-DABSL_MIN_LOG_LEVEL=4 +build --define envoy_mobile_listener=enabled # Pass PATH, CC, CXX and LLVM_CONFIG variables from the environment. build --action_env=CC --host_action_env=CC diff --git a/.github/workflows/core.yml b/.github/workflows/core.yml index ae744c0dab63..72f5ee732124 100644 --- a/.github/workflows/core.yml +++ b/.github/workflows/core.yml @@ -30,6 +30,7 @@ jobs: --action_env=LD_LIBRARY_PATH \ --test_env=ENVOY_IP_TEST_VERSIONS=v4only \ --test_output=all \ + --define envoy_mobile_listener=disabled \ $([ -z $GITHUB_TOKEN ] || echo "--config=remote-ci-linux") \ --remote_header="Authorization=Bearer $GITHUB_TOKEN" \ //test/common/... diff --git a/bazel/BUILD b/bazel/BUILD index 64bb256597d0..7f5ebbf5a476 100644 --- a/bazel/BUILD +++ b/bazel/BUILD @@ -353,6 +353,11 @@ config_setting( values = {"define": "envoy_mobile_request_compression=disabled"}, ) +config_setting( + name = "disable_envoy_mobile_listener", + values = {"define": "envoy_mobile_listener=disabled"}, +) + config_setting( name = "disable_logging", values = {"define": "enable_logging=disabled"}, diff --git a/bazel/envoy_build_system.bzl b/bazel/envoy_build_system.bzl index 814290b3fe21..f31d81e6a121 100644 --- a/bazel/envoy_build_system.bzl +++ b/bazel/envoy_build_system.bzl @@ -24,6 +24,7 @@ load( _envoy_select_boringssl = "envoy_select_boringssl", _envoy_select_disable_logging = "envoy_select_disable_logging", _envoy_select_enable_http3 = "envoy_select_enable_http3", + _envoy_select_envoy_mobile_listener = "envoy_select_envoy_mobile_listener", _envoy_select_envoy_mobile_request_compression = "envoy_select_envoy_mobile_request_compression", _envoy_select_google_grpc = "envoy_select_google_grpc", _envoy_select_hot_restart = "envoy_select_hot_restart", @@ -227,6 +228,7 @@ envoy_select_admin_no_html = _envoy_select_admin_no_html envoy_select_admin_functionality = _envoy_select_admin_functionality envoy_select_static_extension_registration = _envoy_select_static_extension_registration envoy_select_envoy_mobile_request_compression = _envoy_select_envoy_mobile_request_compression +envoy_select_envoy_mobile_listener = _envoy_select_envoy_mobile_listener envoy_select_boringssl = _envoy_select_boringssl envoy_select_disable_logging = _envoy_select_disable_logging envoy_select_google_grpc = _envoy_select_google_grpc diff --git a/bazel/envoy_mobile_copts.bzl b/bazel/envoy_mobile_copts.bzl index 13813eb2933a..f0f65d624fc5 100644 --- a/bazel/envoy_mobile_copts.bzl +++ b/bazel/envoy_mobile_copts.bzl @@ -1,8 +1,9 @@ # DO NOT LOAD THIS FILE. Load envoy_build_system.bzl instead. -load(":envoy_select.bzl", "envoy_select_admin_functionality", "envoy_select_enable_http3", "envoy_select_envoy_mobile_request_compression") +load(":envoy_select.bzl", "envoy_select_admin_functionality", "envoy_select_enable_http3", "envoy_select_envoy_mobile_listener", "envoy_select_envoy_mobile_request_compression") # Compute the copts needed for Envoy Mobile libraries that don't use Envoy's main library wrappers. def envoy_mobile_copts(repository): return envoy_select_admin_functionality(["-DENVOY_ADMIN_FUNCTIONALITY"], repository) + \ envoy_select_enable_http3(["-DENVOY_ENABLE_QUIC"], repository) + \ + envoy_select_envoy_mobile_listener(["-DENVOY_MOBILE_ENABLE_LISTENER"], repository) + \ envoy_select_envoy_mobile_request_compression(["-DENVOY_MOBILE_REQUEST_COMPRESSION"], repository) diff --git a/bazel/envoy_select.bzl b/bazel/envoy_select.bzl index efb6642335f4..04cb1e76f66e 100644 --- a/bazel/envoy_select.bzl +++ b/bazel/envoy_select.bzl @@ -66,6 +66,13 @@ def envoy_select_envoy_mobile_request_compression(xs, repository = ""): "//conditions:default": xs, }) +# Selects the given values if the Envoy Mobile listener is enabled in the current build. +def envoy_select_envoy_mobile_listener(xs, repository = ""): + return select({ + repository + "//bazel:disable_envoy_mobile_listener": [], + "//conditions:default": xs, + }) + # Selects the given values if http3 is enabled in the current build. def envoy_select_enable_http3(xs, repository = ""): return select({ diff --git a/mobile/envoy_build_config/BUILD b/mobile/envoy_build_config/BUILD index 897b1273512b..5a2ddb549ea2 100644 --- a/mobile/envoy_build_config/BUILD +++ b/mobile/envoy_build_config/BUILD @@ -1,4 +1,4 @@ -load("@envoy//bazel:envoy_build_system.bzl", "envoy_cc_library", "envoy_package", "envoy_select_enable_http3", "envoy_select_envoy_mobile_request_compression") +load("@envoy//bazel:envoy_build_system.bzl", "envoy_cc_library", "envoy_package", "envoy_select_enable_http3", "envoy_select_envoy_mobile_listener", "envoy_select_envoy_mobile_request_compression") licenses(["notice"]) # Apache 2 @@ -12,8 +12,8 @@ envoy_cc_library( hdrs = ["extension_registry.h"], repository = "@envoy", deps = [ - "@envoy//source/extensions/listener_managers/listener_manager:listener_manager_lib", #TODO(2711) remove "extension_registry_platform_additions", + "@envoy//source/common/network/matching:inputs_lib", "@envoy//source/common/http/matching:inputs_lib", "@envoy//source/common/network:socket_lib", "@envoy//source/common/router:upstream_codec_filter_lib", @@ -30,7 +30,6 @@ envoy_cc_library( "@envoy//source/extensions/filters/http/router:config", "@envoy//source/extensions/filters/network/http_connection_manager:config", "@envoy//source/extensions/http/header_formatters/preserve_case:config", - "@envoy//source/extensions/listener_managers/listener_manager:connection_handler_lib", "@envoy//source/extensions/network/dns_resolver/getaddrinfo:config", "@envoy//source/extensions/path/match/uri_template:config", "@envoy//source/extensions/path/rewrite/uri_template:config", @@ -65,6 +64,12 @@ envoy_cc_library( "@envoy//source/extensions/filters/http/compressor:config", ], "@envoy", + ) + envoy_select_envoy_mobile_listener( + [ + "@envoy//source/extensions/listener_managers/listener_manager:listener_manager_lib", + "@envoy//source/extensions/listener_managers/listener_manager:connection_handler_lib", + ], + "@envoy", ), ) diff --git a/mobile/envoy_build_config/extension_registry.cc b/mobile/envoy_build_config/extension_registry.cc index 46adee630112..fb519574b274 100644 --- a/mobile/envoy_build_config/extension_registry.cc +++ b/mobile/envoy_build_config/extension_registry.cc @@ -28,8 +28,6 @@ #include "source/extensions/http/header_formatters/preserve_case/config.h" #include "source/extensions/http/header_validators/envoy_default/config.h" #include "source/extensions/http/original_ip_detection/xff/config.h" -#include "source/extensions/listener_managers/listener_manager/connection_handler_impl.h" -#include "source/extensions/listener_managers/listener_manager/listener_manager_impl.h" #include "source/extensions/network/dns_resolver/getaddrinfo/getaddrinfo.h" #include "source/extensions/path/match/uri_template/config.h" #include "source/extensions/path/rewrite/uri_template/config.h" @@ -43,13 +41,20 @@ #include "source/extensions/udp_packet_writer/default/config.h" #include "source/extensions/upstreams/http/generic/config.h" +#ifdef ENVOY_MOBILE_ENABLE_LISTENER +#include "source/extensions/listener_managers/listener_manager/listener_manager_impl.h" +#include "source/extensions/listener_managers/listener_manager/connection_handler_impl.h" +#endif + #ifdef ENVOY_ENABLE_QUIC -#include "source/common/quic/quic_transport_socket_factory.h" +#ifdef ENVOY_MOBILE_ENABLE_LISTENER #include "source/common/quic/server_codec_impl.h" #include "source/extensions/quic/connection_id_generator/envoy_deterministic_connection_id_generator_config.h" #include "source/extensions/quic/crypto_stream/envoy_quic_crypto_server_stream.h" #include "source/extensions/quic/proof_source/envoy_quic_proof_source_factory_impl.h" #endif +#include "source/common/quic/quic_transport_socket_factory.h" +#endif #include "extension_registry_platform_additions.h" #include "library/common/extensions/cert_validator/platform_bridge/config.h" @@ -139,21 +144,26 @@ void ExtensionRegistry::registerFactories() { Router::forceRegisterRouteListMatchActionFactory(); Router::forceRegisterRouteMatchActionFactory(); Router::forceRegisterUpstreamCodecFilterFactory(); - Server::FilterChain::forceRegisterFilterChainNameActionFactory(); Server::forceRegisterApiListenerManagerFactoryImpl(); - Server::forceRegisterConnectionHandlerFactoryImpl(); - Server::forceRegisterDefaultListenerManagerFactoryImpl(); Upstream::forceRegisterLogicalDnsClusterFactory(); Upstream::forceRegisterStaticClusterFactory(); Watchdog::forceRegisterAbortActionFactory(); +#ifdef ENVOY_MOBILE_ENABLE_LISTENER + Server::forceRegisterConnectionHandlerFactoryImpl(); + Server::forceRegisterDefaultListenerManagerFactoryImpl(); + Server::FilterChain::forceRegisterFilterChainNameActionFactory(); +#endif + #ifdef ENVOY_ENABLE_QUIC - Quic::forceRegisterEnvoyDeterministicConnectionIdGeneratorConfigFactory(); - Quic::forceRegisterEnvoyQuicCryptoServerStreamFactoryImpl(); - Quic::forceRegisterEnvoyQuicProofSourceFactoryImpl(); - Quic::forceRegisterQuicClientTransportSocketConfigFactory(); + +#ifdef ENVOY_MOBILE_ENABLE_LISTENER Quic::forceRegisterQuicHttpServerConnectionFactoryImpl(); Quic::forceRegisterQuicServerTransportSocketConfigFactory(); + Quic::forceRegisterEnvoyQuicProofSourceFactoryImpl(); + Quic::forceRegisterEnvoyDeterministicConnectionIdGeneratorConfigFactory(); +#endif + Quic::forceRegisterQuicClientTransportSocketConfigFactory(); #endif #ifdef ENVOY_MOBILE_REQUEST_COMPRESSION diff --git a/mobile/library/common/engine_common.cc b/mobile/library/common/engine_common.cc index b569717fb43f..6721675324cb 100644 --- a/mobile/library/common/engine_common.cc +++ b/mobile/library/common/engine_common.cc @@ -4,11 +4,38 @@ #include "source/common/runtime/runtime_impl.h" namespace Envoy { +namespace { + +bool useApiListener(const envoy::config::bootstrap::v3::Bootstrap& bootstrap) { +#ifndef ENVOY_MOBILE_ENABLE_LISTENER + return true; +#endif + if (bootstrap.layered_runtime().layers().size() == 0) { + return false; + } + for (auto field : bootstrap.layered_runtime().layers(0).static_layer().fields()) { + if (absl::string_view(field.first) == "envoy") { + for (auto inner_field : field.second.struct_value().fields()) { + if (absl::string_view(inner_field.first) == "reloadable_features") { + for (auto flag_field : inner_field.second.struct_value().fields()) { + if (absl::string_view(flag_field.first) == "use_api_listener") { + return flag_field.second.bool_value(); + } + } + } + } + } + } + return false; +} + +} // namespace EngineCommon::EngineCommon(std::unique_ptr&& options) : options_(std::move(options)) { // TODO(alyssar) when this defaults true, move E-M default config over to boostrap config. - if (absl::StrContains(options_->configYaml(), "use_api_listener: true")) { + if (useApiListener(options_->configProto()) || + absl::StrContains(options_->configYaml(), "use_api_listener: true")) { options_->setListenerManager("envoy.listener_manager_impl.api"); }