Skip to content

Commit

Permalink
config: v2 non-pubsub transport API fatal-by-default.
Browse files Browse the repository at this point in the history
This is a followup to envoyproxy#14223, covering remaining uses of the
transport_api_version field.

Risk level: High (this will break anyone who is still using v2 and has
   not enabled CLI or runtime override)
Testing: Various tests updated, some exemplar tests added to
  server_test.
Release Notes: Same as envoyproxy#13950.

Signed-off-by: Harvey Tuch <[email protected]>
  • Loading branch information
htuch committed Dec 14, 2020
1 parent ac344a7 commit 03850d6
Show file tree
Hide file tree
Showing 44 changed files with 235 additions and 98 deletions.
1 change: 1 addition & 0 deletions source/common/config/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -392,6 +392,7 @@ envoy_cc_library(
"//source/common/grpc:common_lib",
"//source/common/protobuf",
"//source/common/protobuf:utility_lib",
"//source/common/runtime:runtime_features_lib",
"//source/common/singleton:const_singleton",
"//source/common/stats:histogram_lib",
"//source/common/stats:stats_lib",
Expand Down
40 changes: 11 additions & 29 deletions source/common/config/subscription_factory_impl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@ namespace Config {
SubscriptionFactoryImpl::SubscriptionFactoryImpl(
const LocalInfo::LocalInfo& local_info, Event::Dispatcher& dispatcher,
Upstream::ClusterManager& cm, ProtobufMessage::ValidationVisitor& validation_visitor,
Api::Api& api, Runtime::Loader& runtime)
Api::Api& api)
: local_info_(local_info), dispatcher_(dispatcher), cm_(cm),
validation_visitor_(validation_visitor), api_(api), runtime_(runtime) {}
validation_visitor_(validation_visitor), api_(api) {}

SubscriptionPtr SubscriptionFactoryImpl::subscriptionFromConfigSource(
const envoy::config::core::v3::ConfigSource& config, absl::string_view type_url,
Expand All @@ -41,24 +41,7 @@ SubscriptionPtr SubscriptionFactoryImpl::subscriptionFromConfigSource(
const envoy::config::core::v3::ApiConfigSource& api_config_source = config.api_config_source();
Utility::checkApiConfigSourceSubscriptionBackingCluster(cm_.primaryClusters(),
api_config_source);
const auto transport_api_version = api_config_source.transport_api_version();
if (transport_api_version == envoy::config::core::v3::ApiVersion::AUTO ||
transport_api_version == envoy::config::core::v3::ApiVersion::V2) {
runtime_.countDeprecatedFeatureUse();
const std::string& warning = fmt::format(
"V2 (and AUTO) xDS transport protocol versions are deprecated in {}. "
"The v2 xDS major version is deprecated and disabled by default. Support for v2 will be "
"removed from Envoy at the start of Q1 2021. You may make use of v2 in Q4 2020 by "
"following the advice in https://www.envoyproxy.io/docs/envoy/latest/faq/api/transition.",
config.DebugString());
ENVOY_LOG(warn, warning);
auto& runtime_snapshot = runtime_.snapshot();
if (!runtime_snapshot.runtimeFeatureEnabled(
"envoy.reloadable_features.enable_deprecated_v2_api")) {
throw DeprecatedMajorVersionException(warning);
}
}

const auto transport_api_version = Utility::getAndCheckTransportVersion(api_config_source);
switch (api_config_source.api_type()) {
case envoy::config::core::v3::ApiConfigSource::hidden_envoy_deprecated_UNSUPPORTED_REST_LEGACY:
throw EnvoyException(
Expand All @@ -70,19 +53,18 @@ SubscriptionPtr SubscriptionFactoryImpl::subscriptionFromConfigSource(
local_info_, cm_, api_config_source.cluster_names()[0], dispatcher_,
api_.randomGenerator(), Utility::apiConfigSourceRefreshDelay(api_config_source),
Utility::apiConfigSourceRequestTimeout(api_config_source),
restMethod(type_url, api_config_source.transport_api_version()), type_url,
api_config_source.transport_api_version(), callbacks, resource_decoder, stats,
Utility::configSourceInitialFetchTimeout(config), validation_visitor_);
restMethod(type_url, transport_api_version), type_url, transport_api_version, callbacks,
resource_decoder, stats, Utility::configSourceInitialFetchTimeout(config),
validation_visitor_);
case envoy::config::core::v3::ApiConfigSource::GRPC:
return std::make_unique<GrpcSubscriptionImpl>(
std::make_shared<Config::GrpcMuxImpl>(
local_info_,
Utility::factoryForGrpcApiConfigSource(cm_.grpcAsyncClientManager(),
api_config_source, scope, true)
->create(),
dispatcher_, sotwGrpcMethod(type_url, api_config_source.transport_api_version()),
api_config_source.transport_api_version(), api_.randomGenerator(), scope,
Utility::parseRateLimitSettings(api_config_source),
dispatcher_, sotwGrpcMethod(type_url, transport_api_version), transport_api_version,
api_.randomGenerator(), scope, Utility::parseRateLimitSettings(api_config_source),
api_config_source.set_node_on_first_message_only()),
callbacks, resource_decoder, stats, type_url, dispatcher_,
Utility::configSourceInitialFetchTimeout(config),
Expand All @@ -93,9 +75,9 @@ SubscriptionPtr SubscriptionFactoryImpl::subscriptionFromConfigSource(
Config::Utility::factoryForGrpcApiConfigSource(cm_.grpcAsyncClientManager(),
api_config_source, scope, true)
->create(),
dispatcher_, deltaGrpcMethod(type_url, api_config_source.transport_api_version()),
api_config_source.transport_api_version(), api_.randomGenerator(), scope,
Utility::parseRateLimitSettings(api_config_source), local_info_),
dispatcher_, deltaGrpcMethod(type_url, transport_api_version), transport_api_version,
api_.randomGenerator(), scope, Utility::parseRateLimitSettings(api_config_source),
local_info_),
callbacks, resource_decoder, stats, type_url, dispatcher_,
Utility::configSourceInitialFetchTimeout(config), false);
}
Expand Down
4 changes: 1 addition & 3 deletions source/common/config/subscription_factory_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,7 @@ class SubscriptionFactoryImpl : public SubscriptionFactory, Logger::Loggable<Log
public:
SubscriptionFactoryImpl(const LocalInfo::LocalInfo& local_info, Event::Dispatcher& dispatcher,
Upstream::ClusterManager& cm,
ProtobufMessage::ValidationVisitor& validation_visitor, Api::Api& api,
Runtime::Loader& runtime);
ProtobufMessage::ValidationVisitor& validation_visitor, Api::Api& api);

// Config::SubscriptionFactory
SubscriptionPtr subscriptionFromConfigSource(const envoy::config::core::v3::ConfigSource& config,
Expand All @@ -38,7 +37,6 @@ class SubscriptionFactoryImpl : public SubscriptionFactory, Logger::Loggable<Log
Upstream::ClusterManager& cm_;
ProtobufMessage::ValidationVisitor& validation_visitor_;
Api::Api& api_;
Runtime::Loader& runtime_;
};

} // namespace Config
Expand Down
29 changes: 29 additions & 0 deletions source/common/config/utility.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
#include "common/grpc/common.h"
#include "common/protobuf/protobuf.h"
#include "common/protobuf/utility.h"
#include "common/runtime/runtime_features.h"
#include "common/singleton/const_singleton.h"

