use serde::Deserialize;
#[cfg(feature = "discovery-etcd")]
use crate::core::CoreResult;
#[cfg(feature = "discovery-etcd")]
use super::rpc::RpcClientProvider;
use super::rpc::RpcClientSection;
#[derive(Debug, Clone, Deserialize, PartialEq, Eq)]
#[serde(default, deny_unknown_fields)]
pub struct EtcdDiscoverySection {
pub endpoints: Vec<String>,
pub prefix: String,
pub lease_ttl: i64,
pub reconnect_interval_ms: u64,
pub connect_timeout_ms: u64,
pub operation_timeout_ms: u64,
pub keep_alive_interval_ms: u64,
pub keep_alive_timeout_ms: u64,
pub watch_backoff: EtcdBackoffSection,
pub auth: Option<EtcdAuthSection>,
}
impl Default for EtcdDiscoverySection {
fn default() -> Self {
Self {
endpoints: vec!["http://127.0.0.1:2379".to_string()],
prefix: "/rs-zero".to_string(),
lease_ttl: 30,
reconnect_interval_ms: 1000,
connect_timeout_ms: 3000,
operation_timeout_ms: 3000,
keep_alive_interval_ms: 5000,
keep_alive_timeout_ms: 3000,
watch_backoff: EtcdBackoffSection::default(),
auth: None,
}
}
}
impl EtcdDiscoverySection {
#[cfg(feature = "discovery-etcd")]
fn to_etcd_discovery_config(&self) -> crate::discovery_etcd::EtcdDiscoveryConfig {
crate::discovery_etcd::EtcdDiscoveryConfig {
endpoints: self.endpoints.clone(),
prefix: self.prefix.clone(),
lease_ttl: self.lease_ttl,
reconnect_interval: std::time::Duration::from_millis(self.reconnect_interval_ms),
connect_timeout: std::time::Duration::from_millis(self.connect_timeout_ms),
operation_timeout: std::time::Duration::from_millis(self.operation_timeout_ms),
keep_alive_interval: std::time::Duration::from_millis(self.keep_alive_interval_ms),
keep_alive_timeout: std::time::Duration::from_millis(self.keep_alive_timeout_ms),
watch_backoff: crate::discovery_etcd::BackoffConfig {
initial: std::time::Duration::from_millis(self.watch_backoff.initial_ms),
max: std::time::Duration::from_millis(self.watch_backoff.max_ms),
},
auth: self
.auth
.as_ref()
.map(|auth| crate::discovery_etcd::EtcdAuthConfig {
username: auth.username.clone(),
password: auth.password.clone(),
}),
}
}
}
impl RpcClientSection {
#[cfg(feature = "discovery-etcd")]
pub fn to_etcd_discovery_config(
&self,
) -> CoreResult<crate::discovery_etcd::EtcdDiscoveryConfig> {
if self.provider != RpcClientProvider::Etcd {
return Err(super::config_error(
"etcd discovery config requires provider = \"etcd\"",
));
}
Ok(self
.etcd
.clone()
.unwrap_or_default()
.to_etcd_discovery_config())
}
}
#[derive(Debug, Clone, Deserialize, PartialEq, Eq)]
#[serde(default, deny_unknown_fields)]
pub struct EtcdBackoffSection {
pub initial_ms: u64,
pub max_ms: u64,
}
impl Default for EtcdBackoffSection {
fn default() -> Self {
Self {
initial_ms: 200,
max_ms: 5000,
}
}
}
#[derive(Debug, Clone, Deserialize, PartialEq, Eq, Default)]
#[serde(default, deny_unknown_fields)]
pub struct EtcdAuthSection {
pub username: String,
pub password: String,
}