1 Ext
.define('PVE.qemu.Options', {
2 extend
: 'Proxmox.grid.PendingObjectGrid',
3 alias
: ['widget.PVE.qemu.Options'],
5 onlineHelp
: 'qm_options',
7 initComponent: function() {
10 var nodename
= me
.pveSelNode
.data
.node
;
12 throw "no node name specified";
15 var vmid
= me
.pveSelNode
.data
.vmid
;
17 throw "no VM ID specified";
20 var caps
= Ext
.state
.Manager
.get('GuiCap');
25 defaultValue
: me
.pveSelNode
.data
.name
,
26 header
: gettext('Name'),
27 editor
: caps
.vms
['VM.Config.Options'] ? {
28 xtype
: 'proxmoxWindowEdit',
29 subject
: gettext('Name'),
37 fieldLabel
: gettext('Name'),
40 onGetValues: function(values
) {
42 if (values
.name
=== undefined ||
43 values
.name
=== null ||
45 params
= { 'delete': 'name' };
53 header
: gettext('Start at boot'),
55 renderer
: Proxmox
.Utils
.format_boolean
,
56 editor
: caps
.vms
['VM.Config.Options'] ? {
57 xtype
: 'proxmoxWindowEdit',
58 subject
: gettext('Start at boot'),
60 xtype
: 'proxmoxcheckbox',
64 deleteDefaultValue
: true,
65 fieldLabel
: gettext('Start at boot'),
70 header
: gettext('Start/Shutdown order'),
72 renderer
: PVE
.Utils
.render_kvm_startup
,
73 editor
: caps
.vms
['VM.Config.Options'] && caps
.nodes
['Sys.Modify']
75 xtype
: 'pveWindowStartupEdit',
76 onlineHelp
: 'qm_startup_and_shutdown',
80 header
: gettext('OS Type'),
81 editor
: caps
.vms
['VM.Config.Options'] ? 'PVE.qemu.OSTypeEdit' : undefined,
82 renderer
: PVE
.Utils
.render_kvm_ostype
,
83 defaultValue
: 'other',
89 header
: gettext('Boot Order'),
91 editor
: caps
.vms
['VM.Config.Disk'] ? 'PVE.qemu.BootOrderEdit' : undefined,
92 multiKey
: ['boot', 'bootdisk'],
93 renderer: function(order
, metaData
, record
, rowIndex
, colIndex
, store
, pending
) {
94 if (/^\s*$/.test(order
)) {
95 return gettext('(No boot device selected)');
97 let boot
= PVE
.Parser
.parsePropertyString(order
, "legacy");
99 let list
= boot
.order
.split(';');
101 list
.forEach(dev
=> {
110 // legacy style and fallback
113 var bootdisk
= me
.getObjectValue('bootdisk', undefined, pending
);
114 order
= boot
.legacy
|| 'cdn';
115 for (i
= 0; i
< order
.length
; i
++) {
119 var sel
= order
.substring(i
, i
+ 1);
124 text
+= gettext('(no bootdisk)');
126 } else if (sel
=== 'n') {
127 text
+= gettext('any net');
128 } else if (sel
=== 'a') {
129 text
+= gettext('Floppy');
130 } else if (sel
=== 'd') {
131 text
+= gettext('any CD-ROM');
140 header
: gettext('Use tablet for pointer'),
142 renderer
: Proxmox
.Utils
.format_boolean
,
143 editor
: caps
.vms
['VM.Config.HWType'] ? {
144 xtype
: 'proxmoxWindowEdit',
145 subject
: gettext('Use tablet for pointer'),
147 xtype
: 'proxmoxcheckbox',
152 deleteDefaultValue
: true,
153 fieldLabel
: gettext('Enabled'),
158 header
: gettext('Hotplug'),
159 defaultValue
: 'disk,network,usb',
160 renderer
: PVE
.Utils
.render_hotplug_features
,
161 editor
: caps
.vms
['VM.Config.HWType'] ? {
162 xtype
: 'proxmoxWindowEdit',
163 subject
: gettext('Hotplug'),
165 xtype
: 'pveHotplugFeatureSelector',
169 fieldLabel
: gettext('Hotplug'),
175 header
: gettext('ACPI support'),
177 renderer
: Proxmox
.Utils
.format_boolean
,
178 editor
: caps
.vms
['VM.Config.HWType'] ? {
179 xtype
: 'proxmoxWindowEdit',
180 subject
: gettext('ACPI support'),
182 xtype
: 'proxmoxcheckbox',
187 deleteDefaultValue
: true,
188 fieldLabel
: gettext('Enabled'),
193 header
: gettext('KVM hardware virtualization'),
195 renderer
: Proxmox
.Utils
.format_boolean
,
196 editor
: caps
.vms
['VM.Config.HWType'] ? {
197 xtype
: 'proxmoxWindowEdit',
198 subject
: gettext('KVM hardware virtualization'),
200 xtype
: 'proxmoxcheckbox',
205 deleteDefaultValue
: true,
206 fieldLabel
: gettext('Enabled'),
211 header
: gettext('Freeze CPU at startup'),
213 renderer
: Proxmox
.Utils
.format_boolean
,
214 editor
: caps
.vms
['VM.PowerMgmt'] ? {
215 xtype
: 'proxmoxWindowEdit',
216 subject
: gettext('Freeze CPU at startup'),
218 xtype
: 'proxmoxcheckbox',
222 deleteDefaultValue
: true,
224 fieldLabel
: gettext('Freeze CPU at startup'),
229 header
: gettext('Use local time for RTC'),
230 defaultValue
: '__default__',
231 renderer
: PVE
.Utils
.render_localtime
,
232 editor
: caps
.vms
['VM.Config.Options'] ? {
233 xtype
: 'proxmoxWindowEdit',
234 subject
: gettext('Use local time for RTC'),
237 xtype
: 'proxmoxKVComboBox',
239 value
: '__default__',
241 ['__default__', PVE
.Utils
.render_localtime('__default__')],
242 [1, PVE
.Utils
.render_localtime(1)],
243 [0, PVE
.Utils
.render_localtime(0)],
246 fieldLabel
: gettext('Use local time for RTC'),
251 header
: gettext('RTC start date'),
253 editor
: caps
.vms
['VM.Config.Options'] ? {
254 xtype
: 'proxmoxWindowEdit',
255 subject
: gettext('RTC start date'),
257 xtype
: 'proxmoxtextfield',
261 fieldLabel
: gettext('RTC start date'),
262 vtype
: 'QemuStartDate',
268 header
: gettext('SMBIOS settings (type1)'),
270 renderer
: Ext
.String
.htmlEncode
,
271 editor
: caps
.vms
['VM.Config.HWType'] ? 'PVE.qemu.Smbios1Edit' : undefined,
274 header
: 'QEMU Guest Agent',
276 renderer
: PVE
.Utils
.render_qga_features
,
277 editor
: caps
.vms
['VM.Config.Options'] ? {
278 xtype
: 'proxmoxWindowEdit',
279 subject
: gettext('Qemu Agent'),
282 xtype
: 'pveAgentFeatureSelector',
288 header
: gettext('Protection'),
290 renderer
: Proxmox
.Utils
.format_boolean
,
291 editor
: caps
.vms
['VM.Config.Options'] ? {
292 xtype
: 'proxmoxWindowEdit',
293 subject
: gettext('Protection'),
295 xtype
: 'proxmoxcheckbox',
299 deleteDefaultValue
: true,
300 fieldLabel
: gettext('Enabled'),
304 spice_enhancements
: {
305 header
: gettext('Spice Enhancements'),
307 renderer
: PVE
.Utils
.render_spice_enhancements
,
308 editor
: caps
.vms
['VM.Config.Options'] ? {
309 xtype
: 'proxmoxWindowEdit',
310 subject
: gettext('Spice Enhancements'),
311 onlineHelp
: 'qm_spice_enhancements',
313 xtype
: 'pveSpiceEnhancementSelector',
314 name
: 'spice_enhancements',
319 header
: gettext('VM State storage'),
321 renderer
: val
=> val
|| gettext('Automatic'),
322 editor
: caps
.vms
['VM.Config.Options'] ? {
323 xtype
: 'proxmoxWindowEdit',
324 subject
: gettext('VM State storage'),
325 onlineHelp
: 'chapter_virtual_machines', // FIXME: use 'qm_vmstatestorage' once available
328 xtype
: 'pveStorageSelector',
329 storageContent
: 'images',
331 emptyText
: gettext("Automatic (Storage used by the VM, or 'local')"),
336 name
: 'vmstatestorage',
341 header
: gettext('Hookscript'),
345 var baseurl
= 'nodes/' + nodename
+ '/qemu/' + vmid
+ '/config';
347 var edit_btn
= new Ext
.Button({
348 text
: gettext('Edit'),
350 handler: function() { me
.run_editor(); },
353 var revert_btn
= new PVE
.button
.PendingRevert();
355 var set_button_status = function() {
356 var sm
= me
.getSelectionModel();
357 var rec
= sm
.getSelection()[0];
364 var key
= rec
.data
.key
;
365 var pending
= rec
.data
.delete || me
.hasPendingChanges(key
);
366 var rowdef
= rows
[key
];
368 edit_btn
.setDisabled(!rowdef
.editor
);
369 revert_btn
.setDisabled(!pending
);
373 url
: "/api2/json/nodes/" + nodename
+ "/qemu/" + vmid
+ "/pending",
376 tbar
: [edit_btn
, revert_btn
],
379 url
: "/api2/extjs/" + baseurl
,
382 itemdblclick
: me
.run_editor
,
383 selectionchange
: set_button_status
,
389 me
.on('activate', () => me
.rstore
.startUpdate());
390 me
.on('destroy', () => me
.rstore
.stopUpdate());
391 me
.on('deactivate', () => me
.rstore
.stopUpdate());
393 me
.mon(me
.getStore(), 'datachanged', function() {