]> git.proxmox.com Git - pve-manager.git/blob - www/manager6/qemu/ProcessorEdit.js
update shipped appliance info index
[pve-manager.git] / www / manager6 / qemu / ProcessorEdit.js
1 // The view model of the parent shoul contain a 'cgroupMode' variable (or params for v2 are used).
2 Ext.define('PVE.qemu.ProcessorInputPanel', {
3 extend: 'Proxmox.panel.InputPanel',
4 alias: 'widget.pveQemuProcessorPanel',
5 onlineHelp: 'qm_cpu',
6
7 insideWizard: false,
8
9 viewModel: {
10 data: {
11 socketCount: 1,
12 coreCount: 1,
13 showCustomModelPermWarning: false,
14 userIsRoot: false,
15 },
16 formulas: {
17 totalCoreCount: get => get('socketCount') * get('coreCount'),
18 cpuunitsDefault: (get) => get('cgroupMode') === 1 ? 1024 : 100,
19 cpuunitsMin: (get) => get('cgroupMode') === 1 ? 2 : 1,
20 cpuunitsMax: (get) => get('cgroupMode') === 1 ? 262144 : 10000,
21 },
22 },
23
24 controller: {
25 xclass: 'Ext.app.ViewController',
26 init: function() {
27 let me = this;
28 let viewModel = me.getViewModel();
29
30 viewModel.set('userIsRoot', Proxmox.UserName === 'root@pam');
31 },
32 },
33
34 onGetValues: function(values) {
35 let me = this;
36 let cpuunitsDefault = me.getViewModel().get('cpuunitsDefault');
37
38 if (Array.isArray(values.delete)) {
39 values.delete = values.delete.join(',');
40 }
41
42 PVE.Utils.delete_if_default(values, 'cpulimit', '0', me.insideWizard);
43 PVE.Utils.delete_if_default(values, 'cpuunits', `${cpuunitsDefault}`, me.insideWizard);
44
45 // build the cpu options:
46 me.cpu.cputype = values.cputype;
47
48 if (values.flags) {
49 me.cpu.flags = values.flags;
50 } else {
51 delete me.cpu.flags;
52 }
53
54 delete values.cputype;
55 delete values.flags;
56 var cpustring = PVE.Parser.printQemuCpu(me.cpu);
57
58 // remove cputype delete request:
59 var del = values.delete;
60 delete values.delete;
61 if (del) {
62 del = del.split(',');
63 Ext.Array.remove(del, 'cputype');
64 } else {
65 del = [];
66 }
67
68 if (cpustring) {
69 values.cpu = cpustring;
70 } else {
71 del.push('cpu');
72 }
73
74 var delarr = del.join(',');
75 if (delarr) {
76 values.delete = delarr;
77 }
78
79 return values;
80 },
81
82 setValues: function(values) {
83 let me = this;
84
85 let type = values.cputype;
86 let typeSelector = me.lookupReference('cputype');
87 let typeStore = typeSelector.getStore();
88 typeStore.on('load', (store, records, success) => {
89 if (!success || !type || records.some(x => x.data.name === type)) {
90 return;
91 }
92
93 // if we get here, a custom CPU model is selected for the VM but we
94 // don't have permission to configure it - it will not be in the
95 // list retrieved from the API, so add it manually to allow changing
96 // other processor options
97 typeStore.add({
98 name: type,
99 displayname: type.replace(/^custom-/, ''),
100 custom: 1,
101 vendor: gettext("Unknown"),
102 });
103 typeSelector.select(type);
104 });
105
106 me.callParent([values]);
107 },
108
109 cpu: {},
110
111 column1: [
112 {
113 xtype: 'proxmoxintegerfield',
114 name: 'sockets',
115 minValue: 1,
116 maxValue: 4,
117 value: '1',
118 fieldLabel: gettext('Sockets'),
119 allowBlank: false,
120 bind: {
121 value: '{socketCount}',
122 },
123 },
124 {
125 xtype: 'proxmoxintegerfield',
126 name: 'cores',
127 minValue: 1,
128 maxValue: 128,
129 value: '1',
130 fieldLabel: gettext('Cores'),
131 allowBlank: false,
132 bind: {
133 value: '{coreCount}',
134 },
135 },
136 ],
137
138 column2: [
139 {
140 xtype: 'CPUModelSelector',
141 name: 'cputype',
142 reference: 'cputype',
143 fieldLabel: gettext('Type'),
144 },
145 {
146 xtype: 'displayfield',
147 fieldLabel: gettext('Total cores'),
148 name: 'totalcores',
149 isFormField: false,
150 bind: {
151 value: '{totalCoreCount}',
152 },
153 },
154 ],
155
156 columnB: [
157 {
158 xtype: 'displayfield',
159 userCls: 'pmx-hint',
160 value: gettext('WARNING: You do not have permission to configure custom CPU types, if you change the type you will not be able to go back!'),
161 hidden: true,
162 bind: {
163 hidden: '{!showCustomModelPermWarning}',
164 },
165 },
166 ],
167
168 advancedColumn1: [
169 {
170 xtype: 'proxmoxintegerfield',
171 name: 'vcpus',
172 minValue: 1,
173 maxValue: 1,
174 value: '',
175 fieldLabel: gettext('VCPUs'),
176 deleteEmpty: true,
177 allowBlank: true,
178 emptyText: '1',
179 bind: {
180 emptyText: '{totalCoreCount}',
181 maxValue: '{totalCoreCount}',
182 },
183 },
184 {
185 xtype: 'numberfield',
186 name: 'cpulimit',
187 minValue: 0,
188 maxValue: 128, // api maximum
189 value: '',
190 step: 1,
191 fieldLabel: gettext('CPU limit'),
192 allowBlank: true,
193 emptyText: gettext('unlimited'),
194 },
195 {
196 xtype: 'proxmoxtextfield',
197 name: 'affinity',
198 vtype: 'CpuSet',
199 value: '',
200 fieldLabel: gettext('CPU Affinity'),
201 allowBlank: true,
202 emptyText: gettext("All Cores"),
203 deleteEmpty: true,
204 bind: {
205 disabled: '{!userIsRoot}',
206 },
207 },
208 ],
209
210 advancedColumn2: [
211 {
212 xtype: 'proxmoxintegerfield',
213 name: 'cpuunits',
214 fieldLabel: gettext('CPU units'),
215 minValue: '1',
216 maxValue: '10000',
217 value: '',
218 emptyText: '100',
219 bind: {
220 minValue: '{cpuunitsMin}',
221 maxValue: '{cpuunitsMax}',
222 emptyText: '{cpuunitsDefault}',
223 },
224 deleteEmpty: true,
225 allowBlank: true,
226 },
227 {
228 xtype: 'proxmoxcheckbox',
229 fieldLabel: gettext('Enable NUMA'),
230 name: 'numa',
231 uncheckedValue: 0,
232 },
233 ],
234 advancedColumnB: [
235 {
236 xtype: 'label',
237 text: 'Extra CPU Flags:',
238 },
239 {
240 xtype: 'vmcpuflagselector',
241 name: 'flags',
242 },
243 ],
244 });
245
246 Ext.define('PVE.qemu.ProcessorEdit', {
247 extend: 'Proxmox.window.Edit',
248 alias: 'widget.pveQemuProcessorEdit',
249
250 width: 700,
251
252 viewModel: {
253 data: {
254 cgroupMode: 2,
255 },
256 },
257
258 initComponent: function() {
259 let me = this;
260 me.getViewModel().set('cgroupMode', me.cgroupMode);
261
262 var ipanel = Ext.create('PVE.qemu.ProcessorInputPanel');
263
264 Ext.apply(me, {
265 subject: gettext('Processors'),
266 items: ipanel,
267 });
268
269 me.callParent();
270
271 me.load({
272 success: function(response, options) {
273 var data = response.result.data;
274 var value = data.cpu;
275 if (value) {
276 var cpu = PVE.Parser.parseQemuCpu(value);
277 ipanel.cpu = cpu;
278 data.cputype = cpu.cputype;
279 if (cpu.flags) {
280 data.flags = cpu.flags;
281 }
282
283 let caps = Ext.state.Manager.get('GuiCap');
284 if (data.cputype.indexOf('custom-') === 0 &&
285 !caps.nodes['Sys.Audit']) {
286 let vm = ipanel.getViewModel();
287 vm.set("showCustomModelPermWarning", true);
288 }
289 }
290 me.setValues(data);
291 },
292 });
293 },
294 });