From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [IPv6:2a01:7e0:0:424::9]) by lore.proxmox.com (Postfix) with ESMTPS id 6615C1FF137 for ; Tue, 03 Feb 2026 17:02:31 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id ED94F243D9; Tue, 3 Feb 2026 17:02:56 +0100 (CET) From: Gabriel Goller To: pve-devel@lists.proxmox.com Subject: [PATCH proxmox-ve-rs 3/9] ve-config: remove FrrConfigBuilder struct Date: Tue, 3 Feb 2026 17:01:10 +0100 Message-ID: <20260203160246.353351-4-g.goller@proxmox.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260203160246.353351-1-g.goller@proxmox.com> References: <20260203160246.353351-1-g.goller@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1770134496421 X-SPAM-LEVEL: Spam detection results: 0 AWL -0.003 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Message-ID-Hash: MAHH6KJAUVBZQXLY33FNFWRL4RSV2HWL X-Message-ID-Hash: MAHH6KJAUVBZQXLY33FNFWRL4RSV2HWL X-MailFrom: g.goller@proxmox.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list List-Id: Proxmox VE development discussion List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: Instead of using the FrrConfigBuilder, derive bon::Builder on FrrConfig and directly build the FrrConfig there. Update the tests accordingly. Signed-off-by: Gabriel Goller --- proxmox-ve-config/src/sdn/frr.rs | 42 ---------- proxmox-ve-config/src/sdn/mod.rs | 2 - proxmox-ve-config/tests/fabric/main.rs | 101 +++++++++++++++---------- 3 files changed, 61 insertions(+), 84 deletions(-) delete mode 100644 proxmox-ve-config/src/sdn/frr.rs diff --git a/proxmox-ve-config/src/sdn/frr.rs b/proxmox-ve-config/src/sdn/frr.rs deleted file mode 100644 index 5d4e4b2ebdbd..000000000000 --- a/proxmox-ve-config/src/sdn/frr.rs +++ /dev/null @@ -1,42 +0,0 @@ -use std::collections::{BTreeMap, BTreeSet}; - -use proxmox_frr::ser::FrrConfig; - -use crate::common::valid::Valid; -use crate::sdn::fabric::{section_config::node::NodeId, FabricConfig}; - -/// Builder that helps constructing the FrrConfig. -/// -/// The goal is to have one struct collect all the rust-based configurations and then construct the -/// [`FrrConfig`] from it using the build method. In the future the controller configuration will -/// be added here as well. -#[derive(Default)] -pub struct FrrConfigBuilder { - fabrics: Valid, -} - -impl FrrConfigBuilder { - /// Add fabric configuration to the builder - pub fn add_fabrics(mut self, fabric: Valid) -> FrrConfigBuilder { - self.fabrics = fabric; - self - } - - /// Build the complete [`FrrConfig`] from this builder configuration given the hostname of the - /// node for which we want to build the config. We also inject the common fabric-level options - /// into the interfaces here. (e.g. the fabric-level "hello-interval" gets added to every - /// interface if there isn't a more specific one.) - pub fn build(self, current_node: NodeId) -> Result { - let mut frr_config = FrrConfig { - router: BTreeMap::new(), - interfaces: BTreeMap::new(), - access_lists: Vec::new(), - routemaps: Vec::new(), - protocol_routemaps: BTreeSet::new(), - }; - - crate::sdn::fabric::frr::build_fabric(current_node, self.fabrics, &mut frr_config)?; - - Ok(frr_config) - } -} diff --git a/proxmox-ve-config/src/sdn/mod.rs b/proxmox-ve-config/src/sdn/mod.rs index 4586c56358ef..86dcd938c92c 100644 --- a/proxmox-ve-config/src/sdn/mod.rs +++ b/proxmox-ve-config/src/sdn/mod.rs @@ -1,7 +1,5 @@ pub mod config; pub mod fabric; -#[cfg(feature = "frr")] -pub mod frr; pub mod ipam; use std::{error::Error, fmt::Display, str::FromStr}; diff --git a/proxmox-ve-config/tests/fabric/main.rs b/proxmox-ve-config/tests/fabric/main.rs index 09629d406449..755592ff7482 100644 --- a/proxmox-ve-config/tests/fabric/main.rs +++ b/proxmox-ve-config/tests/fabric/main.rs @@ -1,8 +1,7 @@ #![cfg(feature = "frr")] -use proxmox_frr::ser::serializer::dump; -use proxmox_ve_config::sdn::{ - fabric::{section_config::node::NodeId, FabricConfig}, - frr::FrrConfigBuilder, +use proxmox_frr::ser::{serializer::dump, FrrConfig}; +use proxmox_ve_config::sdn::fabric::{ + frr::build_fabric, section_config::node::NodeId, FabricConfig, }; mod helper; @@ -17,20 +16,25 @@ mod helper; #[test] fn openfabric_default() { let config = FabricConfig::parse_section_config(helper::get_fabrics_config!()).unwrap(); - - let mut frr_config = FrrConfigBuilder::default() - .add_fabrics(config.clone()) - .build(NodeId::from_string("pve".to_owned()).expect("invalid nodeid")) - .expect("error building frr config"); + let mut frr_config = FrrConfig::default(); + build_fabric( + NodeId::from_string("pve".to_owned()).expect("invalid nodeid"), + config.clone(), + &mut frr_config, + ) + .unwrap(); let mut output = dump(&frr_config).expect("error dumping stuff"); insta::assert_snapshot!(helper::reference_name!("pve"), output); - frr_config = FrrConfigBuilder::default() - .add_fabrics(config.clone()) - .build(NodeId::from_string("pve1".to_owned()).expect("invalid nodeid")) - .expect("error building frr config"); + frr_config = FrrConfig::default(); + build_fabric( + NodeId::from_string("pve1".to_owned()).expect("invalid nodeid"), + config, + &mut frr_config, + ) + .unwrap(); output = dump(&frr_config).expect("error dumping stuff"); @@ -40,20 +44,26 @@ fn openfabric_default() { #[test] fn ospf_default() { let config = FabricConfig::parse_section_config(helper::get_fabrics_config!()).unwrap(); + let mut frr_config = FrrConfig::default(); - let mut frr_config = FrrConfigBuilder::default() - .add_fabrics(config.clone()) - .build(NodeId::from_string("pve".to_owned()).expect("invalid nodeid")) - .expect("error building frr config"); + build_fabric( + NodeId::from_string("pve".to_owned()).expect("invalid nodeid"), + config.clone(), + &mut frr_config, + ) + .unwrap(); let mut output = dump(&frr_config).expect("error dumping stuff"); insta::assert_snapshot!(helper::reference_name!("pve"), output); - frr_config = FrrConfigBuilder::default() - .add_fabrics(config) - .build(NodeId::from_string("pve1".to_owned()).expect("invalid nodeid")) - .expect("error building frr config"); + frr_config = FrrConfig::default(); + build_fabric( + NodeId::from_string("pve1".to_owned()).expect("invalid nodeid"), + config, + &mut frr_config, + ) + .unwrap(); output = dump(&frr_config).expect("error dumping stuff"); @@ -87,11 +97,14 @@ fn ospf_loopback_prefix_fail() { #[test] fn openfabric_multi_fabric() { let config = FabricConfig::parse_section_config(helper::get_fabrics_config!()).unwrap(); + let mut frr_config = FrrConfig::default(); - let frr_config = FrrConfigBuilder::default() - .add_fabrics(config) - .build(NodeId::from_string("pve1".to_owned()).expect("invalid nodeid")) - .expect("error building frr config"); + build_fabric( + NodeId::from_string("pve1".to_owned()).expect("invalid nodeid"), + config, + &mut frr_config, + ) + .unwrap(); let output = dump(&frr_config).expect("error dumping stuff"); @@ -101,12 +114,14 @@ fn openfabric_multi_fabric() { #[test] fn ospf_multi_fabric() { let config = FabricConfig::parse_section_config(helper::get_fabrics_config!()).unwrap(); - - let frr_config = FrrConfigBuilder::default() - .add_fabrics(config) - .build(NodeId::from_string("pve1".to_owned()).expect("invalid nodeid")) - .expect("error building frr config"); - + let mut frr_config = FrrConfig::default(); + + build_fabric( + NodeId::from_string("pve1".to_owned()).expect("invalid nodeid"), + config, + &mut frr_config, + ) + .unwrap(); let output = dump(&frr_config).expect("error dumping stuff"); insta::assert_snapshot!(helper::reference_name!("pve1"), output); @@ -115,11 +130,14 @@ fn ospf_multi_fabric() { #[test] fn openfabric_dualstack() { let config = FabricConfig::parse_section_config(helper::get_fabrics_config!()).unwrap(); + let mut frr_config = FrrConfig::default(); - let frr_config = FrrConfigBuilder::default() - .add_fabrics(config) - .build(NodeId::from_string("pve".to_owned()).expect("invalid nodeid")) - .expect("error building frr config"); + build_fabric( + NodeId::from_string("pve".to_owned()).expect("invalid nodeid"), + config, + &mut frr_config, + ) + .unwrap(); let output = dump(&frr_config).expect("error dumping stuff"); @@ -129,11 +147,14 @@ fn openfabric_dualstack() { #[test] fn openfabric_ipv6_only() { let config = FabricConfig::parse_section_config(helper::get_fabrics_config!()).unwrap(); - - let frr_config = FrrConfigBuilder::default() - .add_fabrics(config) - .build(NodeId::from_string("pve".to_owned()).expect("invalid nodeid")) - .expect("error building frr config"); + let mut frr_config = FrrConfig::default(); + + build_fabric( + NodeId::from_string("pve".to_owned()).expect("invalid nodeid"), + config, + &mut frr_config, + ) + .unwrap(); let output = dump(&frr_config).expect("error dumping stuff"); -- 2.47.3