Skip to main content

xds_server/services/
mod.rs

1//! gRPC service implementations for xDS.
2//!
3//! This module contains the tonic service implementations for:
4//! - Aggregated Discovery Service (ADS)
5//! - Cluster Discovery Service (CDS)
6//! - Listener Discovery Service (LDS)
7//! - Route Discovery Service (RDS)
8//! - Endpoint Discovery Service (EDS)
9//! - Secret Discovery Service (SDS)
10
11pub mod ads;
12pub mod cds;
13pub mod eds;
14pub mod lds;
15pub mod rds;
16pub mod sds;
17
18use std::sync::Arc;
19
20use xds_cache::ShardedCache;
21use xds_core::ResourceRegistry;
22
23use crate::config::ServerConfig;
24use crate::delta::DeltaHandler;
25use crate::sotw::SotwHandler;
26
27// Re-export all services and traits
28pub use ads::{AdsConfig, AdsService, AggregatedDiscoveryService, AggregatedDiscoveryServiceServer};
29pub use cds::{CdsService, ClusterDiscoveryService, ClusterDiscoveryServiceServer};
30pub use eds::{EdsService, EndpointDiscoveryService, EndpointDiscoveryServiceServer};
31pub use lds::{LdsService, ListenerDiscoveryService, ListenerDiscoveryServiceServer};
32pub use rds::{RdsService, RouteDiscoveryService, RouteDiscoveryServiceServer};
33pub use sds::{SdsService, SecretDiscoveryService, SecretDiscoveryServiceServer};
34
35/// Shared state for all xDS services.
36#[derive(Debug, Clone)]
37pub struct ServiceState {
38    /// Shared cache.
39    pub cache: Arc<ShardedCache>,
40    /// Resource registry.
41    pub registry: Arc<ResourceRegistry>,
42    /// Server configuration.
43    pub config: Arc<ServerConfig>,
44    /// SotW handler.
45    pub sotw: Arc<SotwHandler>,
46    /// Delta handler.
47    pub delta: Arc<DeltaHandler>,
48}
49
50impl ServiceState {
51    /// Create new service state.
52    pub fn new(
53        cache: Arc<ShardedCache>,
54        registry: Arc<ResourceRegistry>,
55        config: ServerConfig,
56    ) -> Self {
57        let sotw = Arc::new(SotwHandler::new(Arc::clone(&cache), Arc::clone(&registry)));
58        let delta = Arc::new(DeltaHandler::new(Arc::clone(&cache), Arc::clone(&registry)));
59
60        Self {
61            cache,
62            registry,
63            config: Arc::new(config),
64            sotw,
65            delta,
66        }
67    }
68
69    /// Create all discovery services from this state.
70    ///
71    /// Services share the SotW handler from this state for better resource
72    /// efficiency instead of creating individual handlers.
73    pub fn create_services(
74        &self,
75    ) -> (
76        AdsService,
77        CdsService,
78        LdsService,
79        RdsService,
80        EdsService,
81        SdsService,
82    ) {
83        (
84            AdsService::new(Arc::clone(&self.cache), Arc::clone(&self.registry)),
85            CdsService::new_with_handlers(
86                Arc::clone(&self.cache),
87                Arc::clone(&self.registry),
88                Arc::clone(&self.sotw),
89                Arc::clone(&self.delta),
90            ),
91            LdsService::new_with_handlers(
92                Arc::clone(&self.cache),
93                Arc::clone(&self.registry),
94                Arc::clone(&self.sotw),
95                Arc::clone(&self.delta),
96            ),
97            RdsService::new_with_handlers(
98                Arc::clone(&self.cache),
99                Arc::clone(&self.registry),
100                Arc::clone(&self.sotw),
101                Arc::clone(&self.delta),
102            ),
103            EdsService::new_with_handlers(
104                Arc::clone(&self.cache),
105                Arc::clone(&self.registry),
106                Arc::clone(&self.sotw),
107                Arc::clone(&self.delta),
108            ),
109            SdsService::new_with_handlers(
110                Arc::clone(&self.cache),
111                Arc::clone(&self.registry),
112                Arc::clone(&self.sotw),
113                Arc::clone(&self.delta),
114            ),
115        )
116    }
117}