X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=www%2Fmanager6%2Fqemu%2FMachineEdit.js;h=f928c80c1650dfd0acc18e0334ab2f73f19156b3;hb=refs%2Fheads%2Fmaster;hp=6e294a93ff2189cab2c18b50700381c378569bf6;hpb=60cc233a1067a3303fcc8c52fbcdc8d76a1bac28;p=pve-manager.git diff --git a/www/manager6/qemu/MachineEdit.js b/www/manager6/qemu/MachineEdit.js index 6e294a93..a697cd34 100644 --- a/www/manager6/qemu/MachineEdit.js +++ b/www/manager6/qemu/MachineEdit.js @@ -1,6 +1,16 @@ Ext.define('PVE.qemu.MachineInputPanel', { extend: 'Proxmox.panel.InputPanel', xtype: 'pveMachineInputPanel', + onlineHelp: 'qm_machine_type', + + viewModel: { + data: { + type: '__default__', + }, + formulas: { + q35: get => get('type') === 'q35', + }, + }, controller: { xclass: 'Ext.app.ViewController', @@ -13,31 +23,72 @@ Ext.define('PVE.qemu.MachineInputPanel', { let me = this; let version = me.lookup('version'); let store = version.getStore(); + let oldRec = store.findRecord('id', version.getValue(), 0, false, false, true); let type = value === 'q35' ? 'q35' : 'i440fx'; store.clearFilter(); - store.addFilter(val => (val.data.id === 'latest' || val.data.type === type)); - version.setValue('latest'); + store.addFilter(val => val.data.id === 'latest' || val.data.type === type); + if (!me.getView().isWindows) { + version.setValue('latest'); + } else { + store.isWindows = true; + if (!oldRec) { + return; + } + let oldVers = oldRec.data.version; + // we already filtered by correct type, so just check version property + let rec = store.findRecord('version', oldVers, 0, false, false, true); + if (rec) { + version.select(rec); + } + } }, }, onGetValues: function(values) { + if (values.delete === 'machine' && values.viommu) { + delete values.delete; + values.machine = 'pc'; + } if (values.version && values.version !== 'latest') { values.machine = values.version; delete values.delete; } delete values.version; - return values; + if (values.delete === 'machine' && !values.viommu) { + return values; + } + let ret = {}; + ret.machine = PVE.Parser.printPropertyString(values, 'machine'); + return ret; }, setValues: function(values) { let me = this; + let machineConf = PVE.Parser.parsePropertyString(values.machine, 'type'); + values.machine = machineConf.type; + + me.isWindows = values.isWindows; + if (values.machine === 'pc') { + values.machine = '__default__'; + } + + if (me.isWindows) { + if (values.machine === '__default__') { + values.version = 'pc-i440fx-5.1'; + } else if (values.machine === 'q35') { + values.version = 'pc-q35-5.1'; + } + } + + values.viommu = machineConf.viommu || '__default__'; + if (values.machine !== '__default__' && values.machine !== 'q35') { values.version = values.machine; values.machine = values.version.match(/q35/) ? 'q35' : '__default__'; // avoid hiding a pinned version - Ext.ComponentQuery.query("#advancedcb")[0].setValue(true); + me.setAdvancedVisible(true); } this.callParent(arguments); @@ -52,33 +103,78 @@ Ext.define('PVE.qemu.MachineInputPanel', { ['__default__', PVE.Utils.render_qemu_machine('')], ['q35', 'q35'], ], + bind: { + value: '{type}', + }, }, - advancedItems: { - xtype: 'combobox', - name: 'version', - reference: 'version', - fieldLabel: gettext('Version'), - value: 'latest', - allowBlank: false, - editable: false, - valueField: 'id', - displayField: 'version', - queryParam: false, - store: { - autoLoad: true, - fields: ['id', 'type', 'version'], - proxy: { - type: 'proxmox', - url: "/api2/json/nodes/localhost/capabilities/qemu/machines", - }, - listeners: { - load: function(records) { - this.insert(0, { id: 'latest', type: 'any', version: 'latest' }); + advancedItems: [ + { + xtype: 'combobox', + name: 'version', + reference: 'version', + fieldLabel: gettext('Version'), + emptyText: gettext('Latest'), + value: 'latest', + editable: false, + valueField: 'id', + displayField: 'version', + queryParam: false, + store: { + autoLoad: true, + fields: ['id', 'type', 'version'], + proxy: { + type: 'proxmox', + url: "/api2/json/nodes/localhost/capabilities/qemu/machines", + }, + listeners: { + load: function(records) { + if (!this.isWindows) { + this.insert(0, { id: 'latest', type: 'any', version: gettext('Latest') }); + } + }, }, }, }, - }, + { + xtype: 'displayfield', + fieldLabel: gettext('Note'), + value: gettext('Machine version change may affect hardware layout and settings in the guest OS.'), + }, + { + xtype: 'proxmoxKVComboBox', + name: 'viommu', + fieldLabel: gettext('vIOMMU'), + reference: 'viommu-q35', + deleteEmpty: false, + value: '__default__', + comboItems: [ + ['__default__', Proxmox.Utils.defaultText + ' (None)'], + ['intel', gettext('Intel (AMD Compatible)')], + ['virtio', 'VirtIO'], + ], + bind: { + hidden: '{!q35}', + disabled: '{!q35}', + }, + }, + { + xtype: 'proxmoxKVComboBox', + name: 'viommu', + fieldLabel: gettext('vIOMMU'), + reference: 'viommu-i440fx', + deleteEmpty: false, + value: '__default__', + comboItems: [ + ['__default__', Proxmox.Utils.defaultText + ' (None)'], + ['virtio', 'VirtIO'], + ], + bind: { + hidden: '{q35}', + disabled: '{q35}', + }, + }, + ], }); Ext.define('PVE.qemu.MachineEdit', { @@ -90,6 +186,8 @@ Ext.define('PVE.qemu.MachineEdit', { xtype: 'pveMachineInputPanel', }, + width: 400, + initComponent: function() { let me = this; @@ -97,9 +195,12 @@ Ext.define('PVE.qemu.MachineEdit', { me.load({ success: function(response) { - let vmconfig = response.result.data; - let machine = vmconfig.machine || '__default__'; - me.setValues({ machine: machine }); + let conf = response.result.data; + let values = { + machine: conf.machine || '__default__', + }; + values.isWindows = PVE.Utils.is_windows(conf.ostype); + me.setValues(values); }, }); },