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 48DF11FF189 for ; Thu, 4 Sep 2025 10:19:28 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 5A0AB1F078; Thu, 4 Sep 2025 10:19:43 +0200 (CEST) From: Stefan Hanreich To: pdm-devel@lists.proxmox.com Date: Thu, 4 Sep 2025 10:18:35 +0200 Message-ID: <20250904081900.12655-11-s.hanreich@proxmox.com> X-Mailer: git-send-email 2.47.2 In-Reply-To: <20250904081900.12655-1-s.hanreich@proxmox.com> References: <20250904081900.12655-1-s.hanreich@proxmox.com> MIME-Version: 1.0 X-SPAM-LEVEL: Spam detection results: 0 AWL -0.186 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: [pdm-devel] [PATCH proxmox-api-types v4 1/6] sdn: add list/create zone endpoints X-BeenThere: pdm-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox Datacenter Manager development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: Proxmox Datacenter Manager development discussion Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: pdm-devel-bounces@lists.proxmox.com Sender: "pdm-devel" Signed-off-by: Stefan Hanreich --- pve-api-types/generate.pl | 18 +++++++++ pve-api-types/src/types/verifiers.rs | 56 ++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+) diff --git a/pve-api-types/generate.pl b/pve-api-types/generate.pl index cd08f3d..dc45d98 100644 --- a/pve-api-types/generate.pl +++ b/pve-api-types/generate.pl @@ -79,6 +79,8 @@ Schema2Rust::register_format('bridge-pair' => { code => 'verifiers::verify_bridg Schema2Rust::register_format('pve-task-status-type' => { regex => '^(?i:ok|error|warning|unknown)$' }); +Schema2Rust::register_format('pve-sdn-zone-id' => { code => 'verifiers::verify_sdn_id' }); + Schema2Rust::register_enum_variant('PveVmCpuConfReportedModel::486' => 'I486'); Schema2Rust::register_enum_variant('QemuConfigEfidisk0Efitype::2m' => 'Mb2'); Schema2Rust::register_enum_variant('QemuConfigEfidisk0Efitype::4m' => 'Mb4'); @@ -104,6 +106,10 @@ Schema2Rust::register_format('pve-iface' => { regex => '^[a-zA-Z][a-zA-Z0-9_]{1, Schema2Rust::register_format('pve-vlan-id-or-range' => { code => 'verifiers::verify_vlan_id_or_range' }); +Schema2Rust::register_format('pve-sdn-bgp-rt' => { code => 'verifiers::verify_sdn_bgp_rt' }); +Schema2Rust::register_format('pve-sdn-controller-id' => { code => 'verifiers::verify_sdn_controller_id' }); +Schema2Rust::register_format('pve-sdn-isis-net' => { regex => '^[a-fA-F0-9]{2}(\.[a-fA-F0-9]{4}){3,9}\.[a-fA-F0-9]{2}$' }); + # This is used as both a task status and guest status. Schema2Rust::generate_enum('IsRunning', { type => 'string', @@ -328,6 +334,18 @@ api(GET => '/nodes/{node}/apt/update', 'list_available_updates', 'return-name' = api(POST => '/nodes/{node}/apt/update', 'update_apt_database', 'output-type' => 'PveUpid', 'param-name' => 'AptUpdateParams'); api(GET => '/nodes/{node}/apt/changelog', 'get_package_changelog', 'output-type' => 'String'); +Schema2Rust::generate_enum('SdnObjectState', { + type => 'string', + description => "The state of an SDN object.", + enum => ['new', 'deleted', 'changed'], +}); + +api(GET => '/cluster/sdn/zones', 'list_zones', 'return-name' => 'SdnZone'); +Schema2Rust::derive('SdnZone' => 'Clone', 'PartialEq'); +Schema2Rust::derive('SdnZonePending' => 'Clone', 'PartialEq'); +api(POST => '/cluster/sdn/zones', 'create_zone', 'param-name' => 'CreateZone'); +Schema2Rust::derive('CreateZone' => 'Clone', 'PartialEq'); + # NOW DUMP THE CODE: # # We generate one file for API types, and one for API method calls. diff --git a/pve-api-types/src/types/verifiers.rs b/pve-api-types/src/types/verifiers.rs index e0ad4ca..9a88118 100644 --- a/pve-api-types/src/types/verifiers.rs +++ b/pve-api-types/src/types/verifiers.rs @@ -29,6 +29,12 @@ pub IFACE_RE = r##"^(?i)[a-z][a-z0-9_]{1,20}([:\.]\d+)?$"##; pub VLAN_ID_OR_RANGE = r##"^(\d+)(?:-(\d+))?$"##; +pub SDN_ID = r##"^(?i)[a-z][a-z0-9]+$"##; + +pub SDN_CONTROLLER_ID = r##"^(?i)[a-z][a-z0-9_-]*[a-z0-9]$"##; + +pub SDN_BGP_RT = r##"^(\d+):(\d+)$"##; + } pub fn verify_volume_id(s: &str) -> Result<(), Error> { @@ -228,3 +234,53 @@ pub fn verify_vlan_id_or_range(s: &str) -> Result<(), Error> { Ok(()) } + +pub fn verify_sdn_id(s: &str) -> Result<(), Error> { + if s.len() > 8 { + bail!("SDN ID cannot be longer than 8 characters") + } + + if !SDN_ID.is_match(s) { + bail!("SDN ID contains illegal characters"); + } + + Ok(()) +} + +pub fn verify_sdn_controller_id(s: &str) -> Result<(), Error> { + if s.len() > 64 { + bail!("SDN controller ID cannot be longer than 64 characters") + } + + if !SDN_CONTROLLER_ID.is_match(s) { + bail!("SDN controller ID contains illegal characters"); + } + + Ok(()) +} + +pub fn verify_sdn_bgp_rt(s: &str) -> Result<(), Error> { + let captures = SDN_BGP_RT + .captures(s) + .ok_or_else(|| format_err!("invalid BGP RT: '{s}"))?; + + match (captures.get(1), captures.get(2)) { + (Some(asn), Some(vni)) => { + asn.as_str() + .parse::() + .map_err(|_| format_err!("Invalid ASN in BGP RT: {s}"))?; + + let vni: u32 = vni + .as_str() + .parse() + .map_err(|_| format_err!("Invalid VNI in BGP RT: {s}"))?; + + if vni > 16_777_215 { + bail!("invalid VNI in BGP RT: '{s}'") + } + } + _ => bail!("invalid BGP RT: '{s}"), + } + + Ok(()) +} -- 2.47.2 _______________________________________________ pdm-devel mailing list pdm-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pdm-devel