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 <[email protected]> Signed-off-by: Gabriel Goller <[email protected]> --- 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<Vec<String>, 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<String, Error> { 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<Vec<String>, 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
