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