Line data Source code
1 : #include "source/extensions/config_subscription/grpc/grpc_subscription_factory.h"
2 :
3 : #include "source/common/config/custom_config_validators_impl.h"
4 : #include "source/common/config/type_to_endpoint.h"
5 : #include "source/extensions/config_subscription/grpc/grpc_mux_context.h"
6 : #include "source/extensions/config_subscription/grpc/grpc_mux_impl.h"
7 : #include "source/extensions/config_subscription/grpc/grpc_subscription_impl.h"
8 : #include "source/extensions/config_subscription/grpc/new_grpc_mux_impl.h"
9 : #include "source/extensions/config_subscription/grpc/xds_mux/grpc_mux_impl.h"
10 :
11 : namespace Envoy {
12 : namespace Config {
13 :
14 : SubscriptionPtr
15 0 : GrpcConfigSubscriptionFactory::create(ConfigSubscriptionFactory::SubscriptionData& data) {
16 0 : GrpcMuxSharedPtr mux;
17 0 : const envoy::config::core::v3::ApiConfigSource& api_config_source =
18 0 : data.config_.api_config_source();
19 0 : CustomConfigValidatorsPtr custom_config_validators = std::make_unique<CustomConfigValidatorsImpl>(
20 0 : data.validation_visitor_, data.server_, api_config_source.config_validators());
21 0 : const std::string control_plane_id = Utility::getGrpcControlPlane(api_config_source).value_or("");
22 :
23 0 : JitteredExponentialBackOffStrategyPtr backoff_strategy =
24 0 : Utility::prepareJitteredExponentialBackOffStrategy(
25 0 : api_config_source, data.api_.randomGenerator(), SubscriptionFactory::RetryInitialDelayMs,
26 0 : SubscriptionFactory::RetryMaxDelayMs);
27 :
28 0 : GrpcMuxContext grpc_mux_context{
29 0 : /*async_client_=*/Utility::factoryForGrpcApiConfigSource(data.cm_.grpcAsyncClientManager(),
30 0 : api_config_source, data.scope_, true)
31 0 : ->createUncachedRawAsyncClient(),
32 0 : /*dispatcher_=*/data.dispatcher_,
33 0 : /*service_method_=*/sotwGrpcMethod(data.type_url_),
34 0 : /*local_info_=*/data.local_info_,
35 0 : /*rate_limit_settings_=*/Utility::parseRateLimitSettings(api_config_source),
36 0 : /*scope_=*/data.scope_,
37 0 : /*config_validators_=*/std::move(custom_config_validators),
38 0 : /*xds_resources_delegate_=*/data.xds_resources_delegate_,
39 0 : /*xds_config_tracker_=*/data.xds_config_tracker_,
40 0 : /*backoff_strategy_=*/std::move(backoff_strategy),
41 0 : /*target_xds_authority_=*/control_plane_id,
42 0 : /*eds_resources_cache_=*/nullptr // EDS cache is only used for ADS.
43 0 : };
44 :
45 0 : if (Runtime::runtimeFeatureEnabled("envoy.reloadable_features.unified_mux")) {
46 0 : mux = std::make_shared<Config::XdsMux::GrpcMuxSotw>(
47 0 : grpc_mux_context, api_config_source.set_node_on_first_message_only());
48 0 : } else {
49 0 : mux = std::make_shared<Config::GrpcMuxImpl>(grpc_mux_context,
50 0 : api_config_source.set_node_on_first_message_only());
51 0 : }
52 0 : return std::make_unique<GrpcSubscriptionImpl>(
53 0 : std::move(mux), data.callbacks_, data.resource_decoder_, data.stats_, data.type_url_,
54 0 : data.dispatcher_, Utility::configSourceInitialFetchTimeout(data.config_),
55 0 : /*is_aggregated*/ false, data.options_);
56 0 : }
57 :
58 : SubscriptionPtr
59 0 : DeltaGrpcConfigSubscriptionFactory::create(ConfigSubscriptionFactory::SubscriptionData& data) {
60 0 : GrpcMuxSharedPtr mux;
61 0 : const envoy::config::core::v3::ApiConfigSource& api_config_source =
62 0 : data.config_.api_config_source();
63 0 : CustomConfigValidatorsPtr custom_config_validators = std::make_unique<CustomConfigValidatorsImpl>(
64 0 : data.validation_visitor_, data.server_, api_config_source.config_validators());
65 :
66 0 : JitteredExponentialBackOffStrategyPtr backoff_strategy =
67 0 : Utility::prepareJitteredExponentialBackOffStrategy(
68 0 : api_config_source, data.api_.randomGenerator(), SubscriptionFactory::RetryInitialDelayMs,
69 0 : SubscriptionFactory::RetryMaxDelayMs);
70 :
71 0 : GrpcMuxContext grpc_mux_context{
72 0 : /*async_client_=*/Utility::factoryForGrpcApiConfigSource(data.cm_.grpcAsyncClientManager(),
73 0 : api_config_source, data.scope_, true)
74 0 : ->createUncachedRawAsyncClient(),
75 0 : /*dispatcher_=*/data.dispatcher_,
76 0 : /*service_method_=*/deltaGrpcMethod(data.type_url_),
77 0 : /*local_info_=*/data.local_info_,
78 0 : /*rate_limit_settings_=*/Utility::parseRateLimitSettings(api_config_source),
79 0 : /*scope_=*/data.scope_,
80 0 : /*config_validators_=*/std::move(custom_config_validators),
81 0 : /*xds_resources_delegate_=*/{},
82 0 : /*xds_config_tracker_=*/data.xds_config_tracker_,
83 0 : /*backoff_strategy_=*/std::move(backoff_strategy),
84 0 : /*target_xds_authority_=*/"",
85 0 : /*eds_resources_cache_=*/nullptr // EDS cache is only used for ADS.
86 0 : };
87 :
88 0 : if (Runtime::runtimeFeatureEnabled("envoy.reloadable_features.unified_mux")) {
89 0 : mux = std::make_shared<Config::XdsMux::GrpcMuxDelta>(
90 0 : grpc_mux_context, api_config_source.set_node_on_first_message_only());
91 0 : } else {
92 0 : mux = std::make_shared<Config::NewGrpcMuxImpl>(grpc_mux_context);
93 0 : }
94 0 : return std::make_unique<GrpcSubscriptionImpl>(
95 0 : std::move(mux), data.callbacks_, data.resource_decoder_, data.stats_, data.type_url_,
96 0 : data.dispatcher_, Utility::configSourceInitialFetchTimeout(data.config_),
97 0 : /*is_aggregated*/ false, data.options_);
98 0 : }
99 :
100 : SubscriptionPtr
101 135 : AdsConfigSubscriptionFactory::create(ConfigSubscriptionFactory::SubscriptionData& data) {
102 135 : return std::make_unique<GrpcSubscriptionImpl>(
103 135 : data.cm_.adsMux(), data.callbacks_, data.resource_decoder_, data.stats_, data.type_url_,
104 135 : data.dispatcher_, Utility::configSourceInitialFetchTimeout(data.config_), true,
105 135 : data.options_);
106 135 : }
107 :
108 : REGISTER_FACTORY(GrpcConfigSubscriptionFactory, ConfigSubscriptionFactory);
109 : REGISTER_FACTORY(DeltaGrpcConfigSubscriptionFactory, ConfigSubscriptionFactory);
110 : REGISTER_FACTORY(AdsConfigSubscriptionFactory, ConfigSubscriptionFactory);
111 :
112 : } // namespace Config
113 : } // namespace Envoy
|