Skip to content

Commit b659268

Browse files
authored
Merge pull request #574 from LibreQoE/uisp_site_squash
* Add a new configuration item to the `[uisp_integration]` tree, `squ…
2 parents 1a082bb + b062dfc commit b659268

File tree

3 files changed

+50
-1
lines changed

3 files changed

+50
-1
lines changed

src/rust/lqos_config/src/etc/v15/uisp_integration.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ pub struct UispIntegration {
1111
pub airmax_capacity: f32,
1212
pub ltu_capacity: f32,
1313
pub exclude_sites: Vec<String>,
14+
pub squash_sites: Option<Vec<String>>,
1415
pub ipv6_with_mikrotik: bool,
1516
pub bandwidth_overhead_factor: f32,
1617
pub commit_bandwidth_multiplier: f32,
@@ -42,6 +43,7 @@ impl Default for UispIntegration {
4243
airmax_capacity: 0.0,
4344
ltu_capacity: 0.0,
4445
exclude_sites: vec![],
46+
squash_sites: None,
4547
ipv6_with_mikrotik: false,
4648
bandwidth_overhead_factor: 1.0,
4749
commit_bandwidth_multiplier: 1.0,

src/rust/uisp_integration/src/strategies/full/mod.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ use crate::strategies::full::parse::parse_uisp_datasets;
2828
use crate::strategies::full::root_site::{find_root_site, set_root_site};
2929
use crate::strategies::full::routes_override::get_route_overrides;
3030
use crate::strategies::full::shaped_devices_writer::write_shaped_devices;
31-
use crate::strategies::full::squash_single_entry_aps::squash_single_aps;
31+
use crate::strategies::full::squash_single_entry_aps::{squash_squashed_sites, squash_single_aps};
3232
use crate::strategies::full::tree_walk::walk_tree_for_routing;
3333
use crate::strategies::full::uisp_fetch::load_uisp_data;
3434
use crate::strategies::full::utils::{print_sites, warn_of_no_parents_and_promote};
@@ -137,6 +137,9 @@ pub async fn build_full_network(
137137
// Correct any sites with zero capacity
138138
correct_zero_capacity_sites(&mut sites, &config);
139139

140+
// Squash any sites that are in the squash list
141+
squash_squashed_sites(&mut sites, config.clone(), &root_site)?;
142+
140143
// Print Sites
141144
if let Some(root_idx) = sites.iter().position(|s| s.name == root_site) {
142145
// Issue No Parent Warnings

src/rust/uisp_integration/src/strategies/full/squash_single_entry_aps.rs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
use std::sync::Arc;
2+
use tracing::info;
3+
use lqos_config::Config;
14
use crate::errors::UispIntegrationError;
25
use crate::uisp_types::{UispSite, UispSiteType};
36

@@ -45,3 +48,44 @@ pub fn squash_single_aps(sites: &mut [UispSite]) -> Result<(), UispIntegrationEr
4548

4649
Ok(())
4750
}
51+
52+
pub fn squash_squashed_sites(sites: &mut [UispSite], config: Arc<Config>, root_name: &str) -> Result<(), UispIntegrationError> {
53+
let Some(squash_sites) = &config.uisp_integration.squash_sites else {
54+
return Ok(());
55+
};
56+
57+
let Some(root_index) = sites.iter().position(|s| s.name == root_name) else {
58+
return Ok(());
59+
};
60+
61+
info!("Squashing excluded sites.");
62+
info!("Squashing sites: {:?}", config.uisp_integration.squash_sites);
63+
let mut squashable = Vec::new();
64+
for (idx, site) in sites.iter().enumerate().filter(|(_,s)| s.site_type == UispSiteType::Site || s.site_type == UispSiteType::AccessPoint ) {
65+
if squash_sites.contains(&site.name) {
66+
squashable.push(idx);
67+
info!("Squashing site {} due to exclusion list.", site.name);
68+
}
69+
}
70+
71+
let mut squashed = Vec::new();
72+
for squash_idx in squashable {
73+
sites[squash_idx].site_type = UispSiteType::SquashDeleted;
74+
sites[squash_idx].name += " (SQUASHED)";
75+
println!("Squashing site {}", sites[squash_idx].name);
76+
let parent = root_index;
77+
sites.iter_mut().for_each(|s| {
78+
if let Some(their_parent) = s.selected_parent {
79+
if their_parent == squash_idx {
80+
info!("Re-parenting site {} to {} ({})", s.name, root_name, parent);
81+
s.selected_parent = Some(parent);
82+
squashed.push(s.id.clone());
83+
}
84+
}
85+
});
86+
sites[squash_idx].parent_indices.clear();
87+
}
88+
info!("Squashed sites: {:?}", squashed);
89+
90+
Ok(())
91+
}

0 commit comments

Comments
 (0)