| 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> | 9     <task-page> | 
| 10 | 10 | 
| 11   task-page shows the request, results, stats, and standard output of a task. | 11   task-page shows the request, results, stats, and standard output of a task. | 
| 12 | 12 | 
| 13   This is a top-level element. | 13   This is a top-level element. | 
| 14 | 14 | 
| 15   Properties: | 15   Properties: | 
| 16     task_id: String, Used in testing to specify a task_id | 16     task_id: String, Used in testing to specify a task_id | 
| 17     client_id: String, Oauth 2.0 client id.  It will be set by server-side | 17     client_id: String, Oauth 2.0 client id.  It will be set by server-side | 
| 18         template evaluation. | 18         template evaluation. | 
| 19 | 19 | 
| 20   Methods: | 20   Methods: | 
| 21     None. | 21     None. | 
| 22 | 22 | 
| 23   Events: | 23   Events: | 
| 24     None. | 24     None. | 
| 25 --> | 25 --> | 
| 26 | 26 | 
|  | 27 <link rel="import" href="/res/imp/bower_components/iron-icon/iron-icon.html"> | 
|  | 28 <link rel="import" href="/res/imp/bower_components/iron-icons/iron-icons.html"> | 
|  | 29 <link rel="import" href="/res/imp/bower_components/paper-button/paper-button.htm
     l"> | 
|  | 30 <link rel="import" href="/res/imp/bower_components/paper-dialog/paper-dialog.htm
     l"> | 
|  | 31 <link rel="import" href="/res/imp/bower_components/paper-input/paper-input.html"
     > | 
|  | 32 <link rel="import" href="/res/imp/bower_components/paper-tabs/paper-tabs.html"> | 
| 27 <link rel="import" href="/res/imp/bower_components/polymer/polymer.html"> | 33 <link rel="import" href="/res/imp/bower_components/polymer/polymer.html"> | 
| 28 | 34 | 
| 29 <link rel="import" href="/res/imp/common/common-behavior.html"> | 35 <link rel="import" href="/res/imp/common/common-behavior.html"> | 
|  | 36 <link rel="import" href="/res/imp/common/single-page-style.html"> | 
| 30 <link rel="import" href="/res/imp/common/swarming-app.html"> | 37 <link rel="import" href="/res/imp/common/swarming-app.html"> | 
|  | 38 <link rel="import" href="/res/imp/common/task-behavior.html"> | 
| 31 <link rel="import" href="/res/imp/common/url-param.html"> | 39 <link rel="import" href="/res/imp/common/url-param.html"> | 
| 32 | 40 | 
| 33 <link rel="import" href="task-page-data.html"> | 41 <link rel="import" href="task-page-data.html"> | 
| 34 | 42 | 
| 35 <dom-module id="task-page"> | 43 <dom-module id="task-page"> | 
| 36   <template> | 44   <template> | 
| 37     <style include="iron-flex iron-flex-alignment iron-positioning swarming-app-
     style"> | 45     <style include="iron-flex iron-flex-alignment swarming-app-style single-page
     -style task-style"> | 
