]> git.proxmox.com Git - pve-manager.git/blobdiff - www/manager6/window/PCIMapEdit.js
ui: guest import: network grid: allow selecting hardware type
[pve-manager.git] / www / manager6 / window / PCIMapEdit.js
index 516678e095285b6af86f2b7563c97abbd093311f..d43f04eb2f7e2468cbc08955904804ac98f5c996 100644 (file)
@@ -13,8 +13,12 @@ Ext.define('PVE.window.PCIMapEditWindow', {
 
     cbindData: function(initialConfig) {
        let me = this;
-       me.isCreate = !me.name || !me.nodename;
+       me.isCreate = (!me.name || !me.nodename) && !me.entryOnly;
        me.method = me.name ? 'PUT' : 'POST';
+       me.hideMapping = !!me.entryOnly;
+       me.hideComment = me.name && !me.entryOnly;
+       me.hideNodeSelector = me.nodename || me.entryOnly;
+       me.hideNode = !me.nodename || !me.hideNodeSelector;
        return {
            name: me.name,
            nodename: me.nodename,
@@ -58,7 +62,13 @@ Ext.define('PVE.window.PCIMapEditWindow', {
            let me = this;
            let view = me.getView();
            me.originalMap = [...values.map];
-           values.map = PVE.Parser.filterPropertyStringList(values.map, (e) => e.node === view.nodename);
+           let configuredNodes = [];
+           values.map = PVE.Parser.filterPropertyStringList(values.map, (e) => {
+               configuredNodes.push(e.node);
+               return e.node === view.nodename;
+           });
+
+           me.lookup('nodeselector').disallowedNodes = configuredNodes;
            return values;
        },
 
@@ -70,6 +80,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 +133,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: {
@@ -116,8 +167,7 @@ Ext.define('PVE.window.PCIMapEditWindow', {
                    hidden: true,
                    columnWidth: 1,
                    padding: '0 0 10 0',
-                   value: 'No IOMMU detected, please activate it.' +
-                   'See Documentation for further information.',
+                   value: gettext('No IOMMU detected, please activate it. See Documentation for further information.'),
                    userCls: 'pmx-hint',
                },
                {
@@ -126,8 +176,7 @@ Ext.define('PVE.window.PCIMapEditWindow', {
                    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.',
+                   value: gettext('When multiple devices are selected, the first free one will be chosen on guest start.'),
                    userCls: 'pmx-hint',
                },
                {
@@ -137,7 +186,7 @@ Ext.define('PVE.window.PCIMapEditWindow', {
                    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.',
+                   value: gettext('A selected device is not in a separate IOMMU group, make sure this is intended.'),
                    userCls: 'pmx-hint',
                },
            ],
@@ -156,34 +205,41 @@ Ext.define('PVE.window.PCIMapEditWindow', {
                    allowBlank: false,
                },
                {
-                   xtype: 'pmxDisplayEditField',
+                   xtype: 'displayfield',
                    fieldLabel: gettext('Mapping on Node'),
                    labelWidth: 120,
                    name: 'node',
-                   editConfig: {
-                       xtype: 'pveNodeSelector',
-                   },
                    cbind: {
-                       editable: '{!nodename}',
                        value: '{nodename}',
+                       disabled: '{hideNode}',
+                       hidden: '{hideNode}',
+                   },
+                   allowBlank: false,
+               },
+               {
+                   xtype: 'pveNodeSelector',
+                   reference: 'nodeselector',
+                   fieldLabel: gettext('Mapping on Node'),
+                   labelWidth: 120,
+                   name: 'node',
+                   cbind: {
+                       disabled: '{hideNodeSelector}',
+                       hidden: '{hideNodeSelector}',
                    },
                    allowBlank: false,
                },
            ],
 
            column2: [
-               {
-                   // as spacer
-                   xtype: 'displayfield',
-               },
                {
                    xtype: 'proxmoxcheckbox',
-                   fieldLabel: gettext('Mediated Devices'),
-                   labelWidth: 120,
+                   fieldLabel: gettext('Use with Mediated Devices'),
+                   labelWidth: 200,
                    reference: 'mdev',
                    name: 'mdev',
                    cbind: {
                        deleteEmpty: '{!isCreate}',
+                       disabled: '{hideComment}',
                    },
                },
            ],
@@ -198,6 +254,8 @@ Ext.define('PVE.window.PCIMapEditWindow', {
                    name: 'map',
                    cbind: {
                        nodename: '{nodename}',
+                       disabled: '{hideMapping}',
+                       hidden: '{hideMapping}',
                    },
                    allowBlank: false,
                    onLoadCallBack: 'checkIommu',
@@ -211,6 +269,8 @@ Ext.define('PVE.window.PCIMapEditWindow', {
                    name: 'description',
                    cbind: {
                        deleteEmpty: '{!isCreate}',
+                       disabled: '{hideComment}',
+                       hidden: '{hideComment}',
                    },
                },
            ],