Skip to content

Commit 0dd74a9

Browse files
authored
config: v2 non-pubsub transport API fatal-by-default. (envoyproxy#14389)
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]>
1 parent 37e9414 commit 0dd74a9

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+238
-99
lines changed

source/common/config/BUILD

+1
Original file line numberDiff line numberDiff line change
@@ -392,6 +392,7 @@ envoy_cc_library(
392392
"//source/common/grpc:common_lib",
393393
"//source/common/protobuf",
394394
"//source/common/protobuf:utility_lib",
395+
"//source/common/runtime:runtime_features_lib",
395396
"//source/common/singleton:const_singleton",
396397
"//source/common/stats:histogram_lib",
397398
"//source/common/stats:stats_lib",

source/common/config/subscription_factory_impl.cc

+11-29
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@ namespace Config {
1919
SubscriptionFactoryImpl::SubscriptionFactoryImpl(
2020
const LocalInfo::LocalInfo& local_info, Event::Dispatcher& dispatcher,
2121
Upstream::ClusterManager& cm, ProtobufMessage::ValidationVisitor& validation_visitor,
22-
Api::Api& api, Runtime::Loader& runtime)
22+
Api::Api& api)
2323
: local_info_(local_info), dispatcher_(dispatcher), cm_(cm),
24-
validation_visitor_(validation_visitor), api_(api), runtime_(runtime) {}
24+
validation_visitor_(validation_visitor), api_(api) {}
2525

2626
SubscriptionPtr SubscriptionFactoryImpl::subscriptionFromConfigSource(
2727
const envoy::config::core::v3::ConfigSource& config, absl::string_view type_url,
@@ -41,24 +41,7 @@ SubscriptionPtr SubscriptionFactoryImpl::subscriptionFromConfigSource(
4141
const envoy::config::core::v3::ApiConfigSource& api_config_source = config.api_config_source();
4242
Utility::checkApiConfigSourceSubscriptionBackingCluster(cm_.primaryClusters(),
4343
api_config_source);
44-
const auto transport_api_version = api_config_source.transport_api_version();
45-
if (transport_api_version == envoy::config::core::v3::ApiVersion::AUTO ||
46-
transport_api_version == envoy::config::core::v3::ApiVersion::V2) {
47-
runtime_.countDeprecatedFeatureUse();
48-
const std::string& warning = fmt::format(
49-
"V2 (and AUTO) xDS transport protocol versions are deprecated in {}. "
50-
"The v2 xDS major version is deprecated and disabled by default. Support for v2 will be "
51-
"removed from Envoy at the start of Q1 2021. You may make use of v2 in Q4 2020 by "
52-
"following the advice in https://www.envoyproxy.io/docs/envoy/latest/faq/api/transition.",
53-
config.DebugString());
54-
ENVOY_LOG(warn, warning);
55-
auto& runtime_snapshot = runtime_.snapshot();
56-
if (!runtime_snapshot.runtimeFeatureEnabled(
57-
"envoy.reloadable_features.enable_deprecated_v2_api")) {
58-
throw DeprecatedMajorVersionException(warning);
59-
}
60-
}
61-
44+
const auto transport_api_version = Utility::getAndCheckTransportVersion(api_config_source);
6245
switch (api_config_source.api_type()) {
6346
case envoy::config::core::v3::ApiConfigSource::hidden_envoy_deprecated_UNSUPPORTED_REST_LEGACY:
6447
throw EnvoyException(
@@ -70,19 +53,18 @@ SubscriptionPtr SubscriptionFactoryImpl::subscriptionFromConfigSource(
7053
local_info_, cm_, api_config_source.cluster_names()[0], dispatcher_,
7154
api_.randomGenerator(), Utility::apiConfigSourceRefreshDelay(api_config_source),
7255
Utility::apiConfigSourceRequestTimeout(api_config_source),
73-
restMethod(type_url, api_config_source.transport_api_version()), type_url,
74-
api_config_source.transport_api_version(), callbacks, resource_decoder, stats,
75-
Utility::configSourceInitialFetchTimeout(config), validation_visitor_);
56+
restMethod(type_url, transport_api_version), type_url, transport_api_version, callbacks,
57+
resource_decoder, stats, Utility::configSourceInitialFetchTimeout(config),
58+
validation_visitor_);
7659
case envoy::config::core::v3::ApiConfigSource::GRPC:
7760
return std::make_unique<GrpcSubscriptionImpl>(
7861
std::make_shared<Config::GrpcMuxImpl>(
7962
local_info_,
8063
Utility::factoryForGrpcApiConfigSource(cm_.grpcAsyncClientManager(),
8164
api_config_source, scope, true)
8265
->create(),
83-
dispatcher_, sotwGrpcMethod(type_url, api_config_source.transport_api_version()),
84-
api_config_source.transport_api_version(), api_.randomGenerator(), scope,
85-
Utility::parseRateLimitSettings(api_config_source),
66+
dispatcher_, sotwGrpcMethod(type_url, transport_api_version), transport_api_version,
67+
api_.randomGenerator(), scope, Utility::parseRateLimitSettings(api_config_source),
8668
api_config_source.set_node_on_first_message_only()),
8769
callbacks, resource_decoder, stats, type_url, dispatcher_,
8870
Utility::configSourceInitialFetchTimeout(config),
@@ -93,9 +75,9 @@ SubscriptionPtr SubscriptionFactoryImpl::subscriptionFromConfigSource(
9375
Config::Utility::factoryForGrpcApiConfigSource(cm_.grpcAsyncClientManager(),
9476
api_config_source, scope, true)
9577
->create(),
96-
dispatcher_, deltaGrpcMethod(type_url, api_config_source.transport_api_version()),
97-
api_config_source.transport_api_version(), api_.randomGenerator(), scope,
98-
Utility::parseRateLimitSettings(api_config_source), local_info_),
78+
dispatcher_, deltaGrpcMethod(type_url, transport_api_version), transport_api_version,
79+
api_.randomGenerator(), scope, Utility::parseRateLimitSettings(api_config_source),
80+
local_info_),
9981
callbacks, resource_decoder, stats, type_url, dispatcher_,
10082
Utility::configSourceInitialFetchTimeout(config), false);
10183
}

source/common/config/subscription_factory_impl.h

+1-3
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,7 @@ class SubscriptionFactoryImpl : public SubscriptionFactory, Logger::Loggable<Log
1717
public:
1818
SubscriptionFactoryImpl(const LocalInfo::LocalInfo& local_info, Event::Dispatcher& dispatcher,
1919
Upstream::ClusterManager& cm,
20-
ProtobufMessage::ValidationVisitor& validation_visitor, Api::Api& api,
21-
Runtime::Loader& runtime);
20+
ProtobufMessage::ValidationVisitor& validation_visitor, Api::Api& api);
2221

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

4442
} // namespace Config

