Полный production-рефакторинг билдера, drift-reconcile и документации по up5

This commit is contained in:
2026-05-10 16:42:09 +05:00
parent b3dad5974c
commit b8d2c4592b
12 changed files with 571 additions and 266 deletions
+54
View File
@@ -95,6 +95,34 @@ fn parse_fallback_wg_show(raw: &str, peer_cidr: &str) -> anyhow::Result<Vec<Peer
#[cfg(test)]
mod tests {
use super::*;
use std::collections::BTreeMap;
use std::sync::Mutex;
struct TestTransport {
replies: Mutex<BTreeMap<String, anyhow::Result<String>>>,
}
impl TestTransport {
fn new(entries: Vec<(&str, anyhow::Result<&str>)>) -> Self {
let mut replies = BTreeMap::new();
for (cmd, out) in entries {
let mapped = out.map(|s| s.to_string());
replies.insert(cmd.to_string(), mapped);
}
Self {
replies: Mutex::new(replies),
}
}
}
impl crate::netns::NsTransport for TestTransport {
fn run(&self, args: &[&str]) -> anyhow::Result<String> {
let key = args.join(" ");
let mut lock = self.replies.lock().expect("lock");
lock.remove(&key)
.unwrap_or_else(|| Err(anyhow::anyhow!("missing stub for: {key}")))
}
}
#[test]
fn parse_primary() {
@@ -126,4 +154,30 @@ mod tests {
assert_eq!(peers[0].ipv4.to_string(), "10.8.1.10");
assert_eq!(peers[1].ipv4.to_string(), "10.8.1.2");
}
#[test]
fn command_failure_is_propagated() {
let transport = TestTransport::new(vec![(
"wg show all allowed-ips",
Err(anyhow::anyhow!("wg broken")),
)]);
let err = discover_peers_with_transport(&transport, "10.8.1.0/24").err();
assert!(err.is_some());
let msg = err.expect("err").to_string();
assert!(msg.contains("wg show all allowed-ips failed"));
}
#[test]
fn empty_primary_output_falls_back_to_wg_show() {
let transport = TestTransport::new(vec![
("wg show all allowed-ips", Ok("")),
("wg show", Ok("allowed ips: 10.8.1.4/32, 10.8.1.5/32")),
]);
let peers = discover_peers_with_transport(&transport, "10.8.1.0/24").expect("peers");
assert_eq!(peers.len(), 2);
assert_eq!(peers[0].ipv4.to_string(), "10.8.1.4");
assert_eq!(peers[1].ipv4.to_string(), "10.8.1.5");
}
}