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 <[email protected]>
---
 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




Reply via email to