[pve-devel] [PATCH manager v2 2/5] ui: pci map edit: reintroduce warnings checks

Dominik Csapak d.csapak at proxmox.com
Wed Jun 21 09:41:39 CEST 2023


they got lost in my last rebase/refactor.

the onLoadCallBack is used to check by the window if there are iommu
groups at all, and the checkIsolated function checks if the selected
ones are in a separate group (in regards to the other devices)

Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
---
factored out the store lookup

@fiona, i opted to get the selected values via getValue, because via the
store it's not really possible, and via the selector requires knowledge
of how the selector works internally (lookup the grid, get the selection)

 www/manager6/form/MultiPCISelector.js |  5 ++++
 www/manager6/window/PCIMapEdit.js     | 41 +++++++++++++++++++++++++++
 2 files changed, 46 insertions(+)

diff --git a/www/manager6/form/MultiPCISelector.js b/www/manager6/form/MultiPCISelector.js
index e1ef691a..d4fb6364 100644
--- a/www/manager6/form/MultiPCISelector.js
+++ b/www/manager6/form/MultiPCISelector.js
@@ -8,6 +8,9 @@ Ext.define('PVE.form.MultiPCISelector', {
 	field: 'Ext.form.field.Field',
     },
 
+    // will be called after loading finished
+    onLoadCallBack: Ext.emptyFn,
+
     getValue: function() {
 	let me = this;
 	return me.value ?? [];
@@ -287,6 +290,8 @@ Ext.define('PVE.form.MultiPCISelector', {
 
 	me.callParent();
 
+	me.mon(me.getStore(), 'load', me.onLoadCallBack);
+
 	Proxmox.Utils.monStoreErrors(me, me.getStore(), true);
 
 	me.setNodename(nodename);
diff --git a/www/manager6/window/PCIMapEdit.js b/www/manager6/window/PCIMapEdit.js
index 516678e0..8c1a95e3 100644
--- a/www/manager6/window/PCIMapEdit.js
+++ b/www/manager6/window/PCIMapEdit.js
@@ -70,6 +70,46 @@ Ext.define('PVE.window.PCIMapEditWindow', {
 	    me.lookup('iommu_warning').setVisible(
 		records.every((val) => val.data.iommugroup === -1),
 	    );
+
+	    let value = me.lookup('pciselector').getValue();
+	    me.checkIsolated(value);
+	},
+
+	checkIsolated: function(value) {
+	    let me = this;
+
+	    let store = me.lookup('pciselector').getStore();
+
+	    let isIsolated = function(entry) {
+		let isolated = true;
+		let parsed = PVE.Parser.parsePropertyString(entry);
+		parsed.iommugroup = parseInt(parsed.iommugroup, 10);
+		if (!parsed.iommugroup) {
+		    return isolated;
+		}
+		store.each(({ data }) => {
+		    let isSubDevice = data.id.startsWith(parsed.path);
+		    if (data.iommugroup === parsed.iommugroup && data.id !== parsed.path && !isSubDevice) {
+			isolated = false;
+			return false;
+		    }
+		    return true;
+		});
+		return isolated;
+	    };
+
+	    let showWarning = false;
+	    if (Ext.isArray(value)) {
+		for (const entry of value) {
+		    if (!isIsolated(entry)) {
+			showWarning = true;
+			break;
+		    }
+		}
+	    } else {
+		showWarning = isIsolated(value);
+	    }
+	    me.lookup('group_warning').setVisible(showWarning);
 	},
 
 	mdevChange: function(mdevField, value) {
@@ -83,6 +123,7 @@ Ext.define('PVE.window.PCIMapEditWindow', {
 	pciChange: function(_field, value) {
 	    let me = this;
 	    me.lookup('multiple_warning').setVisible(Ext.isArray(value) && value.length > 1);
+	    me.checkIsolated(value);
 	},
 
 	control: {
-- 
2.30.2






More information about the pve-devel mailing list