Fix crash when queuingStructure.json contains [children] entries.

Affects ISSUE #206

* Add a blank node for [children] in the QueueNode parser.
* Add two unit tests to cover loading content with and without
  [children] entries.
This commit is contained in:
Herbert Wolverson
2023-01-25 17:03:21 +00:00
parent 9e0725c02c
commit 74116e97e8
4 changed files with 679 additions and 1 deletions

View File

@@ -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"
]
}

View File

@@ -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"
]
}

View File

@@ -5,7 +5,7 @@ use serde_json::Value;
use std::path::{Path, PathBuf};
pub struct QueueNetwork {
cpu_node: Vec<QueueNode>,
pub(crate) cpu_node: Vec<QueueNode>,
}
impl QueueNetwork {

View File

@@ -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);
}
}