[pve-devel] [PATCH proxmox-perl-rs v4 5/5] pve-rs: sdn: fabrics: add helper for network API endpoint

Wolfgang Bumiller w.bumiller at proxmox.com
Fri Jul 4 15:34:31 CEST 2025


On Wed, Jul 02, 2025 at 04:50:18PM +0200, Gabriel Goller wrote:
> From: Stefan Hanreich <s.hanreich at proxmox.com>
> 
> In PVE we use the GET /nodes/{node}/network API endpoint to return all
> currently configured network interfaces on a specific node. In order
> to be able to use SDN fabrics in Ceph and the migration settings, we
> add a helper method that returns all fabrics formatted in the same
> format as the pre-existing PVE API call. This enables us to return the
> SDN fabrics in the endpoint so users can select the fabrics from the
> UI, integrating the fabrics with the existing UI components.
> 
> 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 | 54 ++++++++++++++++++++++++++++--
>  1 file changed, 52 insertions(+), 2 deletions(-)
> 
> diff --git a/pve-rs/src/bindings/sdn/fabrics.rs b/pve-rs/src/bindings/sdn/fabrics.rs
> index 099c1a7ab515..f5abb1b72099 100644
> --- a/pve-rs/src/bindings/sdn/fabrics.rs
> +++ b/pve-rs/src/bindings/sdn/fabrics.rs
> @@ -17,7 +17,7 @@ pub mod pve_rs_sdn_fabrics {
>  
>      use perlmod::Value;
>      use proxmox_frr::serializer::to_raw_config;
> -    use proxmox_network_types::ip_address::Cidr;
> +    use proxmox_network_types::ip_address::{Cidr, Ipv4Cidr, Ipv6Cidr};
>      use proxmox_section_config::typed::SectionConfigData;
>      use proxmox_ve_config::common::valid::Validatable;
>  
> @@ -25,7 +25,7 @@ pub mod pve_rs_sdn_fabrics {
>          section_config::{
>              fabric::{
>                  api::{Fabric, FabricUpdater},
> -                FabricId,
> +                Fabric as ConfigFabric, FabricId,
>              },
>              node::{
>                  api::{Node, NodeUpdater},
> @@ -46,6 +46,34 @@ pub mod pve_rs_sdn_fabrics {
>  
>      perlmod::declare_magic!(Box<PerlFabricConfig> : &PerlFabricConfig as "PVE::RS::SDN::Fabrics::Config");
>  
> +    /// Represents a interface as returned by the `GET /nodes/{node}/network` endpoint in PVE.

an*

> +    ///
> +    /// This is used for returning fabrics in the endpoint, so they can be used from various places
> +    /// in the PVE UI (e.g. migration network settings).
> +    #[derive(Serialize, Deserialize)]

It seems we currently only serialize this, so could drop the
`Deserialize` here since it's a private helper type anyway right now.

> +    struct PveInterface {
> +        iface: String,
> +        #[serde(rename = "type")]
> +        ty: String,
> +        active: bool,
> +        #[serde(skip_serializing_if = "Option::is_none")]
> +        cidr: Option<Ipv4Cidr>,
> +        #[serde(skip_serializing_if = "Option::is_none")]
> +        cidr6: Option<Ipv6Cidr>,
> +    }
> +
> +    impl From<ConfigFabric> for PveInterface {
> +        fn from(fabric: ConfigFabric) -> Self {
> +            Self {
> +                iface: fabric.id().to_string(),
> +                ty: "fabric".to_string(),
> +                active: true,
> +                cidr: fabric.ip_prefix(),
> +                cidr6: fabric.ip6_prefix(),
> +            }
> +        }
> +    }
> +
>      /// Parse the raw configuration from `/etc/pve/sdn/fabrics.cfg`.
>      #[export]
>      fn config(#[raw] class: Value, raw_config: &[u8]) -> Result<perlmod::Value, Error> {
> @@ -308,6 +336,28 @@ pub mod pve_rs_sdn_fabrics {
>          Ok(hex::encode(hash))
>      }
>  
> +    /// Class method: Return all interfaces of a node, that are part of a fabric.
> +    #[export]
> +    fn get_interfaces_for_node(
> +        #[try_from_ref] this: &PerlFabricConfig,
> +        node_id: NodeId,
> +    ) -> BTreeMap<String, PveInterface> {
> +        let config = this.fabric_config.lock().unwrap();
> +
> +        let mut ifaces = BTreeMap::new();
> +
> +        for entry in config.values() {
> +            if entry.get_node(&node_id).is_ok() {
> +                ifaces.insert(
> +                    entry.fabric().id().to_string(),
> +                    entry.fabric().clone().into(),
> +                );
> +            }
> +        }
> +
> +        ifaces
> +    }
> +
>      /// Class method: Return all FRR daemons that need to be enabled for this fabric configuration
>      /// instance.
>      #[export]
> -- 
> 2.39.5




More information about the pve-devel mailing list