]>
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 | 7 | |
a61607a8 DC |
8 | stateful: true, |
9 | stateId: 'grid-guest-backup', | |
10 | ||
7bd89462 DM |
11 | initComponent : function() { |
12 | var me = this; | |
13 | ||
14 | var nodename = me.pveSelNode.data.node; | |
15 | if (!nodename) { | |
16 | throw "no node name specified"; | |
17 | } | |
18 | ||
19 | var vmid = me.pveSelNode.data.vmid; | |
20 | if (!vmid) { | |
21 | throw "no VM ID specified"; | |
22 | } | |
23 | ||
24 | var vmtype = me.pveSelNode.data.type; | |
25 | if (!vmtype) { | |
26 | throw "no VM type specified"; | |
27 | } | |
28 | ||
2685b382 | 29 | var vmtypeFilter; |
7bd89462 | 30 | if (vmtype === 'openvz') { |
2685b382 | 31 | vmtypeFilter = function(item) { |
7bd89462 DM |
32 | return item.data.volid.match(':backup/vzdump-openvz-'); |
33 | }; | |
34 | } else if (vmtype === 'lxc') { | |
2685b382 | 35 | vmtypeFilter = function(item) { |
7bd89462 DM |
36 | return item.data.volid.match(':backup/vzdump-lxc-'); |
37 | }; | |
38 | } else if (vmtype === 'qemu') { | |
2685b382 | 39 | vmtypeFilter = function(item) { |
7bd89462 DM |
40 | return item.data.volid.match(':backup/vzdump-qemu-'); |
41 | }; | |
42 | } else { | |
43 | throw "unsupported VM type '" + vmtype + "'"; | |
44 | } | |
45 | ||
ce76a18a EK |
46 | var searchFilter = { |
47 | property: 'volid', | |
48 | // on initial store display only our vmid backups | |
49 | // surround with minus sign to prevent the 2016 VMID bug | |
50 | value: vmtype + '-' + vmid + '-', | |
51 | anyMatch: true, | |
52 | caseSensitive: false | |
53 | }; | |
54 | ||
7bd89462 DM |
55 | me.store = Ext.create('Ext.data.Store', { |
56 | model: 'pve-storage-content', | |
57 | sorters: { | |
58 | property: 'volid', | |
59 | order: 'DESC' | |
60 | }, | |
ce76a18a | 61 | filters: [ |
2685b382 | 62 | vmtypeFilter, |
ce76a18a EK |
63 | searchFilter |
64 | ] | |
7bd89462 DM |
65 | }); |
66 | ||
67 | var reload = Ext.Function.createBuffered(function() { | |
8dfd00cd | 68 | if (me.store) { |
7bd89462 DM |
69 | me.store.load(); |
70 | } | |
71 | }, 100); | |
72 | ||
73 | var setStorage = function(storage) { | |
74 | var url = '/api2/json/nodes/' + nodename + '/storage/' + storage + '/content'; | |
75 | url += '?content=backup'; | |
76 | ||
77 | me.store.setProxy({ | |
56a353b9 | 78 | type: 'proxmox', |
7bd89462 DM |
79 | url: url |
80 | }); | |
81 | ||
82 | reload(); | |
83 | }; | |
84 | ||
85 | var storagesel = Ext.create('PVE.form.StorageSelector', { | |
86 | nodename: nodename, | |
87 | fieldLabel: gettext('Storage'), | |
88 | labelAlign: 'right', | |
89 | storageContent: 'backup', | |
90 | allowBlank: false, | |
91 | listeners: { | |
92 | change: function(f, value) { | |
93 | setStorage(value); | |
94 | } | |
95 | } | |
96 | }); | |
97 | ||
98 | var storagefilter = Ext.create('Ext.form.field.Text', { | |
99 | fieldLabel: gettext('Search'), | |
100 | labelWidth: 50, | |
101 | labelAlign: 'right', | |
102 | enableKeyEvents: true, | |
ce76a18a | 103 | value: searchFilter.value, |
7bd89462 DM |
104 | listeners: { |
105 | buffer: 500, | |
106 | keyup: function(field) { | |
107 | me.store.clearFilter(true); | |
ce76a18a | 108 | searchFilter.value = field.getValue(); |
7bd89462 | 109 | me.store.filter([ |
2685b382 | 110 | vmtypeFilter, |
ce76a18a | 111 | searchFilter |
7bd89462 DM |
112 | ]); |
113 | } | |
114 | } | |
115 | }); | |
116 | ||
117 | var sm = Ext.create('Ext.selection.RowModel', {}); | |
118 | ||
119 | var backup_btn = Ext.create('Ext.button.Button', { | |
120 | text: gettext('Backup now'), | |
121 | handler: function() { | |
122 | var win = Ext.create('PVE.window.Backup', { | |
123 | nodename: nodename, | |
124 | vmid: vmid, | |
125 | vmtype: vmtype, | |
e83e60bf EK |
126 | storage: storagesel.getValue(), |
127 | listeners : { | |
128 | close: function() { | |
129 | reload(); | |
130 | } | |
131 | } | |
7bd89462 DM |
132 | }); |
133 | win.show(); | |
134 | } | |
135 | }); | |
136 | ||
5720fafa | 137 | var restore_btn = Ext.create('Proxmox.button.Button', { |
7bd89462 DM |
138 | text: gettext('Restore'), |
139 | disabled: true, | |
140 | selModel: sm, | |
141 | enableFn: function(rec) { | |
142 | return !!rec; | |
143 | }, | |
144 | handler: function(b, e, rec) { | |
145 | var volid = rec.data.volid; | |
146 | ||
147 | var win = Ext.create('PVE.window.Restore', { | |
148 | nodename: nodename, | |
149 | vmid: vmid, | |
150 | volid: rec.data.volid, | |
151 | volidText: PVE.Utils.render_storage_content(rec.data.volid, {}, rec), | |
152 | vmtype: vmtype | |
153 | }); | |
154 | win.show(); | |
155 | win.on('destroy', reload); | |
156 | } | |
157 | }); | |
158 | ||
3b1ca3ff | 159 | var delete_btn = Ext.create('Proxmox.button.StdRemoveButton', { |
7bd89462 | 160 | selModel: sm, |
3b1ca3ff | 161 | dangerous: true, |
7bd89462 DM |
162 | confirmMsg: function(rec) { |
163 | var msg = Ext.String.format(gettext('Are you sure you want to remove entry {0}'), | |
164 | "'" + rec.data.volid + "'"); | |
16152937 | 165 | msg += " " + gettext('This will permanently erase all data.'); |
7bd89462 DM |
166 | |
167 | return msg; | |
168 | }, | |
3b1ca3ff | 169 | getUrl: function(rec) { |
7bd89462 | 170 | var storage = storagesel.getValue(); |
3b1ca3ff DC |
171 | return '/nodes/' + nodename + '/storage/' + storage + '/content/' + rec.data.volid; |
172 | }, | |
173 | callback: function() { | |
174 | reload(); | |
7bd89462 DM |
175 | } |
176 | }); | |
177 | ||
5720fafa | 178 | var config_btn = Ext.create('Proxmox.button.Button', { |
79f305de DC |
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 | 200 | Ext.apply(me, { |
7bd89462 | 201 | selModel: sm, |
79f305de | 202 | tbar: [ backup_btn, restore_btn, delete_btn,config_btn, '->', storagesel, storagefilter ], |
7bd89462 DM |
203 | columns: [ |
204 | { | |
205 | header: gettext('Name'), | |
206 | flex: 1, | |
207 | sortable: true, | |
208 | renderer: PVE.Utils.render_storage_content, | |
209 | dataIndex: 'volid' | |
210 | }, | |
211 | { | |
212 | header: gettext('Format'), | |
213 | width: 100, | |
214 | dataIndex: 'format' | |
215 | }, | |
216 | { | |
217 | header: gettext('Size'), | |
218 | width: 100, | |
e7ade592 | 219 | renderer: Proxmox.Utils.format_size, |
7bd89462 DM |
220 | dataIndex: 'size' |
221 | } | |
8dfd00cd | 222 | ] |
7bd89462 DM |
223 | }); |
224 | ||
225 | me.callParent(); | |
226 | } | |
227 | }); |