|  | 46       .milo { | 
|  | 47         width: calc(100% - 11px); | 
|  | 48         /** We don't control the milo site and it's on a different domain than | 
|  | 49         us, so there's no good way to avoid scrolling other than tell the iframe | 
|  | 50         it is really tall.*/ | 
|  | 51         height: 2000px; | 
|  | 52       } | 
| 38 | 53 | 
|  | 54       .left { | 
|  | 55         min-width: 550px; | 
|  | 56       } | 
|  | 57       .right { | 
|  | 58         min-width: 500px; | 
|  | 59         margin-top: 8px; | 
|  | 60       } | 
|  | 61 | 
|  | 62       .expand { | 
|  | 63         min-width: 3em; | 
|  | 64         vertical-align: middle; | 
|  | 65         padding: .5em; | 
|  | 66       } | 
|  | 67 | 
|  | 68       .code { | 
|  | 69         font-family: monospace; | 
|  | 70       } | 
|  | 71 | 
|  | 72       .stdout { | 
|  | 73         white-space: pre-line; | 
|  | 74         padding: 2px; | 
|  | 75       } | 
|  | 76 | 
|  | 77       .refresh_input { | 
|  | 78         padding: 0 5px; | 
|  | 79       } | 
|  | 80 | 
|  | 81       .tabbed { | 
|  | 82         border: 3px solid #1F78B4; | 
|  | 83         margin-left: 5px; | 
|  | 84         min-height: 80vh; | 
|  | 85       } | 
| 39     </style> | 86     </style> | 
| 40 | 87 | 
| 41     <url-param name="id" | 88     <url-param name="id" | 
| 42       value="{{task_id}}"> | 89       value="{{task_id}}"> | 
| 43     </url-param> | 90     </url-param> | 
|  | 91     <url-param name="request_detail" | 
|  | 92       value="{{_request_detail}}"> | 
|  | 93     </url-param> | 
|  | 94     <url-param name="show_raw" | 
|  | 95       value="{{_show_raw}}"> | 
|  | 96     </url-param> | 
|  | 97     <url-param name="refresh" | 
|  | 98       value="{{_refresh}}" | 
|  | 99       default_value="10"> | 
|  | 100     </url-param> | 
| 44 | 101 | 
| 45     <swarming-app | 102     <swarming-app | 
| 46       client_id="[[client_id]]" | 103       client_id="[[client_id]]" | 
| 47       auth_headers="{{_auth_headers}}" | 104       auth_headers="{{_auth_headers}}" | 
| 48       signed_in="{{_signed_in}}" | 105       signed_in="{{_signed_in}}" | 
| 49 | 106 | 
| 50       busy="[[_busy]]" | 107       busy="[[_busy]]" | 
| 51       name="Swarming Task Page"> | 108       name="Swarming Task Page"> | 
| 52 | 109 | 
| 53       <h2 hidden$="[[_signed_in]]">You must sign in to see anything useful.</h2> | 110       <h2 hidden$="[[_signed_in]]">You must sign in to see anything useful.</h2> | 
| 54 | 111 | 
| 55       <div hidden$="[[_not(_signed_in)]]"> | 112       <div hidden$="[[_not(_signed_in)]]"> | 
| 56 | 113 | 
| 57         <task-page-data | 114         <task-page-data | 
| 58           auth_headers="[[_auth_headers]]" | 115           auth_headers="[[_auth_headers]]" | 
| 59           task_id="[[task_id]]" | 116           task_id="[[task_id]]" | 
| 60 | 117 | 
| 61           busy="{{_busy}}" | 118           busy="{{_busy}}" | 
| 62           request="{{_request}}" | 119           request="{{_request}}" | 
| 63           result="{{_result}}" | 120           result="{{_result}}" | 
| 64           stdout="{{_stdout}}"> | 121           stdout="{{_stdout}}"> | 
| 65         </task-page-data> | 122         </task-page-data> | 
| 66 | 123 | 
| 67         <h1>Task Page Stub</h1> | 124         <div class="horizontal layout wrap"> | 
|  | 125           <div class="left flex"> | 
|  | 126             <div class="horizontal layout"> | 
|  | 127               <paper-input class="id_input" label="Task id" value="{{task_id}}">
     </paper-input> | 
