github.com/billybanfield/evergreen@v0.0.0-20170525200750-eeee692790f7/service/templates/task.html (about) 1 {{define "scripts"}} 2 <style type="text/css"> 3 body{ background: #f5f6f7; } 4 </style> 5 <script type="text/javascript"> 6 window.plugins = {{.PluginContent.Data}} 7 </script> 8 <script type="text/javascript" src="{{Static "js" "task.js"}}?hash={{ StaticsMD5 }}"></script> 9 {{if .User}} 10 <script type="text/javascript" src="{{Static "js" "task_admin.js"}}?hash={{ StaticsMD5 }}"></script> 11 {{end}} 12 <script type="text/javascript"> 13 var userTz = {{GetTimezone $.User}} 14 {{if .User}} 15 var have_user = true 16 var taskHost = {{.Host}} 17 {{end}} 18 var task_data = {{.Task}} 19 </script> 20 {{range .PluginContent.Includes}} 21 {{.}} 22 {{end}} 23 {{end}} 24 25 {{define "title"}} 26 {{ if .Task.PatchInfo }} 27 Evergreen - Patch {{.Task.PatchInfo.Patch.PatchNumber}} by {{.Task.PatchInfo.Patch.Author}} / {{.Task.BuildVariantDisplay}} / {{.Task.DisplayName}} 28 {{else}} 29 Evergreen - {{Trunc .Task.Revision 10}} / {{.Task.BuildVariantDisplay}} / {{.Task.DisplayName}} 30 {{end}} 31 {{end}} 32 33 {{define "plugin-links"}} 34 {{end}} 35 36 {{define "content"}} 37 38 {{ if not .ProjectData.Patch }} 39 <div ng-controller="TaskHistoryDrawerCtrl" id="drawer"> 40 <div id="drawer-contents"> 41 <div id="drawer-filled"> 42 <div ng-repeat="revisionsForDate in groupedRevisions"> 43 <div class="drawer-section-header"> 44 <span class="history-date-header-words">[[revisionsForDate.date | date:'MMM d']]</span> 45 <span class="history-date-header-numbers history-date-header-slash"> </span> 46 <span class="history-date-header-numbers">[[revisionsForDate.date | date:'M/d/yyyy']]</span> 47 </div> 48 49 <div ng-repeat="revision in revisionsForDate.revisions" 50 class="drawer-item" 51 ng-class="{ 'drawer-item-highlighted': isCurrent(revision) }"> 52 <revision-blurb linktype="'task'" linkid="revision.task.id" revision="revision" task="task"><revision-blurb> 53 </div> 54 </div> 55 </div> 56 </div> 57 </div> 58 59 <div id="page-content" class="container-fluid"> 60 {{ else }} 61 <div id="content" class="container-fluid"> 62 {{ end }} 63 <notify-box ng-init="destination='notifyHeader';"></notify-box> 64 {{template "flash" . }} 65 <div ng-controller="TaskCtrl"> 66 <ol class="breadcrumb"> 67 <li> 68 <span class="gitspec" ng-show="!task.patch_info"> 69 <a ng-href="/version/[[task.version_id]]"> 70 [[task.gitspec.substr(0, 10)]] 71 </a> 72 </span> 73 <span ng-show="task.patch_info"> 74 <a ng-href="/version/[[task.patch_info.Patch.Version]]"> 75 Patch [[task.patch_info.Patch.PatchNumber]] 76 by [[task.patch_info.Patch.Author]] 77 </a> 78 </span> 79 </li> 80 <li> 81 <a ng-href="/build/[[task.build_id]]"> 82 [[task.build_variant_display]] 83 </a> 84 </li> 85 <li> 86 [[task.display_name]] 87 </li> 88 </ol> 89 <div class="row"> 90 <div class="col-lg-7"> 91 <header class="clearfix"> 92 <h1 class="one-liner" id="task-title"> 93 <span class="label status-label" ng-class="task | statusFilter">[[task | statusLabel]]</span> 94 [[task.display_name]] <span class="text-muted">on</span> [[task.build_variant_display]] 95 </h1> 96 97 {{if .User}} 98 <div ng-show="!task.archived" class="pull-right page-actions"> 99 <div ng-controller="AdminOptionsCtrl" ng-init="setTask(task)"> 100 <div id="admin-dropdown" class="dropdown pull-right"> 101 <a id="admin-options" class="btn btn-default" data-toggle="dropdown"> 102 <i class="fa fa-gear"></i> 103 <i class="fa fa-caret-down"></i> 104 </a> 105 106 <ul class="dropdown-menu" role="menu"> 107 <li ng-class="{'admin-disabled': !canSchedule}"> 108 <a tabindex="-1" href="#" ng-click="!canSchedule || openAdminModal('schedule')">Schedule Task</a> 109 </li> 110 <li ng-class="{'admin-disabled': !canUnschedule}"> 111 <a tabindex="-1" href="#" ng-click="!canUnschedule || openAdminModal('unschedule')">Unschedule Task</a> 112 </li> 113 <li ng-class="{'admin-disabled': !canAbort}"> 114 <a tabindex="-1" href="#" ng-click="!canAbort || openAdminModal('abort')">Abort Task</a> 115 </li> 116 <li ng-class="{'admin-disabled': !canRestart}"> 117 <a tabindex="-1" href="#" ng-click="!canRestart || openAdminModal('restart')">Restart Task</a> 118 </li> 119 <li ng-class="{'admin-disabled': !canSetPriority}"> 120 <a tabindex="-1" href="#" ng-click="!canSetPriority || openAdminModal('setPriority')">Set Priority</a> 121 </li> 122 </ul> 123 </div> 124 <admin-modal> 125 <admin-schedule-task ng-show="adminOption=='schedule'"></admin-schedule-task> 126 <admin-unschedule-task ng-show="adminOption=='unschedule'"></admin-unschedule-task> 127 <admin-restart-task ng-show="adminOption=='restart'"></admin-restart-task> 128 <admin-abort-task ng-show="adminOption=='abort'"></admin-abort-task> 129 <admin-set-priority ng-show="adminOption=='setPriority'"></admin-set-priority> 130 </admin-modal> 131 </div> 132 </div> 133 {{end}} 134 </header> 135 <div class="row"> 136 <div class="col-lg-12"> 137 <div class="mci-pod"> 138 {{if .ProjectData.Patch}} 139 <patch-commit-panel patchinfo="task.patch_info" basecommit="task" timezone="{{GetTimezone .User}}" baselink="/task" base="{{.Task.PatchInfo.BaseTaskId}}"></patch-commit-panel> 140 {{else}} 141 <github-commit-panel commit="task" timezone="{{GetTimezone .User}}"></github-commit-panel> 142 {{end}} 143 144 <table id="task-info-elements"> 145 <tr ng-show="task.min_queue_pos != 0"> 146 <td class="icon"><i class="fa fa-sort-numeric-asc"></i></td> 147 <td> 148 <a href="/task_queue#/#[[task.id]]">[[task.min_queue_pos | ordinalNum]]</a> 149 in queue 150 </td> 151 </tr> 152 <tr> 153 <td ng-hide="task.expected_duration == 0"><i class="fa fa-clock-o"></i></td> 154 <td> 155 <span ng-hide="task.status == 'undispatched'"> 156 <span ng-show="timeTaken>0"> [[timeTaken | stringifyNanoseconds]] </span> 157 <span ng-show="timeTaken==0"> Not Started </span> 158 </span> 159 <span ng-show="task.status == 'started' || task.status == 'dispatched'"> (ETA: [[timeToCompletion | stringifyNanoseconds]])</span> 160 <span ng-show="task.status == 'undispatched' && task.expected_duration > 0"> Estimated Runtime: [[timeToCompletion | stringifyNanoseconds]]</span> 161 </td> 162 </tr> 163 <tr ng-show="baseTimeTaken"> 164 <td class="icon"><i class="fa fa-hourglass"></i></td> 165 <td>[[baseTimeTaken | stringifyNanoseconds]] on base commit</td> 166 </tr> 167 <tr ng-show="task.execution > 0 || task.archived"> 168 <td class="icon"><i class="fa fa-rotate-left"></i></td> 169 170 <td> 171 <span ng-show="!task.archived">Latest of [[task.execution+1]] executions</span> 172 <span ng-show="task.archived" class="highlight-bg">[[task.execution + 1 | ordinalNum]] execution</span> 173 <span class="dropdown"> 174 <button class="btn btn-default btn-dropdown btn-xs" data-toggle="dropdown" href="#" id="dLabel"> 175 Executions: <span class="fa fa-caret-down"></span> 176 </button> 177 <ul class="dropdown-menu"> 178 <li ng-repeat="i in otherExecutions"> 179 <a href="/task/[[task.id]]/[[i]]">[[i+1|ordinalNum]] execution </a> 180 </li> 181 </ul> 182 </span> 183 <span ng-show="task.archived"> 184 <a href="/task/[[task.id]]">Jump to latest</a> 185 </span> 186 </td> 187 188 </tr> 189 <tr ng-show="task.host_dns"> 190 <td class="icon"><i class="fa fa-desktop"></i></td> 191 <td> 192 <span> 193 <a href="/host/[[task.host_id]]" class="host-info-item">[[task.host_id]]</a> 194 <span ng-show="haveUser" class="label label-primary host-info-item"><a ng-href="/distros##[[task.distro]]">[[task.distro]]</a></span> 195 <span ng-hide="haveUser" class="label label-primary host-info-item">[[task.distro]]</span> 196 <a ng-show="haveUser && getSpawnLink().length > 0" href="[[getSpawnLink()]]" class="small">Spawn...</a> 197 </span> 198 </td> 199 </tr> 200 <tr ng-show="task.abort"> 201 <td class="icon"><i class="fa fa-level-down"></i></td> 202 <td>Aborting</td> 203 </tr> 204 <tr ng-show="task.start_time > 0 && (task.status != 'undispatched' && task.status != 'dispatched') "> 205 <td class="icon"><i class="fa fa-calendar"></i></td> 206 <td>Started on [[task.start_time | dateFromNanoseconds | convertDateToUserTimezone:userTz:"MMM D, YYYY h:mm:ss a"]]</td> 207 </tr> 208 <tr ng-show="task.finish_time > 0 && (task.status == 'success' || task.status == 'failed') "> 209 <td class="icon"><i class="fa fa-calendar"></i></td> 210 <td>Finished on [[task.finish_time | dateFromNanoseconds | convertDateToUserTimezone:userTz:"MMM D, YYYY h:mm:ss a"]]</td> 211 </tr> 212 <tr ng-show="task.priority > 0"> 213 <td class="icon"><i class="fa fa-rocket"></i></td> 214 <td>Priority: [[task.priority]]</td> 215 </tr> 216 <tr ng-show="task.priority < 0"> 217 <td class="icon"><i class="fa fa-ban"></i></td> 218 <td>Blacklisted</td> 219 </tr> 220 </table> 221 </div> 222 </div> 223 </div> 224 225 <div class="row" ng-show="!!task.depends_on && task.depends_on.length > 0"> 226 <div class="col-lg-12"> 227 <h3 class="section-heading"><i class="fa fa-exchange"></i> Depends On</h3> 228 <span ng-show="task.status=='blocked'" style="color:red"> This task will not run because its dependencies are in an undesirable state.</span> 229 <div class="mci-pod"> 230 <table class="table table-condensed dep-table"> 231 <tbody> 232 <tr ng-repeat="dependency in task.depends_on | filter :{recursive:false} | orderBy:dependency.build_variant:dependency.display_name"> 233 <td class="dep-status"> 234 <i ng-show="isMet(dependency) == 'met'" class="fa fa-check"></i> 235 <i ng-show="isMet(dependency) == 'unmet'" class="fa fa-ban"></i> 236 </td> 237 <td> 238 <a ng-href="/task/[[dependency.id]]">[[dependency.display_name]]</a> 239 <span ng-href="/task/[[dependency.id]]" ng-show="dependency.build_variant != task.build_variant"> 240 in <span class="cross-variant">[[dependency.build_variant]]</span> 241 </span> 242 </td> 243 <td> 244 <span class="label label-primary" ng-show="dependency.required == 'failed'"> must fail </span> 245 <span class="label label-primary" ng-show="dependency.required == '*'"> must finish </span> 246 </td> 247 <td class="dep-task-status"> 248 <span class="label [[dependency | statusFilter]]">[[dependency | statusLabel]]</span> 249 </td> 250 </tr> 251 </tbody> 252 </table> 253 </div> 254 </div> 255 </div> 256 257 <patch-diff-panel type="Test" diffs="task.patch_info.StatusDiffs" ng-show="task.patch_info" baselink=""></patch-diff-panel> 258 259 {{range .PluginContent.Panels.Left}} 260 {{.}} 261 {{end}} 262 </div> 263 <div class="col-lg-5"> 264 <div class="row"> 265 <div class="col-md-4"> 266 <h3 class="section-heading"><i class="fa fa-flask"></i> Tests</h3> 267 </div> 268 <div class="col-md-8"> 269 <div ng-hide="!task.test_results || task.test_results.length == 0" 270 class="dropdown pull-right" style="margin-top:15px"> 271 <button class="btn btn-default" data-toggle="dropdown" href="#" id="dLabel"> 272 <span class="semi-muted"> 273 Sort By: 274 </span> 275 <strong> 276 [[sortBy.name]] 277 <span class="fa fa-caret-down"></span> 278 </strong> 279 </button> 280 <ul class="dropdown-menu" role="menu" aria-labelledby="dLabel"> 281 <li role="presentation" class="dropdown-header">Sort Options</li> 282 <li role="presentation" ng-repeat="order in sortOrders"> 283 <a role="menuitem" ng-click="setSortBy(order);" href="javascript:return false;"> 284 [[order.name]] 285 </a> 286 </li> 287 </ul> 288 </div> 289 </div> 290 </div> 291 <div ng-show="!task.test_results || task.test_results.length == 0" class="mci-pod"> 292 <h4 class="text-center text-muted">No test results to show</h4> 293 <p class="text-center"> 294 <a ng-href="[[getTestHistoryUrl(project, task)]]"> 295 Explore task history 296 </a> 297 </p> 298 </div> 299 <div ng-show="task.test_results.length > 0" class="mci-pod"> 300 <div class=row> 301 <div class="col-md-12"> 302 <span class="label success pull-left" style="margin-right: 5px"> 303 [[(task.test_results | filter:{'status' : 'pass'}).length]] Succeeded 304 </span> 305 <span class="label failed pull-left"> 306 [[(task.test_results | filter:hasTestFailureStatus).length]] Failed 307 </span> 308 <span class="label unlabel semi-muted pull-right"> 309 <i class="fa fa-clock-o"></i> [[totalTestTimeNano | stringifyNanoseconds]] total runtime 310 </span> 311 </div> 312 </div> 313 <div id="tests-info"> 314 <table class="table test-results-table table-new"> 315 <thead> 316 <tr> 317 <th class="col-lg-6">Test</th> 318 <th class="col-lg-3">Time</th> 319 <th class="col-lg-3">Logs</th> 320 </tr> 321 </thead> 322 <tbody data-test-results="task.test_results"> 323 <tr ng-repeat="test in task.test_results | orderBy:sortBy.by:sortBy.reverse" 324 ng-show="test.status != 'skip'" 325 class="test-result-row" 326 ng-class="test.display_name == hash.test | conditional:'highlight-bg':''"> 327 <td class="col-lg-6"> 328 <div class="test-result-link-wrapper"> 329 <i class="icon fa fa-link" 330 style="cursor: pointer;" 331 ng-click="linkToTest(test.display_name)"> 332 </i> 333 </div> 334 <div class="test-result-name one-liner"> 335 <a ng-href="[[getTestHistoryUrl(project, task, test)]]"> 336 [[test.display_name]] 337 </a> 338 </div> 339 <div style="clear: both"></div> 340 </td> 341 <td class="col-lg-3"> 342 <div class="progress [[progressBarClass]]" test-result-bar="test" style="width: [[barWidth]]%"></div> 343 </td> 344 <td class="col-lg-3"> 345 <div class="url-link nowrap" id="html-link"> 346 <a ng-href="[[getURL(test, false)]]" ng-hide="[[hideURL(test, false)]]"> 347 HTML 348 </a> 349 </div> 350 <div id="separator"> 351 <b ng-show="[[hasBothURL(test)]]">·</b> 352 </div> 353 <div class="url-link nowrap" id="raw-link"> 354 <a ng-href="[[getURL(test, true)]]" ng-hide="[[hideURL(test, true)]]"> 355 Raw 356 </a> 357 </div> 358 </td> 359 </tr> 360 </tbody> 361 </table> 362 </div> 363 </div> 364 365 {{range .PluginContent.Panels.Right}} 366 {{.}} 367 {{end}} 368 </div> 369 </div> 370 <div class="row"> 371 <div class="col-lg-12"> 372 {{range .PluginContent.Panels.Center}} 373 {{.}} 374 {{end}} 375 </div> 376 </div> 377 </div> 378 379 <div class="row" ng-controller="TaskLogCtrl"> 380 <div class="col-lg-12"> 381 <h3 class="section-heading"> 382 <i class="fa fa-folder-open"></i> 383 Logs 384 <span id="view-as">view as:</span> 385 <a ng-href="[[getRawLogLink(false)]]" class="task-log-links" target="_blank">HTML</a> 386 <span ng-hide="currentLogs==eventLogs"> 387 <b>·</b> 388 <a ng-href="[[getRawLogLink(true)]]" class="task-log-links" target="_blank">Raw</a> 389 </span> 390 <div id="logs-options" class="btn-group btn-group-sm"> 391 <a class="pointer btn btn-default" ng-class="{active:currentLogs==allLogs}" ng-click="setCurrentLogs(allLogs)">All logs</a> 392 <a class="pointer btn btn-default" ng-class="{active:currentLogs==taskLogs}" ng-click="setCurrentLogs(taskLogs)">Task logs</a> 393 {{if .User}} 394 <a class="pointer btn btn-default" ng-class="{active:currentLogs==agentLogs}" ng-click="setCurrentLogs(agentLogs)">Agent logs</a> 395 {{end}} 396 {{if .User}} 397 <a class="pointer btn btn-default" ng-class="{active:currentLogs==systemLogs}" ng-click="setCurrentLogs(systemLogs)">System logs</a> 398 {{end}} 399 <a class="pointer btn btn-default" ng-class="{active:currentLogs==eventLogs}" ng-click="setCurrentLogs(eventLogs)">Event logs</a> 400 </div> 401 </h3> 402 <div class="row"> 403 <div class="col-lg-12"> 404 <pre ng-show="currentLogs != eventLogs && logs.length"><span ng-repeat="entry in logs.slice().reverse() track by $index" class="severity-[[ entry.severity ]]" ng-bind-html="formatTimestamp(entry, 1) + (entry.message | escapeHtml) + '\n' | linkify | ansi | trustAsHtml"></span></pre> 405 {{if .User}} 406 <pre ng-show="(currentLogs == agentLogs || currentLogs == systemLogs) && !logs.length">No logs found.</pre> 407 {{else}} 408 <pre ng-show="(currentLogs == agentLogs || currentLogs == systemLogs) && !logs.length"><span class="severity-ERROR">You are not authorized to view these logs.</span></pre> 409 {{end}} 410 <pre ng-show="(currentLogs == allLogs || currentLogs == taskLogs) && !logs.length">No logs found.</pre> 411 <div ng-repeat="eventLogItem in eventLogData" ng-show="currentLogs == eventLogs"> <taskevent event="eventLogItem" tz="userTz"></taskevent></div> 412 </div> 413 </div> 414 </div> 415 </div> 416 417 418 {{end}}