From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [IPv6:2a01:7e0:0:424::9]) by lore.proxmox.com (Postfix) with ESMTPS id 774621FF13A for ; Wed, 01 Apr 2026 10:01:36 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 80BC61222C; Wed, 1 Apr 2026 10:00:54 +0200 (CEST) From: Arthur Bied-Charreton To: pve-devel@lists.proxmox.com Subject: [PATCH pve-manager v2 09/17] api: Add endpoint querying available CPU flags cluster-wide Date: Wed, 1 Apr 2026 10:00:20 +0200 Message-ID: <20260401080028.62513-10-a.bied-charreton@proxmox.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260401080028.62513-1-a.bied-charreton@proxmox.com> References: <20260401080028.62513-1-a.bied-charreton@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL -0.115 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 Message-ID-Hash: KWP4H6NC3N7PKFFSI2NHV7LUCZRQ2UZG X-Message-ID-Hash: KWP4H6NC3N7PKFFSI2NHV7LUCZRQ2UZG X-MailFrom: abied-charreton@jett.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: Add endpoint at `/cluster/qemu/cpu-flags` allowing to query the CPU flags available on the whole cluster, filtered by acceleration type (kvm/tcg). For each flag, a list of nodes supporting it is returned. This gives an accurate picture of which flags will actually be accepted by QEMU when starting a VM. Currently only return available flags for x86_64, see documentation of query_available_cpu_flags. Signed-off-by: Arthur Bied-Charreton --- PVE/API2/Cluster.pm | 7 ++++ PVE/API2/Cluster/Makefile | 4 +- PVE/API2/Cluster/Qemu.pm | 41 +++++++++++++++++++ PVE/API2/Cluster/Qemu/CPUFlags.pm | 68 +++++++++++++++++++++++++++++++ PVE/API2/Cluster/Qemu/Makefile | 17 ++++++++ 5 files changed, 136 insertions(+), 1 deletion(-) create mode 100644 PVE/API2/Cluster/Qemu.pm create mode 100644 PVE/API2/Cluster/Qemu/CPUFlags.pm create mode 100644 PVE/API2/Cluster/Qemu/Makefile diff --git a/PVE/API2/Cluster.pm b/PVE/API2/Cluster.pm index cc8279ca..4e641a2d 100644 --- a/PVE/API2/Cluster.pm +++ b/PVE/API2/Cluster.pm @@ -27,6 +27,7 @@ use PVE::API2::Backup; use PVE::API2::Cluster::BackupInfo; use PVE::API2::Cluster::BulkAction; use PVE::API2::Cluster::Ceph; +use PVE::API2::Cluster::Qemu; use PVE::API2::Cluster::Mapping; use PVE::API2::Cluster::Jobs; use PVE::API2::Cluster::MetricServer; @@ -59,6 +60,11 @@ __PACKAGE__->register_method({ path => 'notifications', }); +__PACKAGE__->register_method({ + subclass => "PVE::API2::Cluster::Qemu", + path => 'qemu', +}); + __PACKAGE__->register_method({ subclass => "PVE::API2::ClusterConfig", path => 'config', @@ -157,6 +163,7 @@ __PACKAGE__->register_method({ { name => 'bulk-action' }, { name => 'ceph' }, { name => 'config' }, + { name => 'qemu' }, { name => 'firewall' }, { name => 'ha' }, { name => 'jobs' }, diff --git a/PVE/API2/Cluster/Makefile b/PVE/API2/Cluster/Makefile index 6cffe4c9..fd33e31d 100644 --- a/PVE/API2/Cluster/Makefile +++ b/PVE/API2/Cluster/Makefile @@ -1,13 +1,15 @@ include ../../../defines.mk SUBDIRS=Mapping \ - BulkAction + BulkAction \ + Qemu # for node independent, cluster-wide applicable, API endpoints # ensure we do not conflict with files shipped by pve-cluster!! PERLSOURCE= \ BackupInfo.pm \ BulkAction.pm \ + Qemu.pm \ MetricServer.pm \ Mapping.pm \ Notifications.pm \ diff --git a/PVE/API2/Cluster/Qemu.pm b/PVE/API2/Cluster/Qemu.pm new file mode 100644 index 00000000..ed37fd20 --- /dev/null +++ b/PVE/API2/Cluster/Qemu.pm @@ -0,0 +1,41 @@ +package PVE::API2::Cluster::Qemu; + +use v5.36; + +use PVE::API2::Cluster::Qemu::CPUFlags; + +use base qw(PVE::RESTHandler); + +__PACKAGE__->register_method({ + subclass => "PVE::API2::Cluster::Qemu::CPUFlags", + path => "cpu-flags", +}); + +__PACKAGE__->register_method({ + name => 'index', + path => '', + method => 'GET', + description => "Cluster index.", + permissions => { user => 'all' }, + parameters => { + additionalProperties => 0, + properties => {}, + }, + returns => { + type => 'array', + items => { + type => "object", + properties => {}, + }, + links => [{ rel => 'child', href => "{name}" }], + }, + code => sub { + my ($param) = @_; + + return [ + { name => 'cpu-flags' }, + ]; + }, +}); + +1; diff --git a/PVE/API2/Cluster/Qemu/CPUFlags.pm b/PVE/API2/Cluster/Qemu/CPUFlags.pm new file mode 100644 index 00000000..a3328e85 --- /dev/null +++ b/PVE/API2/Cluster/Qemu/CPUFlags.pm @@ -0,0 +1,68 @@ +package PVE::API2::Cluster::Qemu::CPUFlags; + +use v5.36; + +use PVE::JSONSchema qw(get_standard_option); +use PVE::RESTHandler; +use PVE::Tools qw(extract_param); + +use PVE::QemuServer::Helpers; +use PVE::QemuServer::CPUFlags; + +use base qw(PVE::RESTHandler); + +__PACKAGE__->register_method({ + name => 'index', + path => '', + method => 'GET', + description => "List of available CPU flags. Returns an empty list for 'aarch64', " + . "PVE does not currently ship a flags list for it.", + permissions => { user => 'all' }, + parameters => { + additionalProperties => 0, + properties => { + arch => get_standard_option('pve-qm-cpu-arch', { optional => 1 }), + accel => { + description => 'Acceleration type to check node compatibility for.', + type => 'string', + enum => [qw(kvm tcg)], + optional => 1, + default => 'kvm', + }, + }, + }, + returns => { + type => 'array', + items => { + type => 'object', + properties => { + name => { + type => 'string', + description => "Name of the CPU flag.", + }, + description => { + type => 'string', + description => "Description of the CPU flag.", + optional => 1, + }, + 'supported-on' => { + description => + 'List of nodes supporting the flag with the selected acceleration type ("accel").', + type => 'array', + items => get_standard_option('pve-node'), + optional => 1, + }, + }, + }, + }, + code => sub { + my ($param) = @_; + + my $arch = extract_param($param, 'arch') // PVE::QemuServer::Helpers::get_host_arch(); + my $accel = extract_param($param, 'accel') // 'kvm'; + + return PVE::QemuServer::CPUFlags::query_available_cpu_flags($accel, 0, $arch); + }, +}); + +1; diff --git a/PVE/API2/Cluster/Qemu/Makefile b/PVE/API2/Cluster/Qemu/Makefile new file mode 100644 index 00000000..2ab3e0b1 --- /dev/null +++ b/PVE/API2/Cluster/Qemu/Makefile @@ -0,0 +1,17 @@ +include ../../../../defines.mk + +# for node independent, cluster-wide applicable, API endpoints +# ensure we do not conflict with files shipped by pve-cluster!! +PERLSOURCE= \ + CPUFlags.pm + +all: + +.PHONY: clean +clean: + rm -rf *~ + +.PHONY: install +install: ${PERLSOURCE} + install -d ${PERLLIBDIR}/PVE/API2/Cluster/Qemu + install -m 0644 ${PERLSOURCE} ${PERLLIBDIR}/PVE/API2/Cluster/Qemu -- 2.47.3