|  | 128               <button on-click="_refresh"> | 
|  | 129                 <iron-icon class="refresh" icon="icons:refresh"></iron-icon> | 
|  | 130               </button> | 
|  | 131               <button on-click="_retry"><span>Retry</span></button> | 
|  | 132               <button on-click="_cancel">Cancel</button> | 
|  | 133             </div> | 
|  | 134             <table> | 
|  | 135               <tr> | 
|  | 136                 <td>Name</td> | 
|  | 137                 <td>[[_request.name]]</td> | 
|  | 138               </tr> | 
|  | 139               <tr> | 
|  | 140                 <td>State</td> | 
|  | 141                 <td class$="[[_stateClass(_result)]]">[[_state(_result)]]</td> | 
|  | 142               </tr> | 
|  | 143               <tr> | 
|  | 144                 <td>Created</td> | 
|  | 145                 <td>[[_request.human_created_ts]]</td> | 
|  | 146               </tr> | 
|  | 147               <template is="dom-if" if="[[_wasPickedUp(_result)]]"> | 
|  | 148                 <tr> | 
|  | 149                   <td>Started</td> | 
|  | 150                   <td>[[_result.human_started_ts]]</td> | 
|  | 151                 </tr> | 
|  | 152               </template> | 
|  | 153               <template is="dom-if" if="[[_wasNotPickedUp(_result)]]"> | 
|  | 154                 <tr> | 
|  | 155                   <td>Expires</td> | 
|  | 156                   <td>[[_expires(_request)]]</td> | 
|  | 157                 </tr> | 
|  | 158               </template> | 
|  | 159               <template is="dom-if" if="[[_result.human_completed_ts]]"> | 
|  | 160                 <tr> | 
|  | 161                   <td>Completed</td> | 
|  | 162                   <td>[[_result.human_completed_ts]]</td> | 
|  | 163                 </tr> | 
|  | 164               </template> | 
|  | 165               <template is="dom-if" if="[[_result.human_abandoned_ts]]"> | 
|  | 166                 <tr> | 
|  | 167                   <td>Abandoned</td> | 
|  | 168                   <td>[[_result.human_abandoned_ts]]</td> | 
|  | 169                 </tr> | 
|  | 170               </template> | 
|  | 171               <tr> | 
|  | 172                 <td>Last Updated</td> | 
|  | 173                 <td>[[_result.human_modified_ts]]</td> | 
|  | 174               </tr> | 
|  | 175               <template is="dom-if" if="[[_result.deduped_from]]"> | 
|  | 176                 <tr> | 
|  | 177                   <td><b>Deduped from</b></td> | 
|  | 178                   <td> | 
|  | 179                     <a href$="[[_taskLink(_result.deduped_from)]]"> | 
|  | 180                       [[_result.deduped_from]] | 
|  | 181                     </a> | 
|  | 182                   </td> | 
|  | 183                 </tr> | 
|  | 184               </template> | 
|  | 185               <tr> | 
|  | 186                 <td>Pending Time</td> | 
|  | 187                 <td>[[_pending(_result)]]</td> | 
|  | 188               </tr> | 
|  | 189               <tr> | 
|  | 190                 <td>Duration</td> | 
|  | 191                 <td>[[_result.human_duration]]</td> | 
|  | 192               </tr> | 
|  | 193               <tr> | 
|  | 194                 <td>Priority</td> | 
|  | 195                 <td>[[_request.priority]]</td> | 
|  | 196               </tr> | 
|  | 197               <tr> | 
|  | 198                 <td>User</td> | 
|  | 199                 <td>[[_request.user]]</td> | 
|  | 200               </tr> | 
|  | 201               <tr> | 
|  | 202                 <td>Authenticated</td> | 
|  | 203                 <td>[[_request.authenticated]]</td> | 
|  | 204               </tr> | 
|  | 205               <template is="dom-if" if="[[_request.service_account]]"> | 
|  | 206                 <tr> | 
|  | 207                   <td>Service Account</td> | 
|  | 208                   <td>[[_request.service_account]]</td> | 
|  | 209                 </tr> | 
|  | 210               </template> | 
|  | 211               <template is="dom-if" if="[[_request.properties.secret_bytes]]"> | 
|  | 212                 <tr> | 
|  | 213                   <td>Secret Bytes</td> | 
|  | 214                   <td>[[_request.properties.secret_bytes]]</td> | 
|  | 215                 </tr> | 
|  | 216               </template> | 
|  | 217               <template is="dom-if" if="[[_request.parent_task_id]]"> | 
|  | 218                 <tr> | 
|  | 219                   <td>Parent Task</td> | 
|  | 220                   <td> | 
|  | 221                     <a href$="[[_taskLink(_request.parent_task_id)]]">[[_request
     .parent_task_id]]</a> | 
