Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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.
Comment thread
htuch marked this conversation as resolved.
Outdated
*/
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 ||

@dio dio Dec 14, 2020

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not sure if people will argue that "AUTO" should automatically use the currently "stable" version. But I agree that being explicit is great.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, we agreed to deprecate AUTO in #14233.

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