]> git.proxmox.com Git - pve-manager.git/blame - www/manager6/lxc/Resources.js
lxc/ResoureEdit: move some cpu fields to advanced options
[pve-manager.git] / www / manager6 / lxc / Resources.js
CommitLineData
c7ee0c11
DM
1/*jslint confusion: true */
2Ext.define('PVE.lxc.RessourceView', {
8ea2c870 3 extend: 'Proxmox.grid.ObjectGrid',
c7ee0c11
DM
4 alias: ['widget.pveLxcRessourceView'],
5
ba93a9c6
DC
6 onlineHelp: 'pct_configuration',
7
c7ee0c11
DM
8 renderKey: function(key, metaData, rec, rowIndex, colIndex, store) {
9 var me = this;
14dd743b 10 var rowdef = me.rows[key] || {};
c7ee0c11
DM
11
12 metaData.tdAttr = "valign=middle";
c7ee0c11
DM
13 if (rowdef.tdCls) {
14 metaData.tdCls = rowdef.tdCls;
c7ee0c11
DM
15 }
16 return rowdef.header || key;
17 },
18
19 initComponent : function() {
20 var me = this;
21 var i, confid;
22
23 var nodename = me.pveSelNode.data.node;
24 if (!nodename) {
25 throw "no node name specified";
26 }
27
28 var vmid = me.pveSelNode.data.vmid;
29 if (!vmid) {
30 throw "no VM ID specified";
31 }
32
33 var caps = Ext.state.Manager.get('GuiCap');
34
35 var mpeditor = caps.vms['VM.Config.Disk'] ? 'PVE.lxc.MountPointEdit' : undefined;
36
37 var rows = {
38 memory: {
39 header: gettext('Memory'),
40 editor: caps.vms['VM.Config.Memory'] ? 'PVE.lxc.MemoryEdit' : undefined,
c7ee0c11
DM
41 defaultValue: 512,
42 tdCls: 'pve-itype-icon-memory',
43 renderer: function(value) {
e7ade592 44 return Proxmox.Utils.format_size(value*1024*1024);
c7ee0c11
DM
45 }
46 },
47 swap: {
48 header: gettext('Swap'),
49 editor: caps.vms['VM.Config.Memory'] ? 'PVE.lxc.MemoryEdit' : undefined,
c7ee0c11
DM
50 defaultValue: 512,
51 tdCls: 'pve-itype-icon-swap',
52 renderer: function(value) {
e7ade592 53 return Proxmox.Utils.format_size(value*1024*1024);
c7ee0c11
DM
54 }
55 },
92b5029f
DM
56 cores: {
57 header: gettext('Cores'),
92b5029f
DM
58 editor: caps.vms['VM.Config.CPU'] ? 'PVE.lxc.CPUEdit' : undefined,
59 defaultValue: '',
60 tdCls: 'pve-itype-icon-processor',
61 renderer: function(value) {
62 if (value) { return value; }
63 return gettext('unlimited');
64 }
65 },
c7ee0c11
DM
66 cpulimit: {
67 header: gettext('CPU limit'),
c7ee0c11 68 editor: caps.vms['VM.Config.CPU'] ? 'PVE.lxc.CPUEdit' : undefined,
203fd348 69 defaultValue: 0,
c7ee0c11
DM
70 tdCls: 'pve-itype-icon-processor',
71 renderer: function(value) {
203fd348 72 if (value > 0) { return value; }
c7ee0c11
DM
73 return gettext('unlimited');
74 }
75 },
76 cpuunits: {
77 header: gettext('CPU units'),
c7ee0c11
DM
78 editor: caps.vms['VM.Config.CPU'] ? 'PVE.lxc.CPUEdit' : undefined,
79 defaultValue: 1024,
80 tdCls: 'pve-itype-icon-processor'
81 },
82 rootfs: {
83 header: gettext('Root Disk'),
e7ade592 84 defaultValue: Proxmox.Utils.noneText,
c7ee0c11
DM
85 editor: mpeditor,
86 tdCls: 'pve-itype-icon-storage'
c15e9cd5
PA
87 },
88 unprivileged: {
89 visible: false
c7ee0c11
DM
90 }
91 };
92
93 for (i = 0; i < 10; i++) {
94 confid = "mp" + i;
95 rows[confid] = {
96 group: 1,
97 tdCls: 'pve-itype-icon-storage',
98 editor: mpeditor,
99 header: gettext('Mount Point') + ' (' + confid + ')'
100 };
101 }
102
103 for (i = 0; i < 8; i++) {
104 confid = "unused" + i;
105 rows[confid] = {
106 group: 1,
107 tdCls: 'pve-itype-icon-storage',
108 editor: mpeditor,
109 header: gettext('Unused Disk') + ' ' + i
110 };
111 }
112
c7ee0c11
DM
113 var baseurl = 'nodes/' + nodename + '/lxc/' + vmid + '/config';
114
14dd743b 115 me.selModel = Ext.create('Ext.selection.RowModel', {});
c7ee0c11
DM
116
117 var run_resize = function() {
14dd743b 118 var rec = me.selModel.getSelection()[0];
c7ee0c11
DM
119 if (!rec) {
120 return;
121 }
122
123 var win = Ext.create('PVE.window.MPResize', {
124 disk: rec.data.key,
125 nodename: nodename,
126 vmid: vmid
127 });
128
129 win.show();
c7ee0c11
DM
130 };
131
132 var run_remove = function(b, e, rec) {
e7ade592 133 Proxmox.Utils.API2Request({
c7ee0c11
DM
134 url: '/api2/extjs/' + baseurl,
135 waitMsgTarget: me,
136 method: 'PUT',
137 params: {
138 'delete': rec.data.key
139 },
c7ee0c11
DM
140 failure: function (response, opts) {
141 Ext.Msg.alert('Error', response.htmlStatus);
142 }
143 });
144 };
145
5720fafa 146 var edit_btn = new Proxmox.button.Button({
c7ee0c11 147 text: gettext('Edit'),
14dd743b 148 selModel: me.selModel,
c7ee0c11
DM
149 disabled: true,
150 enableFn: function(rec) {
151 if (!rec) {
152 return false;
153 }
154 var rowdef = rows[rec.data.key];
155 return !!rowdef.editor;
156 },
8cd96756 157 handler: function() { me.run_editor(); }
c7ee0c11
DM
158 });
159
5720fafa 160 var resize_btn = new Proxmox.button.Button({
c7ee0c11 161 text: gettext('Resize disk'),
14dd743b 162 selModel: me.selModel,
c7ee0c11
DM
163 disabled: true,
164 handler: run_resize
165 });
166
5720fafa 167 var remove_btn = new Proxmox.button.Button({
c7ee0c11 168 text: gettext('Remove'),
14dd743b 169 selModel: me.selModel,
c7ee0c11
DM
170 disabled: true,
171 dangerous: true,
172 confirmMsg: function(rec) {
173 var msg = Ext.String.format(gettext('Are you sure you want to remove entry {0}'),
174 "'" + me.renderKey(rec.data.key, {}, rec) + "'");
175 if (rec.data.key.match(/^unused\d+$/)) {
16152937 176 msg += " " + gettext('This will permanently erase all data.');
c7ee0c11
DM
177 }
178
179 return msg;
180 },
181 handler: run_remove
182 });
183
184 var set_button_status = function() {
14dd743b 185 var rec = me.selModel.getSelection()[0];
c7ee0c11
DM
186
187 if (!rec) {
188 edit_btn.disable();
189 remove_btn.disable();
190 resize_btn.disable();
191 return;
192 }
193 var key = rec.data.key;
194 var value = rec.data.value;
195 var rowdef = rows[key];
196
197 var isDisk = (rowdef.tdCls == 'pve-itype-icon-storage');
198
199 var noedit = rec.data['delete'] || !rowdef.editor;
35a04562 200 if (!noedit && Proxmox.UserName !== 'root@pam' && key.match(/^mp\d+$/)) {
c7ee0c11
DM
201 var mp = PVE.Parser.parseLxcMountPoint(value);
202 if (mp.type !== 'volume') {
203 noedit = true;
204 }
205 }
206 edit_btn.setDisabled(noedit);
207
208 remove_btn.setDisabled(!isDisk || rec.data.key === 'rootfs');
209 resize_btn.setDisabled(!isDisk);
210
211 };
212
f7993618 213 Ext.apply(me, {
c7ee0c11 214 url: '/api2/json/' + baseurl,
14dd743b
TL
215 selModel: me.selModel,
216 interval: 2000,
c7ee0c11
DM
217 cwidth1: 170,
218 tbar: [
219 {
220 text: gettext('Add'),
221 menu: new Ext.menu.Menu({
222 items: [
223 {
224 text: gettext('Mount Point'),
225 iconCls: 'pve-itype-icon-storage',
226 disabled: !caps.vms['VM.Config.Disk'],
227 handler: function() {
228 var win = Ext.create('PVE.lxc.MountPointEdit', {
229 url: '/api2/extjs/' + baseurl,
c15e9cd5 230 unprivileged: me.getObjectValue('unprivileged'),
c7ee0c11
DM
231 pveSelNode: me.pveSelNode
232 });
c7ee0c11
DM
233 win.show();
234 }
235 }
236 ]
237 })
238 },
239 edit_btn,
240 remove_btn,
241 resize_btn
242 ],
243 rows: rows,
14dd743b
TL
244 editorConfig: {
245 pveSelNode: me.pveSelNode,
246 url: '/api2/extjs/' + baseurl
247 },
c7ee0c11 248 listeners: {
14dd743b 249 itemdblclick: me.run_editor,
c7ee0c11
DM
250 selectionchange: set_button_status
251 }
252 });
253
254 me.callParent();
14dd743b
TL
255
256 me.on('activate', me.rstore.startUpdate);
257 me.on('destroy', me.rstore.stopUpdate);
258 me.on('deactivate', me.rstore.stopUpdate);
259
260 Ext.apply(me.editorConfig, { unprivileged: me.getObjectValue('unprivileged') });
c7ee0c11
DM
261 }
262});