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">&nbsp;</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]]&nbsp;
   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)]]">&middot;</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>&middot;</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}}