]>
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 DM |
7 | initComponent: function() { |
8 | var me = this; | |
9 | ||
10 | if (!me.upid) { | |
11 | throw "no task specified"; | |
12 | } | |
13 | ||
14 | var task = Proxmox.Utils.parse_task_upid(me.upid); | |
15 | ||
16 | var statstore = Ext.create('Proxmox.data.ObjectStore', { | |
17 | url: "/api2/json/nodes/" + task.node + "/tasks/" + me.upid + "/status", | |
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 DM |
26 | |
27 | var getObjectValue = function(key, defaultValue) { | |
28 | var rec = statstore.getById(key); | |
29 | if (rec) { | |
30 | return rec.data.value; | |
31 | } | |
32 | return defaultValue; | |
33 | }; | |
34 | ||
35 | var pbar = Ext.create('Ext.ProgressBar', { text: 'running...' }); | |
36 | ||
37 | me.mon(statstore, 'load', function() { | |
38 | var status = getObjectValue('status'); | |
39 | if (status === 'stopped') { | |
40 | var exitstatus = getObjectValue('exitstatus'); | |
41 | if (exitstatus == 'OK') { | |
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 | } | |
fde8e8bb | 49 | me.taskDone(exitstatus == 'OK'); |
06694509 DM |
50 | } |
51 | }); | |
52 | ||
53ac9bca | 53 | var 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 AL |
65 | handler: function() { |
66 | var 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? | |
86 | /*jslint confusion: true */ | |
87 | ||
88 | Ext.define('Proxmox.window.TaskViewer', { | |
89 | extend: 'Ext.window.Window', | |
90 | alias: 'widget.proxmoxTaskViewer', | |
91 | ||
641df09e TL |
92 | extraTitle: '', // string to prepend after the generic task title |
93 | ||
fde8e8bb TL |
94 | taskDone: Ext.emptyFn, |
95 | ||
06694509 DM |
96 | initComponent: function() { |
97 | var me = this; | |
98 | ||
99 | if (!me.upid) { | |
100 | throw "no task specified"; | |
101 | } | |
102 | ||
103 | var task = Proxmox.Utils.parse_task_upid(me.upid); | |
104 | ||
105 | var statgrid; | |
106 | ||
107 | var rows = { | |
108 | status: { | |
109 | header: gettext('Status'), | |
110 | defaultValue: 'unknown', | |
111 | renderer: function(value) { | |
112 | if (value != 'stopped') { | |
113 | return value; | |
114 | } | |
115 | var es = statgrid.getObjectValue('exitstatus'); | |
116 | if (es) { | |
117 | return value + ': ' + es; | |
118 | } | |
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'), | |
92d1c20d | 130 | renderer: Ext.String.htmlEncode, |
01031528 | 131 | required: true, |
06694509 DM |
132 | }, |
133 | node: { | |
134 | header: gettext('Node'), | |
01031528 | 135 | required: true, |
06694509 DM |
136 | }, |
137 | pid: { | |
138 | header: gettext('Process ID'), | |
01031528 | 139 | required: true, |
06694509 | 140 | }, |
21efafeb TL |
141 | task_id: { |
142 | header: gettext('Task ID'), | |
143 | }, | |
06694509 DM |
144 | starttime: { |
145 | header: gettext('Start Time'), | |
13fc756d | 146 | required: true, |
01031528 | 147 | renderer: Proxmox.Utils.render_timestamp, |
06694509 DM |
148 | }, |
149 | upid: { | |
92d1c20d DC |
150 | header: gettext('Unique task ID'), |
151 | renderer: Ext.String.htmlEncode, | |
01031528 | 152 | }, |
06694509 DM |
153 | }; |
154 | ||
155 | var statstore = Ext.create('Proxmox.data.ObjectStore', { | |
156 | url: "/api2/json/nodes/" + task.node + "/tasks/" + me.upid + "/status", | |
157 | interval: 1000, | |
01031528 | 158 | rows: rows, |
06694509 DM |
159 | }); |
160 | ||
13fc756d | 161 | me.on('destroy', statstore.stopUpdate); |
06694509 DM |
162 | |
163 | var stop_task = function() { | |
164 | Proxmox.Utils.API2Request({ | |
165 | url: "/nodes/" + task.node + "/tasks/" + me.upid, | |
166 | waitMsgTarget: me, | |
167 | method: 'DELETE', | |
168 | failure: function(response, opts) { | |
169 | Ext.Msg.alert(gettext('Error'), response.htmlStatus); | |
01031528 | 170 | }, |
06694509 DM |
171 | }); |
172 | }; | |
173 | ||
174 | var stop_btn1 = new Ext.Button({ | |
175 | text: gettext('Stop'), | |
176 | disabled: true, | |
01031528 | 177 | handler: stop_task, |
06694509 DM |
178 | }); |
179 | ||
180 | var stop_btn2 = new Ext.Button({ | |
181 | text: gettext('Stop'), | |
182 | disabled: true, | |
01031528 | 183 | handler: stop_task, |
06694509 DM |
184 | }); |
185 | ||
186 | statgrid = Ext.create('Proxmox.grid.ObjectGrid', { | |
187 | title: gettext('Status'), | |
188 | layout: 'fit', | |
01031528 | 189 | tbar: [stop_btn1], |
06694509 DM |
190 | rstore: statstore, |
191 | rows: rows, | |
01031528 | 192 | border: false, |
06694509 DM |
193 | }); |
194 | ||
195 | var logView = Ext.create('Proxmox.panel.LogView', { | |
196 | title: gettext('Output'), | |
01031528 | 197 | tbar: [stop_btn2], |
06694509 | 198 | border: false, |
01031528 | 199 | url: "/api2/extjs/nodes/" + task.node + "/tasks/" + me.upid + "/log", |
06694509 DM |
200 | }); |
201 | ||
202 | me.mon(statstore, 'load', function() { | |
203 | var status = statgrid.getObjectValue('status'); | |
13fc756d | 204 | |
06694509 | 205 | if (status === 'stopped') { |
06694509 | 206 | logView.scrollToEnd = false; |
65bb3b67 | 207 | logView.requestUpdate(); |
06694509 | 208 | statstore.stopUpdate(); |
fde8e8bb | 209 | me.taskDone(statgrid.getObjectValue('exitstatus') == 'OK'); |
06694509 DM |
210 | } |
211 | ||
212 | stop_btn1.setDisabled(status !== 'running'); | |
213 | stop_btn2.setDisabled(status !== 'running'); | |
214 | }); | |
215 | ||
216 | statstore.startUpdate(); | |
217 | ||
218 | Ext.apply(me, { | |
641df09e | 219 | title: "Task viewer: " + task.desc + me.extraTitle, |
06694509 DM |
220 | width: 800, |
221 | height: 400, | |
222 | layout: 'fit', | |
223 | modal: true, | |
224 | items: [{ | |
225 | xtype: 'tabpanel', | |
226 | region: 'center', | |
01031528 TL |
227 | items: [logView, statgrid], |
228 | }], | |
06694509 DM |
229 | }); |
230 | ||
231 | me.callParent(); | |
232 | ||
233 | logView.fireEvent('show', logView); | |
01031528 | 234 | }, |
06694509 DM |
235 | }); |
236 |