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 5071D1FF142 for ; Mon, 02 Mar 2026 14:29:30 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id C5B6B326FB; Mon, 2 Mar 2026 14:29:49 +0100 (CET) From: Dominik Csapak To: pve-devel@lists.proxmox.com Subject: [PATCH manager v3 06/18] ui: qemu: add architecture field in wizard and hardware view Date: Mon, 2 Mar 2026 14:20:54 +0100 Message-ID: <20260302132913.3169037-7-d.csapak@proxmox.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260302132913.3169037-1-d.csapak@proxmox.com> References: <20260302132913.3169037-1-d.csapak@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL 0.035 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 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: Z7JXTSTMC2QJVUWAM2KVJ5YJSQQFRPJ7 X-Message-ID-Hash: Z7JXTSTMC2QJVUWAM2KVJ5YJSQQFRPJ7 X-MailFrom: d.csapak@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: adds a new architecture field to the wizard to select the target architecture for the virtual machine. When the selected architecture does not match the host architecture of the selected node, disable kvm. Also show the architecture in the hardware view when it does not match the host architecture (and add it automatically to the editors so we can access it there). Signed-off-by: Dominik Csapak --- www/manager6/qemu/CreateWizard.js | 51 +++++++++++++++++++++++++++++++ www/manager6/qemu/HardwareView.js | 10 ++++++ 2 files changed, 61 insertions(+) diff --git a/www/manager6/qemu/CreateWizard.js b/www/manager6/qemu/CreateWizard.js index d8379437..8f192284 100644 --- a/www/manager6/qemu/CreateWizard.js +++ b/www/manager6/qemu/CreateWizard.js @@ -8,6 +8,7 @@ Ext.define('PVE.qemu.CreateWizard', { nodename: '', current: { scsihw: '', + architecture: '', }, }, formulas: { @@ -60,6 +61,25 @@ Ext.define('PVE.qemu.CreateWizard', { return undefined; }, + setArchitecture: function () { + let me = this; + let vm = me.getViewModel(); + + let nodename = me.lookup('nodenameSelector').getValue(); + if (!nodename) { + // we can't set an architecture if we don't have a nodename + return; + } + let arch = me.lookup('archSelector').getValue(); + if (arch === '__default__') { + arch = undefined; + } + arch = PVE.qemu.Architecture.getGuestArchitecture(arch, nodename); + vm.set('current.architecture', arch); + }, + + referenceHolder: true, + items: [ { xtype: 'inputpanel', @@ -69,6 +89,7 @@ Ext.define('PVE.qemu.CreateWizard', { { xtype: 'pveNodeSelector', name: 'nodename', + reference: 'nodenameSelector', cbind: { selectCurNode: '{!nodename}', preferredValue: '{nodename}', @@ -79,6 +100,11 @@ Ext.define('PVE.qemu.CreateWizard', { fieldLabel: gettext('Node'), allowBlank: false, onlineValidator: true, + listeners: { + change: function () { + this.up('window').setArchitecture(); + }, + }, }, { xtype: 'pveGuestIDSelector', @@ -151,6 +177,20 @@ Ext.define('PVE.qemu.CreateWizard', { ], advancedColumnB: [ + { + xtype: 'proxmoxKVComboBox', + name: 'arch', + value: '__default__', + reference: 'archSelector', + fieldLabel: gettext('vCPU Architecture'), + labelWidth: 120, + comboItems: PVE.qemu.Architecture.selection, + listeners: { + change: function () { + this.up('window').setArchitecture(); + }, + }, + }, { xtype: 'pveTagFieldSet', name: 'tags', @@ -258,6 +298,13 @@ Ext.define('PVE.qemu.CreateWizard', { kv.boot = boot; } + if ( + kv.arch && + !PVE.qemu.Architecture.isHostArchitecture(kv.arch, kv.nodename) + ) { + kv.kvm = 0; + } + Ext.Object.each(kv, function (key, value) { if (key === 'delete') { // ignore @@ -288,6 +335,10 @@ Ext.define('PVE.qemu.CreateWizard', { kv.boot = boot; } + if (kv.arch && !PVE.qemu.Architecture.isHostArchitecture(kv.arch, nodename)) { + kv.kvm = 0; + } + Proxmox.Utils.API2Request({ url: '/nodes/' + nodename + '/qemu', waitMsgTarget: wizard, diff --git a/www/manager6/qemu/HardwareView.js b/www/manager6/qemu/HardwareView.js index cf5e2a0f..b2ca707c 100644 --- a/www/manager6/qemu/HardwareView.js +++ b/www/manager6/qemu/HardwareView.js @@ -66,6 +66,12 @@ Ext.define('PVE.qemu.HardwareView', { }; let rows = { + arch: { + header: gettext('vCPU Architecture'), + tdCls: 'pve-itype-icon-cpu', + never_delete: true, + renderer: PVE.qemu.Architecture.render_vcpu_architecture, + }, memory: { header: gettext('Memory'), editor: caps.vms['VM.Config.Memory'] ? 'PVE.qemu.MemoryEdit' : undefined, @@ -419,6 +425,10 @@ Ext.define('PVE.qemu.HardwareView', { pveSelNode: me.pveSelNode, confid: rec.data.key, url: `/api2/extjs/${baseurl}`, + arch: PVE.qemu.Architecture.getGuestArchitecture( + me.getObjectValue('arch'), + nodename, + ), listeners: { destroy: () => me.reload(), }, -- 2.47.3