[pve-devel] [PATCH proxmox-perl-rs v4 3/5] pve-rs: sdn: fabrics: add frr config generation
Wolfgang Bumiller
w.bumiller at proxmox.com
Fri Jul 4 15:14:26 CEST 2025
On Wed, Jul 02, 2025 at 04:50:16PM +0200, Gabriel Goller wrote:
> From: Stefan Hanreich <s.hanreich at proxmox.com>
>
> We use proxmox-ve-config to generate a FRR config and serialize it
> with the proxmox-frr crate in order to return it to perl in its
> internally used format (an array of strings). The Perl SDN module in
> turn merges it with the FRR configuration generated by Perl modules
> and persists it to the FRR configuration file.
>
> We also provide a method that returns a list of daemons, that are
> required to be enabled for the current FRR configuration. This is used
> by Perl to write the daemons configuration file of FRR.
>
> Co-authored-by: Gabriel Goller <g.goller at proxmox.com>
> Signed-off-by: Stefan Hanreich <s.hanreich at proxmox.com>
> ---
> pve-rs/src/bindings/sdn/fabrics.rs | 49 +++++++++++++++++++++++++++++-
> 1 file changed, 48 insertions(+), 1 deletion(-)
>
> diff --git a/pve-rs/src/bindings/sdn/fabrics.rs b/pve-rs/src/bindings/sdn/fabrics.rs
> index 2efa1c6306ae..a7a740f5aac9 100644
> --- a/pve-rs/src/bindings/sdn/fabrics.rs
> +++ b/pve-rs/src/bindings/sdn/fabrics.rs
> @@ -5,7 +5,7 @@ pub mod pve_rs_sdn_fabrics {
> //! This provides the configuration for the SDN fabrics, as well as helper methods for reading
> //! / writing the configuration, as well as for generating ifupdown2 and FRR configuration.
>
> - use std::collections::BTreeMap;
> + use std::collections::{BTreeMap, HashSet};
> use std::ops::Deref;
> use std::sync::Mutex;
>
> @@ -14,6 +14,7 @@ pub mod pve_rs_sdn_fabrics {
> use serde::{Deserialize, Serialize};
>
> use perlmod::Value;
> + use proxmox_frr::serializer::to_raw_config;
> use proxmox_section_config::typed::SectionConfigData;
> use proxmox_ve_config::common::valid::Validatable;
>
> @@ -31,6 +32,7 @@ pub mod pve_rs_sdn_fabrics {
> },
> FabricConfig, FabricEntry,
> };
> + use proxmox_ve_config::sdn::frr::FrrConfigBuilder;
>
> /// A SDN Fabric config instance.
> #[derive(Serialize, Deserialize)]
> @@ -302,4 +304,49 @@ pub mod pve_rs_sdn_fabrics {
>
> Ok(hex::encode(hash))
> }
> +
> + /// Class method: Return all FRR daemons that need to be enabled for this fabric configuration
> + /// instance.
Method*
Daemons? Or would "services" make more sense (and a `.service` suffix?)
> + #[export]
> + pub fn enabled_daemons(
> + #[try_from_ref] this: &PerlFabricConfig,
> + node_id: NodeId,
> + ) -> Vec<String> {
> + let config = this.fabric_config.lock().unwrap();
> +
> + let node_fabrics = config
> + .values()
> + .filter(|fabric| fabric.get_node(&node_id).is_ok());
> +
> + let mut daemons = HashSet::new();
> +
> + for fabric in node_fabrics {
> + match fabric {
> + FabricEntry::Ospf(_) => {
> + daemons.insert("ospfd");
> + }
> + FabricEntry::Openfabric(_) => {
> + daemons.insert("fabricd");
> + }
> + };
> + }
> +
> + daemons.into_iter().map(String::from).collect()
> + }
> +
> + /// Class 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)
> + }
> }
> --
> 2.39.5
More information about the pve-devel
mailing list