1111
1212#include " envoy/annotations/resource.pb.h"
1313#include " envoy/common/exception.h"
14- #include " envoy/common/random_generator.h"
1514#include " envoy/config/core/v3/config_source.pb.h"
1615#include " envoy/config/custom_config_validators.h"
16+ #include " envoy/config/grpc_mux.h"
1717#include " envoy/config/subscription.h"
1818#include " envoy/config/subscription_factory.h"
19- #include " envoy/event/dispatcher.h"
2019#include " envoy/grpc/async_client.h"
21- #include " envoy/local_info/local_info .h"
20+ #include " envoy/server/factory_context .h"
2221#include " envoy/stats/scope.h"
2322#include " envoy/upstream/cluster_manager.h"
2423
@@ -106,6 +105,7 @@ TypeUrlToServiceMap* buildTypeUrlToServiceMap() {
106105 // https://www.mail-archive.com/protobuf@googlegroups.com/msg04540.html.
107106 for (absl::string_view name : {
108107 " cilium.NetworkPolicyDiscoveryService" ,
108+ " cilium.NetworkPolicyResourceDiscoveryService" ,
109109 " cilium.NetworkPolicyHostsDiscoveryService" ,
110110 }) {
111111 const auto * service_desc =
@@ -169,7 +169,7 @@ const Protobuf::MethodDescriptor& sotwGrpcMethod(absl::string_view type_url) {
169169
170170// Hard-coded Cilium gRPC cluster
171171// Note: No rate-limit settings are used, consider if needed.
172- envoy::config::core::v3::ConfigSource getCiliumXDSAPIConfig () {
172+ envoy::config::core::v3::ConfigSource getCiliumXDSAPIConfig (bool use_delta_xds = false ) {
173173 auto config_source = envoy::config::core::v3::ConfigSource ();
174174 /* config_source.initial_fetch_timeout is set to 50 millliseconds.
175175 * This applies only to SDS Secrets for now, as for NPDS and NPHDS we explicitly set the timeout
@@ -179,7 +179,9 @@ envoy::config::core::v3::ConfigSource getCiliumXDSAPIConfig() {
179179 config_source.set_resource_api_version (envoy::config::core::v3::ApiVersion::V3 );
180180 auto api_config_source = config_source.mutable_api_config_source ();
181181 api_config_source->set_set_node_on_first_message_only (true );
182- api_config_source->set_api_type (envoy::config::core::v3::ApiConfigSource::GRPC );
182+ api_config_source->set_api_type (use_delta_xds
183+ ? envoy::config::core::v3::ApiConfigSource::DELTA_GRPC
184+ : envoy::config::core::v3::ApiConfigSource::GRPC );
183185 api_config_source->set_transport_api_version (envoy::config::core::v3::ApiVersion::V3 );
184186 api_config_source->add_grpc_services ()->mutable_envoy_grpc ()->set_cluster_name (" xds-grpc-cilium" );
185187 return config_source;
@@ -204,9 +206,9 @@ uint64_t grpcStreamGeneration(Config::Subscription* subscription) {
204206std::unique_ptr<Config::Subscription>
205207subscribe (const std::string& type_url, Server::Configuration::CommonFactoryContext& context,
206208 Stats::Scope& scope, Config::SubscriptionCallbacks& callbacks,
207- Config::OpaqueResourceDecoderSharedPtr resource_decoder,
209+ Config::OpaqueResourceDecoderSharedPtr resource_decoder, bool use_delta_xds,
208210 std::chrono::milliseconds init_fetch_timeout) {
209- const envoy::config::core::v3::ConfigSource config_source = getCiliumXDSAPIConfig ();
211+ const envoy::config::core::v3::ConfigSource config_source = getCiliumXDSAPIConfig (use_delta_xds );
210212 const envoy::config::core::v3::ApiConfigSource& api_config_source =
211213 config_source.api_config_source ();
212214 THROW_IF_NOT_OK (Config::Utility::checkApiConfigSourceSubscriptionBackingCluster (
@@ -231,7 +233,7 @@ subscribe(const std::string& type_url, Server::Configuration::CommonFactoryConte
231233 factory_or_error.value ()->createUncachedRawAsyncClient (), Grpc::RawAsyncClientPtr),
232234 /* failover_async_client_=*/ nullptr ,
233235 /* dispatcher_=*/ context.mainThreadDispatcher (),
234- /* service_method_=*/ sotwGrpcMethod (type_url),
236+ /* service_method_=*/ use_delta_xds ? deltaGrpcMethod (type_url) : sotwGrpcMethod (type_url),
235237 /* local_info_=*/ context.localInfo (),
236238 /* rate_limit_settings_=*/ rate_limit_settings_or_error.value (),
237239 /* scope_=*/ scope,
@@ -247,8 +249,10 @@ subscribe(const std::string& type_url, Server::Configuration::CommonFactoryConte
247249 };
248250
249251 std::shared_ptr<Config::GrpcMux> grpc_mux =
250- std::static_pointer_cast<Config::GrpcMux>(std::make_shared<SotwGrpcMuxImpl>(
251- grpc_mux_context, api_config_source.set_node_on_first_message_only ()));
252+ use_delta_xds ? std::static_pointer_cast<Config::GrpcMux>(
253+ std::make_shared<DeltaGrpcMuxImpl>(grpc_mux_context))
254+ : std::static_pointer_cast<Config::GrpcMux>(std::make_shared<SotwGrpcMuxImpl>(
255+ grpc_mux_context, api_config_source.set_node_on_first_message_only ()));
252256
253257 return std::make_unique<Config::GrpcSubscriptionImpl>(
254258 grpc_mux, callbacks, resource_decoder, stats, type_url, context.mainThreadDispatcher (),
0 commit comments