rs_zero/core/dependency_config/
etcd.rs1use 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#[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 #[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#[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#[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}