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