source/common/config/utility.h

+29
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include "common/grpc/common.h"
2727
#include "common/protobuf/protobuf.h"
2828
#include "common/protobuf/utility.h"
29+
#include "common/runtime/runtime_features.h"
2930
#include "common/singleton/const_singleton.h"
3031

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

186+
/**
187+
* Access transport_api_version field in ApiConfigSource, while validating version
188+
* compatibility.
189+
* @param api_config_source the config source to extract transport API version from.
190+
* @return envoy::config::core::v3::ApiVersion transport API version
191+
* @throws DeprecatedMajorVersionException when the transport version is disabled.
192+
*/
193+
template <class Proto>
194+
static envoy::config::core::v3::ApiVersion
195+
getAndCheckTransportVersion(const Proto& api_config_source) {
196+
const auto transport_api_version = api_config_source.transport_api_version();
197+
if (transport_api_version == envoy::config::core::v3::ApiVersion::AUTO ||
198+
transport_api_version == envoy::config::core::v3::ApiVersion::V2) {
199+
Runtime::LoaderSingleton::getExisting()->countDeprecatedFeatureUse();
200+
const std::string& warning = fmt::format(
201+
"V2 (and AUTO) xDS transport protocol versions are deprecated in {}. "
202+
"The v2 xDS major version is deprecated and disabled by default. Support for v2 will be "
203+
"removed from Envoy at the start of Q1 2021. You may make use of v2 in Q4 2020 by "
204+
"following the advice in https://www.envoyproxy.io/docs/envoy/latest/faq/api/transition.",
205+
api_config_source.DebugString());
206+
ENVOY_LOG_MISC(warn, warning);
207+
if (!Runtime::runtimeFeatureEnabled("envoy.reloadable_features.enable_deprecated_v2_api")) {
208+
throw DeprecatedMajorVersionException(warning);
209+
}
210+
}
211+
return transport_api_version;
212+
}
213+
185214
/**
186215
* Parses RateLimit configuration from envoy::config::core::v3::ApiConfigSource to
187216
* RateLimitSettings.

source/common/upstream/cluster_manager_impl.cc

+6-6
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,7 @@ ClusterManagerImpl::ClusterManagerImpl(
265265
cluster_request_response_size_stat_names_(stats.symbolTable()),
266266
cluster_timeout_budget_stat_names_(stats.symbolTable()),
267267
subscription_factory_(local_info, main_thread_dispatcher, *this,
268-
validation_context.dynamicValidationVisitor(), api, runtime_) {
268+
validation_context.dynamicValidationVisitor(), api) {
269269
async_client_manager_ = std::make_unique<Grpc::AsyncClientManagerImpl>(
270270
*this, tls, time_source_, api, grpc_context.statNames());
271271
const auto& cm_config = bootstrap.cluster_manager();
@@ -325,14 +325,14 @@ ClusterManagerImpl::ClusterManagerImpl(
325325
->create(),
326326
main_thread_dispatcher,
327327
*Protobuf::DescriptorPool::generated_pool()->FindMethodByName(
328-
dyn_resources.ads_config().transport_api_version() ==
328+
Config::Utility::getAndCheckTransportVersion(dyn_resources.ads_config()) ==
329329
envoy::config::core::v3::ApiVersion::V3
330330
// TODO(htuch): consolidate with type_to_endpoint.cc, once we sort out the future
331331
// direction of that module re: https://github.com/envoyproxy/envoy/issues/10650.
332332
? "envoy.service.discovery.v3.AggregatedDiscoveryService.DeltaAggregatedResources"
333333
: "envoy.service.discovery.v2.AggregatedDiscoveryService."
334334
"DeltaAggregatedResources"),
335-
dyn_resources.ads_config().transport_api_version(), random_, stats_,
335+
Config::Utility::getAndCheckTransportVersion(dyn_resources.ads_config()), random_, stats_,
336336
Envoy::Config::Utility::parseRateLimitSettings(dyn_resources.ads_config()), local_info);
337337
} else {
338338
ads_mux_ = std::make_shared<Config::GrpcMuxImpl>(
@@ -342,15 +342,15 @@ ClusterManagerImpl::ClusterManagerImpl(
342342
->create(),
343343
main_thread_dispatcher,
344344
*Protobuf::DescriptorPool::generated_pool()->FindMethodByName(
345-
dyn_resources.ads_config().transport_api_version() ==
345+
Config::Utility::getAndCheckTransportVersion(dyn_resources.ads_config()) ==
346346
envoy::config::core::v3::ApiVersion::V3
347347
// TODO(htuch): consolidate with type_to_endpoint.cc, once we sort out the future
348348
// direction of that module re: https://github.com/envoyproxy/envoy/issues/10650.
349349
? "envoy.service.discovery.v3.AggregatedDiscoveryService."
350350
"StreamAggregatedResources"
351351
: "envoy.service.discovery.v2.AggregatedDiscoveryService."
352352
"StreamAggregatedResources"),
353-
dyn_resources.ads_config().transport_api_version(), random_, stats_,
353+
Config::Utility::getAndCheckTransportVersion(dyn_resources.ads_config()), random_, stats_,
354354
Envoy::Config::Utility::parseRateLimitSettings(dyn_resources.ads_config()),
355355
bootstrap.dynamic_resources().ads_config().set_node_on_first_message_only());
356356
}
@@ -425,7 +425,7 @@ void ClusterManagerImpl::initializeSecondaryClusters(
425425
Config::Utility::factoryForGrpcApiConfigSource(*async_client_manager_, load_stats_config,
426426
stats_, false)
427427
->create(),
428-
load_stats_config.transport_api_version(), dispatcher_);
428+
Config::Utility::getAndCheckTransportVersion(load_stats_config), dispatcher_);
429429
}
430430
}
431431

source/extensions/access_loggers/common/BUILD

+1
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ envoy_cc_library(
3333
"//include/envoy/stats:stats_interface",
3434
"//include/envoy/thread_local:thread_local_interface",
3535
"//source/common/common:assert_lib",
36+
"//source/common/config:utility_lib",
3637
"//source/common/grpc:typed_async_client_lib",
3738
"//source/common/protobuf:utility_lib",
3839
"@com_google_absl//absl/types:optional",

source/extensions/access_loggers/common/grpc_access_logger.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include "envoy/thread_local/thread_local.h"
1212

1313
#include "common/common/assert.h"
14+
#include "common/config/utility.h"
1415
#include "common/grpc/typed_async_client.h"
1516
#include "common/protobuf/utility.h"
1617

@@ -201,7 +202,7 @@ class GrpcAccessLoggerCache : public Singleton::Instance,
201202
factory->create(), config.log_name(),
202203
std::chrono::milliseconds(PROTOBUF_GET_MS_OR_DEFAULT(config, buffer_flush_interval, 1000)),
203204
PROTOBUF_GET_WRAPPED_OR_DEFAULT(config, buffer_size_bytes, 16384), cache.dispatcher_,
204-
local_info_, scope, config.transport_api_version());
205+
local_info_, scope, Config::Utility::getAndCheckTransportVersion(config));
205206
cache.access_loggers_.emplace(cache_key, logger);
206207
return logger;
207208
}

source/extensions/filters/http/ext_authz/BUILD

+1
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ envoy_cc_extension(
4545
":ext_authz",
4646
"//include/envoy/registry",
4747
"//include/envoy/stats:stats_macros",
48+
"//source/common/config:utility_lib",
4849
"//source/common/grpc:google_async_client_cache",
4950
"//source/common/protobuf:utility_lib",
5051
"//source/extensions/filters/common/ext_authz:ext_authz_http_lib",

source/extensions/filters/http/ext_authz/config.cc

+3-2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include "envoy/extensions/filters/http/ext_authz/v3/ext_authz.pb.validate.h"
99
#include "envoy/registry/registry.h"
1010

11+
#include "common/config/utility.h"
1112
#include "common/grpc/google_async_client_cache.h"
1213
#include "common/protobuf/utility.h"
1314

@@ -59,7 +60,7 @@ Http::FilterFactoryCb ExtAuthzFilterConfig::createFilterFactoryFromProtoTyped(
5960
context.clusterManager().grpcAsyncClientManager(), context.scope(),
6061
context.threadLocal(), proto_config.grpc_service());
6162
callback = [async_client_cache, filter_config, timeout_ms, proto_config,
62-
transport_api_version = proto_config.transport_api_version()](
63+
transport_api_version = Config::Utility::getAndCheckTransportVersion(proto_config)](
6364
Http::FilterChainFactoryCallbacks& callbacks) {
6465
auto client = std::make_unique<Filters::Common::ExtAuthz::GrpcClientImpl>(
6566
async_client_cache->getAsyncClient(), std::chrono::milliseconds(timeout_ms),
@@ -79,7 +80,7 @@ Http::FilterFactoryCb ExtAuthzFilterConfig::createFilterFactoryFromProtoTyped(
7980
const uint32_t timeout_ms =
8081
PROTOBUF_GET_MS_OR_DEFAULT(proto_config.grpc_service(), timeout, DefaultTimeout);
8182
callback = [grpc_service = proto_config.grpc_service(), &context, filter_config, timeout_ms,
82-
transport_api_version = proto_config.transport_api_version()](
83+
transport_api_version = Config::Utility::getAndCheckTransportVersion(proto_config)](
8384
Http::FilterChainFactoryCallbacks& callbacks) {
8485
const auto async_client_factory =
8586
context.clusterManager().grpcAsyncClientManager().factoryForGrpcService(

source/extensions/filters/http/ratelimit/BUILD

+1
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ envoy_cc_extension(
4949
deps = [
5050
":ratelimit_lib",
5151
"//include/envoy/registry",
52+
"//source/common/config:utility_lib",
5253
"//source/common/protobuf:utility_lib",
5354
"//source/extensions/filters/common/ratelimit:ratelimit_client_interface",
5455
"//source/extensions/filters/common/ratelimit:ratelimit_lib",

source/extensions/filters/http/ratelimit/config.cc

+5-3
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include "envoy/extensions/filters/http/ratelimit/v3/rate_limit.pb.validate.h"
88
#include "envoy/registry/registry.h"
99

10+
#include "common/config/utility.h"
1011
#include "common/protobuf/utility.h"
1112

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

source/extensions/filters/network/ext_authz/BUILD

+1
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ envoy_cc_extension(
4040
security_posture = "robust_to_untrusted_downstream",
4141
deps = [
4242
"//include/envoy/registry",
43+
"//source/common/config:utility_lib",
4344
"//source/common/protobuf:utility_lib",
4445
"//source/extensions/filters/network:well_known_names",
4546
"//source/extensions/filters/network/common:factory_base_lib",

source/extensions/filters/network/ext_authz/config.cc

+2-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include "envoy/network/connection.h"
1010
#include "envoy/registry/registry.h"
1111

12+
#include "common/config/utility.h"
1213
#include "common/protobuf/utility.h"
1314

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

2930
return [grpc_service = proto_config.grpc_service(), &context, ext_authz_config,
30-
transport_api_version = proto_config.transport_api_version(),
31+
transport_api_version = Envoy::Config::Utility::getAndCheckTransportVersion(proto_config),
3132
timeout_ms](Network::FilterManager& filter_manager) -> void {
3233
auto async_client_factory =
3334
context.clusterManager().grpcAsyncClientManager().factoryForGrpcService(

source/extensions/filters/network/ratelimit/BUILD

+1
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ envoy_cc_extension(
4141
security_posture = "robust_to_untrusted_downstream",
4242
deps = [
4343
"//include/envoy/registry",
44+
"//source/common/config:utility_lib",
4445
"//source/common/protobuf:utility_lib",
4546
"//source/extensions/filters/common/ratelimit:ratelimit_client_interface",
4647
"//source/extensions/filters/common/ratelimit:ratelimit_lib",

source/extensions/filters/network/ratelimit/config.cc

+5-5
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include "envoy/extensions/filters/network/ratelimit/v3/rate_limit.pb.validate.h"
88
#include "envoy/registry/registry.h"
99

10+
#include "common/config/utility.h"
1011
#include "common/protobuf/utility.h"
1112

1213
#include "extensions/filters/common/ratelimit/ratelimit_impl.h"
@@ -32,11 +33,10 @@ Network::FilterFactoryCb RateLimitConfigFactory::createFilterFactoryFromProtoTyp
3233
return [proto_config, &context, timeout,
3334
filter_config](Network::FilterManager& filter_manager) -> void {
3435
filter_manager.addReadFilter(std::make_shared<Filter>(
35-
filter_config,
36-
37-
Filters::Common::RateLimit::rateLimitClient(
38-
context, proto_config.rate_limit_service().grpc_service(), timeout,
39-
proto_config.rate_limit_service().transport_api_version())));
36+
filter_config, Filters::Common::RateLimit::rateLimitClient(
37+
context, proto_config.rate_limit_service().grpc_service(), timeout,
38+
Envoy::Config::Utility::getAndCheckTransportVersion(
39+
proto_config.rate_limit_service()))));
4040
};
4141
}
4242

source/extensions/filters/network/thrift_proxy/filters/ratelimit/BUILD

+1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ envoy_cc_extension(
3636
deps = [
3737
":ratelimit_lib",
3838
"//include/envoy/registry",
39+
"//source/common/config:utility_lib",
3940
"//source/common/protobuf:utility_lib",
4041
"//source/extensions/filters/common/ratelimit:ratelimit_client_interface",
4142
"//source/extensions/filters/common/ratelimit:ratelimit_lib",

0 commit comments

Comments
 (0)