#![allow(dead_code)]
use ipnetwork::{IpNetwork, Ipv4Network, Ipv6Network};
use serde::Serialize;
use serde_repr::{Deserialize_repr, Serialize_repr};
#[derive(Serialize_repr, Deserialize_repr, PartialEq, Eq, Debug)]
#[repr(u8)]
pub enum FilterAction {
Accept = 0,
Reject = 1,
Drop = 2,
}
#[derive(Serialize, Debug)]
pub struct LinkShape {
pub latency: u64,
pub jitter: u64,
pub bandwidth: u64,
pub filter: FilterAction,
pub loss: f32,
pub corrupt: f32,
pub corrupt_corr: f32,
pub reorder: f32,
pub reorder_corr: f32,
pub duplicate: f32,
pub duplicate_corr: f32,
}
#[derive(Serialize, Debug)]
pub struct LinkRule {
#[serde(flatten)]
pub link_shape: LinkShape,
pub subnet: IpNetwork,
}
pub const DEFAULT_DATA_NETWORK: &str = "default";
#[derive(Serialize, Debug)]
pub enum RoutingPolicyType {
#[serde(rename = "allow_all")]
AllowAll,
#[serde(rename = "deny_all")]
DenyAll,
}
#[derive(Serialize, Debug)]
pub struct NetworkConfiguration {
pub network: String,
#[serde(rename = "IPv4")]
pub ipv4: Option<Ipv4Network>,
#[serde(rename = "IPv6")]
pub ipv6: Option<Ipv6Network>,
pub enable: bool,
pub default: LinkShape,
pub rules: Option<Vec<LinkRule>>,
pub callback_state: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub callback_target: Option<u64>,
pub routing_policy: RoutingPolicyType,
}
#[cfg(test)]
mod tests {
use std::net::Ipv4Addr;
use super::*;
#[test]
fn serde_test() {
let output = r#"{"network":"default","IPv4":"16.0.1.1/24","IPv6":null,"enable":true,"default":{"latency":10000000,"jitter":0,"bandwidth":1048576,"filter":0,"loss":0.0,"corrupt":0.0,"corrupt_corr":0.0,"reorder":0.0,"reorder_corr":0.0,"duplicate":0.0,"duplicate_corr":0.0},"rules":null,"callback_state":"latency-reduced","routing_policy":"deny_all"}"#;
let network_conf = NetworkConfiguration {
network: DEFAULT_DATA_NETWORK.to_owned(),
ipv4: Some(Ipv4Network::new(Ipv4Addr::new(16, 0, 1, 1), 24).unwrap()),
ipv6: None,
enable: true,
default: LinkShape {
latency: 10000000,
jitter: 0,
bandwidth: 1048576,
filter: FilterAction::Accept,
loss: 0.0,
corrupt: 0.0,
corrupt_corr: 0.0,
reorder: 0.0,
reorder_corr: 0.0,
duplicate: 0.0,
duplicate_corr: 0.0,
},
rules: None,
callback_state: "latency-reduced".to_owned(),
callback_target: None,
routing_policy: RoutingPolicyType::DenyAll,
};
let input = serde_json::to_string(&network_conf).unwrap();
println!("{}", input);
assert_eq!(input, output)
}
}