|  | 222                   </td> | 
|  | 223                 </tr> | 
|  | 224               </template> | 
|  | 225               <tr> | 
|  | 226                 <td rowspan$="[[_rowspan(_request.properties.dimensions)]]">Requ
     ested Dimensions</td> | 
|  | 227               </tr> | 
|  | 228               <template is="dom-repeat" items="{{_request.properties.dimensions}
     }" as="dimension"> | 
|  | 229                 <tr> | 
|  | 230                   <td><b>[[dimension.key]]:</b> [[dimension.value]]</td> | 
|  | 231                 </tr> | 
|  | 232               </template> | 
|  | 233               <tr> | 
|  | 234                 <td>Isolated Inputs</td> | 
|  | 235                 <td> | 
|  | 236                   <a href$="[[_isolateLink(_request.properties.inputs_ref)]]"> | 
|  | 237                     [[_request.properties.inputs_ref.isolated]] | 
|  | 238                   </a> | 
|  | 239                 </td> | 
|  | 240               </tr> | 
|  | 241               <template is="dom-if" if="[[_not(_request_detail)]]"> | 
|  | 242                 <tr> | 
|  | 243                   <td>More Details</td> | 
|  | 244                   <td> | 
|  | 245                     <button on-click="_toggleDetails"> | 
|  | 246                       <iron-icon icon="icons:add-circle-outline"></iron-icon> | 
|  | 247                     </button> | 
|  | 248                   </td> | 
|  | 249                 </tr> | 
|  | 250               </template> | 
|  | 251               <template is="dom-if" if="[[_request_detail]]"> | 
|  | 252                 <tr> | 
|  | 253                   <td>Hide Details</td> | 
|  | 254                   <td> | 
|  | 255                     <button on-click="_toggleDetails"> | 
|  | 256                       <iron-icon icon="icons:remove-circle-outline"></iron-icon> | 
|  | 257                     </button> | 
|  | 258                   </td> | 
|  | 259                 </tr> | 
|  | 260               </template> | 
|  | 261               <template is="dom-if" if="[[_request_detail]]"> | 
|  | 262                 <tr> | 
|  | 263                   <td>Extra Args</td> | 
|  | 264                   <td class="code">[[_extraArgs(_request)]]</td> | 
|  | 265                 </tr> | 
|  | 266                 <tr> | 
|  | 267                   <td rowspan$="[[_rowspan(_request.tags)]]">Tags</td> | 
|  | 268                 </tr> | 
|  | 269                 <template is="dom-repeat" items="{{_request.tags}}" as="tag"> | 
|  | 270                   <tr> | 
|  | 271                     <td>[[tag]]</td> | 
|  | 272                   </tr> | 
|  | 273                 </template> | 
|  | 274 | 
|  | 275                 <tr> | 
|  | 276                   <td>Execution timeout</td> | 
|  | 277                   <td>[[_humanDuration(_request.properties.execution_timeout_sec
     s)]]</td> | 
|  | 278                 </tr> | 
|  | 279                 <tr> | 
|  | 280                   <td>I/O timeout</td> | 
|  | 281                   <td>[[_humanDuration(_request.properties.io_timeout_secs)]]</t
     d> | 
|  | 282                 </tr> | 
|  | 283                 <tr> | 
|  | 284                   <td>Grace period</td> | 
|  | 285                   <td>[[_humanDuration(_request.properties.grace_period_secs)]]<
     /td> | 
|  | 286                 </tr> | 
|  | 287 | 
|  | 288                 <tr> | 
|  | 289                   <td>CIPD server</td> | 
|  | 290                   <td> | 
|  | 291                     <a href$="[[_request.properties.cipd_input.server]]"> | 
|  | 292                       [[_request.properties.cipd_input.server]] | 
|  | 293                     </a> | 
|  | 294                   </td> | 
|  | 295                 </tr> | 
|  | 296                 <tr> | 
|  | 297                   <td>CIPD version</td> | 
|  | 298                   <td>[[_request.properties.cipd_input.client_package.version]]<
     /td> | 
