]>
git.proxmox.com Git - pve-manager.git/blob - www/manager6/qemu/HardwareView.js
1 // fixme: howto avoid jslint type confusion?
2 /*jslint confusion: true */
3 Ext
.define('PVE.qemu.HardwareView', {
4 extend
: 'PVE.grid.PendingObjectGrid',
5 alias
: ['widget.PVE.qemu.HardwareView'],
7 renderKey: function(key
, metaData
, rec
, rowIndex
, colIndex
, store
) {
10 var rowdef
= rows
[key
] || {};
12 metaData
.tdAttr
= "valign=middle";
15 metaData
.tdCls
= rowdef
.tdCls
;
16 if (rowdef
.tdCls
== 'pve-itype-icon-storage') {
17 var value
= me
.getObjectValue(key
, '', true);
18 if (value
.match(/media=cdrom/)) {
19 metaData
.tdCls
= 'pve-itype-icon-cdrom';
20 return rowdef
.cdheader
;
24 return rowdef
.header
|| key
;
27 initComponent : function() {
31 var nodename
= me
.pveSelNode
.data
.node
;
33 throw "no node name specified";
36 var vmid
= me
.pveSelNode
.data
.vmid
;
38 throw "no VM ID specified";
41 var caps
= Ext
.state
.Manager
.get('GuiCap');
45 header
: gettext('Memory'),
46 editor
: caps
.vms
['VM.Config.Memory'] ? 'PVE.qemu.MemoryEdit' : undefined,
49 tdCls
: 'pve-itype-icon-memory',
50 renderer: function(value
, metaData
, record
) {
51 var balloon
= me
.getObjectValue('balloon');
53 return PVE
.Utils
.format_size(balloon
*1024*1024) + "/" +
54 PVE
.Utils
.format_size(value
*1024*1024);
57 return PVE
.Utils
.format_size(value
*1024*1024);
61 header
: gettext('Processors'),
63 editor
: (caps
.vms
['VM.Config.CPU'] || caps
.vms
['VM.Config.HWType']) ?
64 'PVE.qemu.ProcessorEdit' : undefined,
65 tdCls
: 'pve-itype-icon-processor',
67 multiKey
: ['sockets', 'cpu', 'cores', 'numa', 'vcpus', 'cpulimit', 'cpuunits'],
68 renderer: function(value
, metaData
, record
, rowIndex
, colIndex
, store
, pending
) {
70 var sockets
= me
.getObjectValue('sockets', 1, pending
);
71 var model
= me
.getObjectValue('cpu', undefined, pending
);
72 var cores
= me
.getObjectValue('cores', 1, pending
);
73 var numa
= me
.getObjectValue('numa', undefined, pending
);
74 var vcpus
= me
.getObjectValue('vcpus', undefined, pending
);
75 var cpulimit
= me
.getObjectValue('cpulimit', undefined, pending
);
76 var cpuunits
= me
.getObjectValue('cpuunits', undefined, pending
);
78 var res
= (sockets
*cores
) + ' (' + sockets
+ ' sockets, ' + cores
+ ' cores)';
81 res
+= ' [' + model
+ ']';
85 res
+= ' [numa=' + numa
+']';
89 res
+= ' [vcpus=' + vcpus
+']';
93 res
+= ' [cpulimit=' + cpulimit
+']';
97 res
+= ' [cpuunits=' + cpuunits
+']';
104 header
: gettext('Keyboard Layout'),
106 editor
: caps
.vms
['VM.Config.Options'] ? 'PVE.qemu.KeyboardEdit' : undefined,
107 tdCls
: 'pve-itype-icon-keyboard',
109 renderer
: PVE
.Utils
.render_kvm_language
112 header
: gettext('Display'),
113 editor
: caps
.vms
['VM.Config.HWType'] ? 'PVE.qemu.DisplayEdit' : undefined,
115 tdCls
: 'pve-itype-icon-display',
117 renderer
: PVE
.Utils
.render_kvm_vga_driver
146 for (i
= 0; i
< 4; i
++) {
150 tdCls
: 'pve-itype-icon-storage',
151 editor
: 'PVE.qemu.HDEdit',
152 never_delete
: caps
.vms
['VM.Config.Disk'] ? false : true,
153 header
: gettext('Hard Disk') + ' (' + confid
+')',
154 cdheader
: gettext('CD/DVD Drive') + ' (' + confid
+')'
157 for (i
= 0; i
< 6; i
++) {
161 tdCls
: 'pve-itype-icon-storage',
162 editor
: 'PVE.qemu.HDEdit',
163 never_delete
: caps
.vms
['VM.Config.Disk'] ? false : true,
164 header
: gettext('Hard Disk') + ' (' + confid
+')',
165 cdheader
: gettext('CD/DVD Drive') + ' (' + confid
+')'
168 for (i
= 0; i
< 16; i
++) {
172 tdCls
: 'pve-itype-icon-storage',
173 editor
: 'PVE.qemu.HDEdit',
174 never_delete
: caps
.vms
['VM.Config.Disk'] ? false : true,
175 header
: gettext('Hard Disk') + ' (' + confid
+')',
176 cdheader
: gettext('CD/DVD Drive') + ' (' + confid
+')'
179 for (i
= 0; i
< 16; i
++) {
180 confid
= "virtio" + i
;
183 tdCls
: 'pve-itype-icon-storage',
184 editor
: 'PVE.qemu.HDEdit',
185 never_delete
: caps
.vms
['VM.Config.Disk'] ? false : true,
186 header
: gettext('Hard Disk') + ' (' + confid
+')',
187 cdheader
: gettext('CD/DVD Drive') + ' (' + confid
+')'
190 for (i
= 0; i
< 32; i
++) {
194 tdCls
: 'pve-itype-icon-network',
195 editor
: caps
.vms
['VM.Config.Network'] ? 'PVE.qemu.NetworkEdit' : undefined,
196 never_delete
: caps
.vms
['VM.Config.Network'] ? false : true,
197 header
: gettext('Network Device') + ' (' + confid
+')'
202 tdCls
: 'pve-itype-icon-storage',
204 never_delete
: caps
.vms
['VM.Config.Disk'] ? false : true,
205 header
: gettext('EFI Disk')
207 for (i
= 0; i
< 8; i
++) {
208 rows
["unused" + i
] = {
210 tdCls
: 'pve-itype-icon-storage',
211 editor
: caps
.vms
['VM.Config.Disk'] ? 'PVE.qemu.HDEdit' : undefined,
212 header
: gettext('Unused Disk') + ' ' + i
216 var sorterFn = function(rec1
, rec2
) {
217 var v1
= rec1
.data
.key
;
218 var v2
= rec2
.data
.key
;
219 var g1
= rows
[v1
].group
|| 0;
220 var g2
= rows
[v2
].group
|| 0;
223 (g1
> g2
? 1 : -1) : (v1
> v2
? 1 : (v1
< v2
? -1 : 0));
226 var reload = function() {
230 var baseurl
= 'nodes/' + nodename
+ '/qemu/' + vmid
+ '/config';
232 var sm
= Ext
.create('Ext.selection.RowModel', {});
234 var run_editor = function() {
235 var rec
= sm
.getSelection()[0];
240 var rowdef
= rows
[rec
.data
.key
];
241 if (!rowdef
.editor
) {
245 var editor
= rowdef
.editor
;
246 if (rowdef
.tdCls
== 'pve-itype-icon-storage') {
247 var value
= me
.getObjectValue(rec
.data
.key
, '', true);
248 if (value
.match(/media=cdrom/)) {
249 editor
= 'PVE.qemu.CDEdit';
255 if (Ext
.isString(editor
)) {
256 win
= Ext
.create(editor
, {
257 pveSelNode
: me
.pveSelNode
,
258 confid
: rec
.data
.key
,
259 url
: '/api2/extjs/' + baseurl
262 var config
= Ext
.apply({
263 pveSelNode
: me
.pveSelNode
,
264 confid
: rec
.data
.key
,
265 url
: '/api2/extjs/' + baseurl
267 win
= Ext
.createWidget(rowdef
.editor
.xtype
, config
);
272 win
.on('destroy', reload
);
275 var run_diskthrottle = function() {
276 var rec
= sm
.getSelection()[0];
281 var win
= Ext
.create('PVE.qemu.HDThrottle', {
282 pveSelNode
: me
.pveSelNode
,
283 confid
: rec
.data
.key
,
284 url
: '/api2/extjs/' + baseurl
288 win
.on('destroy', reload
);
291 var run_resize = function() {
292 var rec
= sm
.getSelection()[0];
297 var win
= Ext
.create('PVE.window.HDResize', {
305 win
.on('destroy', reload
);
308 var run_cpuoptions = function() {
309 var sockets
= me
.getObjectValue('sockets', 1);
310 var cores
= me
.getObjectValue('cores', 1);
312 var win
= Ext
.create('PVE.qemu.CPUOptions', {
313 maxvcpus
: sockets
* cores
,
315 pveSelNode
: me
.pveSelNode
,
316 url
: '/api2/extjs/' + baseurl
321 win
.on('destroy', reload
);
324 var run_move = function() {
325 var rec
= sm
.getSelection()[0];
330 var win
= Ext
.create('PVE.window.HDMove', {
338 win
.on('destroy', reload
);
341 var edit_btn
= new PVE
.button
.Button({
342 text
: gettext('Edit'),
348 var resize_btn
= new PVE
.button
.Button({
349 text
: gettext('Resize disk'),
355 var move_btn
= new PVE
.button
.Button({
356 text
: gettext('Move disk'),
362 var diskthrottle_btn
= new PVE
.button
.Button({
363 text
: gettext('Disk Throttle'),
366 handler
: run_diskthrottle
369 var cpuoptions_btn
= new Ext
.Button({
370 text
: gettext('CPU options'),
371 handler
: run_cpuoptions
374 var remove_btn
= new PVE
.button
.Button({
375 text
: gettext('Remove'),
379 confirmMsg: function(rec
) {
380 var msg
= Ext
.String
.format(gettext('Are you sure you want to remove entry {0}'),
381 "'" + me
.renderKey(rec
.data
.key
, {}, rec
) + "'");
382 if (rec
.data
.key
.match(/^unused\d+$/)) {
383 msg
+= " " + gettext('This will permanently erase all data.');
388 handler: function(b
, e
, rec
) {
389 PVE
.Utils
.API2Request({
390 url
: '/api2/extjs/' + baseurl
,
394 'delete': rec
.data
.key
396 callback: function() {
399 failure: function (response
, opts
) {
400 Ext
.Msg
.alert('Error', response
.htmlStatus
);
406 var revert_btn
= new PVE
.button
.Button({
407 text
: gettext('Revert'),
410 handler: function(b
, e
, rec
) {
411 var rowdef
= me
.rows
[rec
.data
.key
] || {};
412 var keys
= rowdef
.multiKey
|| [ rec
.data
.key
];
413 var revert
= keys
.join(',');
414 PVE
.Utils
.API2Request({
415 url
: '/api2/extjs/' + baseurl
,
421 callback: function() {
424 failure: function (response
, opts
) {
425 Ext
.Msg
.alert('Error',response
.htmlStatus
);
431 var set_button_status = function() {
432 var sm
= me
.getSelectionModel();
433 var rec
= sm
.getSelection()[0];
436 remove_btn
.disable();
438 resize_btn
.disable();
440 diskthrottle_btn
.disable();
441 revert_btn
.disable();
444 var key
= rec
.data
.key
;
445 var value
= rec
.data
.value
;
446 var rowdef
= rows
[key
];
448 var pending
= rec
.data
['delete'] || me
.hasPendingChanges(key
);
449 var isDisk
= !key
.match(/^unused\d+/) &&
450 rowdef
.tdCls
== 'pve-itype-icon-storage' &&
451 (value
&& !value
.match(/media=cdrom/));
453 remove_btn
.setDisabled(rec
.data
['delete'] || (rowdef
.never_delete
=== true));
455 edit_btn
.setDisabled(rec
.data
['delete'] || !rowdef
.editor
);
457 resize_btn
.setDisabled(pending
|| !isDisk
);
459 move_btn
.setDisabled(pending
|| !isDisk
);
461 diskthrottle_btn
.setDisabled(pending
|| !isDisk
);
463 revert_btn
.setDisabled(!pending
);
468 url
: '/api2/json/' + 'nodes/' + nodename
+ '/qemu/' + vmid
+ '/pending',
473 text
: gettext('Add'),
474 menu
: new Ext
.menu
.Menu({
477 text
: gettext('Hard Disk'),
478 iconCls
: 'pve-itype-icon-storage',
479 disabled
: !caps
.vms
['VM.Config.Disk'],
480 handler: function() {
481 var win
= Ext
.create('PVE.qemu.HDEdit', {
482 url
: '/api2/extjs/' + baseurl
,
483 pveSelNode
: me
.pveSelNode
485 win
.on('destroy', reload
);
490 text
: gettext('CD/DVD Drive'),
491 iconCls
: 'pve-itype-icon-cdrom',
492 disabled
: !caps
.vms
['VM.Config.Disk'],
493 handler: function() {
494 var win
= Ext
.create('PVE.qemu.CDEdit', {
495 url
: '/api2/extjs/' + baseurl
,
496 pveSelNode
: me
.pveSelNode
498 win
.on('destroy', reload
);
503 text
: gettext('Network Device'),
504 iconCls
: 'pve-itype-icon-network',
505 disabled
: !caps
.vms
['VM.Config.Network'],
506 handler: function() {
507 var win
= Ext
.create('PVE.qemu.NetworkEdit', {
508 url
: '/api2/extjs/' + baseurl
,
509 pveSelNode
: me
.pveSelNode
511 win
.on('destroy', reload
);
529 itemdblclick
: run_editor
,
530 selectionchange
: set_button_status
536 me
.on('activate', me
.rstore
.startUpdate
);
537 me
.on('destroy', me
.rstore
.stopUpdate
);
539 me
.mon(me
.rstore
, 'refresh', function() {