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