|  | 299                 </tr> | 
|  | 300                 <template is="dom-if" if="[[_wasPickedUp(_result)]]"> | 
|  | 301                   <tr> | 
|  | 302                     <td>CIPD package name</td> | 
|  | 303                     <td>[[_result.cipd_pins.client_package.package_name]]</td> | 
|  | 304                   </tr> | 
|  | 305                 </template> | 
|  | 306 | 
|  | 307                 <tr hidden$="[[_not(_request.properties.cipd_input)]]"> | 
|  | 308                   <td rowspan$="[[_cipdRowspan(_request,_result)]]">CIPD package
     s</td> | 
|  | 309                 </tr> | 
|  | 310                 <template is="dom-repeat" items="[[_cipdPackages(_request,_resul
     t)]]" as="cipd"> | 
|  | 311                   <tr> | 
|  | 312                     <td>[[cipd.path]]/</td> | 
|  | 313                   </tr> | 
|  | 314                   <tr> | 
|  | 315                     <td><b>Requested:</b>[[cipd.requested]]</td> | 
|  | 316                   </tr> | 
|  | 317                   <tr hidden$="[[_wasNotPickedUp(_result)]]"> | 
|  | 318                     <td><b>Actual:</b>[[cipd.actual]]</td> | 
|  | 319                   </tr> | 
|  | 320                 </template> | 
|  | 321               </template> | 
|  | 322             </table> | 
|  | 323 | 
|  | 324             <div class="title">Task Execution</div> | 
|  | 325             <template is="dom-if" if="[[_wasPickedUp(_result)]]"> | 
|  | 326               <table> | 
|  | 327                 <tr> | 
|  | 328                   <td>Bot assigned to task</td> | 
|  | 329                   <td><a href$="[[_botLink(_result.bot_id)]]">[[_result.bot_id]]
     </td> | 
|  | 330                 </tr> | 
|  | 331                 <tr> | 
|  | 332                   <td rowspan$="[[_rowspan(_result.bot_dimensions)]]">Bot Dimens
     ions</td> | 
|  | 333                 </tr> | 
|  | 334                 <template is="dom-repeat" items="[[_result.bot_dimensions]]" as=
     "dimension"> | 
|  | 335                   <tr> | 
|  | 336                     <td><b>[[dimension.key]]:</b> [[_join(dimension.value," | ")
     ]]</td> | 
|  | 337                   </tr> | 
|  | 338                 </template> | 
|  | 339 | 
|  | 340                 <tr> | 
|  | 341                   <td>Exit code</td> | 
|  | 342                   <td>[[_result.exit_code]]</td> | 
|  | 343                 </tr> | 
|  | 344                 <tr> | 
|  | 345                   <td>Try number</td> | 
|  | 346                   <td>[[_result.try_number]]</td> | 
|  | 347                 </tr> | 
|  | 348                 <tr> | 
|  | 349                   <td>Failure</td> | 
|  | 350                   <td class$="[[_failureClass(_result.failure)]]">[[_result.fail
     ure]]</td> | 
|  | 351                 </tr> | 
|  | 352                 <tr> | 
|  | 353                   <td>Internal Failure</td> | 
|  | 354                   <td class$="[[_internalClass(_result.internal_failure)]]">[[_r
     esult.internal_failure]]</td> | 
|  | 355                 </tr> | 
|  | 356                 <tr> | 
|  | 357                   <td>Isolated Outputs</td> | 
|  | 358                   <td> | 
|  | 359                     <a href$="[[_isolateLink(_result.outputs_ref)]]"> | 
|  | 360                       [[_result.outputs_ref.isolated]] | 
|  | 361                     </a> | 
|  | 362                   </td> | 
|  | 363                 </tr> | 
|  | 364                 <tr> | 
|  | 365                   <td>Bot version</td> | 
|  | 366                   <td>[[_result.bot_version]]</td> | 
|  | 367                 </tr> | 
|  | 368                 <tr> | 
|  | 369                   <td>Server version</td> | 
|  | 370                   <td>[[_result.server_versions]]</td> | 
|  | 371                 </tr> | 
|  | 372               </table> | 
|  | 373             </template> | 
|  | 374             <template is="dom-if" if="[[_wasNotPickedUp(_result)]]"> | 
|  | 375               This space left blank until a bot is assigned to the task. | 
|  | 376             </template> | 
|  | 377 | 
|  | 378             <template is="dom-if" if="[[_result.performance_stats]]"> | 
|  | 379               <div class="title">Performance Stats</div> | 
|  | 380               <table> | 
|  | 381                 <tr> | 
|  | 382                   <td title="This includes time taken to download inputs, isolat
     e outputs, and setup CIPD">Total Overhead</td> | 
