From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by lists.proxmox.com (Postfix) with ESMTPS id 46F8C8B614 for ; Thu, 25 Aug 2022 11:25:08 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id C8D75233A4 for ; Thu, 25 Aug 2022 11:25:06 +0200 (CEST) Received: from proxmox-new.maurer-it.com (proxmox-new.maurer-it.com [94.136.29.106]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by firstgate.proxmox.com (Proxmox) with ESMTPS for ; Thu, 25 Aug 2022 11:24:57 +0200 (CEST) Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1]) by proxmox-new.maurer-it.com (Proxmox) with ESMTP id AFAD543F45 for ; Thu, 25 Aug 2022 11:24:45 +0200 (CEST) From: Dominik Csapak To: pve-devel@lists.proxmox.com Date: Thu, 25 Aug 2022 11:24:36 +0200 Message-Id: <20220825092440.1810328-28-d.csapak@proxmox.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220825092440.1810328-1-d.csapak@proxmox.com> References: <20220825092440.1810328-1-d.csapak@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL 0.044 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment POISEN_SPAM_PILL_4 0.1 random spam to be learned in bayes SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record T_SCC_BODY_TEXT_LINE -0.01 - URIBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to URIBL was blocked. See http://wiki.apache.org/spamassassin/DnsBlocklists#dnsbl-block for more information. [me.name, pcidev.data] Subject: [pve-devel] [PATCH manager v2 09/13] ui: add window/PCIEdit: edit window for pci mappings X-BeenThere: pve-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox VE development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 25 Aug 2022 09:25:08 -0000 allows to add a single host mapping for pci entries Signed-off-by: Dominik Csapak --- www/manager6/Makefile | 1 + www/manager6/form/PCISelector.js | 17 +- www/manager6/window/PCIEdit.js | 287 +++++++++++++++++++++++++++++++ 3 files changed, 304 insertions(+), 1 deletion(-) create mode 100644 www/manager6/window/PCIEdit.js diff --git a/www/manager6/Makefile b/www/manager6/Makefile index c189af92..4a6b02e5 100644 --- a/www/manager6/Makefile +++ b/www/manager6/Makefile @@ -116,6 +116,7 @@ JSSRC= \ window/ScheduleSimulator.js \ window/Wizard.js \ window/GuestDiskReassign.js \ + window/PCIEdit.js \ ha/Fencing.js \ ha/GroupEdit.js \ ha/GroupSelector.js \ diff --git a/www/manager6/form/PCISelector.js b/www/manager6/form/PCISelector.js index 4e0a778f..39e111f0 100644 --- a/www/manager6/form/PCISelector.js +++ b/www/manager6/form/PCISelector.js @@ -3,7 +3,22 @@ Ext.define('PVE.form.PCISelector', { xtype: 'pvePCISelector', store: { - fields: ['id', 'vendor_name', 'device_name', 'vendor', 'device', 'iommugroup', 'mdev'], + fields: [ + 'id', 'vendor_name', 'device_name', 'vendor', 'device', 'iommugroup', 'mdev', + 'subsystem_vendor', 'subsystem_device', + { + name: 'subsystem-vendor', + calculate: function(data) { + return data.subsystem_vendor; + }, + }, + { + name: 'subsystem-device', + calculate: function(data) { + return data.subsystem_device; + }, + }, + ], filterOnLoad: true, sorters: [ { diff --git a/www/manager6/window/PCIEdit.js b/www/manager6/window/PCIEdit.js new file mode 100644 index 00000000..4f8786bd --- /dev/null +++ b/www/manager6/window/PCIEdit.js @@ -0,0 +1,287 @@ +Ext.define('PVE.node.PCIEditWindow', { + extend: 'Proxmox.window.Edit', + + mixins: ['Proxmox.Mixin.CBind'], + + width: 800, + + title: gettext('Add PCI mapping'), + + onlineHelp: 'qm_pci_passthrough', + + method: 'POST', + + cbindData: function(initialConfig) { + let me = this; + me.isCreate = !me.name || !me.nodename; + me.method = me.isCreate ? 'POST' : 'PUT'; + return { + name: me.name, + nodename: me.nodename, + }; + }, + + submitUrl: function(_url, data) { + let me = this; + let name = me.isCreate ? '' : me.name; + return `/nodes/${data.node}/hardware/mapping/pci/${name}`; + }, + + controller: { + xclass: 'Ext.app.ViewController', + + onGetValues: function(values) { + let me = this; + + if (values.iommugroup === -1) { + delete values.iommugroup; + } + + return values; + }, + + checkIommu: function(store, records, success) { + let me = this; + if (!success || !records.length) { + return; + } + me.lookup('iommu_warning').setVisible( + records.every((val) => val.data.iommugroup === -1), + ); + }, + + pciChange: function(pcisel, values) { + let me = this; + if (!values) { + return; + } + values = values.split(';').filter(id => !!id); + me.lookup('multiple_warning').setVisible(values.length > 1); + + let value = values[0]; + // add function for 'all function' device + if (value.indexOf('.') === -1) { + value += '.0'; + } + + let pciDev = pcisel.getStore().getById(value); + if (!pciDev) { + return; + } + + let fields = [ + 'vendor', + 'device', + 'subsystem-vendor', + 'subsystem-device', + 'mdev', + 'iommugroup', + ]; + + fields.forEach((fieldName) => { + let field = me.lookup(fieldName); + let oldValue = field.getValue(); + if (oldValue !== pciDev.data[fieldName]) { + field.setValue(pciDev.data[fieldName]); + } + }); + }, + + mdevChange: function(mdevField, value) { + let val = Proxmox.Utils.format_boolean(!!value); + this.lookup('mdev-display').setValue(val); + }, + + nodeChange: function(_field, value) { + this.lookup('pciselector').setNodename(value); + }, + + init: function(view) { + let me = this; + + if (!view.nodename) { + //throw "no nodename given"; + } + }, + + control: { + 'pveMultiPCISelector': { + change: 'pciChange', + }, + 'field[name=mdev]': { + change: 'mdevChange', + }, + 'pveNodeSelector': { + change: 'nodeChange', + }, + }, + }, + + items: [ + { + xtype: 'inputpanel', + onGetValues: function(values) { + return this.up('window').getController().onGetValues(values); + }, + + columnT: [ + { + xtype: 'displayfield', + reference: 'iommu_warning', + hidden: true, + columnWidth: 1, + padding: '0 0 10 0', + value: 'No IOMMU detected, please activate it.' + + 'See Documentation for further information.', + userCls: 'pmx-hint', + }, + { + xtype: 'displayfield', + reference: 'multiple_warning', + hidden: true, + columnWidth: 1, + padding: '0 0 10 0', + value: 'When multiple devices are selected, the first free one will be chosen' + + ' on guest start.', + userCls: 'pmx-hint', + }, + { + xtype: 'displayfield', + reference: 'group_warning', + hidden: true, + columnWidth: 1, + padding: '0 0 10 0', + itemId: 'iommuwarning', + value: 'The selected Device is not in a seperate IOMMU group, make sure this is intended.', + userCls: 'pmx-hint', + }, + ], + + column1: [ + { + xtype: 'pmxDisplayEditField', + fieldLabel: gettext('Name'), + labelWidth: 120, + cbind: { + editable: '{!name}', + value: '{name}', + submitValue: '{isCreate}', + }, + name: 'name', + allowBlank: false, + }, + { + xtype: 'displayfield', + fieldLabel: gettext('Vendor'), + labelWidth: 120, + submitValue: true, + reference: 'vendor', + name: 'vendor', + }, + { + xtype: 'displayfield', + fieldLabel: gettext('Subsystem Vendor'), + labelWidth: 120, + submitValue: true, + reference: 'subsystem-vendor', + name: 'subsystem-vendor', + cbind: { + deleteEmpty: '{!isCreate}', + }, + }, + { + xtype: 'proxmoxtextfield', + reference: 'mdev', + hidden: true, + name: 'mdev', + cbind: { + deleteEmpty: '{!isCreate}', + }, + }, + { + xtype: 'displayfield', + fieldLabel: gettext('Mediated Devices'), + labelWidth: 120, + value: Proxmox.Utils.noText, + reference: 'mdev-display', + name: 'mdev-display', + }, + ], + + column2: [ + { + xtype: 'pmxDisplayEditField', + fieldLabel: gettext('Node'), + labelWidth: 120, + name: 'node', + editConfig: { + xtype: 'pveNodeSelector', + }, + cbind: { + editable: '{!nodename}', + value: '{nodename}', + }, + submitValue: true, + allowBlank: false, + }, + { + xtype: 'displayfield', + fieldLabel: gettext('Device'), + labelWidth: 120, + submitValue: true, + reference: 'device', + name: 'device', + }, + { + xtype: 'displayfield', + fieldLabel: gettext('Subsystem Device'), + labelWidth: 120, + submitValue: true, + reference: 'subsystem-device', + name: 'subsystem-device', + cbind: { + deleteEmpty: '{!isCreate}', + }, + }, + { + xtype: 'displayfield', + fieldLabel: gettext('IOMMU group'), + labelWidth: 120, + submitValue: true, + reference: 'iommugroup', + name: 'iommugroup', + cbind: { + deleteEmpty: '{!isCreate}', + }, + }, + ], + + columnB: [ + { + xtype: 'pveMultiPCISelector', + fieldLabel: gettext('Device'), + labelWidth: 120, + height: 300, + reference: 'pciselector', + name: 'path', + cbind: { + nodename: '{nodename}', + }, + allowBlank: false, + onLoadCallBack: 'checkIommu', + margin: '0 0 10 0', + }, + { + xtype: 'proxmoxtextfield', + fieldLabel: gettext('Comment'), + labelWidth: 120, + submitValue: true, + name: 'comment', + cbind: { + deleteEmpty: '{!isCreate}', + }, + }, + ], + }, + ], +}); -- 2.30.2