Signed-off-by: Stefan Hanreich <s.hanre...@proxmox.com> --- 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.2 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel