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 5C2951FF137 for ; Tue, 03 Feb 2026 17:03:39 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 6149D2527C; Tue, 3 Feb 2026 17:03:31 +0100 (CET) From: Gabriel Goller To: pve-devel@lists.proxmox.com Subject: [PATCH proxmox-perl-rs 1/2] sdn: add function to generate the frr config for all daemons Date: Tue, 3 Feb 2026 17:01:17 +0100 Message-ID: <20260203160246.353351-11-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: 1770134496953 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: 4BIBVGCEYJY2HFJTC3ZBF75E2UQ7MHNQ X-Message-ID-Hash: 4BIBVGCEYJY2HFJTC3ZBF75E2UQ7MHNQ 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: Add a function to generate the raw frr configuration for all the protocols. This means we need a single function which takes the fabric-config and the bgp+isis configuration. This function takes the FrrConfig, which is partially filled with the bgp+isis config, and then converts the fabrics to frr-rust-types and adds them to the FrrConfig. Finally the FrrConfig is converted to literal frr-config-lines and returned. Co-authored-by: Stefan Hanreich Signed-off-by: Gabriel Goller --- pve-rs/Makefile | 1 + pve-rs/src/bindings/sdn/fabrics.rs | 25 +++---------------------- pve-rs/src/bindings/sdn/mod.rs | 28 ++++++++++++++++++++++++++++ 3 files changed, 32 insertions(+), 22 deletions(-) diff --git a/pve-rs/Makefile b/pve-rs/Makefile index aa7181efc78b..a4603365e3f7 100644 --- a/pve-rs/Makefile +++ b/pve-rs/Makefile @@ -31,6 +31,7 @@ PERLMOD_PACKAGES := \ PVE::RS::OpenId \ PVE::RS::ResourceScheduling::Static \ PVE::RS::SDN::Fabrics \ + PVE::RS::SDN \ PVE::RS::TFA PERLMOD_PACKAGE_FILES := $(addsuffix .pm,$(subst ::,/,$(PERLMOD_PACKAGES))) diff --git a/pve-rs/src/bindings/sdn/fabrics.rs b/pve-rs/src/bindings/sdn/fabrics.rs index 54606e7b6bb9..18848c405201 100644 --- a/pve-rs/src/bindings/sdn/fabrics.rs +++ b/pve-rs/src/bindings/sdn/fabrics.rs @@ -14,10 +14,11 @@ pub mod pve_rs_sdn_fabrics { use anyhow::{Context, Error, format_err}; use openssl::hash::{MessageDigest, hash}; + use proxmox_ve_config::sdn::fabric::section_config::node::api::{Node, NodeUpdater}; use serde::{Deserialize, Serialize}; use perlmod::Value; - use proxmox_frr::ser::serializer::to_raw_config; + use proxmox_network_types::ip_address::{Cidr, Ipv4Cidr, Ipv6Cidr}; use proxmox_section_config::typed::SectionConfigData; use proxmox_ve_config::common::valid::{Valid, Validatable}; @@ -29,12 +30,8 @@ pub mod pve_rs_sdn_fabrics { api::{Fabric, FabricUpdater}, }; use proxmox_ve_config::sdn::fabric::section_config::interface::InterfaceName; - use proxmox_ve_config::sdn::fabric::section_config::node::{ - Node as ConfigNode, NodeId, - api::{Node, NodeUpdater}, - }; + use proxmox_ve_config::sdn::fabric::section_config::node::{Node as ConfigNode, NodeId}; use proxmox_ve_config::sdn::fabric::{FabricConfig, FabricEntry}; - use proxmox_ve_config::sdn::frr::FrrConfigBuilder; use crate::sdn::status::{self, RunningConfig}; @@ -462,22 +459,6 @@ pub mod pve_rs_sdn_fabrics { daemons.into_iter().map(String::from).collect() } - /// Method: Return the FRR configuration for this config instance, as an array of - /// strings, where each line represents a line in the FRR configuration. - #[export] - pub fn get_frr_raw_config( - #[try_from_ref] this: &PerlFabricConfig, - node_id: NodeId, - ) -> Result, Error> { - let config = this.fabric_config.lock().unwrap(); - - let frr_config = FrrConfigBuilder::default() - .add_fabrics(config.clone().into_valid()?) - .build(node_id)?; - - to_raw_config(&frr_config) - } - /// Helper function to generate the default `/etc/network/interfaces` config for a given CIDR. fn render_interface(name: &str, cidr: Cidr, is_dummy: bool) -> Result { let mut interface = String::new(); diff --git a/pve-rs/src/bindings/sdn/mod.rs b/pve-rs/src/bindings/sdn/mod.rs index 0ec7009cc788..fde3138d55f7 100644 --- a/pve-rs/src/bindings/sdn/mod.rs +++ b/pve-rs/src/bindings/sdn/mod.rs @@ -1 +1,29 @@ pub(crate) mod fabrics; + +#[perlmod::package(name = "PVE::RS::SDN", lib = "pve_rs")] +pub mod pve_rs_sdn { + //! The `PVE::RS::SDN` package. + //! + //! This provides general methods for generating the frr config. + + use anyhow::Error; + use proxmox_frr::ser::{FrrConfig, serializer::to_raw_config}; + + use proxmox_ve_config::common::valid::Validatable; + use proxmox_ve_config::sdn::fabric::section_config::node::NodeId; + + use crate::bindings::pve_rs_sdn_fabrics::PerlFabricConfig; + + /// Return the FRR configuration for the passed FrrConfig and the FabricsConfig as an array of + /// strings, where each line represents a line in the FRR configuration. + #[export] + pub fn get_frr_raw_config( + mut frr_config: FrrConfig, + #[try_from_ref] cfg: &PerlFabricConfig, + node_id: NodeId, + ) -> Result, Error> { + let fabric_config = cfg.fabric_config.lock().unwrap().clone().into_valid()?; + proxmox_ve_config::sdn::fabric::frr::build_fabric(node_id, fabric_config, &mut frr_config)?; + to_raw_config(&frr_config) + } +} -- 2.47.3