When parsing the vnet.cfg config file we also want to get the tag (vni or vlan). We need this so that we can lookup the vni of the passed vnet on the status api call. We need the vni so that we can filter the frr output.
In the future we would probably want to do this better with an enum per vnet type and parse all possible options. Signed-off-by: Gabriel Goller <g.gol...@proxmox.com> --- proxmox-ve-config/src/sdn/config.rs | 27 ++++++++++++++++--- proxmox-ve-config/tests/sdn/main.rs | 5 ++-- .../tests/sdn/resources/running-config.json | 1 + 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/proxmox-ve-config/src/sdn/config.rs b/proxmox-ve-config/src/sdn/config.rs index 031fedcebbfc..afc5175002b1 100644 --- a/proxmox-ve-config/src/sdn/config.rs +++ b/proxmox-ve-config/src/sdn/config.rs @@ -196,6 +196,7 @@ pub struct SubnetsRunningConfig { /// Struct for deserializing a vnet entry of the SDN running config #[derive(Clone, Debug, Deserialize, PartialEq, Eq, Hash, PartialOrd, Ord)] pub struct VnetRunningConfig { + tag: Option<u32>, zone: ZoneName, } @@ -295,14 +296,16 @@ impl SubnetConfig { #[derive(Clone, Debug, Deserialize, PartialEq, Eq, Hash, PartialOrd, Ord)] pub struct VnetConfig { name: VnetName, + tag: Option<u32>, subnets: BTreeMap<Cidr, SubnetConfig>, } impl VnetConfig { - pub fn new(name: VnetName) -> Self { + pub fn new(name: VnetName, tag: Option<u32>) -> Self { Self { name, subnets: BTreeMap::default(), + tag, } } @@ -310,7 +313,18 @@ impl VnetConfig { name: VnetName, subnets: impl IntoIterator<Item = SubnetConfig>, ) -> Result<Self, SdnConfigError> { - let mut config = Self::new(name); + let mut config = Self::new(name, None); + config.add_subnets(subnets)?; + Ok(config) + } + + pub fn from_subnets_and_tag( + name: VnetName, + tag: Option<u32>, + subnets: impl IntoIterator<Item = SubnetConfig>, + ) -> Result<Self, SdnConfigError> { + let mut config = Self::new(name, None); + config.tag = tag; config.add_subnets(subnets)?; Ok(config) } @@ -342,6 +356,10 @@ impl VnetConfig { pub fn name(&self) -> &VnetName { &self.name } + + pub fn tag(&self) -> &Option<u32> { + &self.tag + } } #[derive(Clone, Debug, Deserialize, PartialEq, Eq, Hash, PartialOrd, Ord)] @@ -617,7 +635,10 @@ impl TryFrom<RunningConfig> for SdnConfig { if let Some(running_vnets) = value.vnets.take() { for (name, running_config) in running_vnets.ids { - config.add_vnet(&running_config.zone, VnetConfig::new(name))?; + config.add_vnet( + &running_config.zone, + VnetConfig::new(name, running_config.tag), + )?; } } diff --git a/proxmox-ve-config/tests/sdn/main.rs b/proxmox-ve-config/tests/sdn/main.rs index 94039ad5550e..bd38bbfc71f4 100644 --- a/proxmox-ve-config/tests/sdn/main.rs +++ b/proxmox-ve-config/tests/sdn/main.rs @@ -25,8 +25,9 @@ fn parse_running_config() { ZoneName::from_str("zone0").unwrap(), ZoneType::Simple, [ - VnetConfig::from_subnets( + VnetConfig::from_subnets_and_tag( VnetName::from_str("vnet0").unwrap(), + Some(100), [ SubnetConfig::new( SubnetName::from_str("zone0-fd80::-64").unwrap(), @@ -84,7 +85,7 @@ fn sdn_config() { let zone0 = ZoneConfig::new(zone0_name.clone(), ZoneType::Qinq); sdn_config.add_zone(zone0).unwrap(); - let vnet0 = VnetConfig::new(vnet0_name.clone()); + let vnet0 = VnetConfig::new(vnet0_name.clone(), None); assert_eq!( sdn_config.add_vnet(&zone1_name, vnet0.clone()), Err(SdnConfigError::ZoneNotFound) diff --git a/proxmox-ve-config/tests/sdn/resources/running-config.json b/proxmox-ve-config/tests/sdn/resources/running-config.json index b03c20fa6ff9..d6054ba8d023 100644 --- a/proxmox-ve-config/tests/sdn/resources/running-config.json +++ b/proxmox-ve-config/tests/sdn/resources/running-config.json @@ -43,6 +43,7 @@ "ids": { "vnet0": { "type": "vnet", + "tag": 100, "zone": "zone0" }, "vnet1": { -- 2.47.2 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel