From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from gate001.proxmox.com (gate001.proxmox.com [45.144.208.40]) by lore.proxmox.com (Postfix) with ESMTPS id E4C751FF138 for ; Mon, 20 Jul 2026 14:39:15 +0200 (CEST) Received: from gate001.proxmox.com (localhost.localdomain [127.0.0.1]) by gate001.proxmox.com (Proxmox) with ESMTP id 06F0521548; Mon, 20 Jul 2026 14:38:16 +0200 (CEST) From: Daniel Kral To: pve-devel@lists.proxmox.com Subject: [PATCH ha-manager 08/16] introduce separate parse_vmid_or_sid helper subroutine Date: Mon, 20 Jul 2026 14:36:57 +0200 Message-ID: <20260720123705.216089-9-d.kral@proxmox.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260720123705.216089-1-d.kral@proxmox.com> References: <20260720123705.216089-1-d.kral@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1784551006200 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.248 Adjusted score from AWL reputation of From: address DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment (newer systems) RCVD_IN_DNSWL_LOW -0.7 Sender listed at https://www.dnswl.org/, low trust SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Message-ID-Hash: UABYESKLHZ6NXRFGWCNE44QCKE3TNYZL X-Message-ID-Hash: UABYESKLHZ6NXRFGWCNE44QCKE3TNYZL X-MailFrom: d.kral@proxmox.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list List-Id: Proxmox VE development discussion List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: The separate parse_vmid_or_sid() subroutine helps in stricter checking that vmid references are only allowed in the API/CLI endpoints, while the HA stack should always use the proper HA resource id ('type:vmid') format internally. This makes the parse_sid() subroutine slightly faster (by about 10%) as it doesn't unnecessarily need to go through the vmid pattern matching. The use of qr// was considered but increased the runtime again. Signed-off-by: Daniel Kral --- src/PVE/API2/HA/Resources.pm | 13 +++++++------ src/PVE/CLI/ha_manager.pm | 2 +- src/PVE/HA/Config.pm | 14 +++++++++++--- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/PVE/API2/HA/Resources.pm b/src/PVE/API2/HA/Resources.pm index a1fa8856..7f910818 100644 --- a/src/PVE/API2/HA/Resources.pm +++ b/src/PVE/API2/HA/Resources.pm @@ -174,7 +174,7 @@ __PACKAGE__->register_method({ my $cfg = PVE::HA::Config::read_resources_config(); my $exclude_group_property = PVE::HA::Config::have_groups_been_migrated(); - my ($sid) = PVE::HA::Config::parse_sid($param->{sid}); + my ($sid) = PVE::HA::Config::parse_vmid_or_sid($param->{sid}); return &$api_copy_config($cfg, $sid, $exclude_group_property); }, @@ -198,7 +198,8 @@ __PACKAGE__->register_method({ PVE::Cluster::check_cfs_quorum(); mkdir("/etc/pve/ha"); - my ($sid, $type, $vmid) = PVE::HA::Config::parse_sid(extract_param($param, 'sid')); + my ($sid, $type, $vmid) = + PVE::HA::Config::parse_vmid_or_sid(extract_param($param, 'sid')); if (my $param_type = extract_param($param, 'type')) { # useless, but do it anyway @@ -253,7 +254,7 @@ __PACKAGE__->register_method({ my $digest = extract_param($param, 'digest'); my $delete = extract_param($param, 'delete'); - my ($sid, $type) = PVE::HA::Config::parse_sid(extract_param($param, 'sid')); + my ($sid, $type) = PVE::HA::Config::parse_vmid_or_sid(extract_param($param, 'sid')); if (my $param_type = extract_param($param, 'type')) { # useless, but do it anyway @@ -313,7 +314,7 @@ __PACKAGE__->register_method({ code => sub { my ($param) = @_; - my ($sid) = PVE::HA::Config::parse_sid(extract_param($param, 'sid')); + my ($sid) = PVE::HA::Config::parse_vmid_or_sid(extract_param($param, 'sid')); my $purge = extract_param($param, 'purge') // 1; if (!PVE::HA::Config::service_is_configured($sid)) { @@ -401,7 +402,7 @@ __PACKAGE__->register_method({ my $result = {}; - my ($sid) = PVE::HA::Config::parse_sid(extract_param($param, 'sid')); + my ($sid) = PVE::HA::Config::parse_vmid_or_sid(extract_param($param, 'sid')); my $req_node = extract_param($param, 'node'); PVE::HA::Config::service_is_ha_managed($sid); @@ -503,7 +504,7 @@ __PACKAGE__->register_method({ my $result = {}; - my ($sid) = PVE::HA::Config::parse_sid(extract_param($param, 'sid')); + my ($sid) = PVE::HA::Config::parse_vmid_or_sid(extract_param($param, 'sid')); my $req_node = extract_param($param, 'node'); PVE::HA::Config::service_is_ha_managed($sid); diff --git a/src/PVE/CLI/ha_manager.pm b/src/PVE/CLI/ha_manager.pm index 2bec33cb..013742e0 100644 --- a/src/PVE/CLI/ha_manager.pm +++ b/src/PVE/CLI/ha_manager.pm @@ -104,7 +104,7 @@ __PACKAGE__->register_method({ code => sub { my ($param) = @_; - my ($sid) = PVE::HA::Config::parse_sid(extract_param($param, 'sid')); + my ($sid) = PVE::HA::Config::parse_vmid_or_sid(extract_param($param, 'sid')); PVE::HA::Config::service_is_ha_managed($sid); diff --git a/src/PVE/HA/Config.pm b/src/PVE/HA/Config.pm index 77c9737e..db86de82 100644 --- a/src/PVE/HA/Config.pm +++ b/src/PVE/HA/Config.pm @@ -198,6 +198,16 @@ sub update_resources_config { sub parse_sid { my ($sid) = @_; + if (my ($type, $vmid) = $sid =~ m/^(\S+):(\S+)$/) { + return ($sid, $type, $vmid); + } else { + die "unable to parse service id '$sid'\n"; + } +} + +sub parse_vmid_or_sid { + my ($sid) = @_; + if (my ($vmid) = $sid =~ m/^(\d+)$/) { my $vmlist = PVE::Cluster::get_vmlist(); if (defined($vmlist->{ids}->{$vmid})) { @@ -208,10 +218,8 @@ sub parse_sid { } else { die "unable to detect SID from VMID - VM/CT $1 does not exist\n"; } - } elsif (my ($type, $vmid) = $sid =~ m/^(\S+):(\S+)$/) { - return ($sid, $type, $vmid); } else { - die "unable to parse service id '$sid'\n"; + return parse_sid($sid); } } -- 2.47.3