@spotinst/spinnaker-deck
Version:
Spinnaker-Deck service, forked with support to Spotinst
205 lines (202 loc) • 9.63 kB
HTML
<div class="row tasks-wrapper">
<div class="horizontal center spinner-container" ng-if="viewState.loading" style="width: 100%">
<loading-spinner size="'medium'"></loading-spinner>
</div>
<div class="col-md-12" ng-if="viewState.loadError">
<h4 class="text-center">There was an error loading tasks. Please try again later.</h4>
</div>
<div class="col-md-12 tasks" ng-if="!viewState.loading && !viewState.loadError">
<div class="row tasks-header">
<div class="col-md-5">
<div class="btn-group">
<label class="btn btn-sm btn-default" ng-model="viewState.taskStateFilter" uib-btn-radio="''">
<a href>All</a>
</label>
<label class="btn btn-sm btn-default" ng-model="viewState.taskStateFilter" uib-btn-radio="'NOT_STARTED'">
<a href> <status-glyph item="{hasNotStarted: true}"></status-glyph> Not Started </a>
</label>
<label class="btn btn-sm btn-default" ng-model="viewState.taskStateFilter" uib-btn-radio="'RUNNING'">
<a href> <status-glyph item="{isRunning: true}"></status-glyph> Running </a>
</label>
<label class="btn btn-sm btn-default" ng-model="viewState.taskStateFilter" uib-btn-radio="'SUCCEEDED'">
<a href> <status-glyph item="{isCompleted: true}"></status-glyph> Succeeded </a>
</label>
<label class="btn btn-sm btn-default" ng-model="viewState.taskStateFilter" uib-btn-radio="'TERMINAL'">
<a href> <status-glyph item="{isFailed: true}"></status-glyph> Terminal </a>
</label>
<label class="btn btn-sm btn-default" ng-model="viewState.taskStateFilter" uib-btn-radio="'CANCELED'">
<a href> <status-glyph item="{isCanceled: true}"></status-glyph> Canceled </a>
</label>
</div>
</div>
<div class="col-md-4 text-right horizontal right" style="padding-right: 0; margin-left: auto">
<a
class="btn btn-link"
ng-click="tasks.clearNameFilter()"
style="padding-right: 5px"
ng-if="viewState.nameFilter.length > 0"
>
<span class="glyphicon glyphicon-remove" uib-tooltip="clear search filter"></span>
</a>
<div class="form-group has-feedback">
<label class="sr-only" for="task-filter">Filter tasks by name, user, or task ID</label>
<input
type="search"
id="task-filter"
class="form-control input-sm"
placeholder="Filter tasks by name, user, or task ID"
ng-change="tasks.nameFilterUpdated()"
ng-model="viewState.nameFilter"
/>
<span class="glyphicon glyphicon-search form-control-feedback"></span>
</div>
</div>
</div>
<div class="row tasks-content">
<div class="col-md-10 col-md-offset-1 text-center" ng-if="!tasks.sortedTasks.length" style="margin-top: 30px">
<h4 ng-if="!viewState.nameFilter && !viewState.taskStateFilter">
We couldn't find any tasks for {{tasks.application.name}}
</h4>
<div ng-if="viewState.nameFilter || viewState.taskStateFilter">
<h4>We couldn't find any tasks matching the filters you've specified.</h4>
<p style="margin-top: 20px"><strong>Note</strong> that Spinnaker only tracks tasks for two weeks.</p>
</div>
</div>
<div class="col-md-12" ng-if="tasks.sortedTasks.length">
<table class="table table-condensed">
<thead>
<tr>
<th width="30%">Task</th>
<th width="5%">Account</th>
<th width="8%">Region</th>
<th width="12%">Progress</th>
<th width="12%">Started</th>
<th width="12%">Ended</th>
<th width="8%">Running Time</th>
<th>User</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
<tr class="clickable" ng-click="tasks.toggleDetails(task.id)" ng-repeat-start="task in tasks.resultPage()">
<td>
<div class="task-name">
<a href id="task-{{task.id}}"
><span class="glyphicon glyphicon-chevron-{{tasks.isExpanded(task.id) ? 'down' : 'right'}}"></span
></a>
{{task.name}}
</div>
<div ng-if="tasks.getFirstDeployServerGroupName(task)" class="task-name">
<a href><span class="glyphicon glyphicon-none"></span></a>
<span ng-if="tasks.getProviderForServerGroupByTask(task)">
Deployed
<a
ui-sref="^.insight.clusters.serverGroup({application: tasks.application.name, serverGroup: tasks.getFirstDeployServerGroupName(task), accountId: tasks.getAccountId(task), region: tasks.getRegion(task), provider: tasks.getProviderForServerGroupByTask(task)})"
ng-click="$event.stopPropagation()"
>
{{tasks.getFirstDeployServerGroupName(task)}}</a
>
</span>
<span ng-if="!tasks.getProviderForServerGroupByTask(task)">
Deployed {{tasks.getFirstDeployServerGroupName(task)}}
</span>
</div>
</td>
<td>
<account-tag
account="task.getValueFor('credentials') ? task.getValueFor('credentials') : task.getValueFor('account')"
pad="both"
></account-tag>
</td>
<td>
<span ng-if="task.getValueFor('region')">{{task.getValueFor('region')}}</span>
<span ng-if="!task.getValueFor('region') && task.getValueFor('regions')"
>{{task.getValueFor('regions').join(', ')}}</span
>
<span
ng-if="!task.getValueFor('region') && !task.getValueFor('regions') && task.getValueFor('location')"
>
{{task.getValueFor('location')}}
</span>
</td>
<td>
<task-progress-bar task="task"></task-progress-bar>
</td>
<td>{{ task.startTime | timestamp }}</td>
<td>{{ task.endTime | timestamp }}</td>
<td>
<span ng-if="task.runningTimeInMs && !viewState.cancelling">
{{ task.runningTimeInMs | duration }}
</span>
<span ng-if="viewState.cancelling || !task.runningTimeInMs"> - </span>
</td>
<td>{{ task.getDisplayUser() }}</td>
<td class="small text-center">
<a
ng-if="task.isRunning || task.hasNotStarted"
href
ng-click="tasks.cancelTask(task.id); $event.stopPropagation();"
>
<span class="glyphicon glyphicon-remove" uib-tooltip="Cancel Task"></span>
</a>
</td>
</tr>
<tr ng-repeat="step in task.steps | displayableTasks" ng-if="tasks.isExpanded(task.id)" class="task-step">
<td colspan="4">
<status-glyph item="step"></status-glyph>
{{step.name | robotToHuman }}
</td>
<td>{{ step.startTime | timestamp }}</td>
<td>{{ step.endTime | timestamp }}</td>
<td colspan="3">{{ step.runningTimeInMs | duration }}</td>
</tr>
<tr class="task-error-message danger" ng-if="task.isFailed && tasks.isExpanded(task.id)">
<td colspan="9">
<strong>Exception:</strong> <span ng-bind-html="task.failureMessage || 'No reason provided'"></span>
</td>
</tr>
<tr ng-if="tasks.isExpanded(task.id) && task.getValueFor('reason')" class="task-reason">
<td colspan="9"><strong>Reason:</strong> <span ng-bind-html="task.getValueFor('reason')"></span></td>
</tr>
<tr ng-if="tasks.isExpanded(task.id)" ng-repeat-end>
<td colspan="9" class="small text-right">
<a href="{{tasksUrl + task.id}}" target="_blank">View as JSON</a> |
<a target="_blank" ui-sref=".taskDetails({taskId: task.id})">Permalink</a>
<copy-to-clipboard
text="$state.href(viewState.nameFilter ? '.' : '.taskDetails', {taskId: task.id}, {absolute:true} )"
tool-tip="'Copy permalink to clipboard'"
></copy-to-clipboard>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="row pagination-footer">
<div class="col-md-9">
<ul
uib-pagination
ng-if="!viewState.loading && tasks.sortedTasks.length > pagination.itemsPerPage"
items-per-page="pagination.itemsPerPage"
total-items="tasks.sortedTasks.length"
max-size="pagination.maxSize"
ng-model="pagination.currentPage"
class="pagination-sm"
></ul>
</div>
<div class="col-md-3 text-right">
<div class="form-group">
Show
<select
class="input input-sm"
ng-model="viewState.itemsPerPage"
ng-change="tasks.sortTasksAndResetPaginator()"
ng-options="count for count in filterCountOptions"
style="width: 50px"
></select>
per page
</div>
</div>
</div>
</div>
</div>