]>
git.proxmox.com Git - pve-manager.git/blob - www/manager6/lxc/Resources.js
1 /*jslint confusion: true */
2 Ext
.define('PVE.lxc.RessourceView', {
3 extend
: 'Proxmox.grid.PendingObjectGrid',
4 alias
: ['widget.pveLxcRessourceView'],
6 onlineHelp
: 'pct_configuration',
8 renderKey: function(key
, metaData
, rec
, rowIndex
, colIndex
, store
) {
10 var rowdef
= me
.rows
[key
] || {};
12 metaData
.tdAttr
= "valign=middle";
14 metaData
.tdCls
= rowdef
.tdCls
;
16 return rowdef
.header
|| key
;
19 initComponent : function() {
23 var nodename
= me
.pveSelNode
.data
.node
;
25 throw "no node name specified";
28 var vmid
= me
.pveSelNode
.data
.vmid
;
30 throw "no VM ID specified";
33 var caps
= Ext
.state
.Manager
.get('GuiCap');
34 var diskCap
= caps
.vms
['VM.Config.Disk'];
36 var mpeditor
= caps
.vms
['VM.Config.Disk'] ? 'PVE.lxc.MountPointEdit' : undefined;
40 header
: gettext('Memory'),
41 editor
: caps
.vms
['VM.Config.Memory'] ? 'PVE.lxc.MemoryEdit' : undefined,
43 tdCls
: 'pve-itype-icon-memory',
45 renderer: function(value
) {
46 return Proxmox
.Utils
.format_size(value
*1024*1024);
50 header
: gettext('Swap'),
51 editor
: caps
.vms
['VM.Config.Memory'] ? 'PVE.lxc.MemoryEdit' : undefined,
53 tdCls
: 'pve-itype-icon-swap',
55 renderer: function(value
) {
56 return Proxmox
.Utils
.format_size(value
*1024*1024);
60 header
: gettext('Cores'),
61 editor
: caps
.vms
['VM.Config.CPU'] ? 'PVE.lxc.CPUEdit' : undefined,
63 tdCls
: 'pve-itype-icon-processor',
65 renderer: function(value
) {
66 var cpulimit
= me
.getObjectValue('cpulimit');
67 var cpuunits
= me
.getObjectValue('cpuunits');
72 res
= gettext('unlimited');
76 res
+= ' [cpulimit=' + cpulimit
+ ']';
80 res
+= ' [cpuunits=' + cpuunits
+ ']';
86 header
: gettext('Root Disk'),
87 defaultValue
: Proxmox
.Utils
.noneText
,
89 tdCls
: 'pve-itype-icon-storage',
103 PVE
.Utils
.forEachMP(function(bus
, i
) {
108 header
= gettext('Mount Point') + ' (' + confid
+ ')';
110 header
= gettext('Unused Disk') + ' ' + i
;
116 tdCls
: 'pve-itype-icon-storage',
122 var baseurl
= 'nodes/' + nodename
+ '/lxc/' + vmid
+ '/config';
124 me
.selModel
= Ext
.create('Ext.selection.RowModel', {});
126 var run_resize = function() {
127 var rec
= me
.selModel
.getSelection()[0];
132 var win
= Ext
.create('PVE.window.MPResize', {
141 var run_remove = function(b
, e
, rec
) {
142 Proxmox
.Utils
.API2Request({
143 url
: '/api2/extjs/' + baseurl
,
147 'delete': rec
.data
.key
149 failure: function (response
, opts
) {
150 Ext
.Msg
.alert('Error', response
.htmlStatus
);
155 var run_move = function(b
, e
, rec
) {
160 var win
= Ext
.create('PVE.window.HDMove', {
169 win
.on('destroy', me
.reload
, me
);
172 var edit_btn
= new Proxmox
.button
.Button({
173 text
: gettext('Edit'),
174 selModel
: me
.selModel
,
176 enableFn: function(rec
) {
180 var rowdef
= rows
[rec
.data
.key
];
181 return !!rowdef
.editor
;
183 handler: function() { me
.run_editor(); }
186 var resize_btn
= new Proxmox
.button
.Button({
187 text
: gettext('Resize disk'),
188 selModel
: me
.selModel
,
193 var remove_btn
= new Proxmox
.button
.Button({
194 text
: gettext('Remove'),
195 selModel
: me
.selModel
,
198 confirmMsg: function(rec
) {
199 var msg
= Ext
.String
.format(gettext('Are you sure you want to remove entry {0}'),
200 "'" + me
.renderKey(rec
.data
.key
, {}, rec
) + "'");
201 if (rec
.data
.key
.match(/^unused\d+$/)) {
202 msg
+= " " + gettext('This will permanently erase all data.');
210 var move_btn
= new Proxmox
.button
.Button({
211 text
: gettext('Move Volume'),
212 selModel
: me
.selModel
,
218 var revert_btn
= new PVE
.button
.PendingRevert();
220 var set_button_status = function() {
221 var rec
= me
.selModel
.getSelection()[0];
225 remove_btn
.disable();
226 resize_btn
.disable();
227 revert_btn
.disable();
230 var key
= rec
.data
.key
;
231 var value
= rec
.data
.value
;
232 var rowdef
= rows
[key
];
234 var pending
= rec
.data
['delete'] || me
.hasPendingChanges(key
);
235 var isDisk
= (rowdef
.tdCls
== 'pve-itype-icon-storage');
236 var isUnusedDisk
= key
.match(/^unused\d+/);
238 var noedit
= rec
.data
['delete'] || !rowdef
.editor
;
239 if (!noedit
&& Proxmox
.UserName
!== 'root@pam' && key
.match(/^mp\d+$/)) {
240 var mp
= PVE
.Parser
.parseLxcMountPoint(value
);
241 if (mp
.type
!== 'volume') {
245 edit_btn
.setDisabled(noedit
);
247 remove_btn
.setDisabled(!isDisk
|| rec
.data
.key
=== 'rootfs' || !diskCap
|| pending
);
248 resize_btn
.setDisabled(!isDisk
|| !diskCap
|| isUnusedDisk
);
249 move_btn
.setDisabled(!isDisk
|| !diskCap
);
250 revert_btn
.setDisabled(!pending
);
254 var sorterFn = function(rec1
, rec2
) {
255 var v1
= rec1
.data
.key
;
256 var v2
= rec2
.data
.key
;
257 var g1
= rows
[v1
].group
|| 0;
258 var g2
= rows
[v2
].group
|| 0;
259 var order1
= rows
[v1
].order
|| 0;
260 var order2
= rows
[v2
].order
|| 0;
262 if ((g1
- g2
) !== 0) {
266 if ((order1
- order2
) !== 0) {
267 return order1
- order2
;
272 } else if (v1
< v2
) {
280 url
: "/api2/json/nodes/" + nodename
+ "/lxc/" + vmid
+ "/pending",
281 selModel
: me
.selModel
,
286 text
: gettext('Add'),
287 menu
: new Ext
.menu
.Menu({
290 text
: gettext('Mount Point'),
291 iconCls
: 'pve-itype-icon-storage',
292 disabled
: !caps
.vms
['VM.Config.Disk'],
293 handler: function() {
294 var win
= Ext
.create('PVE.lxc.MountPointEdit', {
295 url
: '/api2/extjs/' + baseurl
,
296 unprivileged
: me
.getObjectValue('unprivileged'),
297 pveSelNode
: me
.pveSelNode
299 win
.on('destroy', me
.reload
, me
);
315 pveSelNode
: me
.pveSelNode
,
316 url
: '/api2/extjs/' + baseurl
319 itemdblclick
: me
.run_editor
,
320 selectionchange
: set_button_status
326 me
.on('activate', me
.rstore
.startUpdate
);
327 me
.on('destroy', me
.rstore
.stopUpdate
);
328 me
.on('deactivate', me
.rstore
.stopUpdate
);
330 me
.mon(me
.getStore(), 'datachanged', function() {
334 Ext
.apply(me
.editorConfig
, { unprivileged
: me
.getObjectValue('unprivileged') });