]>
Commit | Line | Data |
---|---|---|
7d44036a DM |
1 | /*jslint confusion: true */ |
2 | Ext.define('PVE.qemu.Options', { | |
bc0eaf58 | 3 | extend: 'Proxmox.grid.PendingObjectGrid', |
7d44036a DM |
4 | alias: ['widget.PVE.qemu.Options'], |
5 | ||
ba93a9c6 DC |
6 | onlineHelp: 'qm_options', |
7 | ||
7d44036a DM |
8 | initComponent : function() { |
9 | var me = this; | |
10 | var i; | |
11 | ||
12 | var nodename = me.pveSelNode.data.node; | |
13 | if (!nodename) { | |
14 | throw "no node name specified"; | |
15 | } | |
16 | ||
17 | var vmid = me.pveSelNode.data.vmid; | |
18 | if (!vmid) { | |
19 | throw "no VM ID specified"; | |
20 | } | |
21 | ||
22 | var caps = Ext.state.Manager.get('GuiCap'); | |
23 | ||
24 | var rows = { | |
25 | name: { | |
26 | required: true, | |
27 | defaultValue: me.pveSelNode.data.name, | |
28 | header: gettext('Name'), | |
29 | editor: caps.vms['VM.Config.Options'] ? { | |
9fccc702 | 30 | xtype: 'proxmoxWindowEdit', |
7d44036a DM |
31 | subject: gettext('Name'), |
32 | items: { | |
3335a948 DC |
33 | xtype: 'inputpanel', |
34 | items:{ | |
35 | xtype: 'textfield', | |
36 | name: 'name', | |
37 | vtype: 'DnsName', | |
38 | value: '', | |
39 | fieldLabel: gettext('Name'), | |
40 | allowBlank: true | |
41 | }, | |
42 | onGetValues: function(values) { | |
43 | var params = values; | |
44 | if (values.name === undefined || | |
45 | values.name === null || | |
46 | values.name === '') { | |
47 | params = { 'delete':'name'}; | |
48 | } | |
49 | return params; | |
50 | } | |
7d44036a DM |
51 | } |
52 | } : undefined | |
53 | }, | |
54 | onboot: { | |
55 | header: gettext('Start at boot'), | |
56 | defaultValue: '', | |
e7ade592 | 57 | renderer: Proxmox.Utils.format_boolean, |
7d44036a | 58 | editor: caps.vms['VM.Config.Options'] ? { |
9fccc702 | 59 | xtype: 'proxmoxWindowEdit', |
7d44036a DM |
60 | subject: gettext('Start at boot'), |
61 | items: { | |
896c0d50 | 62 | xtype: 'proxmoxcheckbox', |
7d44036a DM |
63 | name: 'onboot', |
64 | uncheckedValue: 0, | |
65 | defaultValue: 0, | |
66 | deleteDefaultValue: true, | |
67 | fieldLabel: gettext('Start at boot') | |
68 | } | |
69 | } : undefined | |
70 | }, | |
71 | startup: { | |
72 | header: gettext('Start/Shutdown order'), | |
73 | defaultValue: '', | |
74 | renderer: PVE.Utils.render_kvm_startup, | |
998922c3 | 75 | editor: caps.vms['VM.Config.Options'] && caps.nodes['Sys.Modify'] ? |
a255dd7e EK |
76 | { |
77 | xtype: 'pveWindowStartupEdit', | |
78 | onlineHelp: 'qm_startup_and_shutdown' | |
79 | } : undefined | |
7d44036a DM |
80 | }, |
81 | ostype: { | |
82 | header: gettext('OS Type'), | |
83 | editor: caps.vms['VM.Config.Options'] ? 'PVE.qemu.OSTypeEdit' : undefined, | |
84 | renderer: PVE.Utils.render_kvm_ostype, | |
85 | defaultValue: 'other' | |
86 | }, | |
87 | bootdisk: { | |
88 | visible: false | |
89 | }, | |
90 | boot: { | |
ec99b1c3 | 91 | header: gettext('Boot Order'), |
7d44036a DM |
92 | defaultValue: 'cdn', |
93 | editor: caps.vms['VM.Config.Disk'] ? 'PVE.qemu.BootOrderEdit' : undefined, | |
16c162ec | 94 | multiKey: ['boot', 'bootdisk'], |
7d44036a DM |
95 | renderer: function(order, metaData, record, rowIndex, colIndex, store, pending) { |
96 | var i; | |
97 | var text = ''; | |
98 | var bootdisk = me.getObjectValue('bootdisk', undefined, pending); | |
99 | order = order || 'cdn'; | |
100 | for (i = 0; i < order.length; i++) { | |
101 | var sel = order.substring(i, i + 1); | |
102 | if (text) { | |
103 | text += ', '; | |
104 | } | |
105 | if (sel === 'c') { | |
106 | if (bootdisk) { | |
107 | text += "Disk '" + bootdisk + "'"; | |
108 | } else { | |
109 | text += "Disk"; | |
110 | } | |
111 | } else if (sel === 'n') { | |
112 | text += 'Network'; | |
113 | } else if (sel === 'a') { | |
114 | text += 'Floppy'; | |
115 | } else if (sel === 'd') { | |
116 | text += 'CD-ROM'; | |
117 | } else { | |
118 | text += sel; | |
119 | } | |
120 | } | |
121 | return text; | |
122 | } | |
123 | }, | |
124 | tablet: { | |
125 | header: gettext('Use tablet for pointer'), | |
126 | defaultValue: true, | |
e7ade592 | 127 | renderer: Proxmox.Utils.format_boolean, |
7d44036a | 128 | editor: caps.vms['VM.Config.HWType'] ? { |
9fccc702 | 129 | xtype: 'proxmoxWindowEdit', |
7d44036a DM |
130 | subject: gettext('Use tablet for pointer'), |
131 | items: { | |
896c0d50 | 132 | xtype: 'proxmoxcheckbox', |
7d44036a DM |
133 | name: 'tablet', |
134 | checked: true, | |
135 | uncheckedValue: 0, | |
136 | defaultValue: 1, | |
137 | deleteDefaultValue: true, | |
138 | fieldLabel: gettext('Enabled') | |
139 | } | |
140 | } : undefined | |
141 | }, | |
142 | hotplug: { | |
143 | header: gettext('Hotplug'), | |
144 | defaultValue: 'disk,network,usb', | |
145 | renderer: PVE.Utils.render_hotplug_features, | |
146 | editor: caps.vms['VM.Config.HWType'] ? { | |
9fccc702 | 147 | xtype: 'proxmoxWindowEdit', |
7d44036a DM |
148 | subject: gettext('Hotplug'), |
149 | items: { | |
150 | xtype: 'pveHotplugFeatureSelector', | |
151 | name: 'hotplug', | |
152 | value: '', | |
153 | multiSelect: true, | |
154 | fieldLabel: gettext('Hotplug'), | |
155 | allowBlank: true | |
156 | } | |
157 | } : undefined | |
158 | }, | |
159 | acpi: { | |
160 | header: gettext('ACPI support'), | |
161 | defaultValue: true, | |
e7ade592 | 162 | renderer: Proxmox.Utils.format_boolean, |
7d44036a | 163 | editor: caps.vms['VM.Config.HWType'] ? { |
9fccc702 | 164 | xtype: 'proxmoxWindowEdit', |
7d44036a DM |
165 | subject: gettext('ACPI support'), |
166 | items: { | |
896c0d50 | 167 | xtype: 'proxmoxcheckbox', |
7d44036a DM |
168 | name: 'acpi', |
169 | checked: true, | |
170 | uncheckedValue: 0, | |
171 | defaultValue: 1, | |
172 | deleteDefaultValue: true, | |
173 | fieldLabel: gettext('Enabled') | |
174 | } | |
175 | } : undefined | |
176 | }, | |
7d44036a DM |
177 | kvm: { |
178 | header: gettext('KVM hardware virtualization'), | |
179 | defaultValue: true, | |
e7ade592 | 180 | renderer: Proxmox.Utils.format_boolean, |
7d44036a | 181 | editor: caps.vms['VM.Config.HWType'] ? { |
9fccc702 | 182 | xtype: 'proxmoxWindowEdit', |
7d44036a DM |
183 | subject: gettext('KVM hardware virtualization'), |
184 | items: { | |
896c0d50 | 185 | xtype: 'proxmoxcheckbox', |
7d44036a DM |
186 | name: 'kvm', |
187 | checked: true, | |
188 | uncheckedValue: 0, | |
189 | defaultValue: 1, | |
190 | deleteDefaultValue: true, | |
191 | fieldLabel: gettext('Enabled') | |
192 | } | |
193 | } : undefined | |
194 | }, | |
195 | freeze: { | |
196 | header: gettext('Freeze CPU at startup'), | |
197 | defaultValue: false, | |
e7ade592 | 198 | renderer: Proxmox.Utils.format_boolean, |
7d44036a | 199 | editor: caps.vms['VM.PowerMgmt'] ? { |
9fccc702 | 200 | xtype: 'proxmoxWindowEdit', |
7d44036a DM |
201 | subject: gettext('Freeze CPU at startup'), |
202 | items: { | |
896c0d50 | 203 | xtype: 'proxmoxcheckbox', |
7d44036a DM |
204 | name: 'freeze', |
205 | uncheckedValue: 0, | |
206 | defaultValue: 0, | |
207 | deleteDefaultValue: true, | |
208 | labelWidth: 140, | |
209 | fieldLabel: gettext('Freeze CPU at startup') | |
210 | } | |
211 | } : undefined | |
212 | }, | |
213 | localtime: { | |
214 | header: gettext('Use local time for RTC'), | |
215 | defaultValue: false, | |
e7ade592 | 216 | renderer: Proxmox.Utils.format_boolean, |
7d44036a | 217 | editor: caps.vms['VM.Config.Options'] ? { |
9fccc702 | 218 | xtype: 'proxmoxWindowEdit', |
7d44036a DM |
219 | subject: gettext('Use local time for RTC'), |
220 | items: { | |
896c0d50 | 221 | xtype: 'proxmoxcheckbox', |
7d44036a DM |
222 | name: 'localtime', |
223 | uncheckedValue: 0, | |
224 | defaultValue: 0, | |
225 | deleteDefaultValue: true, | |
226 | labelWidth: 140, | |
227 | fieldLabel: gettext('Use local time for RTC') | |
228 | } | |
229 | } : undefined | |
230 | }, | |
231 | startdate: { | |
232 | header: gettext('RTC start date'), | |
233 | defaultValue: 'now', | |
234 | editor: caps.vms['VM.Config.Options'] ? { | |
9fccc702 | 235 | xtype: 'proxmoxWindowEdit', |
7d44036a DM |
236 | subject: gettext('RTC start date'), |
237 | items: { | |
dbed4c1c | 238 | xtype: 'proxmoxtextfield', |
7d44036a DM |
239 | name: 'startdate', |
240 | deleteEmpty: true, | |
241 | value: 'now', | |
242 | fieldLabel: gettext('RTC start date'), | |
243 | vtype: 'QemuStartDate', | |
244 | allowBlank: true | |
245 | } | |
246 | } : undefined | |
247 | }, | |
248 | smbios1: { | |
249 | header: gettext('SMBIOS settings (type1)'), | |
250 | defaultValue: '', | |
251 | renderer: Ext.String.htmlEncode, | |
252 | editor: caps.vms['VM.Config.HWType'] ? 'PVE.qemu.Smbios1Edit' : undefined | |
253 | }, | |
254 | agent: { | |
ea6a4b52 | 255 | header: 'QEMU Guest Agent', |
7d44036a | 256 | defaultValue: false, |
1662ccdb | 257 | renderer: PVE.Utils.render_qga_features, |
7d44036a | 258 | editor: caps.vms['VM.Config.Options'] ? { |
9fccc702 | 259 | xtype: 'proxmoxWindowEdit', |
7d44036a | 260 | subject: gettext('Qemu Agent'), |
ea6a4b52 | 261 | width: 350, |
7d44036a | 262 | items: { |
1662ccdb SI |
263 | xtype: 'pveAgentFeatureSelector', |
264 | name: 'agent' | |
7d44036a DM |
265 | } |
266 | } : undefined | |
267 | }, | |
268 | protection: { | |
16152937 | 269 | header: gettext('Protection'), |
7d44036a | 270 | defaultValue: false, |
e7ade592 | 271 | renderer: Proxmox.Utils.format_boolean, |
7d44036a | 272 | editor: caps.vms['VM.Config.Options'] ? { |
9fccc702 | 273 | xtype: 'proxmoxWindowEdit', |
16152937 | 274 | subject: gettext('Protection'), |
7d44036a | 275 | items: { |
896c0d50 | 276 | xtype: 'proxmoxcheckbox', |
7d44036a DM |
277 | name: 'protection', |
278 | uncheckedValue: 0, | |
279 | defaultValue: 0, | |
280 | deleteDefaultValue: true, | |
281 | fieldLabel: gettext('Enabled') | |
282 | } | |
283 | } : undefined | |
95f2a8a2 | 284 | }, |
9c22da32 AL |
285 | spice_enhancements: { |
286 | header: gettext('Spice Enhancements'), | |
287 | defaultValue: false, | |
288 | renderer: PVE.Utils.render_spice_enhancements, | |
289 | editor: caps.vms['VM.Config.Options'] ? { | |
290 | xtype: 'proxmoxWindowEdit', | |
291 | subject: gettext('Spice Enhancements'), | |
292 | onlineHelp: 'qm_spice_enhancements', | |
293 | items: { | |
294 | xtype: 'pveSpiceEnhancementSelector', | |
295 | name: 'spice_enhancements', | |
296 | } | |
297 | } : undefined | |
298 | }, | |
95f2a8a2 DC |
299 | hookscript: { |
300 | header: gettext('Hookscript') | |
7d44036a DM |
301 | } |
302 | }; | |
303 | ||
304 | var baseurl = 'nodes/' + nodename + '/qemu/' + vmid + '/config'; | |
305 | ||
7d44036a DM |
306 | var edit_btn = new Ext.Button({ |
307 | text: gettext('Edit'), | |
308 | disabled: true, | |
8cd96756 | 309 | handler: function() { me.run_editor(); } |
7d44036a DM |
310 | }); |
311 | ||
5720fafa | 312 | var revert_btn = new Proxmox.button.Button({ |
7d44036a DM |
313 | text: gettext('Revert'), |
314 | disabled: true, | |
315 | handler: function() { | |
316 | var sm = me.getSelectionModel(); | |
317 | var rec = sm.getSelection()[0]; | |
318 | if (!rec) { | |
319 | return; | |
320 | } | |
321 | ||
16c162ec DC |
322 | var rowdef = me.rows[rec.data.key] || {}; |
323 | var keys = rowdef.multiKey || [ rec.data.key ]; | |
324 | var revert = keys.join(','); | |
325 | ||
e7ade592 | 326 | Proxmox.Utils.API2Request({ |
7d44036a DM |
327 | url: '/api2/extjs/' + baseurl, |
328 | waitMsgTarget: me, | |
329 | method: 'PUT', | |
330 | params: { | |
16c162ec | 331 | 'revert': revert |
7d44036a DM |
332 | }, |
333 | callback: function() { | |
998922c3 | 334 | me.reload(); |
7d44036a DM |
335 | }, |
336 | failure: function (response, opts) { | |
337 | Ext.Msg.alert('Error',response.htmlStatus); | |
338 | } | |
339 | }); | |
340 | } | |
341 | }); | |
342 | ||
343 | var set_button_status = function() { | |
344 | var sm = me.getSelectionModel(); | |
345 | var rec = sm.getSelection()[0]; | |
346 | ||
347 | if (!rec) { | |
348 | edit_btn.disable(); | |
349 | return; | |
350 | } | |
351 | ||
352 | var key = rec.data.key; | |
353 | var pending = rec.data['delete'] || me.hasPendingChanges(key); | |
354 | var rowdef = rows[key]; | |
355 | ||
356 | edit_btn.setDisabled(!rowdef.editor); | |
357 | revert_btn.setDisabled(!pending); | |
358 | }; | |
359 | ||
a26cb711 | 360 | Ext.apply(me, { |
7d44036a DM |
361 | url: "/api2/json/nodes/" + nodename + "/qemu/" + vmid + "/pending", |
362 | interval: 5000, | |
3c813f74 | 363 | cwidth1: 250, |
7d44036a DM |
364 | tbar: [ edit_btn, revert_btn ], |
365 | rows: rows, | |
998922c3 TL |
366 | editorConfig: { |
367 | url: "/api2/extjs/" + baseurl | |
368 | }, | |
7d44036a | 369 | listeners: { |
998922c3 | 370 | itemdblclick: me.run_editor, |
7d44036a DM |
371 | selectionchange: set_button_status |
372 | } | |
373 | }); | |
374 | ||
375 | me.callParent(); | |
376 | ||
a26cb711 | 377 | me.on('activate', me.rstore.startUpdate); |
998922c3 TL |
378 | me.on('destroy', me.rstore.stopUpdate); |
379 | me.on('deactivate', me.rstore.stopUpdate); | |
7d44036a | 380 | |
141aba6b | 381 | me.mon(me.getStore(), 'datachanged', function() { |
7d44036a DM |
382 | set_button_status(); |
383 | }); | |
384 | } | |
385 | }); | |
386 |