|  | 383                   <td>[[_humanDuration(_result.performance_stats.bot_overhead)]]
     </td> | 
|  | 384                 </tr> | 
|  | 385                 <tr> | 
|  | 386                   <td>Downloading Inputs From Isolate</td> | 
|  | 387                   <td>[[_humanDuration(_result.performance_stats.isolated_downlo
     ad.duration)]]</td> | 
|  | 388                 </tr> | 
|  | 389                 <tr> | 
|  | 390                   <td>Uploading Outputs To Isolate</td> | 
|  | 391                   <td>[[_humanDuration(_result.performance_stats.isolated_upload
     .duration)]]</td> | 
|  | 392                 </tr> | 
|  | 393                 <tr> | 
|  | 394                   <td>Initial bot cache</td> | 
|  | 395                   <td>[[_result.performance_stats.isolated_download.initial_numb
     er_items]] items; | 
|  | 396                   [[_bytes(_result.performance_stats.isolated_download.initial_s
     ize)]]</td> | 
|  | 397                 </tr> | 
|  | 398               </table> | 
|  | 399             </template> | 
|  | 400           </div> | 
|  | 401 | 
|  | 402           <div class="flex right"> | 
|  | 403             <div class="horizontal layout"> | 
|  | 404               <div class="tabs"> | 
|  | 405                 <paper-tabs selected="{{_show_raw}}" no-bar> | 
|  | 406                   <paper-tab disabled$="[[_noMilo(_request)]]">Milo Output</pape
     r-tab> | 
|  | 407                   <paper-tab>Raw Output</paper-tab> | 
|  | 408                 </paper-tabs> | 
|  | 409               </div> | 
|  | 410 | 
|  | 411               <paper-input | 
|  | 412                 class="refresh_input" | 
|  | 413                 label="Refresh Interval (seconds)" | 
|  | 414                 value="{{_refresh}}" | 
|  | 415                 auto-validate | 
|  | 416                 min="1" | 
|  | 417                 max="1000" | 
|  | 418                 pattern="[0-9]+"> | 
|  | 419               </paper-input> | 
|  | 420             </div> | 
|  | 421 | 
|  | 422             <template is="dom-if" if="[[_supportsMilo(_request,_show_raw)]]"> | 
|  | 423               <iframe id="miloFrame" class="milo tabbed" src$="[[_getMiloLink(mi
     lo_prefix,task_id)]]"></iframe> | 
