| OLD | NEW | 
|    1 <!-- |    1 <!-- | 
|    2   Copyright 2016 The LUCI Authors. All rights reserved. |    2   Copyright 2016 The LUCI Authors. All rights reserved. | 
|    3   Use of this source code is governed under the Apache License, Version 2.0 |    3   Use of this source code is governed under the Apache License, Version 2.0 | 
|    4   that can be found in the LICENSE file. |    4   that can be found in the LICENSE file. | 
|    5  |    5  | 
|    6   This in an HTML Import-able file that contains the definition |    6   This in an HTML Import-able file that contains the definition | 
|    7   of the following elements: |    7   of the following elements: | 
|    8  |    8  | 
|    9     <task-page-data> |    9     <task-page-data> | 
|   10  |   10  | 
| (...skipping 11 matching lines...) Expand all  Loading... | 
|   22        name, id, created_ts, tags, and dimensions.  See the sample data in |   22        name, id, created_ts, tags, and dimensions.  See the sample data in | 
|   23        task-request-demo.json for a full rundown. |   23        task-request-demo.json for a full rundown. | 
|   24     result: Object, the result or progress of the task. This contains informatio
     n such as the |   24     result: Object, the result or progress of the task. This contains informatio
     n such as the | 
|   25        modified_ts, duration, exit_code, information about the bot that picked |   25        modified_ts, duration, exit_code, information about the bot that picked | 
|   26        up the task, etc.  See the sample data in task-result-demo.json for a |   26        up the task, etc.  See the sample data in task-result-demo.json for a | 
|   27        full rundown. |   27        full rundown. | 
|   28     stdout: String, the raw output of the task, if any.  See |   28     stdout: String, the raw output of the task, if any.  See | 
|   29         task-stdout-demo.json for a full rundown. |   29         task-stdout-demo.json for a full rundown. | 
|   30  |   30  | 
|   31   Methods: |   31   Methods: | 
|   32     request(): Force a fetch of the data. This happens automatically when |   32     reload(): Force a fetch of the data. This happens automatically when | 
|   33         auth_headers is set or task_id is changed. |   33         auth_headers is set or task_id is changed. | 
 |   34     reloadStdout(): Force a fetch of just the stdout | 