#include "udpa/type/v1/typed_struct.pb.h"
Expand Down Expand Up @@ -182,6 +183,34 @@ class Utility {
const Upstream::ClusterManager::ClusterSet& primary_clusters,
const envoy::config::core::v3::ApiConfigSource& api_config_source);

/**
* Access transport_api_version field in ApiConfigSource, while validating version
* compatibility.
* @param api_config_source the config source to extract transport API version from.
* @return envoy::config::core::v3::ApiVersion transport API version
* @throws DeprecateDMajorVersion when the transport version is disabled.
*/
template <class Proto>
static envoy::config::core::v3::ApiVersion
getAndCheckTransportVersion(const Proto& api_config_source) {
const auto transport_api_version = api_config_source.transport_api_version();
if (transport_api_version == envoy::config::core::v3::ApiVersion::AUTO ||
transport_api_version == envoy::config::core::v3::ApiVersion::V2) {
Runtime::LoaderSingleton::getExisting()->countDeprecatedFeatureUse();
const std::string& warning = fmt::format(
"V2 (and AUTO) xDS transport protocol versions are deprecated in {}. "
"The v2 xDS major version is deprecated and disabled by default. Support for v2 will be "
"removed from Envoy at the start of Q1 2021. You may make use of v2 in Q4 2020 by "
"following the advice in https://www.envoyproxy.io/docs/envoy/latest/faq/api/transition.",
api_config_source.DebugString());
ENVOY_LOG_MISC(warn, warning);
if (!Runtime::runtimeFeatureEnabled("envoy.reloadable_features.enable_deprecated_v2_api")) {
throw DeprecatedMajorVersionException(warning);
}
}
return transport_api_version;
}

