Skip to main content

rs_zero/core/dependency_config/
etcd.rs

1use serde::Deserialize;
2
3#[cfg(feature = "discovery-etcd")]
4use crate::core::CoreResult;
5
6#[cfg(feature = "discovery-etcd")]
7use super::rpc::RpcClientProvider;
8use super::rpc::RpcClientSection;
9
10/// Serializable etcd discovery configuration.
11#[derive(Debug, Clone, Deserialize, PartialEq, Eq)]
12#[serde(default, deny_unknown_fields)]
13pub struct EtcdDiscoverySection {
14    pub endpoints: Vec<String>,
15    pub prefix: String,
16    pub lease_ttl: i64,
17    pub reconnect_interval_ms: u64,
18    pub connect_timeout_ms: u64,
19    pub operation_timeout_ms: u64,
20    pub keep_alive_interval_ms: u64,
21    pub keep_alive_timeout_ms: u64,
22    pub watch_backoff: EtcdBackoffSection,
23    pub auth: Option<EtcdAuthSection>,
24}
25
26impl Default for EtcdDiscoverySection {
27    fn default() -> Self {
28        Self {
29            endpoints: vec!["http://127.0.0.1:2379".to_string()],
30            prefix: "/rs-zero".to_string(),
31            lease_ttl: 30,
32            reconnect_interval_ms: 1000,
33            connect_timeout_ms: 3000,
34            operation_timeout_ms: 3000,
35            keep_alive_interval_ms: 5000,
36            keep_alive_timeout_ms: 3000,
37            watch_backoff: EtcdBackoffSection::default(),
38            auth: None,
39        }
40    }
41}
42
43impl EtcdDiscoverySection {
44    #[cfg(feature = "discovery-etcd")]
45    fn to_etcd_discovery_config(&self) -> crate::discovery_etcd::EtcdDiscoveryConfig {
46        crate::discovery_etcd::EtcdDiscoveryConfig {
47            endpoints: self.endpoints.clone(),
48            prefix: self.prefix.clone(),
49            lease_ttl: self.lease_ttl,
50            reconnect_interval: std::time::Duration::from_millis(self.reconnect_interval_ms),
51            connect_timeout: std::time::Duration::from_millis(self.connect_timeout_ms),
52            operation_timeout: std::time::Duration::from_millis(self.operation_timeout_ms),
53            keep_alive_interval: std::time::Duration::from_millis(self.keep_alive_interval_ms),
54            keep_alive_timeout: std::time::Duration::from_millis(self.keep_alive_timeout_ms),
55            watch_backoff: crate::discovery_etcd::BackoffConfig {
56                initial: std::time::Duration::from_millis(self.watch_backoff.initial_ms),
57                max: std::time::Duration::from_millis(self.watch_backoff.max_ms),
58            },
59            auth: self
60                .auth
61                .as_ref()
62                .map(|auth| crate::discovery_etcd::EtcdAuthConfig {
63                    username: auth.username.clone(),
64                    password: auth.password.clone(),
65                }),
66        }
67    }
68}
69
70impl RpcClientSection {
71    /// Converts nested etcd settings into the runtime etcd discovery config.
72    #[cfg(feature = "discovery-etcd")]
73    pub fn to_etcd_discovery_config(
74        &self,
75    ) -> CoreResult<crate::discovery_etcd::EtcdDiscoveryConfig> {
76        if self.provider != RpcClientProvider::Etcd {
77            return Err(super::config_error(
78                "etcd discovery config requires provider = \"etcd\"",
79            ));
80        }
81        Ok(self
82            .etcd
83            .clone()
84            .unwrap_or_default()
85            .to_etcd_discovery_config())
86    }
87}
88
89/// Serializable reconnect backoff configuration.
90#[derive(Debug, Clone, Deserialize, PartialEq, Eq)]
91#[serde(default, deny_unknown_fields)]
92pub struct EtcdBackoffSection {
93    pub initial_ms: u64,
94    pub max_ms: u64,
95}
96
97impl Default for EtcdBackoffSection {
98    fn default() -> Self {
99        Self {
100            initial_ms: 200,
101            max_ms: 5000,
102        }
103    }
104}
105
106/// Serializable etcd authentication configuration.
107#[derive(Debug, Clone, Deserialize, PartialEq, Eq, Default)]
108#[serde(default, deny_unknown_fields)]
109pub struct EtcdAuthSection {
110    pub username: String,
111    pub password: String,
112}