From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) by lore.proxmox.com (Postfix) with ESMTPS id 230611FF163 for ; Thu, 10 Oct 2024 17:57:45 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id CBBF91DFE7; Thu, 10 Oct 2024 17:56:57 +0200 (CEST) From: Stefan Hanreich To: pve-devel@lists.proxmox.com Date: Thu, 10 Oct 2024 17:56:29 +0200 Message-Id: <20241010155637.255451-18-s.hanreich@proxmox.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20241010155637.255451-1-s.hanreich@proxmox.com> References: <20241010155637.255451-1-s.hanreich@proxmox.com> MIME-Version: 1.0 X-SPAM-LEVEL: Spam detection results: 0 AWL -0.261 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment KAM_LAZY_DOMAIN_SECURITY 1 Sending domain does not have any anti-forgery methods RDNS_NONE 0.793 Delivered to internal network by a host with no rDNS SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_NONE 0.001 SPF: sender does not publish an SPF Record Subject: [pve-devel] [PATCH proxmox-ve-rs v2 17/25] tests: add sdn config tests X-BeenThere: pve-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox VE development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: Proxmox VE development discussion Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: pve-devel-bounces@lists.proxmox.com Sender: "pve-devel" Signed-off-by: Stefan Hanreich --- proxmox-ve-config/tests/sdn/main.rs | 144 ++++++++++++++++++ .../tests/sdn/resources/running-config.json | 54 +++++++ 2 files changed, 198 insertions(+) create mode 100644 proxmox-ve-config/tests/sdn/main.rs create mode 100644 proxmox-ve-config/tests/sdn/resources/running-config.json diff --git a/proxmox-ve-config/tests/sdn/main.rs b/proxmox-ve-config/tests/sdn/main.rs new file mode 100644 index 0000000..2ac0cb3 --- /dev/null +++ b/proxmox-ve-config/tests/sdn/main.rs @@ -0,0 +1,144 @@ +use std::{ + net::{IpAddr, Ipv4Addr, Ipv6Addr}, + str::FromStr, +}; + +use proxmox_ve_config::{ + firewall::types::{address::IpRange, Cidr}, + sdn::{ + config::{ + RunningConfig, SdnConfig, SdnConfigError, SubnetConfig, VnetConfig, ZoneConfig, + ZoneType, + }, + SubnetName, VnetName, ZoneName, + }, +}; + +#[test] +fn parse_running_config() { + let running_config: RunningConfig = + serde_json::from_str(include_str!("resources/running-config.json")).unwrap(); + + let parsed_config = SdnConfig::try_from(running_config).unwrap(); + + let sdn_config = SdnConfig::from_zones([ZoneConfig::from_vnets( + ZoneName::from_str("zone0").unwrap(), + ZoneType::Simple, + [ + VnetConfig::from_subnets( + VnetName::from_str("vnet0").unwrap(), + [ + SubnetConfig::new( + SubnetName::from_str("zone0-fd80::-64").unwrap(), + Some(Ipv6Addr::new(0xFD80, 0, 0, 0, 0, 0, 0, 0x1).into()), + true, + [IpRange::new_v6( + [0xFD80, 0, 0, 0, 0, 0, 0, 0x1000], + [0xFD80, 0, 0, 0, 0, 0, 0, 0xFFFF], + ) + .unwrap()], + ) + .unwrap(), + SubnetConfig::new( + SubnetName::from_str("zone0-10.101.0.0-16").unwrap(), + Some(Ipv4Addr::new(10, 101, 1, 1).into()), + true, + [ + IpRange::new_v4([10, 101, 98, 100], [10, 101, 98, 200]).unwrap(), + IpRange::new_v4([10, 101, 99, 100], [10, 101, 99, 200]).unwrap(), + ], + ) + .unwrap(), + ], + ) + .unwrap(), + VnetConfig::from_subnets( + VnetName::from_str("vnet1").unwrap(), + [SubnetConfig::new( + SubnetName::from_str("zone0-10.102.0.0-16").unwrap(), + None, + false, + [], + ) + .unwrap()], + ) + .unwrap(), + ], + ) + .unwrap()]) + .unwrap(); + + assert_eq!(sdn_config, parsed_config); +} + +#[test] +fn sdn_config() { + let mut sdn_config = SdnConfig::new(); + + let zone0_name = ZoneName::new("zone0".to_string()).unwrap(); + let zone1_name = ZoneName::new("zone1".to_string()).unwrap(); + + let vnet0_name = VnetName::new("vnet0".to_string()).unwrap(); + let vnet1_name = VnetName::new("vnet1".to_string()).unwrap(); + + let zone0 = ZoneConfig::new(zone0_name.clone(), ZoneType::Qinq); + sdn_config.add_zone(zone0).unwrap(); + + let vnet0 = VnetConfig::new(vnet0_name.clone()); + assert_eq!( + sdn_config.add_vnet(&zone1_name, vnet0.clone()), + Err(SdnConfigError::ZoneNotFound) + ); + + sdn_config.add_vnet(&zone0_name, vnet0.clone()).unwrap(); + + let subnet = SubnetConfig::new( + SubnetName::new(zone0_name.clone(), Cidr::new_v4([10, 0, 0, 0], 16).unwrap()), + IpAddr::V4(Ipv4Addr::new(10, 0, 0, 1)), + true, + [], + ) + .unwrap(); + + assert_eq!( + sdn_config.add_subnet(&zone0_name, &vnet1_name, subnet.clone()), + Err(SdnConfigError::VnetNotFound), + ); + + sdn_config + .add_subnet(&zone0_name, &vnet0_name, subnet) + .unwrap(); + + let zone1 = ZoneConfig::from_vnets( + zone1_name.clone(), + ZoneType::Evpn, + [VnetConfig::from_subnets( + vnet1_name.clone(), + [SubnetConfig::new( + SubnetName::new( + zone0_name.clone(), + Cidr::new_v4([192, 168, 0, 0], 24).unwrap(), + ), + None, + false, + [], + ) + .unwrap()], + ) + .unwrap()], + ) + .unwrap(); + + assert_eq!( + sdn_config.add_zones([zone1]), + Err(SdnConfigError::MismatchedSubnetZone), + ); + + let zone1 = ZoneConfig::new(zone1_name.clone(), ZoneType::Evpn); + sdn_config.add_zone(zone1).unwrap(); + + assert_eq!( + sdn_config.add_vnet(&zone1_name, vnet0.clone()), + Err(SdnConfigError::DuplicateVnetName), + ) +} diff --git a/proxmox-ve-config/tests/sdn/resources/running-config.json b/proxmox-ve-config/tests/sdn/resources/running-config.json new file mode 100644 index 0000000..b03c20f --- /dev/null +++ b/proxmox-ve-config/tests/sdn/resources/running-config.json @@ -0,0 +1,54 @@ +{ + "version": 10, + "subnets": { + "ids": { + "zone0-fd80::-64": { + "gateway": "fd80::1", + "type": "subnet", + "snat": 1, + "dhcp-range": [ + "start-address=fd80::1000,end-address=fd80::ffff" + ], + "vnet": "vnet0" + }, + "zone0-10.102.0.0-16": { + "vnet": "vnet1", + "type": "subnet" + }, + "zone0-10.101.0.0-16": { + "dhcp-range": [ + "start-address=10.101.98.100,end-address=10.101.98.200", + "start-address=10.101.99.100,end-address=10.101.99.200" + ], + "vnet": "vnet0", + "type": "subnet", + "gateway": "10.101.1.1", + "snat": 1 + } + } + }, + "zones": { + "ids": { + "zone0": { + "ipam": "pve", + "dhcp": "dnsmasq", + "type": "simple" + } + } + }, + "controllers": { + "ids": {} + }, + "vnets": { + "ids": { + "vnet0": { + "type": "vnet", + "zone": "zone0" + }, + "vnet1": { + "type": "vnet", + "zone": "zone0" + } + } + } +} -- 2.39.5 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel