openstack-health/app/views/home.html

206 lines
10 KiB
HTML

<header class="bs-header">
<div class="container">
<div class="row">
<div class="col-lg-12">
<h1 class="page-header">
OpenStack Health
<small>
is a dashboard for visualizing test results of OpenStack CI jobs.
</small>
</h1>
<crumb-menu show-group-key="true"
show-resolution="true"
show-period="true"></crumb-menu>
<loading-indicator></loading-indicator>
<fresh-check></fresh-check>
</div>
</div>
</div>
</header>
<div class="container">
<div class="row">
<div class="col-lg-12">
<div class="panel panel-default">
<div class="panel-heading panel-controls">
<h3 class="panel-title">Total Jobs</h3>
<div class="input-group">
<div class="input-group-addon"><i class="fa fa-search"></i></div>
<input type="text" class="form-control"
placeholder="Search for {{ home.groupKey }} with regex"
ng-model="home.searchProject"
ng-model-options="{debounce: 250}"
ng-change="home.onSearchChange()"
uib-tooltip="You can see {{home.projects.length}} {{ home.groupKey }}(s). Details are at the bottom.">
</div>
</div>
<div class="panel-body">
<chart width="100%" height="250px">
<chart-axis name="x" opposes="y" type="time"
path=".x" align="bottom" orient="horizontal"
granular-format="%x %X"></chart-axis>
<chart-axis name="y" opposes="x" type="linear"
path=".y" align="left" orient="vertical"
draw="true"></chart-axis>
<chart-dataset name="passes"
title="Passes"
data="home.passes"></chart-dataset>
<chart-dataset name="failures"
title="Failures"
data="home.failures"></chart-dataset>
<chart-canvas-line dataset="passes"
axes="x y"
stroke="blue"
line-width="1"></chart-canvas-line>
<chart-canvas-line dataset="failures"
axes="x y"
stroke="red"
line-width="1"></chart-canvas-line>
<chart-tooltip primary="x" secondary="y"></chart-tooltip>
</chart>
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading panel-controls">
<h3 class="panel-title">Job Failure Rate</h3>
<div class="input-group">
<div class="input-group-addon"><i class="fa fa-search"></i></div>
<input type="text" class="form-control"
placeholder="Search for {{ home.groupKey }} with regex"
ng-model="home.searchProject"
ng-model-options="{debounce: 250}"
ng-change="home.onSearchChange()"
uib-tooltip="You can see {{home.projects.length}} {{ home.groupKey }}(s). Details are at the bottom.">
</div>
</div>
<div class="panel-body">
<chart width="100%" height="250px">
<chart-axis name="x" type="time" path=".x" opposes="y"
align="bottom" orient="horizontal"
granular-format="%x %X"></chart-axis>
<chart-axis name="y" type="linear" path=".y" opposes="x"
align="left" orient="vertical"
domain="[0, 1]" draw="true"
granular-format=".3f"></chart-axis>
<chart-dataset name="rate"
title="% Failures"
data="home.failRate"></chart-dataset>
<chart-canvas-line dataset="rate" axes="x y"
stroke="red"
line-width="1"></chart-canvas-line>
<chart-tooltip primary="x" secondary="y"></chart-tooltip>
</chart>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-lg-12">
<div class="panel panel-default table-responsive">
<div class="panel-heading">
<h3 class="panel-title">Failed Tests in Last 10 Failed Runs</h3>
</div>
<table class="table table-hover default-cols">
<thead>
<tr>
<th class="tiny"></th>
<th>Job</th>
<th>Artifacts Link</th>
<th># Failed</th>
<th>Likely Bugs</th>
</tr>
</thead>
<tbody>
<tr nest="templates/run-details.html"
ng-repeat="(key, value) in home.recentRuns">
<td><span nest-toggle nest-indicator></span></td>
<td><a href nest-toggle>{{key | split:'/' | last:2 | pick:0}}</a></td>
<td>
<a target="_blank" href="{{ key }}">
{{key | split:'/' | last:2 | pick:1}}
<fa name="external-link"></fa>
</a>
</td>
<td>{{ value.fails.length }}</td>
<td>
<span ng-if="!!value.bugs">
<a ng-repeat="bug in value.bugs"
href="https://launchpad.net/bugs/{{bug}}"
uib-tooltip="Launchpad Bugs: {{bug}}"
target="_blank">{{bug}} <fa name="external-link"></fa>
</a>
</span>
<span ng-if="!value.bugs">-</span>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="row">
<div class="col-lg-12">
<div class="panel panel-default table-responsive">
<div class="panel-heading panel-controls">
<h3 class="panel-title">{{home.groupKey | replace:'_':' ' | camelcase}} Status</h3>
<div class="input-group">
<div class="input-group-addon"><i class="fa fa-search"></i></div>
<input type="text" class="form-control"
placeholder="Search for {{ home.groupKey }} with regex"
ng-model="home.searchProject"
ng-model-options="{debounce: 250}"
ng-change="home.onSearchChange()">
</div>
</div>
<table table-sort class="table table-hover status-table" data="home.projects"
uib-popover-template="'templates/context-legend.html'"
popover-placement="top"
popover-trigger="mouseenter">
<thead>
<tr>
<th field="number" class="text-center">#</th>
<th sort-field="name" class="text-center">Name</a></th>
<th sort-field="passes" class="text-center">Passes</th>
<th sort-field="failures" class="text-center">Failures</th>
<th sort-field="passRate" class="text-center">% Passes</th>
<th sort-default sort-field="failRate" class="text-center">% Failures</th>
<th class="text-center">Bar Graph</th>
</tr>
</thead>
<tbody>
<tr table-ref="table" ng-repeat="p in home.projects | regex:'name':home.searchProject"
ng-class="p.failRate | ctxcls">
<td class="text-right">{{$index+1}}</td>
<td class="text-left">
<a ui-sref="groupedRuns({ runMetadataKey: home.groupKey, name: p.name })">{{p.name}}</a>
<span ng-if="!!home.apiRoot">
<a href="{{ home.apiRoot }}/runs/key/{{ home.groupKey }}/{{ p.name }}/recent/rss"
target="_blank">
<fa name="rss-square"></fa>
</a>
</span>
</td>
<td class="text-right">{{p.passes|number}}</td>
<td class="text-right">{{p.failures|number}}</td>
<td class="text-right">{{p.passRate*100|number:2}}</td>
<td class="text-right">{{p.failRate*100|number:2}}</td>
<td uib-tooltip-html="p.tooltip" tooltip-placement="top" tooltip-animation="false">
<chart-gauge-horizontal value="1 - p.failRate"
width="300"
height="20"></chart-gauge-horizontal>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>