/**
* Parses RateLimit configuration from envoy::config::core::v3::ApiConfigSource to
* RateLimitSettings.
Expand Down
12 changes: 6 additions & 6 deletions source/common/upstream/cluster_manager_impl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -265,7 +265,7 @@ ClusterManagerImpl::ClusterManagerImpl(
cluster_request_response_size_stat_names_(stats.symbolTable()),
cluster_timeout_budget_stat_names_(stats.symbolTable()),
subscription_factory_(local_info, main_thread_dispatcher, *this,
validation_context.dynamicValidationVisitor(), api, runtime_) {
validation_context.dynamicValidationVisitor(), api) {
async_client_manager_ = std::make_unique<Grpc::AsyncClientManagerImpl>(
*this, tls, time_source_, api, grpc_context.statNames());
const auto& cm_config = bootstrap.cluster_manager();
Expand Down Expand Up @@ -325,14 +325,14 @@ ClusterManagerImpl::ClusterManagerImpl(
->create(),
main_thread_dispatcher,
*Protobuf::DescriptorPool::generated_pool()->FindMethodByName(
dyn_resources.ads_config().transport_api_version() ==
Config::Utility::getAndCheckTransportVersion(dyn_resources.ads_config()) ==
envoy::config::core::v3::ApiVersion::V3
// TODO(htuch): consolidate with type_to_endpoint.cc, once we sort out the future
// direction of that module re: https://github.com/envoyproxy/envoy/issues/10650.
? "envoy.service.discovery.v3.AggregatedDiscoveryService.DeltaAggregatedResources"
: "envoy.service.discovery.v2.AggregatedDiscoveryService."
"DeltaAggregatedResources"),
dyn_resources.ads_config().transport_api_version(), random_, stats_,
Config::Utility::getAndCheckTransportVersion(dyn_resources.ads_config()), random_, stats_,
Envoy::Config::Utility::parseRateLimitSettings(dyn_resources.ads_config()), local_info);
} else {
ads_mux_ = std::make_shared<Config::GrpcMuxImpl>(
Expand All @@ -342,15 +342,15 @@ ClusterManagerImpl::ClusterManagerImpl(
->create(),
main_thread_dispatcher,
*Protobuf::DescriptorPool::generated_pool()->FindMethodByName(
dyn_resources.ads_config().transport_api_version() ==
Config::Utility::getAndCheckTransportVersion(dyn_resources.ads_config()) ==
envoy::config::core::v3::ApiVersion::V3
// TODO(htuch): consolidate with type_to_endpoint.cc, once we sort out the future
// direction of that module re: https://github.com/envoyproxy/envoy/issues/10650.
? "envoy.service.discovery.v3.AggregatedDiscoveryService."
"StreamAggregatedResources"
: "envoy.service.discovery.v2.AggregatedDiscoveryService."
"StreamAggregatedResources"),
dyn_resources.ads_config().transport_api_version(), random_, stats_,
Config::Utility::getAndCheckTransportVersion(dyn_resources.ads_config()), random_, stats_,
Envoy::Config::Utility::parseRateLimitSettings(dyn_resources.ads_config()),
bootstrap.dynamic_resources().ads_config().set_node_on_first_message_only());
}
Expand Down Expand Up @@ -437,7 +437,7 @@ void ClusterManagerImpl::initializeSecondaryClusters(
Config::Utility::factoryForGrpcApiConfigSource(*async_client_manager_, load_stats_config,
stats_, false)
->create(),
load_stats_config.transport_api_version(), dispatcher_);
Config::Utility::getAndCheckTransportVersion(load_stats_config), dispatcher_);
}
}

Expand Down
1 change: 1 addition & 0 deletions source/extensions/access_loggers/common/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ envoy_cc_library(
"//include/envoy/stats:stats_interface",
"//include/envoy/thread_local:thread_local_interface",
"//source/common/common:assert_lib",
"//source/common/config:utility_lib",
"//source/common/grpc:typed_async_client_lib",
"//source/common/protobuf:utility_lib",
"@com_google_absl//absl/types:optional",
Expand Down
3 changes: 2 additions & 1 deletion source/extensions/access_loggers/common/grpc_access_logger.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
#include "envoy/thread_local/thread_local.h"

#include "common/common/assert.h"
#include "common/config/utility.h"
#include "common/grpc/typed_async_client.h"
#include "common/protobuf/utility.h"

Expand Down Expand Up @@ -201,7 +202,7 @@ class GrpcAccessLoggerCache : public Singleton::Instance,
factory->create(), config.log_name(),
std::chrono::milliseconds(PROTOBUF_GET_MS_OR_DEFAULT(config, buffer_flush_interval, 1000)),
PROTOBUF_GET_WRAPPED_OR_DEFAULT(config, buffer_size_bytes, 16384), cache.dispatcher_,
local_info_, scope, config.transport_api_version());
local_info_, scope, Config::Utility::getAndCheckTransportVersion(config));
cache.access_loggers_.emplace(cache_key, logger);
return logger;
}
Expand Down
1 change: 1 addition & 0 deletions source/extensions/filters/http/ext_authz/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ envoy_cc_extension(
":ext_authz",
"//include/envoy/registry",
"//include/envoy/stats:stats_macros",
"//source/common/config:utility_lib",
"//source/common/grpc:google_async_client_cache",
"//source/common/protobuf:utility_lib",
"//source/extensions/filters/common/ext_authz:ext_authz_http_lib",
Expand Down
5 changes: 3 additions & 2 deletions source/extensions/filters/http/ext_authz/config.cc
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#include "envoy/extensions/filters/http/ext_authz/v3/ext_authz.pb.validate.h"
#include "envoy/registry/registry.h"

#include "common/config/utility.h"
#include "common/grpc/google_async_client_cache.h"
#include "common/protobuf/utility.h"

Expand Down Expand Up @@ -59,7 +60,7 @@ Http::FilterFactoryCb ExtAuthzFilterConfig::createFilterFactoryFromProtoTyped(
context.clusterManager().grpcAsyncClientManager(), context.scope(),
context.threadLocal(), proto_config.grpc_service());
callback = [async_client_cache, filter_config, timeout_ms, proto_config,
transport_api_version = proto_config.transport_api_version()](
transport_api_version = Config::Utility::getAndCheckTransportVersion(proto_config)](
Http::FilterChainFactoryCallbacks& callbacks) {
auto client = std::make_unique<Filters::Common::ExtAuthz::GrpcClientImpl>(
async_client_cache->getAsyncClient(), std::chrono::milliseconds(timeout_ms),
Expand All @@ -79,7 +80,7 @@ Http::FilterFactoryCb ExtAuthzFilterConfig::createFilterFactoryFromProtoTyped(
const uint32_t timeout_ms =
PROTOBUF_GET_MS_OR_DEFAULT(proto_config.grpc_service(), timeout, DefaultTimeout);
callback = [grpc_service = proto_config.grpc_service(), &context, filter_config, timeout_ms,
transport_api_version = proto_config.transport_api_version()](
transport_api_version = Config::Utility::getAndCheckTransportVersion(proto_config)](
Http::FilterChainFactoryCallbacks& callbacks) {
const auto async_client_factory =
context.clusterManager().grpcAsyncClientManager().factoryForGrpcService(
Expand Down
1 change: 1 addition & 0 deletions source/extensions/filters/http/ratelimit/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ envoy_cc_extension(
deps = [
":ratelimit_lib",
"//include/envoy/registry",
"//source/common/config:utility_lib",
"//source/common/protobuf:utility_lib",
"//source/extensions/filters/common/ratelimit:ratelimit_client_interface",
"//source/extensions/filters/common/ratelimit:ratelimit_lib",
Expand Down
8 changes: 5 additions & 3 deletions source/extensions/filters/http/ratelimit/config.cc
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include "envoy/extensions/filters/http/ratelimit/v3/rate_limit.pb.validate.h"
#include "envoy/registry/registry.h"

#include "common/config/utility.h"
#include "common/protobuf/utility.h"

#include "extensions/filters/common/ratelimit/ratelimit_impl.h"
Expand All @@ -30,9 +31,10 @@ Http::FilterFactoryCb RateLimitFilterConfig::createFilterFactoryFromProtoTyped(
return [proto_config, &context, timeout,
filter_config](Http::FilterChainFactoryCallbacks& callbacks) -> void {
callbacks.addStreamFilter(std::make_shared<Filter>(
filter_config, Filters::Common::RateLimit::rateLimitClient(
context, proto_config.rate_limit_service().grpc_service(), timeout,
proto_config.rate_limit_service().transport_api_version())));
filter_config,
Filters::Common::RateLimit::rateLimitClient(
context, proto_config.rate_limit_service().grpc_service(), timeout,
Config::Utility::getAndCheckTransportVersion(proto_config.rate_limit_service()))));
};
}

Expand Down
1 change: 1 addition & 0 deletions source/extensions/filters/network/ext_authz/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ envoy_cc_extension(
security_posture = "robust_to_untrusted_downstream",
deps = [
"//include/envoy/registry",
"//source/common/config:utility_lib",
"//source/common/protobuf:utility_lib",
"//source/extensions/filters/network:well_known_names",
"//source/extensions/filters/network/common:factory_base_lib",
Expand Down
3 changes: 2 additions & 1 deletion source/extensions/filters/network/ext_authz/config.cc
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#include "envoy/network/connection.h"
#include "envoy/registry/registry.h"

#include "common/config/utility.h"
#include "common/protobuf/utility.h"

#include "extensions/filters/common/ext_authz/ext_authz.h"
Expand All @@ -27,7 +28,7 @@ Network::FilterFactoryCb ExtAuthzConfigFactory::createFilterFactoryFromProtoType
const uint32_t timeout_ms = PROTOBUF_GET_MS_OR_DEFAULT(proto_config.grpc_service(), timeout, 200);

return [grpc_service = proto_config.grpc_service(), &context, ext_authz_config,
transport_api_version = proto_config.transport_api_version(),
transport_api_version = Envoy::Config::Utility::getAndCheckTransportVersion(proto_config),
timeout_ms](Network::FilterManager& filter_manager) -> void {
auto async_client_factory =
context.clusterManager().grpcAsyncClientManager().factoryForGrpcService(
Expand Down
1 change: 1 addition & 0 deletions source/extensions/filters/network/ratelimit/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ envoy_cc_extension(
security_posture = "robust_to_untrusted_downstream",
deps = [
"//include/envoy/registry",
"//source/common/config:utility_lib",
"//source/common/protobuf:utility_lib",
"//source/extensions/filters/common/ratelimit:ratelimit_client_interface",
"//source/extensions/filters/common/ratelimit:ratelimit_lib",
Expand Down
10 changes: 5 additions & 5 deletions source/extensions/filters/network/ratelimit/config.cc
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include "envoy/extensions/filters/network/ratelimit/v3/rate_limit.pb.validate.h"
#include "envoy/registry/registry.h"

#include "common/config/utility.h"
#include "common/protobuf/utility.h"

#include "extensions/filters/common/ratelimit/ratelimit_impl.h"
Expand All @@ -32,11 +33,10 @@ Network::FilterFactoryCb RateLimitConfigFactory::createFilterFactoryFromProtoTyp
return [proto_config, &context, timeout,
filter_config](Network::FilterManager& filter_manager) -> void {
filter_manager.addReadFilter(std::make_shared<Filter>(
filter_config,

Filters::Common::RateLimit::rateLimitClient(
context, proto_config.rate_limit_service().grpc_service(), timeout,
proto_config.rate_limit_service().transport_api_version())));
filter_config, Filters::Common::RateLimit::rateLimitClient(
context, proto_config.rate_limit_service().grpc_service(), timeout,
Envoy::Config::Utility::getAndCheckTransportVersion(
proto_config.rate_limit_service()))));
};
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ envoy_cc_extension(
deps = [
":ratelimit_lib",
"//include/envoy/registry",
"//source/common/config:utility_lib",
"//source/common/protobuf:utility_lib",
"//source/extensions/filters/common/ratelimit:ratelimit_client_interface",
"//source/extensions/filters/common/ratelimit:ratelimit_lib",
Expand Down
Loading

0 comments on commit 03850d6

Please sign in to comment.