]> git.proxmox.com Git - pve-manager.git/blame - www/manager6/window/PCIMapEdit.js
ui: guest migrate: allow mapped devices for offline migrations
[pve-manager.git] / www / manager6 / window / PCIMapEdit.js
CommitLineData
2ffe0f32
DC
1Ext.define('PVE.window.PCIMapEditWindow', {
2 extend: 'Proxmox.window.Edit',
3
4 mixins: ['Proxmox.Mixin.CBind'],
5
6 width: 800,
7
8 subject: gettext('PCI mapping'),
9
10 onlineHelp: 'resource_mapping',
11
12 method: 'POST',
13
14 cbindData: function(initialConfig) {
15 let me = this;
16 me.isCreate = !me.name;
17 me.method = me.isCreate ? 'POST' : 'PUT';
18 return {
19 name: me.name,
20 nodename: me.nodename,
21 };
22 },
23
24 submitUrl: function(_url, data) {
25 let me = this;
26 let name = me.isCreate ? '' : me.name;
27 return `/cluster/mapping/pci/${name}`;
28 },
29
30 controller: {
31 xclass: 'Ext.app.ViewController',
32
33 onGetValues: function(values) {
34 let me = this;
35 let view = me.getView();
36 if (view.method === "POST") {
37 delete me.digest;
38 }
39
40 if (values.iommugroup === -1) {
41 delete values.iommugroup;
42 }
43
44 let nodename = values.node ?? view.nodename;
45 delete values.node;
46 if (me.originalMap) {
47 let otherMaps = PVE.Parser
48 .filterPropertyStringList(me.originalMap, (e) => e.node !== nodename);
49 if (otherMaps.length) {
50 values.map = values.map.concat(otherMaps);
51 }
52 }
53
54 return values;
55 },
56
57 onSetValues: function(values) {
58 let me = this;
59 let view = me.getView();
60 me.originalMap = [...values.map];
61 values.map = PVE.Parser.filterPropertyStringList(values.map, (e) => e.node === view.nodename);
62 return values;
63 },
64
65 checkIommu: function(store, records, success) {
66 let me = this;
67 if (!success || !records.length) {
68 return;
69 }
70 me.lookup('iommu_warning').setVisible(
71 records.every((val) => val.data.iommugroup === -1),
72 );
73 },
74
75 mdevChange: function(mdevField, value) {
76 this.lookup('pciselector').setMdev(value);
77 },
78
79 nodeChange: function(_field, value) {
80 this.lookup('pciselector').setNodename(value);
81 },
82
83 pciChange: function(_field, value) {
84 let me = this;
85 me.lookup('multiple_warning').setVisible(Ext.isArray(value) && value.length > 1);
86 },
87
88 control: {
89 'field[name=mdev]': {
90 change: 'mdevChange',
91 },
92 'pveNodeSelector': {
93 change: 'nodeChange',
94 },
95 'pveMultiPCISelector': {
96 change: 'pciChange',
97 },
98 },
99 },
100
101 items: [
102 {
103 xtype: 'inputpanel',
104 onGetValues: function(values) {
105 return this.up('window').getController().onGetValues(values);
106 },
107
108 onSetValues: function(values) {
109 return this.up('window').getController().onSetValues(values);
110 },
111
112 columnT: [
113 {
114 xtype: 'displayfield',
115 reference: 'iommu_warning',
116 hidden: true,
117 columnWidth: 1,
118 padding: '0 0 10 0',
119 value: 'No IOMMU detected, please activate it.' +
120 'See Documentation for further information.',
121 userCls: 'pmx-hint',
122 },
123 {
124 xtype: 'displayfield',
125 reference: 'multiple_warning',
126 hidden: true,
127 columnWidth: 1,
128 padding: '0 0 10 0',
129 value: 'When multiple devices are selected, the first free one will be chosen' +
130 ' on guest start.',
131 userCls: 'pmx-hint',
132 },
133 {
134 xtype: 'displayfield',
135 reference: 'group_warning',
136 hidden: true,
137 columnWidth: 1,
138 padding: '0 0 10 0',
139 itemId: 'iommuwarning',
140 value: 'The selected Device is not in a seperate IOMMU group, make sure this is intended.',
141 userCls: 'pmx-hint',
142 },
143 ],
144
145 column1: [
146 {
147 xtype: 'pmxDisplayEditField',
148 fieldLabel: gettext('Name'),
149 labelWidth: 120,
150 cbind: {
151 editable: '{!name}',
152 value: '{name}',
153 submitValue: '{isCreate}',
154 },
155 name: 'id',
156 allowBlank: false,
157 },
158 {
159 xtype: 'proxmoxcheckbox',
160 fieldLabel: gettext('Mediated Devices'),
161 labelWidth: 120,
162 reference: 'mdev',
163 name: 'mdev',
164 cbind: {
165 deleteEmpty: '{!isCreate}',
166 },
167 },
168 ],
169
170 column2: [
171 {
172 xtype: 'pmxDisplayEditField',
173 fieldLabel: gettext('Node'),
174 labelWidth: 120,
175 name: 'node',
176 editConfig: {
177 xtype: 'pveNodeSelector',
178 },
179 cbind: {
180 editable: '{!nodename}',
181 value: '{nodename}',
182 },
183 allowBlank: false,
184 },
185 ],
186
187 columnB: [
188 {
189 xtype: 'pveMultiPCISelector',
190 fieldLabel: gettext('Device'),
191 labelWidth: 120,
192 height: 300,
193 reference: 'pciselector',
194 name: 'map',
195 cbind: {
196 nodename: '{nodename}',
197 },
198 allowBlank: false,
199 onLoadCallBack: 'checkIommu',
200 margin: '0 0 10 0',
201 },
202 {
203 xtype: 'proxmoxtextfield',
204 fieldLabel: gettext('Comment'),
205 labelWidth: 120,
206 submitValue: true,
207 name: 'description',
208 cbind: {
209 deleteEmpty: '{!isCreate}',
210 },
211 },
212 ],
213 },
214 ],
215});