diff --git a/api/envoy/api/v2/core/config_source.proto b/api/envoy/api/v2/core/config_source.proto index 042a847891678..f9fa9c9ffbb07 100644 --- a/api/envoy/api/v2/core/config_source.proto +++ b/api/envoy/api/v2/core/config_source.proto @@ -103,8 +103,20 @@ message RateLimitSettings { // ` etc. may either be sourced from the // filesystem or from an xDS API source. Filesystem configs are watched with // inotify for updates. -// [#next-free-field: 6] +// [#next-free-field: 7] message ConfigSource { + enum XdsApiVersion { + // use for describing explicitly that xDS API version is set automatically. In default, xDS API + // version is V2 + AUTO = 0; + + // use xDS v2 API + V2 = 1; + + // use xDS v3alpha API + V3ALPHA = 2; + } + oneof config_source_specifier { option (validate.required) = true; @@ -150,4 +162,7 @@ message ConfigSource { // means no timeout - Envoy will wait indefinitely for the first xDS config (unless another // timeout applies). The default is 15s. google.protobuf.Duration initial_fetch_timeout = 4; + + // API version for xDS endpoint + XdsApiVersion xds_api_version = 6; } diff --git a/api/envoy/api/v3alpha/core/config_source.proto b/api/envoy/api/v3alpha/core/config_source.proto index 16a197dfbf6c6..6cef3dd6864ad 100644 --- a/api/envoy/api/v3alpha/core/config_source.proto +++ b/api/envoy/api/v3alpha/core/config_source.proto @@ -113,10 +113,22 @@ message RateLimitSettings { // ` etc. may either be sourced from the // filesystem or from an xDS API source. Filesystem configs are watched with // inotify for updates. -// [#next-free-field: 6] +// [#next-free-field: 7] message ConfigSource { option (udpa.annotations.versioning).previous_message_type = "envoy.api.v2.core.ConfigSource"; + enum XdsApiVersion { + // use for describing explicitly that xDS API version is set automatically. In default, xDS API + // version is V2 + AUTO = 0; + + // use xDS v2 API + V2 = 1; + + // use xDS v3alpha API + V3ALPHA = 2; + } + oneof config_source_specifier { option (validate.required) = true; @@ -162,4 +174,7 @@ message ConfigSource { // means no timeout - Envoy will wait indefinitely for the first xDS config (unless another // timeout applies). The default is 15s. google.protobuf.Duration initial_fetch_timeout = 4; + + // API version for xDS endpoint + XdsApiVersion xds_api_version = 6; } diff --git a/generated_api_shadow/envoy/api/v2/core/config_source.proto b/generated_api_shadow/envoy/api/v2/core/config_source.proto index 042a847891678..f9fa9c9ffbb07 100644 --- a/generated_api_shadow/envoy/api/v2/core/config_source.proto +++ b/generated_api_shadow/envoy/api/v2/core/config_source.proto @@ -103,8 +103,20 @@ message RateLimitSettings { // ` etc. may either be sourced from the // filesystem or from an xDS API source. Filesystem configs are watched with // inotify for updates. -// [#next-free-field: 6] +// [#next-free-field: 7] message ConfigSource { + enum XdsApiVersion { + // use for describing explicitly that xDS API version is set automatically. In default, xDS API + // version is V2 + AUTO = 0; + + // use xDS v2 API + V2 = 1; + + // use xDS v3alpha API + V3ALPHA = 2; + } + oneof config_source_specifier { option (validate.required) = true; @@ -150,4 +162,7 @@ message ConfigSource { // means no timeout - Envoy will wait indefinitely for the first xDS config (unless another // timeout applies). The default is 15s. google.protobuf.Duration initial_fetch_timeout = 4; + + // API version for xDS endpoint + XdsApiVersion xds_api_version = 6; } diff --git a/generated_api_shadow/envoy/api/v3alpha/core/config_source.proto b/generated_api_shadow/envoy/api/v3alpha/core/config_source.proto index a14b34d2c80ab..877b5df4ac4d3 100644 --- a/generated_api_shadow/envoy/api/v3alpha/core/config_source.proto +++ b/generated_api_shadow/envoy/api/v3alpha/core/config_source.proto @@ -113,10 +113,22 @@ message RateLimitSettings { // ` etc. may either be sourced from the // filesystem or from an xDS API source. Filesystem configs are watched with // inotify for updates. -// [#next-free-field: 6] +// [#next-free-field: 7] message ConfigSource { option (udpa.annotations.versioning).previous_message_type = "envoy.api.v2.core.ConfigSource"; + enum XdsApiVersion { + // use for describing explicitly that xDS API version is set automatically. In default, xDS API + // version is V2 + AUTO = 0; + + // use xDS v2 API + V2 = 1; + + // use xDS v3alpha API + V3ALPHA = 2; + } + oneof config_source_specifier { option (validate.required) = true; @@ -162,4 +174,7 @@ message ConfigSource { // means no timeout - Envoy will wait indefinitely for the first xDS config (unless another // timeout applies). The default is 15s. google.protobuf.Duration initial_fetch_timeout = 4; + + // API version for xDS endpoint + XdsApiVersion xds_api_version = 6; } diff --git a/source/common/router/BUILD b/source/common/router/BUILD index 4495396cfa43b..c270e0ec4bba1 100644 --- a/source/common/router/BUILD +++ b/source/common/router/BUILD @@ -139,6 +139,7 @@ envoy_cc_library( "@envoy_api//envoy/api/v2:pkg_cc_proto", "@envoy_api//envoy/api/v2/core:pkg_cc_proto", "@envoy_api//envoy/api/v2/route:pkg_cc_proto", + "@envoy_api//envoy/api/v3alpha/route:pkg_cc_proto", ], ) @@ -172,6 +173,8 @@ envoy_cc_library( "//source/common/router:vhds_lib", "@envoy_api//envoy/admin/v2alpha:pkg_cc_proto", "@envoy_api//envoy/api/v2:pkg_cc_proto", + "@envoy_api//envoy/api/v2/core:pkg_cc_proto", + "@envoy_api//envoy/api/v3alpha:pkg_cc_proto", "@envoy_api//envoy/config/filter/network/http_connection_manager/v2:pkg_cc_proto", ], ) @@ -215,6 +218,7 @@ envoy_cc_library( "@envoy_api//envoy/api/v2:pkg_cc_proto", "@envoy_api//envoy/api/v2/core:pkg_cc_proto", "@envoy_api//envoy/config/filter/network/http_connection_manager/v2:pkg_cc_proto", + "@envoy_api//envoy/service/route/v3alpha:pkg_cc_proto", ], ) diff --git a/source/common/router/rds_impl.cc b/source/common/router/rds_impl.cc index 96c9952eac170..f8c01afd6a8c6 100644 --- a/source/common/router/rds_impl.cc +++ b/source/common/router/rds_impl.cc @@ -9,6 +9,7 @@ #include "envoy/api/v2/discovery.pb.h" #include "envoy/api/v2/rds.pb.h" #include "envoy/api/v2/rds.pb.validate.h" +#include "envoy/api/v3alpha/rds.pb.h" #include "envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.pb.h" #include "common/common/assert.h" @@ -61,7 +62,8 @@ RdsRouteConfigSubscription::RdsRouteConfigSubscription( const uint64_t manager_identifier, Server::Configuration::ServerFactoryContext& factory_context, ProtobufMessage::ValidationVisitor& validator, Init::Manager& init_manager, const std::string& stat_prefix, - Envoy::Router::RouteConfigProviderManagerImpl& route_config_provider_manager) + Envoy::Router::RouteConfigProviderManagerImpl& route_config_provider_manager, + envoy::api::v2::core::ConfigSource::XdsApiVersion xds_api_version) : route_config_name_(rds.route_config_name()), factory_context_(factory_context), validator_(validator), init_manager_(init_manager), init_target_(fmt::format("RdsRouteConfigSubscription {}", route_config_name_), @@ -69,14 +71,11 @@ RdsRouteConfigSubscription::RdsRouteConfigSubscription( scope_(factory_context.scope().createScope(stat_prefix + "rds." + route_config_name_ + ".")), stat_prefix_(stat_prefix), stats_({ALL_RDS_STATS(POOL_COUNTER(*scope_))}), route_config_provider_manager_(route_config_provider_manager), - manager_identifier_(manager_identifier) { + manager_identifier_(manager_identifier), xds_api_version_(xds_api_version) { subscription_ = factory_context.clusterManager().subscriptionFactory().subscriptionFromConfigSource( - rds.config_source(), - Grpc::Common::typeUrl( - API_NO_BOOST(envoy::api::v2::RouteConfiguration)().GetDescriptor()->full_name()), - *scope_, *this); + rds.config_source(), loadTypeUrl(), *scope_, *this); config_update_info_ = std::make_unique(factory_context.timeSource(), validator); } @@ -122,7 +121,8 @@ void RdsRouteConfigSubscription::onConfigUpdate( // TODO(dmitri-d): It's unsafe to depend directly on factory context here, // the listener might have been torn down, need to remove this. vhds_subscription_ = std::make_unique( - config_update_info_, factory_context_, stat_prefix_, route_config_providers_); + config_update_info_, factory_context_, stat_prefix_, route_config_providers_, + config_update_info_->routeConfiguration().vhds().config_source().xds_api_version()); vhds_subscription_->registerInitTargetWithInitManager( noop_init_manager == nullptr ? getRdsConfigInitManager() : *noop_init_manager); } else { @@ -201,6 +201,21 @@ bool RdsRouteConfigSubscription::validateUpdateSize(int num_resources) { return true; } +std::string RdsRouteConfigSubscription::loadTypeUrl() { + switch (xds_api_version_) { + // automatically set api version as V2 + case envoy::api::v2::core::ConfigSource::AUTO: + case envoy::api::v2::core::ConfigSource::V2: + return Grpc::Common::typeUrl( + API_NO_BOOST(envoy::api::v2::RouteConfiguration().GetDescriptor()->full_name())); + case envoy::api::v2::core::ConfigSource::V3ALPHA: + return Grpc::Common::typeUrl( + API_NO_BOOST(envoy::api::v3alpha::RouteConfiguration().GetDescriptor()->full_name())); + default: + throw EnvoyException(fmt::format("type {} is not supported", xds_api_version_)); + } +} + RdsRouteConfigProviderImpl::RdsRouteConfigProviderImpl( RdsRouteConfigSubscriptionSharedPtr&& subscription, Server::Configuration::FactoryContext& factory_context) @@ -274,7 +289,7 @@ Router::RouteConfigProviderSharedPtr RouteConfigProviderManagerImpl::createRdsRo RdsRouteConfigSubscriptionSharedPtr subscription(new RdsRouteConfigSubscription( rds, manager_identifier, factory_context.getServerFactoryContext(), factory_context.messageValidationVisitor(), factory_context.initManager(), stat_prefix, - *this)); + *this, rds.config_source().xds_api_version())); init_manager.add(subscription->init_target_); std::shared_ptr new_provider{ new RdsRouteConfigProviderImpl(std::move(subscription), factory_context)}; diff --git a/source/common/router/rds_impl.h b/source/common/router/rds_impl.h index 41f71b6957e4b..ef542c3a2e79e 100644 --- a/source/common/router/rds_impl.h +++ b/source/common/router/rds_impl.h @@ -7,6 +7,7 @@ #include #include "envoy/admin/v2alpha/config_dump.pb.h" +#include "envoy/api/v2/core/config_source.pb.h" #include "envoy/api/v2/discovery.pb.h" #include "envoy/api/v2/rds.pb.h" #include "envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.pb.h" @@ -139,10 +140,12 @@ class RdsRouteConfigSubscription : Envoy::Config::SubscriptionCallbacks, const uint64_t manager_identifier, Server::Configuration::ServerFactoryContext& factory_context, ProtobufMessage::ValidationVisitor& validator, Init::Manager& init_manager, - const std::string& stat_prefix, - RouteConfigProviderManagerImpl& route_config_provider_manager); + const std::string& stat_prefix, RouteConfigProviderManagerImpl& route_config_provider_manager, + const envoy::api::v2::core::ConfigSource::XdsApiVersion xds_api_version = + envoy::api::v2::core::ConfigSource::AUTO); bool validateUpdateSize(int num_resources); + std::string loadTypeUrl(); Init::Manager& getRdsConfigInitManager() { return init_manager_; } @@ -162,6 +165,7 @@ class RdsRouteConfigSubscription : Envoy::Config::SubscriptionCallbacks, VhdsSubscriptionPtr vhds_subscription_; RouteConfigUpdatePtr config_update_info_; Common::CallbackManager<> update_callback_manager_; + envoy::api::v2::core::ConfigSource::XdsApiVersion xds_api_version_; friend class RouteConfigProviderManagerImpl; // Access to addUpdateCallback diff --git a/source/common/router/scoped_rds.cc b/source/common/router/scoped_rds.cc index ec1564fe802d1..c62d15e181cdc 100644 --- a/source/common/router/scoped_rds.cc +++ b/source/common/router/scoped_rds.cc @@ -8,6 +8,7 @@ #include "envoy/api/v2/srds.pb.h" #include "envoy/api/v2/srds.pb.validate.h" #include "envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.pb.h" +#include "envoy/service/route/v3alpha/srds.pb.h" #include "common/common/assert.h" #include "common/common/cleanup.h" @@ -99,14 +100,11 @@ ScopedRdsConfigSubscription::ScopedRdsConfigSubscription( stats_({ALL_SCOPED_RDS_STATS(POOL_COUNTER(*scope_))}), rds_config_source_(std::move(rds_config_source)), validation_visitor_(factory_context.messageValidationVisitor()), stat_prefix_(stat_prefix), - route_config_provider_manager_(route_config_provider_manager) { + route_config_provider_manager_(route_config_provider_manager), + xds_api_version_(rds_config_source_.xds_api_version()) { subscription_ = factory_context.clusterManager().subscriptionFactory().subscriptionFromConfigSource( - scoped_rds.scoped_rds_config_source(), - Grpc::Common::typeUrl(API_NO_BOOST(envoy::api::v2::ScopedRouteConfiguration)() - .GetDescriptor() - ->full_name()), - *scope_, *this); + scoped_rds.scoped_rds_config_source(), loadTypeUrl(), *scope_, *this); initialize([scope_key_builder]() -> Envoy::Config::ConfigProvider::ConfigConstSharedPtr { return std::make_shared( @@ -345,6 +343,21 @@ void ScopedRdsConfigSubscription::onConfigUpdate( onConfigUpdate(to_add_repeated, to_remove_repeated, version_info); } +std::string ScopedRdsConfigSubscription::loadTypeUrl() { + switch (xds_api_version_) { + // automatically set api version as V2 + case envoy::api::v2::core::ConfigSource::AUTO: + case envoy::api::v2::core::ConfigSource::V2: + return Grpc::Common::typeUrl( + API_NO_BOOST(envoy::api::v2::ScopedRouteConfiguration().GetDescriptor()->full_name())); + case envoy::api::v2::core::ConfigSource::V3ALPHA: + return Grpc::Common::typeUrl(API_NO_BOOST( + envoy::service::route::v3alpha::ScopedRouteConfiguration().GetDescriptor()->full_name())); + default: + throw EnvoyException(fmt::format("type {} is not supported", xds_api_version_)); + } +} + ScopedRdsConfigProvider::ScopedRdsConfigProvider( ScopedRdsConfigSubscriptionSharedPtr&& subscription) : MutableConfigProviderCommonBase(std::move(subscription), ConfigProvider::ApiType::Delta) {} diff --git a/source/common/router/scoped_rds.h b/source/common/router/scoped_rds.h index a6e137c76ec0d..d7d70effe79ce 100644 --- a/source/common/router/scoped_rds.h +++ b/source/common/router/scoped_rds.h @@ -160,6 +160,7 @@ class ScopedRdsConfigSubscription : public Envoy::Config::DeltaConfigSubscriptio std::string resourceName(const ProtobufWkt::Any& resource) override { return MessageUtil::anyConvert(resource).name(); } + std::string loadTypeUrl(); // Propagate RDS updates to ScopeConfigImpl in workers. void onRdsConfigUpdate(const std::string& scope_name, RdsRouteConfigSubscription& rds_subscription); @@ -183,6 +184,7 @@ class ScopedRdsConfigSubscription : public Envoy::Config::DeltaConfigSubscriptio ProtobufMessage::ValidationVisitor& validation_visitor_; const std::string stat_prefix_; RouteConfigProviderManager& route_config_provider_manager_; + envoy::api::v2::core::ConfigSource::XdsApiVersion xds_api_version_; }; using ScopedRdsConfigSubscriptionSharedPtr = std::shared_ptr; diff --git a/source/common/router/vhds.cc b/source/common/router/vhds.cc index ac5fa000e24a1..339a79fc80a27 100644 --- a/source/common/router/vhds.cc +++ b/source/common/router/vhds.cc @@ -8,6 +8,7 @@ #include "envoy/api/v2/core/config_source.pb.h" #include "envoy/api/v2/discovery.pb.h" #include "envoy/api/v2/route/route.pb.h" +#include "envoy/api/v3alpha/route/route.pb.h" #include "common/common/assert.h" #include "common/common/fmt.h" @@ -20,17 +21,18 @@ namespace Envoy { namespace Router { // Implements callbacks to handle DeltaDiscovery protocol for VirtualHostDiscoveryService -VhdsSubscription::VhdsSubscription(RouteConfigUpdatePtr& config_update_info, - Server::Configuration::ServerFactoryContext& factory_context, - const std::string& stat_prefix, - std::unordered_set& route_config_providers) +VhdsSubscription::VhdsSubscription( + RouteConfigUpdatePtr& config_update_info, + Server::Configuration::ServerFactoryContext& factory_context, const std::string& stat_prefix, + std::unordered_set& route_config_providers, + envoy::api::v2::core::ConfigSource::XdsApiVersion xds_api_version) : config_update_info_(config_update_info), scope_(factory_context.scope().createScope(stat_prefix + "vhds." + config_update_info_->routeConfigName() + ".")), stats_({ALL_VHDS_STATS(POOL_COUNTER(*scope_))}), init_target_(fmt::format("VhdsConfigSubscription {}", config_update_info_->routeConfigName()), [this]() { subscription_->start({}); }), - route_config_providers_(route_config_providers) { + route_config_providers_(route_config_providers), xds_api_version_(xds_api_version) { const auto& config_source = config_update_info_->routeConfiguration() .vhds() .config_source() @@ -42,10 +44,8 @@ VhdsSubscription::VhdsSubscription(RouteConfigUpdatePtr& config_update_info, subscription_ = factory_context.clusterManager().subscriptionFactory().subscriptionFromConfigSource( - config_update_info_->routeConfiguration().vhds().config_source(), - Grpc::Common::typeUrl( - API_NO_BOOST(envoy::api::v2::route::VirtualHost)().GetDescriptor()->full_name()), - *scope_, *this); + config_update_info_->routeConfiguration().vhds().config_source(), loadTypeUrl(), *scope_, + *this); } void VhdsSubscription::onConfigUpdateFailed(Envoy::Config::ConfigUpdateFailureReason reason, @@ -72,5 +72,19 @@ void VhdsSubscription::onConfigUpdate( init_target_.ready(); } +std::string VhdsSubscription::loadTypeUrl() { + switch (xds_api_version_) { + // automatically set api version as V2 + case envoy::api::v2::core::ConfigSource::AUTO: + case envoy::api::v2::core::ConfigSource::V2: + return Grpc::Common::typeUrl( + API_NO_BOOST(envoy::api::v2::route::VirtualHost().GetDescriptor()->full_name())); + case envoy::api::v2::core::ConfigSource::V3ALPHA: + return Grpc::Common::typeUrl( + API_NO_BOOST(envoy::api::v2::route::VirtualHost().GetDescriptor()->full_name())); + default: + throw EnvoyException(fmt::format("type {} is not supported", xds_api_version_)); + } +} } // namespace Router } // namespace Envoy diff --git a/source/common/router/vhds.h b/source/common/router/vhds.h index 7db4ebd04e502..45d95c806890f 100644 --- a/source/common/router/vhds.h +++ b/source/common/router/vhds.h @@ -6,6 +6,7 @@ #include #include +#include "envoy/api/v2/core/config_source.pb.h" #include "envoy/api/v2/discovery.pb.h" #include "envoy/api/v2/route/route.pb.h" #include "envoy/config/subscription.h" @@ -39,7 +40,9 @@ class VhdsSubscription : Envoy::Config::SubscriptionCallbacks, VhdsSubscription(RouteConfigUpdatePtr& config_update_info, Server::Configuration::ServerFactoryContext& factory_context, const std::string& stat_prefix, - std::unordered_set& route_config_providers); + std::unordered_set& route_config_providers, + const envoy::api::v2::core::ConfigSource::XdsApiVersion xds_api_version = + envoy::api::v2::core::ConfigSource::AUTO); ~VhdsSubscription() override { init_target_.ready(); } void registerInitTargetWithInitManager(Init::Manager& m) { m.add(init_target_); } @@ -57,6 +60,7 @@ class VhdsSubscription : Envoy::Config::SubscriptionCallbacks, std::string resourceName(const ProtobufWkt::Any& resource) override { return MessageUtil::anyConvert(resource).name(); } + std::string loadTypeUrl(); RouteConfigUpdatePtr& config_update_info_; Stats::ScopePtr scope_; @@ -64,6 +68,7 @@ class VhdsSubscription : Envoy::Config::SubscriptionCallbacks, std::unique_ptr subscription_; Init::TargetImpl init_target_; std::unordered_set& route_config_providers_; + envoy::api::v2::core::ConfigSource::XdsApiVersion xds_api_version_; }; using VhdsSubscriptionPtr = std::unique_ptr; diff --git a/source/common/runtime/BUILD b/source/common/runtime/BUILD index e2abe6597a7e2..2dcabcf401f87 100644 --- a/source/common/runtime/BUILD +++ b/source/common/runtime/BUILD @@ -42,6 +42,7 @@ envoy_cc_library( "@envoy_api//envoy/api/v2/core:pkg_cc_proto", "@envoy_api//envoy/config/bootstrap/v2:pkg_cc_proto", "@envoy_api//envoy/service/discovery/v2:pkg_cc_proto", + "@envoy_api//envoy/service/discovery/v3alpha:pkg_cc_proto", "@envoy_api//envoy/type:pkg_cc_proto", ], ) diff --git a/source/common/runtime/runtime_impl.cc b/source/common/runtime/runtime_impl.cc index 7dc5ed7bf8439..acc7e2cbe8e2a 100644 --- a/source/common/runtime/runtime_impl.cc +++ b/source/common/runtime/runtime_impl.cc @@ -10,6 +10,7 @@ #include "envoy/event/dispatcher.h" #include "envoy/service/discovery/v2/rtds.pb.h" #include "envoy/service/discovery/v2/rtds.pb.validate.h" +#include "envoy/service/discovery/v3alpha/rtds.pb.h" #include "envoy/thread_local/thread_local.h" #include "envoy/type/percent.pb.h" #include "envoy/type/percent.pb.validate.h" @@ -551,7 +552,7 @@ RtdsSubscription::RtdsSubscription( : parent_(parent), config_source_(rtds_layer.rtds_config()), store_(store), resource_name_(rtds_layer.name()), init_target_("RTDS " + resource_name_, [this]() { start(); }), - validation_visitor_(validation_visitor) {} + validation_visitor_(validation_visitor), xds_api_version_(config_source_.xds_api_version()) {} void RtdsSubscription::onConfigUpdate(const Protobuf::RepeatedPtrField& resources, const std::string&) { @@ -590,10 +591,7 @@ void RtdsSubscription::start() { // cluster manager resources are not available in the constructor when // instantiated in the server instance. subscription_ = parent_.cm_->subscriptionFactory().subscriptionFromConfigSource( - config_source_, - Grpc::Common::typeUrl( - API_NO_BOOST(envoy::service::discovery::v2::Runtime)().GetDescriptor()->full_name()), - store_, *this); + config_source_, loadTypeUrl(), store_, *this); subscription_->start({resource_name_}); } @@ -605,6 +603,21 @@ void RtdsSubscription::validateUpdateSize(uint32_t num_resources) { } } +std::string RtdsSubscription::loadTypeUrl() { + switch (xds_api_version_) { + // automatically set api version as V2 + case envoy::api::v2::core::ConfigSource::AUTO: + case envoy::api::v2::core::ConfigSource::V2: + return Grpc::Common::typeUrl( + API_NO_BOOST(envoy::service::discovery::v2::Runtime().GetDescriptor()->full_name())); + case envoy::api::v2::core::ConfigSource::V3ALPHA: + return Grpc::Common::typeUrl( + API_NO_BOOST(envoy::service::discovery::v3alpha::Runtime().GetDescriptor()->full_name())); + default: + throw EnvoyException(fmt::format("type {} is not supported", xds_api_version_)); + } +} + void LoaderImpl::loadNewSnapshot() { std::shared_ptr ptr = createNewSnapshot(); tls_->set([ptr](Event::Dispatcher&) -> ThreadLocal::ThreadLocalObjectSharedPtr { diff --git a/source/common/runtime/runtime_impl.h b/source/common/runtime/runtime_impl.h index 26c7d7c1eb0bd..548b5ee6b0220 100644 --- a/source/common/runtime/runtime_impl.h +++ b/source/common/runtime/runtime_impl.h @@ -219,6 +219,7 @@ struct RtdsSubscription : Config::SubscriptionCallbacks, Logger::Loggable; diff --git a/source/common/secret/sds_api.cc b/source/common/secret/sds_api.cc index 8ecea2b50bf16..c0b2fa7642778 100644 --- a/source/common/secret/sds_api.cc +++ b/source/common/secret/sds_api.cc @@ -23,7 +23,8 @@ SdsApi::SdsApi(envoy::api::v2::core::ConfigSource sds_config, absl::string_view secret_hash_(0), clean_up_(std::move(destructor_cb)), validation_visitor_(validation_visitor), subscription_factory_(subscription_factory), time_source_(time_source), secret_data_{sds_config_name_, "uninitialized", - time_source_.systemTime()} { + time_source_.systemTime()}, + xds_api_version_(sds_config_.xds_api_version()) { // TODO(JimmyCYJ): Implement chained_init_manager, so that multiple init_manager // can be chained together to behave as one init_manager. In that way, we let // two listeners which share same SdsApi to register at separate init managers, and @@ -80,14 +81,26 @@ void SdsApi::validateUpdateSize(int num_resources) { } void SdsApi::initialize() { - subscription_ = subscription_factory_.subscriptionFromConfigSource( - sds_config_, - Grpc::Common::typeUrl( - API_NO_BOOST(envoy::api::v2::auth::Secret)().GetDescriptor()->full_name()), - stats_, *this); + subscription_ = + subscription_factory_.subscriptionFromConfigSource(sds_config_, loadTypeUrl(), stats_, *this); subscription_->start({sds_config_name_}); } +std::string SdsApi::loadTypeUrl() { + switch (xds_api_version_) { + // automatically set api version as V2 + case envoy::api::v2::core::ConfigSource::AUTO: + case envoy::api::v2::core::ConfigSource::V2: + return Grpc::Common::typeUrl( + API_NO_BOOST(envoy::api::v2::auth::Secret().GetDescriptor()->full_name())); + case envoy::api::v2::core::ConfigSource::V3ALPHA: + return Grpc::Common::typeUrl( + API_NO_BOOST(envoy::api::v2::auth::Secret().GetDescriptor()->full_name())); + default: + throw EnvoyException(fmt::format("type {} is not supported", xds_api_version_)); + } +} + SdsApi::SecretData SdsApi::secretData() { return secret_data_; } } // namespace Secret diff --git a/source/common/secret/sds_api.h b/source/common/secret/sds_api.h index c7f1d32ced06b..5e4bfadaed0b2 100644 --- a/source/common/secret/sds_api.h +++ b/source/common/secret/sds_api.h @@ -62,6 +62,7 @@ class SdsApi : public Config::SubscriptionCallbacks { std::string resourceName(const ProtobufWkt::Any& resource) override { return MessageUtil::anyConvert(resource).name(); } + std::string loadTypeUrl(); private: void validateUpdateSize(int num_resources); @@ -79,6 +80,7 @@ class SdsApi : public Config::SubscriptionCallbacks { Config::SubscriptionFactory& subscription_factory_; TimeSource& time_source_; SecretData secret_data_; + envoy::api::v2::core::ConfigSource::XdsApiVersion xds_api_version_; }; class TlsCertificateSdsApi; diff --git a/source/common/upstream/BUILD b/source/common/upstream/BUILD index ad02bc359511b..36c519f8d3a4b 100644 --- a/source/common/upstream/BUILD +++ b/source/common/upstream/BUILD @@ -24,6 +24,7 @@ envoy_cc_library( "//source/common/protobuf:utility_lib", "@envoy_api//envoy/api/v2:pkg_cc_proto", "@envoy_api//envoy/api/v2/core:pkg_cc_proto", + "@envoy_api//envoy/api/v3alpha:pkg_cc_proto", ], ) @@ -359,6 +360,7 @@ envoy_cc_library( "//source/extensions/clusters:well_known_names", "@envoy_api//envoy/api/v2:pkg_cc_proto", "@envoy_api//envoy/api/v2/core:pkg_cc_proto", + "@envoy_api//envoy/api/v3alpha:pkg_cc_proto", ], ) diff --git a/source/common/upstream/cds_api_impl.cc b/source/common/upstream/cds_api_impl.cc index 2b9b25db9b85f..fb7c252591567 100644 --- a/source/common/upstream/cds_api_impl.cc +++ b/source/common/upstream/cds_api_impl.cc @@ -6,6 +6,7 @@ #include "envoy/api/v2/cds.pb.validate.h" #include "envoy/api/v2/core/config_source.pb.h" #include "envoy/api/v2/discovery.pb.h" +#include "envoy/api/v3alpha/cds.pb.h" #include "envoy/stats/scope.h" #include "common/common/cleanup.h" @@ -29,11 +30,9 @@ CdsApiPtr CdsApiImpl::create(const envoy::api::v2::core::ConfigSource& cds_confi CdsApiImpl::CdsApiImpl(const envoy::api::v2::core::ConfigSource& cds_config, ClusterManager& cm, Stats::Scope& scope, ProtobufMessage::ValidationVisitor& validation_visitor) : cm_(cm), scope_(scope.createScope("cluster_manager.cds.")), - validation_visitor_(validation_visitor) { - subscription_ = cm_.subscriptionFactory().subscriptionFromConfigSource( - cds_config, - Grpc::Common::typeUrl(API_NO_BOOST(envoy::api::v2::Cluster)().GetDescriptor()->full_name()), - *scope_, *this); + validation_visitor_(validation_visitor), xds_api_version_(cds_config.xds_api_version()) { + subscription_ = cm_.subscriptionFactory().subscriptionFromConfigSource(cds_config, loadTypeUrl(), + *scope_, *this); } void CdsApiImpl::onConfigUpdate(const Protobuf::RepeatedPtrField& resources, @@ -126,5 +125,20 @@ void CdsApiImpl::runInitializeCallbackIfAny() { } } +std::string CdsApiImpl::loadTypeUrl() { + switch (xds_api_version_) { + // automatically set api version as V2 + case envoy::api::v2::core::ConfigSource::AUTO: + case envoy::api::v2::core::ConfigSource::V2: + return Grpc::Common::typeUrl( + API_NO_BOOST(envoy::api::v2::Cluster().GetDescriptor()->full_name())); + case envoy::api::v2::core::ConfigSource::V3ALPHA: + return Grpc::Common::typeUrl( + API_NO_BOOST(envoy::api::v3alpha::Cluster().GetDescriptor()->full_name())); + default: + throw EnvoyException(fmt::format("type {} is not supported", xds_api_version_)); + } +} + } // namespace Upstream } // namespace Envoy diff --git a/source/common/upstream/cds_api_impl.h b/source/common/upstream/cds_api_impl.h index ba5cd4977cf3f..e83a03cfbadfc 100644 --- a/source/common/upstream/cds_api_impl.h +++ b/source/common/upstream/cds_api_impl.h @@ -47,7 +47,7 @@ class CdsApiImpl : public CdsApi, std::string resourceName(const ProtobufWkt::Any& resource) override { return MessageUtil::anyConvert(resource).name(); } - + std::string loadTypeUrl(); CdsApiImpl(const envoy::api::v2::core::ConfigSource& cds_config, ClusterManager& cm, Stats::Scope& scope, ProtobufMessage::ValidationVisitor& validation_visitor); void runInitializeCallbackIfAny(); @@ -58,6 +58,7 @@ class CdsApiImpl : public CdsApi, std::function initialize_callback_; Stats::ScopePtr scope_; ProtobufMessage::ValidationVisitor& validation_visitor_; + envoy::api::v2::core::ConfigSource::XdsApiVersion xds_api_version_; }; } // namespace Upstream diff --git a/source/common/upstream/eds.cc b/source/common/upstream/eds.cc index 2c8dd16c19a08..4af57d49ac8d5 100644 --- a/source/common/upstream/eds.cc +++ b/source/common/upstream/eds.cc @@ -5,6 +5,8 @@ #include "envoy/api/v2/discovery.pb.h" #include "envoy/api/v2/eds.pb.h" #include "envoy/api/v2/eds.pb.validate.h" +#include "envoy/api/v3alpha/cds.pb.h" +#include "envoy/common/exception.h" #include "common/common/utility.h" #include "common/config/api_version.h" @@ -22,7 +24,8 @@ EdsClusterImpl::EdsClusterImpl( cluster_name_(cluster.eds_cluster_config().service_name().empty() ? cluster.name() : cluster.eds_cluster_config().service_name()), - validation_visitor_(factory_context.messageValidationVisitor()) { + validation_visitor_(factory_context.messageValidationVisitor()), + xds_api_version_(cluster.eds_cluster_config().eds_config().xds_api_version()) { Event::Dispatcher& dispatcher = factory_context.dispatcher(); assignment_timeout_ = dispatcher.createTimer([this]() -> void { onAssignmentTimeout(); }); const auto& eds_config = cluster.eds_cluster_config().eds_config(); @@ -34,10 +37,7 @@ EdsClusterImpl::EdsClusterImpl( } subscription_ = factory_context.clusterManager().subscriptionFactory().subscriptionFromConfigSource( - eds_config, - Grpc::Common::typeUrl( - API_NO_BOOST(envoy::api::v2::ClusterLoadAssignment)().GetDescriptor()->full_name()), - info_->statsScope(), *this); + eds_config, loadTypeUrl(), info_->statsScope(), *this); } void EdsClusterImpl::startPreInit() { subscription_->start({cluster_name_}); } @@ -217,6 +217,21 @@ void EdsClusterImpl::reloadHealthyHostsHelper(const HostSharedPtr& host) { } } +std::string EdsClusterImpl::loadTypeUrl() { + switch (xds_api_version_) { + // automatically set api version as V2 + case envoy::api::v2::core::ConfigSource::AUTO: + case envoy::api::v2::core::ConfigSource::V2: + return Grpc::Common::typeUrl( + API_NO_BOOST(envoy::api::v2::ClusterLoadAssignment().GetDescriptor()->full_name())); + case envoy::api::v2::core::ConfigSource::V3ALPHA: + return Grpc::Common::typeUrl( + API_NO_BOOST(envoy::api::v3alpha::ClusterLoadAssignment().GetDescriptor()->full_name())); + default: + throw EnvoyException(fmt::format("type {} is not supported", xds_api_version_)); + } +} + bool EdsClusterImpl::updateHostsPerLocality( const uint32_t priority, const uint32_t overprovisioning_factor, const HostVector& new_hosts, LocalityWeightsMap& locality_weights_map, LocalityWeightsMap& new_locality_weights_map, diff --git a/source/common/upstream/eds.h b/source/common/upstream/eds.h index c84df480b0180..909c2cfbd9842 100644 --- a/source/common/upstream/eds.h +++ b/source/common/upstream/eds.h @@ -2,6 +2,7 @@ #include "envoy/api/v2/cds.pb.h" #include "envoy/api/v2/core/base.pb.h" +#include "envoy/api/v2/core/config_source.pb.h" #include "envoy/api/v2/discovery.pb.h" #include "envoy/api/v2/eds.pb.h" #include "envoy/config/subscription.h" @@ -42,7 +43,7 @@ class EdsClusterImpl : public BaseDynamicClusterImpl, Config::SubscriptionCallba std::string resourceName(const ProtobufWkt::Any& resource) override { return MessageUtil::anyConvert(resource).cluster_name(); } - + std::string loadTypeUrl(); using LocalityWeightsMap = std::unordered_map; bool updateHostsPerLocality(const uint32_t priority, const uint32_t overprovisioning_factor, @@ -79,6 +80,7 @@ class EdsClusterImpl : public BaseDynamicClusterImpl, Config::SubscriptionCallba Event::TimerPtr assignment_timeout_; ProtobufMessage::ValidationVisitor& validation_visitor_; InitializePhase initialize_phase_; + envoy::api::v2::core::ConfigSource::XdsApiVersion xds_api_version_; }; class EdsClusterFactory : public ClusterFactoryImplBase { diff --git a/source/server/BUILD b/source/server/BUILD index 88a73a5f69cee..abd74aa667815 100644 --- a/source/server/BUILD +++ b/source/server/BUILD @@ -261,6 +261,7 @@ envoy_cc_library( "@envoy_api//envoy/admin/v2alpha:pkg_cc_proto", "@envoy_api//envoy/api/v2:pkg_cc_proto", "@envoy_api//envoy/api/v2/core:pkg_cc_proto", + "@envoy_api//envoy/api/v3alpha:pkg_cc_proto", ], ) diff --git a/source/server/lds_api.cc b/source/server/lds_api.cc index df19f72fc6dd1..5e72ba513602c 100644 --- a/source/server/lds_api.cc +++ b/source/server/lds_api.cc @@ -7,6 +7,7 @@ #include "envoy/api/v2/discovery.pb.h" #include "envoy/api/v2/lds.pb.h" #include "envoy/api/v2/lds.pb.validate.h" +#include "envoy/api/v3alpha/lds.pb.h" #include "envoy/stats/scope.h" #include "common/common/cleanup.h" @@ -26,11 +27,9 @@ LdsApiImpl::LdsApiImpl(const envoy::api::v2::core::ConfigSource& lds_config, ProtobufMessage::ValidationVisitor& validation_visitor) : listener_manager_(lm), scope_(scope.createScope("listener_manager.lds.")), cm_(cm), init_target_("LDS", [this]() { subscription_->start({}); }), - validation_visitor_(validation_visitor) { - subscription_ = cm.subscriptionFactory().subscriptionFromConfigSource( - lds_config, - Grpc::Common::typeUrl(API_NO_BOOST(envoy::api::v2::Listener)().GetDescriptor()->full_name()), - *scope_, *this); + validation_visitor_(validation_visitor), xds_api_version_(lds_config.xds_api_version()) { + subscription_ = cm.subscriptionFactory().subscriptionFromConfigSource(lds_config, loadTypeUrl(), + *scope_, *this); init_manager.add(init_target_); } @@ -132,5 +131,19 @@ void LdsApiImpl::onConfigUpdateFailed(Envoy::Config::ConfigUpdateFailureReason r init_target_.ready(); } +std::string LdsApiImpl::loadTypeUrl() { + switch (xds_api_version_) { + // automatically set api version as V2 + case envoy::api::v2::core::ConfigSource::AUTO: + case envoy::api::v2::core::ConfigSource::V2: + return Grpc::Common::typeUrl( + API_NO_BOOST(envoy::api::v2::Listener().GetDescriptor()->full_name())); + case envoy::api::v2::core::ConfigSource::V3ALPHA: + return Grpc::Common::typeUrl( + API_NO_BOOST(envoy::api::v3alpha::Listener().GetDescriptor()->full_name())); + default: + throw EnvoyException(fmt::format("type {} is not supported", xds_api_version_)); + } +} } // namespace Server } // namespace Envoy diff --git a/source/server/lds_api.h b/source/server/lds_api.h index 357360c851c17..4d7835aee3fbb 100644 --- a/source/server/lds_api.h +++ b/source/server/lds_api.h @@ -5,6 +5,7 @@ #include "envoy/api/v2/core/config_source.pb.h" #include "envoy/api/v2/discovery.pb.h" #include "envoy/api/v2/lds.pb.h" +#include "envoy/api/v3alpha/lds.pb.h" #include "envoy/config/subscription.h" #include "envoy/config/subscription_factory.h" #include "envoy/init/manager.h" @@ -43,6 +44,7 @@ class LdsApiImpl : public LdsApi, std::string resourceName(const ProtobufWkt::Any& resource) override { return MessageUtil::anyConvert(resource).name(); } + std::string loadTypeUrl(); std::unique_ptr subscription_; std::string system_version_info_; @@ -51,6 +53,7 @@ class LdsApiImpl : public LdsApi, Upstream::ClusterManager& cm_; Init::TargetImpl init_target_; ProtobufMessage::ValidationVisitor& validation_visitor_; + envoy::api::v2::core::ConfigSource::XdsApiVersion xds_api_version_; }; } // namespace Server diff --git a/tools/spelling_dictionary.txt b/tools/spelling_dictionary.txt index c24d646693720..2312f1326ed12 100644 --- a/tools/spelling_dictionary.txt +++ b/tools/spelling_dictionary.txt @@ -610,6 +610,7 @@ idx ie ifdef iff +ified impl implementors impls @@ -872,6 +873,7 @@ refetch regex regexes reimplements +rele releasor reloadable reparse @@ -954,6 +956,7 @@ strerr strerror stringbuf stringified +stringify stringstream strtoull struct