use std::{collections::HashMap, net::SocketAddr, path::PathBuf};
use serde::Deserialize;
use crate::{blackhole, generator, inspector, observer, target, target_metrics};
#[derive(Debug, Default, Deserialize, PartialEq)]
pub struct Config {
#[serde(default)]
pub telemetry: Telemetry,
#[serde(default)]
#[serde(with = "serde_yaml::with::singleton_map_recursive")]
pub generator: Vec<generator::Config>,
#[serde(skip_deserializing)]
pub observer: observer::Config,
#[serde(skip_deserializing)]
pub target: Option<target::Config>,
#[serde(default)]
#[serde(with = "serde_yaml::with::singleton_map_recursive")]
pub blackhole: Option<Vec<blackhole::Config>>,
#[serde(default)]
#[serde(with = "serde_yaml::with::singleton_map_recursive")]
pub target_metrics: Option<Vec<target_metrics::Config>>,
pub inspector: Option<inspector::Config>,
}
#[derive(Debug, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
#[serde(untagged)]
pub enum Telemetry {
Prometheus {
prometheus_addr: SocketAddr,
global_labels: HashMap<String, String>,
},
Log {
path: PathBuf,
global_labels: HashMap<String, String>,
},
}
impl Default for Telemetry {
fn default() -> Self {
Self::Prometheus {
prometheus_addr: "0.0.0.0:9000".parse().unwrap(),
global_labels: HashMap::default(),
}
}
}
#[cfg(test)]
mod tests {
use std::str::FromStr;
use http::HeaderMap;
use crate::throttle;
use super::*;
#[test]
fn config_deserializes() {
let contents = r#"
generator:
- id: "Data out"
http:
seed: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
headers: {}
target_uri: "http://localhost:1000/"
bytes_per_second: "100 Mb"
parallel_connections: 5
method:
post:
maximum_prebuild_cache_size_bytes: "8 Mb"
variant: "fluent"
blackhole:
- id: "Data in"
tcp:
binding_addr: "127.0.0.1:1000"
- tcp:
binding_addr: "127.0.0.1:1001"
"#;
let config: Config = serde_yaml::from_str(contents).unwrap();
assert_eq!(
config,
Config {
generator: vec![generator::Config {
general: generator::General {
id: Some(String::from("Data out"))
},
inner: generator::Inner::Http(generator::http::Config {
seed: Default::default(),
target_uri: "http://localhost:1000/".try_into().unwrap(),
method: generator::http::Method::Post {
variant: crate::payload::Config::Fluent,
maximum_prebuild_cache_size_bytes: byte_unit::Byte::from_unit(
8_f64,
byte_unit::ByteUnit::MB
)
.unwrap()
},
headers: HeaderMap::default(),
bytes_per_second: byte_unit::Byte::from_unit(
100_f64,
byte_unit::ByteUnit::MB
)
.unwrap(),
block_sizes: Option::default(),
parallel_connections: 5,
throttle: throttle::Config::default(),
}),
}],
blackhole: Some(vec![
blackhole::Config {
general: blackhole::General {
id: Some(String::from("Data in"))
},
inner: blackhole::Inner::Tcp(blackhole::tcp::Config {
binding_addr: SocketAddr::from_str("127.0.0.1:1000").unwrap(),
})
},
blackhole::Config {
general: blackhole::General { id: None },
inner: blackhole::Inner::Tcp(blackhole::tcp::Config {
binding_addr: SocketAddr::from_str("127.0.0.1:1001").unwrap(),
})
},
]),
target: Option::default(),
telemetry: crate::config::Telemetry::default(),
observer: observer::Config::default(),
inspector: Option::default(),
target_metrics: Option::default(),
},
);
}
}