]>
Commit | Line | Data |
---|---|---|
7bd89462 DM |
1 | Ext.define('PVE.grid.BackupView', { |
2 | extend: 'Ext.grid.GridPanel', | |
3 | ||
4 | alias: ['widget.pveBackupView'], | |
5 | ||
ba93a9c6 | 6 | onlineHelp: 'chapter_vzdump', |
7bd89462 DM |
7 | |
8 | initComponent : function() { | |
9 | var me = this; | |
10 | ||
11 | var nodename = me.pveSelNode.data.node; | |
12 | if (!nodename) { | |
13 | throw "no node name specified"; | |
14 | } | |
15 | ||
16 | var vmid = me.pveSelNode.data.vmid; | |
17 | if (!vmid) { | |
18 | throw "no VM ID specified"; | |
19 | } | |
20 | ||
21 | var vmtype = me.pveSelNode.data.type; | |
22 | if (!vmtype) { | |
23 | throw "no VM type specified"; | |
24 | } | |
25 | ||
26 | var filterFn; | |
27 | if (vmtype === 'openvz') { | |
28 | filterFn = function(item) { | |
29 | return item.data.volid.match(':backup/vzdump-openvz-'); | |
30 | }; | |
31 | } else if (vmtype === 'lxc') { | |
32 | filterFn = function(item) { | |
33 | return item.data.volid.match(':backup/vzdump-lxc-'); | |
34 | }; | |
35 | } else if (vmtype === 'qemu') { | |
36 | filterFn = function(item) { | |
37 | return item.data.volid.match(':backup/vzdump-qemu-'); | |
38 | }; | |
39 | } else { | |
40 | throw "unsupported VM type '" + vmtype + "'"; | |
41 | } | |
42 | ||
43 | me.store = Ext.create('Ext.data.Store', { | |
44 | model: 'pve-storage-content', | |
45 | sorters: { | |
46 | property: 'volid', | |
47 | order: 'DESC' | |
48 | }, | |
49 | filters: { filterFn: filterFn } | |
50 | }); | |
51 | ||
52 | var reload = Ext.Function.createBuffered(function() { | |
69c635d7 | 53 | if (me.store && me.store.proxy.url) { |
7bd89462 DM |
54 | me.store.load(); |
55 | } | |
56 | }, 100); | |
57 | ||
58 | var setStorage = function(storage) { | |
59 | var url = '/api2/json/nodes/' + nodename + '/storage/' + storage + '/content'; | |
60 | url += '?content=backup'; | |
61 | ||
62 | me.store.setProxy({ | |
63 | type: 'pve', | |
64 | url: url | |
65 | }); | |
66 | ||
67 | reload(); | |
68 | }; | |
69 | ||
70 | var storagesel = Ext.create('PVE.form.StorageSelector', { | |
71 | nodename: nodename, | |
72 | fieldLabel: gettext('Storage'), | |
73 | labelAlign: 'right', | |
74 | storageContent: 'backup', | |
75 | allowBlank: false, | |
76 | listeners: { | |
77 | change: function(f, value) { | |
78 | setStorage(value); | |
79 | } | |
80 | } | |
81 | }); | |
82 | ||
83 | var storagefilter = Ext.create('Ext.form.field.Text', { | |
84 | fieldLabel: gettext('Search'), | |
85 | labelWidth: 50, | |
86 | labelAlign: 'right', | |
87 | enableKeyEvents: true, | |
88 | listeners: { | |
89 | buffer: 500, | |
90 | keyup: function(field) { | |
91 | me.store.clearFilter(true); | |
92 | me.store.filter([ | |
5c416459 | 93 | filterFn, |
7bd89462 DM |
94 | { |
95 | property: 'volid', | |
96 | value: field.getValue(), | |
97 | anyMatch: true, | |
98 | caseSensitive: false | |
99 | } | |
100 | ]); | |
101 | } | |
102 | } | |
103 | }); | |
104 | ||
105 | var sm = Ext.create('Ext.selection.RowModel', {}); | |
106 | ||
107 | var backup_btn = Ext.create('Ext.button.Button', { | |
108 | text: gettext('Backup now'), | |
109 | handler: function() { | |
110 | var win = Ext.create('PVE.window.Backup', { | |
111 | nodename: nodename, | |
112 | vmid: vmid, | |
113 | vmtype: vmtype, | |
114 | storage: storagesel.getValue() | |
115 | }); | |
116 | win.show(); | |
117 | } | |
118 | }); | |
119 | ||
120 | var restore_btn = Ext.create('PVE.button.Button', { | |
121 | text: gettext('Restore'), | |
122 | disabled: true, | |
123 | selModel: sm, | |
124 | enableFn: function(rec) { | |
125 | return !!rec; | |
126 | }, | |
127 | handler: function(b, e, rec) { | |
128 | var volid = rec.data.volid; | |
129 | ||
130 | var win = Ext.create('PVE.window.Restore', { | |
131 | nodename: nodename, | |
132 | vmid: vmid, | |
133 | volid: rec.data.volid, | |
134 | volidText: PVE.Utils.render_storage_content(rec.data.volid, {}, rec), | |
135 | vmtype: vmtype | |
136 | }); | |
137 | win.show(); | |
138 | win.on('destroy', reload); | |
139 | } | |
140 | }); | |
141 | ||
142 | var delete_btn = Ext.create('PVE.button.Button', { | |
143 | text: gettext('Remove'), | |
144 | disabled: true, | |
145 | selModel: sm, | |
146 | dangerous: true, | |
147 | confirmMsg: function(rec) { | |
148 | var msg = Ext.String.format(gettext('Are you sure you want to remove entry {0}'), | |
149 | "'" + rec.data.volid + "'"); | |
16152937 | 150 | msg += " " + gettext('This will permanently erase all data.'); |
7bd89462 DM |
151 | |
152 | return msg; | |
153 | }, | |
154 | enableFn: function(rec) { | |
155 | return !!rec; | |
156 | }, | |
157 | handler: function(b, e, rec){ | |
158 | var storage = storagesel.getValue(); | |
159 | if (!storage) { | |
160 | return; | |
161 | } | |
162 | ||
163 | var volid = rec.data.volid; | |
164 | PVE.Utils.API2Request({ | |
165 | url: "/nodes/" + nodename + "/storage/" + storage + "/content/" + volid, | |
166 | method: 'DELETE', | |
167 | waitMsgTarget: me, | |
168 | failure: function(response, opts) { | |
169 | Ext.Msg.alert('Error', response.htmlStatus); | |
170 | }, | |
171 | success: function(response, options) { | |
172 | reload(); | |
173 | } | |
174 | }); | |
175 | } | |
176 | }); | |
177 | ||
79f305de DC |
178 | var config_btn = Ext.create('PVE.button.Button', { |
179 | text: gettext('Show Configuration'), | |
180 | disabled: true, | |
181 | selModel: sm, | |
182 | enableFn: function(rec) { | |
183 | return !!rec; | |
184 | }, | |
185 | handler: function(b, e, rec) { | |
186 | var storage = storagesel.getValue(); | |
187 | if (!storage) { | |
188 | return; | |
189 | } | |
190 | ||
6da4aea8 DC |
191 | var win = Ext.create('PVE.window.BackupConfig', { |
192 | volume: rec.data.volid, | |
193 | pveSelNode: me.pveSelNode | |
79f305de DC |
194 | }); |
195 | ||
6da4aea8 | 196 | win.show(); |
79f305de DC |
197 | } |
198 | }); | |
199 | ||
7bd89462 DM |
200 | Ext.apply(me, { |
201 | stateful: false, | |
202 | selModel: sm, | |
79f305de | 203 | tbar: [ backup_btn, restore_btn, delete_btn,config_btn, '->', storagesel, storagefilter ], |
7bd89462 DM |
204 | columns: [ |
205 | { | |
206 | header: gettext('Name'), | |
207 | flex: 1, | |
208 | sortable: true, | |
209 | renderer: PVE.Utils.render_storage_content, | |
210 | dataIndex: 'volid' | |
211 | }, | |
212 | { | |
213 | header: gettext('Format'), | |
214 | width: 100, | |
215 | dataIndex: 'format' | |
216 | }, | |
217 | { | |
218 | header: gettext('Size'), | |
219 | width: 100, | |
220 | renderer: PVE.Utils.format_size, | |
221 | dataIndex: 'size' | |
222 | } | |
223 | ], | |
224 | listeners: { | |
c0b3df6e | 225 | activate: reload |
7bd89462 DM |
226 | } |
227 | }); | |
228 | ||
229 | me.callParent(); | |
230 | } | |
231 | }); |