|  | 424             </template> | 
|  | 425             <template is="dom-if" if="[[_show_raw]]"> | 
|  | 426               <div class="code stdout tabbed">[[_stdout]]</div> | 
|  | 427             </template> | 
|  | 428           </div> | 
|  | 429         </div> | 
| 68       </div> | 430       </div> | 
| 69 | 431 | 
| 70     </swarming-app> | 432     </swarming-app> | 
| 71 | 433 | 
| 72   </template> | 434   </template> | 
| 73   <script> | 435   <script> | 
| 74   (function(){ | 436   (function(){ | 
| 75     Polymer({ | 437     Polymer({ | 
| 76       is: 'task-page', | 438       is: 'task-page', | 
| 77 | 439 | 
| 78       behaviors: [ | 440       behaviors: [ | 
| 79           SwarmingBehaviors.CommonBehavior, | 441           SwarmingBehaviors.CommonBehavior, | 
|  | 442           SwarmingBehaviors.TaskBehavior, | 
| 80       ], | 443       ], | 
| 81 | 444 | 
| 82       properties: { | 445       properties: { | 
| 83         task_id: { | 446         task_id: { | 
| 84           type: String, | 447           type: String, | 
| 85         }, | 448         }, | 
| 86         client_id: { | 449         client_id: { | 
| 87           type: String, | 450           type: String, | 
| 88         }, | 451         }, | 
|  | 452         milo_prefix: { | 
|  | 453           type: String, | 
|  | 454         }, | 
|  | 455 | 
|  | 456         _request: { | 
|  | 457           type: Object, | 
|  | 458           observer: "_requestUpdated" | 
|  | 459         }, | 
|  | 460         _request_detail: { | 
|  | 461           type: Boolean, | 
|  | 462         } | 
|  | 463       }, | 
|  | 464 | 
|  | 465       _bytes: function(sizeInBytes) { | 
|  | 466         return sk.human.bytes(sizeInBytes); | 
|  | 467       }, | 
|  | 468 | 
|  | 469       _cipdRowspan: function(request, result) { | 
|  | 470         if (!request || !request.properties || !request.properties.cipd_input) { | 
|  | 471           return 0; | 
|  | 472         } | 
|  | 473         // We always need to at least double the number of packages because we | 
|  | 474         // show the path and then the requested.  If the actual package info | 
|  | 475         // is available, we triple the number of packages to account for that. | 
|  | 476         var rowSpan = (request.properties.cipd_input.packages || []).length; | 
|  | 477         if (result && result.cipd_pins && result.cipd_pins.packages) { | 
|  | 478           rowSpan *= 3; | 
|  | 479         } else { | 
|  | 480           rowSpan *= 2; | 
|  | 481         } | 
|  | 482         // Add one because rowSpan counts from 1. | 
|  | 483         return rowSpan + 1; | 
|  | 484       }, | 
|  | 485 | 
|  | 486       _cipdPackages: function(request, result) { | 
|  | 487         if (!request || !request.properties || !request.properties.cipd_input) { | 
|  | 488           return []; | 
|  | 489         } | 
|  | 490         var packages = request.properties.cipd_input.packages || []; | 
|  | 491         var actual = (result && result.cipd_pins && result.cipd_pins.packages) |
     | []; | 
|  | 492         packages.forEach(function(p) { | 
|  | 493           p.requested = p.package_name + ":" + p.version; | 
|  | 494           actual.forEach(function(c) { | 
|  | 495             if (c.path === p.path) { | 
|  | 496               p.actual = c.package_name + ":" + c.version; | 
|  | 497             } | 
|  | 498           }); | 
|  | 499         }); | 
|  | 500         return packages; | 
|  | 501       }, | 
|  | 502 | 
|  | 503       _expires: function(request) { | 
|  | 504         var delta = parseInt(request.expiration_secs); | 
|  | 505         if (delta) { | 
|  | 506           return sk.human.localeTime(new Date(request.created_ts.getTime() + del
     ta * 1000)); | 
|  | 507         } | 
|  | 508         // Fall back to something | 
|  | 509         return request.expiration_secs + " seconds from created time"; | 
|  | 510       }, | 
|  | 511 | 
|  | 512       _extraArgs: function(request) { | 
|  | 513         if (!request || !request.properties) { | 
|  | 514           return ""; | 
|  | 515         } | 
|  | 516         var args = request.properties.extra_args || []; | 
|  | 517         return args.join(" "); | 
|  | 518       }, | 
|  | 519 | 
|  | 520       _failureClass: function(failure) { | 
|  | 521         if (failure) { | 
|  | 522           return "failed_task"; | 
|  | 523         } | 
|  | 524         return ""; | 
|  | 525       }, | 
|  | 526 | 
|  | 527       _getMiloLink: function(prefix,id) { | 
|  | 528         if (!prefix) { | 
|  | 529           return undefined; | 
|  | 530         } | 
|  | 531         return prefix + id; | 
|  | 532       }, | 
|  | 533 | 
|  | 534       _internalClass: function(failure) { | 
|  | 535         if (failure) { | 
|  | 536           return "exception"; | 
|  | 537         } | 
|  | 538         return ""; | 
|  | 539       }, | 
|  | 540 | 
|  | 541       _isolateLink: function(ref) { | 
|  | 542         if (!ref || !ref.isolatedserver) { | 
|  | 543           return undefined; | 
|  | 544         } | 
|  | 545         return ref.isolatedserver + "/browse?namespace="+ref.namespace + | 
|  | 546           "&hash=" + ref.isolated; | 
|  | 547       }, | 
|  | 548 | 
|  | 549       _join: function(arr, s) { | 
|  | 550         arr = arr || []; | 
|  | 551         return arr.join(s); | 
|  | 552       }, | 
|  | 553 | 
|  | 554       _noMilo: function(result) { | 
|  | 555         return !this._tag(result, "allow_milo"); | 
|  | 556       }, | 
|  | 557 | 
|  | 558       _pending: function(result) { | 
|  | 559         if (!result.created_ts) { | 
|  | 560           return ""; | 
|  | 561         } | 
|  | 562         var end = result.started_ts || result.abandoned_ts || new Date(); | 
|  | 563         // In the case of deduplicated tasks, started_ts comes before the task. | 
|  | 564         if (end <= result.created_ts) { | 
|  | 565           return "0s"; | 
|  | 566         } | 
|  | 567         return this._timeDiffExact(result.created_ts, end); | 
|  | 568       }, | 
|  | 569 | 
|  | 570       _requestUpdated: function(request) { | 
|  | 571         if (this._noMilo(request)) { | 
|  | 572           this.set("_show_raw", 1); | 
|  | 573         } | 
|  | 574       }, | 
|  | 575 | 
|  | 576       _rowspan: function(dims) { | 
|  | 577         dims = dims || []; | 
|  | 578         return dims.length + 1; | 
|  | 579       }, | 
|  | 580 | 
|  | 581       _supportsMilo: function(request, showRaw) { | 
|  | 582         return !showRaw && request && this._tag(request, "allow_milo"); | 
|  | 583       }, | 
|  | 584 | 
|  | 585       _state: function(result) { | 
|  | 586         if (!result) { | 
|  | 587           return ""; | 
|  | 588         } | 
|  | 589         if (result.state === this.COMPLETED) { | 
|  | 590           if (result.failure) { | 
|  | 591             return this.COMPLETED_FAILURE; | 
|  | 592           } | 
|  | 593           if (result.try_number === "0") { | 
|  | 594             return this.COMPLETED_DEDUPED; | 
|  | 595           } | 
|  | 596           return this.COMPLETED_SUCCESS; | 
|  | 597         } | 
|  | 598         return result.state; | 
|  | 599       }, | 
|  | 600 | 
|  | 601       _stateClass: function(result) { | 
|  | 602         return this.stateClass(this._state(result)); | 
|  | 603       }, | 
|  | 604 | 
|  | 605       _toggleDetails: function() { | 
|  | 606         this.set("_request_detail", !this._request_detail); | 
|  | 607       }, | 
|  | 608 | 
|  | 609       _tag: function(result, col) { | 
|  | 610         if (!result || !result.tagMap) { | 
|  | 611           return undefined; | 
|  | 612         } | 
|  | 613         return result.tagMap[col]; | 
|  | 614       }, | 
|  | 615 | 
|  | 616       _wasPickedUp: function(result) { | 
|  | 617         return result && result.state !== this.PENDING && result.state !== this.
     CANCELED && result.state != this.EXPIRED; | 
|  | 618       }, | 
|  | 619 | 
|  | 620       _wasNotPickedUp: function(result) { | 
|  | 621         return result && !this._wasPickedUp(result); | 
| 89       }, | 622       }, | 
| 90     }); | 623     }); | 
| 91   })(); | 624   })(); | 
| 92   </script> | 625   </script> | 
| 93 </dom-module> | 626 </dom-module> | 
| OLD | NEW | 
|---|