[pve-devel] [PATCH proxmox-perl-rs v3 3/5] pve-rs: sdn: fabrics: add frr config generation
Stefan Hanreich
s.hanreich at proxmox.com
Thu May 22 18:16:45 CEST 2025
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 2efa1c6..a7a740f 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.
+ #[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