diff --git a/src/rust/lqos_queue_tracker/src/queue_structure/example_queue_flat.test.json b/src/rust/lqos_queue_tracker/src/queue_structure/example_queue_flat.test.json new file mode 100644 index 00000000..6e21768a --- /dev/null +++ b/src/rust/lqos_queue_tracker/src/queue_structure/example_queue_flat.test.json @@ -0,0 +1,247 @@ +{ + "Network": { + "Generated_PN_1": { + "downloadBandwidthMbps": 10000, + "uploadBandwidthMbps": 10000, + "downloadBandwidthMbpsMin": 9500, + "uploadBandwidthMbpsMin": 9500, + "classid": "0x1:0x3", + "up_classid": "0x1:0x3", + "parentClassID": "0x1:", + "up_parentClassID": "0x1:", + "classMajor": "0x1", + "up_classMajor": "0x1", + "classMinor": "0x3", + "cpuNum": "0x0", + "up_cpuNum": "0x0", + "circuits": [ + { + "maxDownload": 545, + "maxUpload": 545, + "minDownload": 27, + "minUpload": 5, + "circuitID": "9999", + "circuitName": "968 Circle St., Gurnee, IL 60031", + "ParentNode": "Generated_PN_1", + "devices": [ + { + "deviceID": "1", + "deviceName": "Device 1", + "mac": "", + "ipv4s": [ + "100.64.1.2", + "100.64.0.14" + ], + "ipv6s": [], + "comment": "" + } + ], + "classid": "0x1:0x4", + "up_classid": "0x1:0x4", + "classMajor": "0x1", + "up_classMajor": "0x1", + "classMinor": "0x4", + "comment": "" + } + ] + }, + "Generated_PN_2": { + "downloadBandwidthMbps": 10000, + "uploadBandwidthMbps": 10000, + "downloadBandwidthMbpsMin": 9500, + "uploadBandwidthMbpsMin": 9500, + "classid": "0x2:0x3", + "up_classid": "0x2:0x3", + "parentClassID": "0x2:", + "up_parentClassID": "0x2:", + "classMajor": "0x2", + "up_classMajor": "0x2", + "classMinor": "0x3", + "cpuNum": "0x1", + "up_cpuNum": "0x1", + "circuits": [ + { + "maxDownload": 669, + "maxUpload": 222, + "minDownload": 2, + "minUpload": 2, + "circuitID": "104", + "circuitName": "7", + "ParentNode": "Generated_PN_2", + "devices": [ + { + "deviceID": "KOMP_7", + "deviceName": "104", + "mac": "", + "ipv4s": [ + "10.30.3.49" + ], + "ipv6s": [], + "comment": "COMMENT" + } + ], + "classid": "0x2:0x4", + "up_classid": "0x2:0x4", + "classMajor": "0x2", + "up_classMajor": "0x2", + "classMinor": "0x4", + "comment": "COMMENT" + } + ] + }, + "Generated_PN_3": { + "downloadBandwidthMbps": 10000, + "uploadBandwidthMbps": 10000, + "downloadBandwidthMbpsMin": 9500, + "uploadBandwidthMbpsMin": 9500, + "classid": "0x3:0x3", + "up_classid": "0x3:0x3", + "parentClassID": "0x3:", + "up_parentClassID": "0x3:", + "classMajor": "0x3", + "up_classMajor": "0x3", + "classMinor": "0x3", + "cpuNum": "0x2", + "up_cpuNum": "0x2", + "circuits": [ + { + "maxDownload": 11, + "maxUpload": 2, + "minDownload": 2, + "minUpload": 2, + "circuitID": "101", + "circuitName": "3", + "ParentNode": "Generated_PN_3", + "devices": [ + { + "deviceID": "KOMP_3", + "deviceName": "101", + "mac": "", + "ipv4s": [ + "10.19.7.19" + ], + "ipv6s": [], + "comment": "COMMENT" + } + ], + "classid": "0x3:0x4", + "up_classid": "0x3:0x4", + "classMajor": "0x3", + "up_classMajor": "0x3", + "classMinor": "0x4", + "comment": "COMMENT" + }, + { + "maxDownload": 111, + "maxUpload": 111, + "minDownload": 2, + "minUpload": 2, + "circuitID": "102", + "circuitName": "4", + "ParentNode": "Generated_PN_3", + "devices": [ + { + "deviceID": "KOMP_4", + "deviceName": "102", + "mac": "", + "ipv4s": [ + "5.63.189.26" + ], + "ipv6s": [], + "comment": "COMMENT" + } + ], + "classid": "0x3:0x5", + "up_classid": "0x3:0x5", + "classMajor": "0x3", + "up_classMajor": "0x3", + "classMinor": "0x5", + "comment": "COMMENT" + } + ] + }, + "Generated_PN_4": { + "downloadBandwidthMbps": 10000, + "uploadBandwidthMbps": 10000, + "downloadBandwidthMbpsMin": 9500, + "uploadBandwidthMbpsMin": 9500, + "classid": "0x4:0x3", + "up_classid": "0x4:0x3", + "parentClassID": "0x4:", + "up_parentClassID": "0x4:", + "classMajor": "0x4", + "up_classMajor": "0x4", + "classMinor": "0x3", + "cpuNum": "0x3", + "up_cpuNum": "0x3", + "circuits": [ + { + "maxDownload": 109, + "maxUpload": 55, + "minDownload": 2, + "minUpload": 2, + "circuitID": "100", + "circuitName": "1", + "ParentNode": "Generated_PN_4", + "devices": [ + { + "deviceID": "KOMP_1", + "deviceName": "100", + "mac": "", + "ipv4s": [ + "10.30.0.204" + ], + "ipv6s": [], + "comment": "COMMENT" + } + ], + "classid": "0x4:0x4", + "up_classid": "0x4:0x4", + "classMajor": "0x4", + "up_classMajor": "0x4", + "classMinor": "0x4", + "comment": "COMMENT" + }, + { + "maxDownload": 109, + "maxUpload": 55, + "minDownload": 2, + "minUpload": 2, + "circuitID": "103", + "circuitName": "5", + "ParentNode": "Generated_PN_4", + "devices": [ + { + "deviceID": "KOMP_5", + "deviceName": "103", + "mac": "", + "ipv4s": [ + "10.30.4.128" + ], + "ipv6s": [], + "comment": "COMMENT" + } + ], + "classid": "0x4:0x5", + "up_classid": "0x4:0x5", + "classMajor": "0x4", + "up_classMajor": "0x4", + "classMinor": "0x5", + "comment": "COMMENT" + } + ] + } + }, + "lastUsedClassIDCounterByCPU": { + "1": 5, + "2": 5, + "3": 6, + "4": 6 + }, + "generatedPNs": [ + "Generated_PN_1", + "Generated_PN_2", + "Generated_PN_3", + "Generated_PN_4" + ] +} \ No newline at end of file diff --git a/src/rust/lqos_queue_tracker/src/queue_structure/example_queue_with_children.test.json b/src/rust/lqos_queue_tracker/src/queue_structure/example_queue_with_children.test.json new file mode 100644 index 00000000..061fbf32 --- /dev/null +++ b/src/rust/lqos_queue_tracker/src/queue_structure/example_queue_with_children.test.json @@ -0,0 +1,390 @@ +{ + "Network": { + "Site_1": { + "downloadBandwidthMbps": 1000, + "uploadBandwidthMbps": 1000, + "downloadBandwidthMbpsMin": 950, + "uploadBandwidthMbpsMin": 950, + "children": { + "AP_A": { + "downloadBandwidthMbps": 500, + "uploadBandwidthMbps": 500, + "downloadBandwidthMbpsMin": 475, + "uploadBandwidthMbpsMin": 475, + "classid": "0x1:0x5", + "up_classid": "0x1:0x5", + "parentClassID": "0x1:0x3", + "up_parentClassID": "0x1:0x3", + "classMajor": "0x1", + "up_classMajor": "0x1", + "classMinor": "0x5", + "cpuNum": "0x0", + "up_cpuNum": "0x0" + }, + "Site_3": { + "downloadBandwidthMbps": 500, + "uploadBandwidthMbps": 500, + "downloadBandwidthMbpsMin": 475, + "uploadBandwidthMbpsMin": 475, + "children": { + "PoP_5": { + "downloadBandwidthMbps": 200, + "uploadBandwidthMbps": 200, + "downloadBandwidthMbpsMin": 190, + "uploadBandwidthMbpsMin": 190, + "children": { + "AP_9": { + "downloadBandwidthMbps": 120, + "uploadBandwidthMbps": 120, + "downloadBandwidthMbpsMin": 114, + "uploadBandwidthMbpsMin": 114, + "classid": "0x1:0xa", + "up_classid": "0x1:0xa", + "parentClassID": "0x1:0x8", + "up_parentClassID": "0x1:0x8", + "classMajor": "0x1", + "up_classMajor": "0x1", + "classMinor": "0xa", + "cpuNum": "0x0", + "up_cpuNum": "0x0" + }, + "PoP_6": { + "downloadBandwidthMbps": 60, + "uploadBandwidthMbps": 60, + "downloadBandwidthMbpsMin": 57, + "uploadBandwidthMbpsMin": 57, + "children": { + "AP_11": { + "downloadBandwidthMbps": 30, + "uploadBandwidthMbps": 30, + "downloadBandwidthMbpsMin": 28, + "uploadBandwidthMbpsMin": 28, + "classid": "0x1:0xd", + "up_classid": "0x1:0xd", + "parentClassID": "0x1:0xb", + "up_parentClassID": "0x1:0xb", + "classMajor": "0x1", + "up_classMajor": "0x1", + "classMinor": "0xd", + "cpuNum": "0x0", + "up_cpuNum": "0x0" + } + }, + "classid": "0x1:0xb", + "up_classid": "0x1:0xb", + "parentClassID": "0x1:0x8", + "up_parentClassID": "0x1:0x8", + "classMajor": "0x1", + "up_classMajor": "0x1", + "classMinor": "0xb", + "cpuNum": "0x0", + "up_cpuNum": "0x0" + } + }, + "classid": "0x1:0x8", + "up_classid": "0x1:0x8", + "parentClassID": "0x1:0x6", + "up_parentClassID": "0x1:0x6", + "classMajor": "0x1", + "up_classMajor": "0x1", + "classMinor": "0x8", + "cpuNum": "0x0", + "up_cpuNum": "0x0" + } + }, + "classid": "0x1:0x6", + "up_classid": "0x1:0x6", + "parentClassID": "0x1:0x3", + "up_parentClassID": "0x1:0x3", + "classMajor": "0x1", + "up_classMajor": "0x1", + "classMinor": "0x6", + "cpuNum": "0x0", + "up_cpuNum": "0x0" + } + }, + "classid": "0x1:0x3", + "up_classid": "0x1:0x3", + "parentClassID": "0x1:", + "up_parentClassID": "0x1:", + "classMajor": "0x1", + "up_classMajor": "0x1", + "classMinor": "0x3", + "cpuNum": "0x0", + "up_cpuNum": "0x0" + }, + "Site_2": { + "downloadBandwidthMbps": 500, + "uploadBandwidthMbps": 500, + "downloadBandwidthMbpsMin": 475, + "uploadBandwidthMbpsMin": 475, + "children": { + "PoP_1": { + "downloadBandwidthMbps": 200, + "uploadBandwidthMbps": 200, + "downloadBandwidthMbpsMin": 190, + "uploadBandwidthMbpsMin": 190, + "children": { + "AP_7": { + "downloadBandwidthMbps": 100, + "uploadBandwidthMbps": 100, + "downloadBandwidthMbpsMin": 95, + "uploadBandwidthMbpsMin": 95, + "classid": "0x2:0x8", + "up_classid": "0x2:0x8", + "parentClassID": "0x2:0x5", + "up_parentClassID": "0x2:0x5", + "classMajor": "0x2", + "up_classMajor": "0x2", + "classMinor": "0x8", + "cpuNum": "0x1", + "up_cpuNum": "0x1" + } + }, + "classid": "0x2:0x5", + "up_classid": "0x2:0x5", + "parentClassID": "0x2:0x3", + "up_parentClassID": "0x2:0x3", + "classMajor": "0x2", + "up_classMajor": "0x2", + "classMinor": "0x5", + "cpuNum": "0x1", + "up_cpuNum": "0x1", + "circuits": [ + { + "maxDownload": 200, + "maxUpload": 200, + "minDownload": 27, + "minUpload": 5, + "circuitID": "9999", + "circuitName": "968 Circle St., Gurnee, IL 60031", + "ParentNode": "PoP_1", + "devices": [ + { + "deviceID": "1", + "deviceName": "Device 1", + "mac": "", + "ipv4s": [ + "100.64.1.2", + "100.64.0.14" + ], + "ipv6s": [], + "comment": "" + } + ], + "classid": "0x2:0x6", + "up_classid": "0x2:0x6", + "classMajor": "0x2", + "up_classMajor": "0x2", + "classMinor": "0x6", + "comment": "" + } + ] + }, + "AP_1": { + "downloadBandwidthMbps": 150, + "uploadBandwidthMbps": 150, + "downloadBandwidthMbpsMin": 142, + "uploadBandwidthMbpsMin": 142, + "classid": "0x2:0x9", + "up_classid": "0x2:0x9", + "parentClassID": "0x2:0x3", + "up_parentClassID": "0x2:0x3", + "classMajor": "0x2", + "up_classMajor": "0x2", + "classMinor": "0x9", + "cpuNum": "0x1", + "up_cpuNum": "0x1" + } + }, + "classid": "0x2:0x3", + "up_classid": "0x2:0x3", + "parentClassID": "0x2:", + "up_parentClassID": "0x2:", + "classMajor": "0x2", + "up_classMajor": "0x2", + "classMinor": "0x3", + "cpuNum": "0x1", + "up_cpuNum": "0x1" + }, + "Generated_PN_1": { + "downloadBandwidthMbps": 10000, + "uploadBandwidthMbps": 10000, + "downloadBandwidthMbpsMin": 9500, + "uploadBandwidthMbpsMin": 9500, + "classid": "0x3:0x3", + "up_classid": "0x3:0x3", + "parentClassID": "0x3:", + "up_parentClassID": "0x3:", + "classMajor": "0x3", + "up_classMajor": "0x3", + "classMinor": "0x3", + "cpuNum": "0x2", + "up_cpuNum": "0x2", + "circuits": [ + { + "maxDownload": 669, + "maxUpload": 222, + "minDownload": 2, + "minUpload": 2, + "circuitID": "104", + "circuitName": "7", + "ParentNode": "Generated_PN_1", + "devices": [ + { + "deviceID": "KOMP_7", + "deviceName": "104", + "mac": "", + "ipv4s": [ + "10.30.3.49" + ], + "ipv6s": [], + "comment": "COMMENT" + } + ], + "classid": "0x3:0x4", + "up_classid": "0x3:0x4", + "classMajor": "0x3", + "up_classMajor": "0x3", + "classMinor": "0x4", + "comment": "COMMENT" + } + ] + }, + "Generated_PN_2": { + "downloadBandwidthMbps": 10000, + "uploadBandwidthMbps": 10000, + "downloadBandwidthMbpsMin": 9500, + "uploadBandwidthMbpsMin": 9500, + "classid": "0x4:0x3", + "up_classid": "0x4:0x3", + "parentClassID": "0x4:", + "up_parentClassID": "0x4:", + "classMajor": "0x4", + "up_classMajor": "0x4", + "classMinor": "0x3", + "cpuNum": "0x3", + "up_cpuNum": "0x3", + "circuits": [ + { + "maxDownload": 109, + "maxUpload": 55, + "minDownload": 2, + "minUpload": 2, + "circuitID": "100", + "circuitName": "1", + "ParentNode": "Generated_PN_2", + "devices": [ + { + "deviceID": "KOMP_1", + "deviceName": "100", + "mac": "", + "ipv4s": [ + "10.30.0.204" + ], + "ipv6s": [], + "comment": "COMMENT" + } + ], + "classid": "0x4:0x4", + "up_classid": "0x4:0x4", + "classMajor": "0x4", + "up_classMajor": "0x4", + "classMinor": "0x4", + "comment": "COMMENT" + }, + { + "maxDownload": 11, + "maxUpload": 2, + "minDownload": 2, + "minUpload": 2, + "circuitID": "101", + "circuitName": "3", + "ParentNode": "Generated_PN_2", + "devices": [ + { + "deviceID": "KOMP_3", + "deviceName": "101", + "mac": "", + "ipv4s": [ + "10.19.7.19" + ], + "ipv6s": [], + "comment": "COMMENT" + } + ], + "classid": "0x4:0x5", + "up_classid": "0x4:0x5", + "classMajor": "0x4", + "up_classMajor": "0x4", + "classMinor": "0x5", + "comment": "COMMENT" + }, + { + "maxDownload": 111, + "maxUpload": 111, + "minDownload": 2, + "minUpload": 2, + "circuitID": "102", + "circuitName": "4", + "ParentNode": "Generated_PN_2", + "devices": [ + { + "deviceID": "KOMP_4", + "deviceName": "102", + "mac": "", + "ipv4s": [ + "5.63.189.26" + ], + "ipv6s": [], + "comment": "COMMENT" + } + ], + "classid": "0x4:0x6", + "up_classid": "0x4:0x6", + "classMajor": "0x4", + "up_classMajor": "0x4", + "classMinor": "0x6", + "comment": "COMMENT" + }, + { + "maxDownload": 109, + "maxUpload": 55, + "minDownload": 2, + "minUpload": 2, + "circuitID": "103", + "circuitName": "5", + "ParentNode": "Generated_PN_2", + "devices": [ + { + "deviceID": "KOMP_5", + "deviceName": "103", + "mac": "", + "ipv4s": [ + "10.30.4.128" + ], + "ipv6s": [], + "comment": "COMMENT" + } + ], + "classid": "0x4:0x7", + "up_classid": "0x4:0x7", + "classMajor": "0x4", + "up_classMajor": "0x4", + "classMinor": "0x7", + "comment": "COMMENT" + } + ] + } + }, + "lastUsedClassIDCounterByCPU": { + "1": 14, + "2": 10, + "3": 5, + "4": 8 + }, + "generatedPNs": [ + "Generated_PN_1", + "Generated_PN_2" + ] +} \ No newline at end of file diff --git a/src/rust/lqos_queue_tracker/src/queue_structure/queue_network.rs b/src/rust/lqos_queue_tracker/src/queue_structure/queue_network.rs index 38655cca..6f1c65b7 100644 --- a/src/rust/lqos_queue_tracker/src/queue_structure/queue_network.rs +++ b/src/rust/lqos_queue_tracker/src/queue_structure/queue_network.rs @@ -5,7 +5,7 @@ use serde_json::Value; use std::path::{Path, PathBuf}; pub struct QueueNetwork { - cpu_node: Vec, + pub(crate) cpu_node: Vec, } impl QueueNetwork { diff --git a/src/rust/lqos_queue_tracker/src/queue_structure/queue_node.rs b/src/rust/lqos_queue_tracker/src/queue_structure/queue_node.rs index e1ae4a1d..85ea592a 100644 --- a/src/rust/lqos_queue_tracker/src/queue_structure/queue_node.rs +++ b/src/rust/lqos_queue_tracker/src/queue_structure/queue_node.rs @@ -101,6 +101,7 @@ impl QueueNode { } } } + "children" => {} // Ignore for now _ => log::error!("I don't know how to parse key: [{key}]"), } } @@ -127,3 +128,43 @@ impl QueueNode { result } } + +#[cfg(test)] +mod test { + use super::*; + + const EXAMPLE_QUEUE_STRUCTURE_WITH_CHILDREN: &str = include_str!("./example_queue_with_children.test.json"); + const EXAMPLE_QUEUE_STRUCTURE_NO_CHILDREN: &str = include_str!("./example_queue_flat.test.json"); + + fn try_load_queue_structure(raw_string: &str) { + let mut result = super::super::QueueNetwork { + cpu_node: Vec::new(), + }; + let json: Value = serde_json::from_str(&raw_string).unwrap(); + if let Value::Object(map) = &json { + if let Some(network) = map.get("Network") { + if let Value::Object(map) = network { + for (key, value) in map.iter() { + result.cpu_node.push(QueueNode::from_json(&key, value).unwrap()); + } + } else { + panic!("Unable to parse network object structure"); + } + } else { + panic!("Network entry not found"); + } + } else { + panic!("Unable to parse queueStructure.json"); + } + } + + #[test] + fn load_queue_structure_no_children() { + try_load_queue_structure(EXAMPLE_QUEUE_STRUCTURE_NO_CHILDREN); + } + + #[test] + fn load_queue_structure_with_children() { + try_load_queue_structure(EXAMPLE_QUEUE_STRUCTURE_WITH_CHILDREN); + } +} \ No newline at end of file