]>
Commit | Line | Data |
---|---|---|
06694509 DM |
1 | Ext.define('Proxmox.window.TaskProgress', { |
2 | extend: 'Ext.window.Window', | |
3 | alias: 'widget.proxmoxTaskProgress', | |
4 | ||
fde8e8bb TL |
5 | taskDone: Ext.emptyFn, |
6 | ||
06694509 | 7 | initComponent: function() { |
05a977a2 | 8 | let me = this; |
06694509 DM |
9 | |
10 | if (!me.upid) { | |
11 | throw "no task specified"; | |
12 | } | |
13 | ||
05a977a2 | 14 | let task = Proxmox.Utils.parse_task_upid(me.upid); |
06694509 | 15 | |
05a977a2 | 16 | let statstore = Ext.create('Proxmox.data.ObjectStore', { |
9427d6a9 | 17 | url: "/api2/json/nodes/" + task.node + "/tasks/" + encodeURIComponent(me.upid) + "/status", |
06694509 DM |
18 | interval: 1000, |
19 | rows: { | |
20 | status: { defaultValue: 'unknown' }, | |
01031528 TL |
21 | exitstatus: { defaultValue: 'unknown' }, |
22 | }, | |
06694509 DM |
23 | }); |
24 | ||
13fc756d | 25 | me.on('destroy', statstore.stopUpdate); |
06694509 | 26 | |
05a977a2 TL |
27 | let getObjectValue = function(key, defaultValue) { |
28 | let rec = statstore.getById(key); | |
06694509 DM |
29 | if (rec) { |
30 | return rec.data.value; | |
31 | } | |
32 | return defaultValue; | |
33 | }; | |
34 | ||
05a977a2 | 35 | let pbar = Ext.create('Ext.ProgressBar', { text: 'running...' }); |
06694509 DM |
36 | |
37 | me.mon(statstore, 'load', function() { | |
05a977a2 | 38 | let status = getObjectValue('status'); |
06694509 | 39 | if (status === 'stopped') { |
05a977a2 TL |
40 | let exitstatus = getObjectValue('exitstatus'); |
41 | if (exitstatus === 'OK') { | |
06694509 DM |
42 | pbar.reset(); |
43 | pbar.updateText("Done!"); | |
44 | Ext.Function.defer(me.close, 1000, me); | |
45 | } else { | |
46 | me.close(); | |
47 | Ext.Msg.alert('Task failed', exitstatus); | |
48 | } | |
05a977a2 | 49 | me.taskDone(exitstatus === 'OK'); |
06694509 DM |
50 | } |
51 | }); | |
52 | ||
05a977a2 | 53 | let descr = Proxmox.Utils.format_task_description(task.type, task.id); |
06694509 DM |
54 | |
55 | Ext.apply(me, { | |
d7139140 | 56 | title: gettext('Task') + ': ' + descr, |
06694509 DM |
57 | width: 300, |
58 | layout: 'auto', | |
59 | modal: true, | |
60 | bodyPadding: 5, | |
61 | items: pbar, | |
62 | buttons: [ | |
13fc756d | 63 | { |
06694509 | 64 | text: gettext('Details'), |
13fc756d | 65 | handler: function() { |
05a977a2 | 66 | let win = Ext.create('Proxmox.window.TaskViewer', { |
fde8e8bb | 67 | taskDone: me.taskDone, |
01031528 | 68 | upid: me.upid, |
06694509 DM |
69 | }); |
70 | win.show(); | |
71 | me.close(); | |
01031528 TL |
72 | }, |
73 | }, | |
74 | ], | |
06694509 DM |
75 | }); |
76 | ||
77 | me.callParent(); | |
78 | ||
79 | statstore.startUpdate(); | |
80 | ||
81 | pbar.wait(); | |
01031528 | 82 | }, |
06694509 DM |
83 | }); |
84 | ||
85 | // fixme: how can we avoid those lint errors? | |
06694509 DM |
86 | |
87 | Ext.define('Proxmox.window.TaskViewer', { | |
88 | extend: 'Ext.window.Window', | |
89 | alias: 'widget.proxmoxTaskViewer', | |
90 | ||
641df09e TL |
91 | extraTitle: '', // string to prepend after the generic task title |
92 | ||
fde8e8bb TL |
93 | taskDone: Ext.emptyFn, |
94 | ||
06694509 | 95 | initComponent: function() { |
05a977a2 | 96 | let me = this; |
06694509 DM |
97 | |
98 | if (!me.upid) { | |
99 | throw "no task specified"; | |
100 | } | |
101 | ||
05a977a2 | 102 | let task = Proxmox.Utils.parse_task_upid(me.upid); |
06694509 | 103 | |
05a977a2 | 104 | let statgrid; |
06694509 | 105 | |
05a977a2 | 106 | let rows = { |
06694509 DM |
107 | status: { |
108 | header: gettext('Status'), | |
109 | defaultValue: 'unknown', | |
110 | renderer: function(value) { | |
05a977a2 | 111 | if (value !== 'stopped') { |
06694509 DM |
112 | return value; |
113 | } | |
05a977a2 | 114 | let es = statgrid.getObjectValue('exitstatus'); |
06694509 DM |
115 | if (es) { |
116 | return value + ': ' + es; | |
117 | } | |
05a977a2 | 118 | return 'unknown'; |
01031528 | 119 | }, |
06694509 | 120 | }, |
13fc756d | 121 | exitstatus: { |
01031528 | 122 | visible: false, |
06694509 DM |
123 | }, |
124 | type: { | |
125 | header: gettext('Task type'), | |
01031528 | 126 | required: true, |
06694509 DM |
127 | }, |
128 | user: { | |
129 | header: gettext('User name'), | |
8e3f2973 TL |
130 | renderer: function(value) { |
131 | let user = value; | |
132 | let tokenid = statgrid.getObjectValue('tokenid'); | |
133 | if (tokenid) { | |
134 | user += `!${tokenid} (API Token)`; | |
135 | } | |
136 | return Ext.String.htmlEncode(user); | |
137 | }, | |
01031528 | 138 | required: true, |
06694509 | 139 | }, |
c2ad5266 FG |
140 | tokenid: { |
141 | header: gettext('API Token'), | |
142 | renderer: Ext.String.htmlEncode, | |
8e3f2973 | 143 | visible: false, |
c2ad5266 | 144 | }, |
06694509 DM |
145 | node: { |
146 | header: gettext('Node'), | |
01031528 | 147 | required: true, |
06694509 DM |
148 | }, |
149 | pid: { | |
150 | header: gettext('Process ID'), | |
01031528 | 151 | required: true, |
06694509 | 152 | }, |
21efafeb TL |
153 | task_id: { |
154 | header: gettext('Task ID'), | |
155 | }, | |
06694509 DM |
156 | starttime: { |
157 | header: gettext('Start Time'), | |
13fc756d | 158 | required: true, |
01031528 | 159 | renderer: Proxmox.Utils.render_timestamp, |
06694509 DM |
160 | }, |
161 | upid: { | |
92d1c20d DC |
162 | header: gettext('Unique task ID'), |
163 | renderer: Ext.String.htmlEncode, | |
01031528 | 164 | }, |
06694509 DM |
165 | }; |
166 | ||
c9d603af DC |
167 | if (me.endtime) { |
168 | if (typeof me.endtime === 'object') { | |
169 | // convert to epoch | |
170 | me.endtime = parseInt(me.endtime.getTime()/1000, 10); | |
171 | } | |
172 | rows.endtime = { | |
173 | header: gettext('End Time'), | |
174 | required: true, | |
175 | renderer: function() { | |
176 | return Proxmox.Utils.render_timestamp(me.endtime); | |
177 | }, | |
178 | }; | |
179 | } | |
180 | ||
181 | rows.duration = { | |
182 | header: gettext('Duration'), | |
183 | required: true, | |
184 | renderer: function() { | |
185 | let starttime = statgrid.getObjectValue('starttime'); | |
186 | let endtime = me.endtime || Date.now()/1000; | |
187 | let duration = endtime - starttime; | |
188 | return Proxmox.Utils.format_duration_human(duration); | |
189 | }, | |
190 | }; | |
191 | ||
05a977a2 | 192 | let statstore = Ext.create('Proxmox.data.ObjectStore', { |
9427d6a9 | 193 | url: "/api2/json/nodes/" + task.node + "/tasks/" + encodeURIComponent(me.upid) + "/status", |
06694509 | 194 | interval: 1000, |
01031528 | 195 | rows: rows, |
06694509 DM |
196 | }); |
197 | ||
13fc756d | 198 | me.on('destroy', statstore.stopUpdate); |
06694509 | 199 | |
05a977a2 | 200 | let stop_task = function() { |
06694509 | 201 | Proxmox.Utils.API2Request({ |
9427d6a9 | 202 | url: "/nodes/" + task.node + "/tasks/" + encodeURIComponent(me.upid), |
06694509 DM |
203 | waitMsgTarget: me, |
204 | method: 'DELETE', | |
205 | failure: function(response, opts) { | |
206 | Ext.Msg.alert(gettext('Error'), response.htmlStatus); | |
01031528 | 207 | }, |
06694509 DM |
208 | }); |
209 | }; | |
210 | ||
05a977a2 | 211 | let stop_btn1 = new Ext.Button({ |
06694509 DM |
212 | text: gettext('Stop'), |
213 | disabled: true, | |
01031528 | 214 | handler: stop_task, |
06694509 DM |
215 | }); |
216 | ||
05a977a2 | 217 | let stop_btn2 = new Ext.Button({ |
06694509 DM |
218 | text: gettext('Stop'), |
219 | disabled: true, | |
01031528 | 220 | handler: stop_task, |
06694509 DM |
221 | }); |
222 | ||
223 | statgrid = Ext.create('Proxmox.grid.ObjectGrid', { | |
224 | title: gettext('Status'), | |
225 | layout: 'fit', | |
01031528 | 226 | tbar: [stop_btn1], |
06694509 DM |
227 | rstore: statstore, |
228 | rows: rows, | |
01031528 | 229 | border: false, |
06694509 DM |
230 | }); |
231 | ||
05a977a2 | 232 | let logView = Ext.create('Proxmox.panel.LogView', { |
06694509 | 233 | title: gettext('Output'), |
01031528 | 234 | tbar: [stop_btn2], |
06694509 | 235 | border: false, |
9427d6a9 | 236 | url: "/api2/extjs/nodes/" + task.node + "/tasks/" + encodeURIComponent(me.upid) + "/log", |
06694509 DM |
237 | }); |
238 | ||
239 | me.mon(statstore, 'load', function() { | |
05a977a2 | 240 | let status = statgrid.getObjectValue('status'); |
13fc756d | 241 | |
06694509 | 242 | if (status === 'stopped') { |
06694509 | 243 | logView.scrollToEnd = false; |
65bb3b67 | 244 | logView.requestUpdate(); |
06694509 | 245 | statstore.stopUpdate(); |
05a977a2 | 246 | me.taskDone(statgrid.getObjectValue('exitstatus') === 'OK'); |
06694509 DM |
247 | } |
248 | ||
249 | stop_btn1.setDisabled(status !== 'running'); | |
250 | stop_btn2.setDisabled(status !== 'running'); | |
251 | }); | |
252 | ||
253 | statstore.startUpdate(); | |
254 | ||
255 | Ext.apply(me, { | |
641df09e | 256 | title: "Task viewer: " + task.desc + me.extraTitle, |
06694509 | 257 | width: 800, |
be3e4b4c | 258 | height: 500, |
06694509 DM |
259 | layout: 'fit', |
260 | modal: true, | |
261 | items: [{ | |
262 | xtype: 'tabpanel', | |
263 | region: 'center', | |
01031528 TL |
264 | items: [logView, statgrid], |
265 | }], | |
06694509 DM |
266 | }); |
267 | ||
268 | me.callParent(); | |
269 | ||
270 | logView.fireEvent('show', logView); | |
01031528 | 271 | }, |
06694509 DM |
272 | }); |
273 |