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 CE9991FF09C for ; Mon, 21 Sep 2026 17:54:34 +0200 (CEST) Received: from gate001.proxmox.com (localhost.localdomain [127.0.0.1]) by gate001.proxmox.com (Proxmox) with ESMTP id 978C2215CA; Mon, 21 Sep 2026 17:54:25 +0200 (CEST) From: =?UTF-8?q?Michael=20K=C3=B6ppl?= To: pve-devel@lists.proxmox.com Subject: [PATCH pve-manager v5 6/7] close #4369: api: optionally only suggest unique IDs Date: Mon, 21 Sep 2026 17:54:09 +0200 Message-ID: <20260921155410.938337-7-m.koeppl@proxmox.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260921155410.938337-1-m.koeppl@proxmox.com> References: <20260921155410.938337-1-m.koeppl@proxmox.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1790006059611 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.577 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_MED -2.3 Sender listed at https://www.dnswl.org/, medium 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: 2FB7AZPYNFC4BVABXRO4IWSAGBN36KFG X-Message-ID-Hash: 2FB7AZPYNFC4BVABXRO4IWSAGBN36KFG X-MailFrom: m.koeppl@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: At the moment, the `/cluster/nextid` API endpoint will return the lowest available VM/CT ID, which means that it will suggest re-using VM IDs. This can be undesirable, so add an optional check to ensure that it chooses an ID which is not and has never been in use. This optional behaviour is enabled when `unique-next-id: 1` in the datacenter config, and the previously used IDs are tracked as a list in the file `/etc/pve/used-guest-ids`. Originally-by: Daniel Krambrock Originally-by: Severen Redwood Signed-off-by: Michael Köppl --- PVE/API2/Cluster.pm | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/PVE/API2/Cluster.pm b/PVE/API2/Cluster.pm index 4e5efbfd9..8178562a5 100644 --- a/PVE/API2/Cluster.pm +++ b/PVE/API2/Cluster.pm @@ -20,6 +20,7 @@ use PVE::RPCEnvironment; use PVE::SafeSyslog; use PVE::Storage; use PVE::Tools qw(extract_param); +use PVE::UsedGuestIDs; use PVE::API2::ACMEAccount; use PVE::API2::ACMEPlugin; @@ -1041,12 +1042,18 @@ __PACKAGE__->register_method({ my $dc_conf = PVE::Cluster::cfs_read_file('datacenter.cfg'); my $next_id = $dc_conf->{'next-id'} // {}; + my $used_ids; + if ($dc_conf->{'unique-next-id'}) { + $used_ids = PVE::UsedGuestIDs::read_list(); + } else { + $used_ids = {}; + } my $lower = $next_id->{lower} // 100; my $upper = $next_id->{upper} // (1000 * 1000); # note, lower than the schema-maximum for (my $i = $lower; $i < $upper; $i++) { - return $i if !defined($idlist->{$i}); + return $i if !defined($idlist->{$i}) and !defined($used_ids->{$i}); } die "unable to get any free VMID in range [$lower, $upper]\n"; -- 2.47.3