]>
git.proxmox.com Git - pve-manager.git/blob - www/manager6/window/PCIMapEdit.js
1 Ext
.define('PVE.window.PCIMapEditWindow', {
2 extend
: 'Proxmox.window.Edit',
4 mixins
: ['Proxmox.Mixin.CBind'],
8 subject
: gettext('PCI mapping'),
10 onlineHelp
: 'resource_mapping',
14 cbindData: function(initialConfig
) {
16 me
.isCreate
= (!me
.name
|| !me
.nodename
) && !me
.entryOnly
;
17 me
.method
= me
.name
? 'PUT' : 'POST';
18 me
.hideMapping
= !!me
.entryOnly
;
19 me
.hideComment
= me
.name
&& !me
.entryOnly
;
20 me
.hideNodeSelector
= me
.nodename
|| me
.entryOnly
;
21 me
.hideNode
= !me
.nodename
|| !me
.hideNodeSelector
;
24 nodename
: me
.nodename
,
28 submitUrl: function(_url
, data
) {
30 let name
= me
.method
=== 'PUT' ? me
.name
: '';
31 return `/cluster/mapping/pci/${name}`;
35 xclass
: 'Ext.app.ViewController',
37 onGetValues: function(values
) {
39 let view
= me
.getView();
40 if (view
.method
=== "POST") {
44 if (values
.iommugroup
=== -1) {
45 delete values
.iommugroup
;
48 let nodename
= values
.node
?? view
.nodename
;
51 let otherMaps
= PVE
.Parser
52 .filterPropertyStringList(me
.originalMap
, (e
) => e
.node
!== nodename
);
53 if (otherMaps
.length
) {
54 values
.map
= values
.map
.concat(otherMaps
);
61 onSetValues: function(values
) {
63 let view
= me
.getView();
64 me
.originalMap
= [...values
.map
];
65 let configuredNodes
= [];
66 values
.map
= PVE
.Parser
.filterPropertyStringList(values
.map
, (e
) => {
67 configuredNodes
.push(e
.node
);
68 return e
.node
=== view
.nodename
;
71 me
.lookup('nodeselector').disallowedNodes
= configuredNodes
;
75 checkIommu: function(store
, records
, success
) {
77 if (!success
|| !records
.length
) {
80 me
.lookup('iommu_warning').setVisible(
81 records
.every((val
) => val
.data
.iommugroup
=== -1),
84 let value
= me
.lookup('pciselector').getValue();
85 me
.checkIsolated(value
);
88 checkIsolated: function(value
) {
91 let store
= me
.lookup('pciselector').getStore();
93 let isIsolated = function(entry
) {
95 let parsed
= PVE
.Parser
.parsePropertyString(entry
);
96 parsed
.iommugroup
= parseInt(parsed
.iommugroup
, 10);
97 if (!parsed
.iommugroup
) {
100 store
.each(({ data
}) => {
101 let isSubDevice
= data
.id
.startsWith(parsed
.path
);
102 if (data
.iommugroup
=== parsed
.iommugroup
&& data
.id
!== parsed
.path
&& !isSubDevice
) {
111 let showWarning
= false;
112 if (Ext
.isArray(value
)) {
113 for (const entry
of value
) {
114 if (!isIsolated(entry
)) {
120 showWarning
= isIsolated(value
);
122 me
.lookup('group_warning').setVisible(showWarning
);
125 mdevChange: function(mdevField
, value
) {
126 this.lookup('pciselector').setMdev(value
);
129 nodeChange: function(_field
, value
) {
130 this.lookup('pciselector').setNodename(value
);
133 pciChange: function(_field
, value
) {
135 me
.lookup('multiple_warning').setVisible(Ext
.isArray(value
) && value
.length
> 1);
136 me
.checkIsolated(value
);
140 'field[name=mdev]': {
141 change
: 'mdevChange',
144 change
: 'nodeChange',
146 'pveMultiPCISelector': {
155 onGetValues: function(values
) {
156 return this.up('window').getController().onGetValues(values
);
159 onSetValues: function(values
) {
160 return this.up('window').getController().onSetValues(values
);
165 xtype
: 'displayfield',
166 reference
: 'iommu_warning',
170 value
: gettext('No IOMMU detected, please activate it. See Documentation for further information.'),
174 xtype
: 'displayfield',
175 reference
: 'multiple_warning',
179 value
: gettext('When multiple devices are selected, the first free one will be chosen on guest start.'),
183 xtype
: 'displayfield',
184 reference
: 'group_warning',
188 itemId
: 'iommuwarning',
189 value
: gettext('A selected device is not in a separate IOMMU group, make sure this is intended.'),
196 xtype
: 'pmxDisplayEditField',
197 fieldLabel
: gettext('Name'),
202 submitValue
: '{isCreate}',
208 xtype
: 'displayfield',
209 fieldLabel
: gettext('Mapping on Node'),
214 disabled
: '{hideNode}',
215 hidden
: '{hideNode}',
220 xtype
: 'pveNodeSelector',
221 reference
: 'nodeselector',
222 fieldLabel
: gettext('Mapping on Node'),
226 disabled
: '{hideNodeSelector}',
227 hidden
: '{hideNodeSelector}',
235 xtype
: 'proxmoxcheckbox',
236 fieldLabel
: gettext('Use with Mediated Devices'),
241 deleteEmpty
: '{!isCreate}',
242 disabled
: '{hideComment}',
249 xtype
: 'pveMultiPCISelector',
250 fieldLabel
: gettext('Device'),
253 reference
: 'pciselector',
256 nodename
: '{nodename}',
257 disabled
: '{hideMapping}',
258 hidden
: '{hideMapping}',
261 onLoadCallBack
: 'checkIommu',
265 xtype
: 'proxmoxtextfield',
266 fieldLabel
: gettext('Comment'),
271 deleteEmpty
: '{!isCreate}',
272 disabled
: '{hideComment}',
273 hidden
: '{hideComment}',