]>
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) { | |
50 | return PVE.Utils.format_size(value*1024*1024); | |
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) { | |
60 | return PVE.Utils.format_size(value*1024*1024); | |
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'), | |
94 | defaultValue: PVE.Utils.noneText, | |
95 | editor: mpeditor, | |
96 | tdCls: 'pve-itype-icon-storage' | |
97 | } | |
98 | }; | |
99 | ||
100 | for (i = 0; i < 10; i++) { | |
101 | confid = "mp" + i; | |
102 | rows[confid] = { | |
103 | group: 1, | |
104 | tdCls: 'pve-itype-icon-storage', | |
105 | editor: mpeditor, | |
106 | header: gettext('Mount Point') + ' (' + confid + ')' | |
107 | }; | |
108 | } | |
109 | ||
110 | for (i = 0; i < 8; i++) { | |
111 | confid = "unused" + i; | |
112 | rows[confid] = { | |
113 | group: 1, | |
114 | tdCls: 'pve-itype-icon-storage', | |
115 | editor: mpeditor, | |
116 | header: gettext('Unused Disk') + ' ' + i | |
117 | }; | |
118 | } | |
119 | ||
120 | var reload = function() { | |
121 | me.rstore.load(); | |
122 | }; | |
123 | ||
124 | var baseurl = 'nodes/' + nodename + '/lxc/' + vmid + '/config'; | |
125 | ||
126 | var sm = Ext.create('Ext.selection.RowModel', {}); | |
127 | ||
128 | var run_editor = function() { | |
129 | var rec = sm.getSelection()[0]; | |
130 | if (!rec) { | |
131 | return; | |
132 | } | |
133 | ||
134 | var rowdef = rows[rec.data.key]; | |
135 | if (!rowdef.editor) { | |
136 | return; | |
137 | } | |
138 | ||
139 | var editor = rowdef.editor; | |
140 | ||
141 | var win = Ext.create(editor, { | |
142 | pveSelNode: me.pveSelNode, | |
143 | confid: rec.data.key, | |
144 | url: '/api2/extjs/' + baseurl | |
145 | }); | |
146 | ||
147 | win.show(); | |
148 | win.on('destroy', reload); | |
149 | }; | |
150 | ||
151 | var run_resize = function() { | |
152 | var rec = sm.getSelection()[0]; | |
153 | if (!rec) { | |
154 | return; | |
155 | } | |
156 | ||
157 | var win = Ext.create('PVE.window.MPResize', { | |
158 | disk: rec.data.key, | |
159 | nodename: nodename, | |
160 | vmid: vmid | |
161 | }); | |
162 | ||
163 | win.show(); | |
164 | ||
165 | win.on('destroy', reload); | |
166 | }; | |
167 | ||
168 | var run_remove = function(b, e, rec) { | |
169 | PVE.Utils.API2Request({ | |
170 | url: '/api2/extjs/' + baseurl, | |
171 | waitMsgTarget: me, | |
172 | method: 'PUT', | |
173 | params: { | |
174 | 'delete': rec.data.key | |
175 | }, | |
176 | callback: function() { | |
177 | reload(); | |
178 | }, | |
179 | failure: function (response, opts) { | |
180 | Ext.Msg.alert('Error', response.htmlStatus); | |
181 | } | |
182 | }); | |
183 | }; | |
184 | ||
185 | var edit_btn = new PVE.button.Button({ | |
186 | text: gettext('Edit'), | |
187 | selModel: sm, | |
188 | disabled: true, | |
189 | enableFn: function(rec) { | |
190 | if (!rec) { | |
191 | return false; | |
192 | } | |
193 | var rowdef = rows[rec.data.key]; | |
194 | return !!rowdef.editor; | |
195 | }, | |
196 | handler: run_editor | |
197 | }); | |
198 | ||
199 | var resize_btn = new PVE.button.Button({ | |
200 | text: gettext('Resize disk'), | |
201 | selModel: sm, | |
202 | disabled: true, | |
203 | handler: run_resize | |
204 | }); | |
205 | ||
206 | var remove_btn = new PVE.button.Button({ | |
207 | text: gettext('Remove'), | |
208 | selModel: sm, | |
209 | disabled: true, | |
210 | dangerous: true, | |
211 | confirmMsg: function(rec) { | |
212 | var msg = Ext.String.format(gettext('Are you sure you want to remove entry {0}'), | |
213 | "'" + me.renderKey(rec.data.key, {}, rec) + "'"); | |
214 | if (rec.data.key.match(/^unused\d+$/)) { | |
16152937 | 215 | msg += " " + gettext('This will permanently erase all data.'); |
c7ee0c11 DM |
216 | } |
217 | ||
218 | return msg; | |
219 | }, | |
220 | handler: run_remove | |
221 | }); | |
222 | ||
223 | var set_button_status = function() { | |
224 | var sm = me.getSelectionModel(); | |
225 | var rec = sm.getSelection()[0]; | |
226 | ||
227 | if (!rec) { | |
228 | edit_btn.disable(); | |
229 | remove_btn.disable(); | |
230 | resize_btn.disable(); | |
231 | return; | |
232 | } | |
233 | var key = rec.data.key; | |
234 | var value = rec.data.value; | |
235 | var rowdef = rows[key]; | |
236 | ||
237 | var isDisk = (rowdef.tdCls == 'pve-itype-icon-storage'); | |
238 | ||
239 | var noedit = rec.data['delete'] || !rowdef.editor; | |
240 | if (!noedit && PVE.UserName !== 'root@pam' && key.match(/^mp\d+$/)) { | |
241 | var mp = PVE.Parser.parseLxcMountPoint(value); | |
242 | if (mp.type !== 'volume') { | |
243 | noedit = true; | |
244 | } | |
245 | } | |
246 | edit_btn.setDisabled(noedit); | |
247 | ||
248 | remove_btn.setDisabled(!isDisk || rec.data.key === 'rootfs'); | |
249 | resize_btn.setDisabled(!isDisk); | |
250 | ||
251 | }; | |
252 | ||
f7993618 | 253 | Ext.apply(me, { |
c7ee0c11 DM |
254 | url: '/api2/json/' + baseurl, |
255 | selModel: sm, | |
256 | cwidth1: 170, | |
257 | tbar: [ | |
258 | { | |
259 | text: gettext('Add'), | |
260 | menu: new Ext.menu.Menu({ | |
261 | items: [ | |
262 | { | |
263 | text: gettext('Mount Point'), | |
264 | iconCls: 'pve-itype-icon-storage', | |
265 | disabled: !caps.vms['VM.Config.Disk'], | |
266 | handler: function() { | |
267 | var win = Ext.create('PVE.lxc.MountPointEdit', { | |
268 | url: '/api2/extjs/' + baseurl, | |
269 | pveSelNode: me.pveSelNode | |
270 | }); | |
271 | win.on('destroy', reload); | |
272 | win.show(); | |
273 | } | |
274 | } | |
275 | ] | |
276 | }) | |
277 | }, | |
278 | edit_btn, | |
279 | remove_btn, | |
280 | resize_btn | |
281 | ], | |
282 | rows: rows, | |
283 | listeners: { | |
26c5aba0 | 284 | afterrender: reload, |
597fd1b4 | 285 | activate: reload, |
c7ee0c11 DM |
286 | itemdblclick: run_editor, |
287 | selectionchange: set_button_status | |
288 | } | |
289 | }); | |
290 | ||
291 | me.callParent(); | |
292 | } | |
293 | }); |