]>
git.proxmox.com Git - pve-manager.git/blob - www/manager/qemu/HardwareView.js
89f2f4e53cf9d9a1720ee979a814a496205ee2ad
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
+')'
200 for (i
= 0; i
< 8; i
++) {
201 rows
["unused" + i
] = {
203 tdCls
: 'pve-itype-icon-storage',
204 editor
: caps
.vms
['VM.Config.Disk'] ? 'PVE.qemu.HDEdit' : undefined,
205 header
: gettext('Unused Disk') + ' ' + i
209 var sorterFn = function(rec1
, rec2
) {
210 var v1
= rec1
.data
.key
;
211 var v2
= rec2
.data
.key
;
212 var g1
= rows
[v1
].group
|| 0;
213 var g2
= rows
[v2
].group
|| 0;
216 (g1
> g2
? 1 : -1) : (v1
> v2
? 1 : (v1
< v2
? -1 : 0));
219 var reload = function() {
223 var baseurl
= 'nodes/' + nodename
+ '/qemu/' + vmid
+ '/config';
225 var sm
= Ext
.create('Ext.selection.RowModel', {});
227 var run_editor = function() {
228 var rec
= sm
.getSelection()[0];
233 var rowdef
= rows
[rec
.data
.key
];
234 if (!rowdef
.editor
) {
238 var editor
= rowdef
.editor
;
239 if (rowdef
.tdCls
== 'pve-itype-icon-storage') {
240 var value
= me
.getObjectValue(rec
.data
.key
, '', true);
241 if (value
.match(/media=cdrom/)) {
242 editor
= 'PVE.qemu.CDEdit';
248 if (Ext
.isString(editor
)) {
249 win
= Ext
.create(editor
, {
250 pveSelNode
: me
.pveSelNode
,
251 confid
: rec
.data
.key
,
252 url
: '/api2/extjs/' + baseurl
255 var config
= Ext
.apply({
256 pveSelNode
: me
.pveSelNode
,
257 confid
: rec
.data
.key
,
258 url
: '/api2/extjs/' + baseurl
260 win
= Ext
.createWidget(rowdef
.editor
.xtype
, config
);
265 win
.on('destroy', reload
);
268 var run_diskthrottle = function() {
269 var rec
= sm
.getSelection()[0];
274 var win
= Ext
.create('PVE.qemu.HDThrottle', {
275 pveSelNode
: me
.pveSelNode
,
276 confid
: rec
.data
.key
,
277 url
: '/api2/extjs/' + baseurl
281 win
.on('destroy', reload
);
284 var run_resize = function() {
285 var rec
= sm
.getSelection()[0];
290 var win
= Ext
.create('PVE.window.HDResize', {
298 win
.on('destroy', reload
);
301 var run_cpuoptions = function() {
302 var sockets
= me
.getObjectValue('sockets', 1);
303 var cores
= me
.getObjectValue('cores', 1);
305 var win
= Ext
.create('PVE.qemu.CPUOptions', {
306 maxvcpus
: sockets
* cores
,
308 pveSelNode
: me
.pveSelNode
,
309 url
: '/api2/extjs/' + baseurl
314 win
.on('destroy', reload
);
317 var run_move = function() {
318 var rec
= sm
.getSelection()[0];
323 var win
= Ext
.create('PVE.window.HDMove', {
331 win
.on('destroy', reload
);
334 var edit_btn
= new PVE
.button
.Button({
335 text
: gettext('Edit'),
341 var resize_btn
= new PVE
.button
.Button({
342 text
: gettext('Resize disk'),
348 var move_btn
= new PVE
.button
.Button({
349 text
: gettext('Move disk'),
355 var diskthrottle_btn
= new PVE
.button
.Button({
356 text
: gettext('Disk Throttle'),
359 handler
: run_diskthrottle
362 var cpuoptions_btn
= new Ext
.Button({
363 text
: gettext('CPU options'),
364 handler
: run_cpuoptions
367 var remove_btn
= new PVE
.button
.Button({
368 text
: gettext('Remove'),
372 confirmMsg: function(rec
) {
373 var msg
= Ext
.String
.format(gettext('Are you sure you want to remove entry {0}'),
374 "'" + me
.renderKey(rec
.data
.key
, {}, rec
) + "'");
375 if (rec
.data
.key
.match(/^unused\d+$/)) {
376 msg
+= " " + gettext('This will permanently erase all image data.');
381 handler: function(b
, e
, rec
) {
382 PVE
.Utils
.API2Request({
383 url
: '/api2/extjs/' + baseurl
,
387 'delete': rec
.data
.key
389 callback: function() {
392 failure: function (response
, opts
) {
393 Ext
.Msg
.alert('Error', response
.htmlStatus
);
399 var revert_btn
= new PVE
.button
.Button({
400 text
: gettext('Revert'),
403 handler: function(b
, e
, rec
) {
404 var rowdef
= me
.rows
[rec
.data
.key
] || {};
405 var keys
= rowdef
.multiKey
|| [ rec
.data
.key
];
406 var revert
= keys
.join(',');
407 PVE
.Utils
.API2Request({
408 url
: '/api2/extjs/' + baseurl
,
414 callback: function() {
417 failure: function (response
, opts
) {
418 Ext
.Msg
.alert('Error',response
.htmlStatus
);
424 var set_button_status = function() {
425 var sm
= me
.getSelectionModel();
426 var rec
= sm
.getSelection()[0];
429 remove_btn
.disable();
431 resize_btn
.disable();
433 diskthrottle_btn
.disable();
434 revert_btn
.disable();
437 var key
= rec
.data
.key
;
438 var value
= rec
.data
.value
;
439 var rowdef
= rows
[key
];
441 var pending
= rec
.data
['delete'] || me
.hasPendingChanges(key
);
442 var isDisk
= !key
.match(/^unused\d+/) &&
443 (rowdef
.tdCls
== 'pve-itype-icon-storage' && !value
.match(/media=cdrom/));
445 remove_btn
.setDisabled(rec
.data
['delete'] || (rowdef
.never_delete
=== true));
447 edit_btn
.setDisabled(rec
.data
['delete'] || !rowdef
.editor
);
449 resize_btn
.setDisabled(pending
|| !isDisk
);
451 move_btn
.setDisabled(pending
|| !isDisk
);
453 diskthrottle_btn
.setDisabled(pending
|| !isDisk
);
455 revert_btn
.setDisabled(!pending
);
460 url
: '/api2/json/' + 'nodes/' + nodename
+ '/qemu/' + vmid
+ '/pending',
466 text
: gettext('Add'),
467 menu
: new Ext
.menu
.Menu({
470 text
: gettext('Hard Disk'),
471 iconCls
: 'pve-itype-icon-storage',
472 disabled
: !caps
.vms
['VM.Config.Disk'],
473 handler: function() {
474 var win
= Ext
.create('PVE.qemu.HDEdit', {
475 url
: '/api2/extjs/' + baseurl
,
476 pveSelNode
: me
.pveSelNode
478 win
.on('destroy', reload
);
483 text
: gettext('CD/DVD Drive'),
484 iconCls
: 'pve-itype-icon-cdrom',
485 disabled
: !caps
.vms
['VM.Config.Disk'],
486 handler: function() {
487 var win
= Ext
.create('PVE.qemu.CDEdit', {
488 url
: '/api2/extjs/' + baseurl
,
489 pveSelNode
: me
.pveSelNode
491 win
.on('destroy', reload
);
496 text
: gettext('Network Device'),
497 iconCls
: 'pve-itype-icon-network',
498 disabled
: !caps
.vms
['VM.Config.Network'],
499 handler: function() {
500 var win
= Ext
.create('PVE.qemu.NetworkEdit', {
501 url
: '/api2/extjs/' + baseurl
,
502 pveSelNode
: me
.pveSelNode
504 win
.on('destroy', reload
);
522 itemdblclick
: run_editor
,
523 selectionchange
: set_button_status
529 me
.on('show', me
.rstore
.startUpdate
);
530 me
.on('hide', me
.rstore
.stopUpdate
);
531 me
.on('destroy', me
.rstore
.stopUpdate
);
533 me
.rstore
.on('datachanged', function() {