testground/
network_conf.rs1#![allow(dead_code)]
2
3use ipnetwork::{IpNetwork, Ipv4Network, Ipv6Network};
4use serde::Serialize;
5
6use serde_repr::{Deserialize_repr, Serialize_repr};
7
8#[derive(Serialize_repr, Deserialize_repr, PartialEq, Eq, Debug)]
9#[repr(u8)]
10pub enum FilterAction {
11 Accept = 0,
12 Reject = 1,
13 Drop = 2,
14}
15
16#[derive(Serialize, Debug)]
17pub struct LinkShape {
19 pub latency: u64,
21
22 pub jitter: u64,
24
25 pub bandwidth: u64,
27
28 pub filter: FilterAction,
31
32 pub loss: f32,
34
35 pub corrupt: f32,
37
38 pub corrupt_corr: f32,
40
41 pub reorder: f32,
47
48 pub reorder_corr: f32,
50
51 pub duplicate: f32,
53
54 pub duplicate_corr: f32,
56}
57
58#[derive(Serialize, Debug)]
59pub struct LinkRule {
61 #[serde(flatten)]
62 pub link_shape: LinkShape,
63
64 pub subnet: IpNetwork,
65}
66
67pub const DEFAULT_DATA_NETWORK: &str = "default";
68
69#[derive(Serialize, Debug)]
70pub enum RoutingPolicyType {
71 #[serde(rename = "allow_all")]
72 AllowAll,
73 #[serde(rename = "deny_all")]
74 DenyAll,
75}
76
77#[derive(Serialize, Debug)]
79pub struct NetworkConfiguration {
80 pub network: String,
82
83 #[serde(rename = "IPv4")]
90 pub ipv4: Option<Ipv4Network>,
91
92 #[serde(rename = "IPv6")]
94 pub ipv6: Option<Ipv6Network>,
95
96 pub enable: bool,
98
99 pub default: LinkShape,
101
102 pub rules: Option<Vec<LinkRule>>,
106
107 pub callback_state: String,
112
113 #[serde(skip_serializing_if = "Option::is_none")]
116 pub callback_target: Option<u64>,
117
118 pub routing_policy: RoutingPolicyType,
122}
123
124#[cfg(test)]
125mod tests {
126 use std::net::Ipv4Addr;
127
128 use super::*;
129
130 #[test]
131 fn serde_test() {
132 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"}"#;
133
134 let network_conf = NetworkConfiguration {
135 network: DEFAULT_DATA_NETWORK.to_owned(),
136 ipv4: Some(Ipv4Network::new(Ipv4Addr::new(16, 0, 1, 1), 24).unwrap()),
137 ipv6: None,
138 enable: true,
139 default: LinkShape {
140 latency: 10000000,
141 jitter: 0,
142 bandwidth: 1048576,
143 filter: FilterAction::Accept,
144 loss: 0.0,
145 corrupt: 0.0,
146 corrupt_corr: 0.0,
147 reorder: 0.0,
148 reorder_corr: 0.0,
149 duplicate: 0.0,
150 duplicate_corr: 0.0,
151 },
152 rules: None,
153 callback_state: "latency-reduced".to_owned(),
154 callback_target: None,
155 routing_policy: RoutingPolicyType::DenyAll,
156 };
157
158 let input = serde_json::to_string(&network_conf).unwrap();
159
160 println!("{}", input);
161
162 assert_eq!(input, output)
163 }
164}