|   34  |   35  | 
|   35   Events: |   36   Events: | 
|   36     None. |   37     None. | 
|   37 --> |   38 --> | 
|   38  |   39  | 
|   39  |   40  | 
|   40 <link rel="import" href="/res/imp/common/common-behavior.html"> |   41 <link rel="import" href="/res/imp/common/common-behavior.html"> | 
|   41 <link rel="import" href="/res/imp/common/task-behavior.html"> |   42 <link rel="import" href="/res/imp/common/task-behavior.html"> | 
|   42  |   43  | 
|   43 <dom-module id="task-page-data"> |   44 <dom-module id="task-page-data"> | 
| (...skipping 13 matching lines...) Expand all  Loading... | 
|   57       behaviors: [ |   58       behaviors: [ | 
|   58           SwarmingBehaviors.CommonBehavior, |   59           SwarmingBehaviors.CommonBehavior, | 
|   59           SwarmingBehaviors.TaskBehavior, |   60           SwarmingBehaviors.TaskBehavior, | 
|   60       ], |   61       ], | 
|   61  |   62  | 
|   62       properties: { |   63       properties: { | 
|   63         // inputs |   64         // inputs | 
|   64         auth_headers: { |   65         auth_headers: { | 
|   65           type: Object, |   66           type: Object, | 
|   66         }, |   67         }, | 
 |   68  | 
|   67         task_id: { |   69         task_id: { | 
|   68           type: String, |   70           type: String, | 
|   69         }, |   71         }, | 
|   70  |   72  | 
|   71         // outputs |   73         // outputs | 
|   72         busy: { |   74         busy: { | 
|   73           type: Boolean, |   75           type: Boolean, | 
|   74           computed: "_or(_busy1,_busy2,_busy3)", |   76           computed: "_or(_busy1,_busy2,_busy3)", | 
|   75           notify: true, |   77           notify: true, | 
|   76         }, |   78         }, | 
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  120  |  122  | 
|  121       reload: function(){ |  123       reload: function(){ | 
|  122         if (!this.task_id || !this.auth_headers) { |  124         if (!this.task_id || !this.auth_headers) { | 
|  123           console.log("task_id and auth_headers can't be empty"); |  125           console.log("task_id and auth_headers can't be empty"); | 
|  124           return; |  126           return; | 
|  125         } |  127         } | 
|  126         if (lastRequest) { |  128         if (lastRequest) { | 
|  127           this.cancelAsync(lastRequest); |  129           this.cancelAsync(lastRequest); | 
|  128         } |  130         } | 
|  129  |  131  | 
 |  132         var baseUrl = "/_ah/api/swarming/v1/task/" + this.task_id; | 
|  130         lastRequest = this.async(function(){ |  133         lastRequest = this.async(function(){ | 
|  131           lastRequest = undefined; |  134           lastRequest = undefined; | 
|  132           var baseUrl = "/_ah/api/swarming/v1/task/"+this.task_id; |  | 
|  133           this._getJsonAsync("_request", baseUrl + "/request", |  135           this._getJsonAsync("_request", baseUrl + "/request", | 
|  134             "_busy1", this.auth_headers); |  136             "_busy1", this.auth_headers); | 
|  135           this._getJsonAsync("_result", |  137           this._getJsonAsync("_result", | 
|  136             baseUrl + "/result?include_performance_stats=true", |  138             baseUrl + "/result?include_performance_stats=true", | 
|  137             "_busy2", this.auth_headers); |  139             "_busy2", this.auth_headers); | 
|  138           this._getJsonAsync("_stdout", baseUrl + "/stdout", |  140           this.reloadStdout(); | 
|  139             "_busy3", this.auth_headers); |  | 
|  140         }, TASK_ID_DEBOUNCE_MS); |  141         }, TASK_ID_DEBOUNCE_MS); | 
|  141       }, |  142       }, | 
|  142  |  143  | 
|  143       _parseRequest: function(request) { |  144       _parseRequest: function(request) { | 
|  144         if (!request) { |  145         if (!request) { | 
|  145           return {}; |  146           return {}; | 
|  146         } |  147         } | 
|  147         request.tagMap = {}; |  148         request.tagMap = {}; | 
|  148         request.tags = request.tags || []; |  149         request.tags = request.tags || []; | 
|  149         request.tags.forEach(function(tag) { |  150         request.tags.forEach(function(tag) { | 
|  150           var split = tag.split(":", 1) |  151           var split = tag.split(":", 1) | 
|  151           var key = split[0]; |  152           var key = split[0]; | 
|  152           var rest = tag.substring(key.length + 1); |  153           var rest = tag.substring(key.length + 1); | 
|  153           request.tagMap[key] = rest; |  154           request.tagMap[key] = rest; | 
|  154         }); |  155         }); | 
|  155  |  156  | 
|  156         TIMES.forEach(function(time) { |  157         TIMES.forEach(function(time) { | 
|  157           if (request[time]) { |  158           if (request[time]) { | 
|  158             request[time] = new Date(request[time]); |  159             request[time] = new Date(request[time]); | 
|  159             request["human_"+time] = sk.human.localeTime(request[time]); |  160             request["human_"+time] = sk.human.localeTime(request[time]); | 
|  160           } |  161           } | 
|  161         }); |  162         }); | 
|  162         // request.properties.dimensions |  | 
|  163         request.properties = request.properties || {}; |  | 
|  164         if (request.properties.dimensions) { |  | 
|  165           request.properties.dimensions.forEach(function(dim){ |  | 
|  166             if (swarming.alias.has(dim.key)) { |  | 
|  167               dim.value = swarming.alias.apply(dim.value, dim.key); |  | 
|  168             } |  | 
|  169           }) |  | 
|  170         } |  | 
|  171         return request; |  163         return request; | 
|  172       }, |  164       }, | 
|  173  |  165  | 
|  174       _parseResult: function(result) { |  166       _parseResult: function(result) { | 
|  175         if (!result) { |  167         if (!result) { | 
|  176           return {}; |  168           return {}; | 
|  177         } |  169         } | 
|  178         var now = new Date(); |  170         var now = new Date(); | 
|  179         TIMES.forEach(function(time) { |  171         TIMES.forEach(function(time) { | 
|  180           if (result[time]) { |  172           if (result[time]) { | 
|  181             result[time] = new Date(result[time]); |  173             result[time] = new Date(result[time]); | 
|  182             result["human_"+time] = sk.human.localeTime(result[time]); |  174             result["human_"+time] = sk.human.localeTime(result[time]); | 
|  183           } |  175           } | 
|  184         }); |  176         }); | 
|  185         // Running tasks have no duration set, so we can figure it out. |  177         // Running tasks have no duration set, so we can figure it out. | 
|  186         if (!result.duration && result.state === this.RUNNING && result.started_
     ts){ |  178         if (!result.duration && result.state === this.RUNNING && result.started_
     ts){ | 
|  187           result.duration = (now - result.started_ts) / 1000; |  179           result.duration = (now - result.started_ts) / 1000; | 
|  188         } |  180         } | 
|  189         // Make the duration human readable |  181         // Make the duration human readable | 
|  190         if (result.duration){ |  182         if (result.duration){ | 
|  191           result.human_duration = this._humanDuration(result.duration); |  183           result.human_duration = this._humanDuration(result.duration); | 
|  192         } |  184         } | 
|  193         // result.bot_dimensions |  | 
|  194         if (result.bot_dimensions) { |  | 
|  195           result.bot_dimensions.forEach(function(dim){ |  | 
|  196             if (swarming.alias.has(dim.key)) { |  | 
|  197               // dim.value is an array |  | 
|  198               dim.value.forEach(function(v, i){ |  | 
|  199                 dim.value[i] = swarming.alias.apply(v, dim.key); |  | 
|  200               }); |  | 
|  201             } |  | 
|  202           }) |  | 
|  203         } |  | 
|  204         return result; |  185         return result; | 
|  205       }, |  186       }, | 
|  206  |  187  | 
|  207       _parseStdout: function(stdout) { |  188       _parseStdout: function(stdout) { | 
|  208         if (!stdout || !stdout.output) { |  189         if (!stdout || !stdout.output) { | 
|  209           return ""; |  190           return "[No output yet]"; | 
|  210         } |  191         } | 
|  211         return stdout.output; |  192         return stdout.output; | 
|  212       } |  193       }, | 
 |  194  | 
 |  195       reloadStdout: function() { | 
 |  196         this._getJsonAsync("_stdout", "/_ah/api/swarming/v1/task/" + | 
 |  197               this.task_id + "/stdout", "_busy3", this.auth_headers); | 
 |  198       }, | 
|  213  |  199  | 
|  214     }); |  200     }); | 
|  215   })(); |  201   })(); | 
|  216   </script> |  202   </script> | 
|  217 </dom-module> |  203 </dom-module> | 
| OLD | NEW |