app/views/showBake.scala.html (109 lines of code) (raw):
@import data.PackageListDiff
@import fun.mike.dmp.Operation
@(bake: Bake,
bakeLogs: Iterable[BakeLog],
packageList: Either[String, List[String]],
packageListDiff: Either[String, PackageListDiff],
inUse: Boolean)
@layout("AMIgo"){
<h1><a href="@routes.RecipeController.showRecipe(bake.recipe.id)">@bake.recipe.id</a> bake number @bake.bakeId.buildNumber</h1>
<div class="panel panel-default">
<div class="panel-heading">Info</div>
<ul class="list-group">
<li class="list-group-item bake--info">
<span class="bake--info--title">Number: </span>
<span><b>#@bake.buildNumber</b></span>
</li>
<li class="list-group-item bake--info">
<span class="bake--info--title">Status: </span>
<span><b>@bake.status</b></span>
</li>
<li class="list-group-item bake--info">
<span class="bake--info--title">AMI: </span>
<span id="ami-id"><b>@bake.amiId.getOrElse("(none)")</b></span>
<span class="bake--info--right">
<button class="btn btn-primary" title="Copy to clipboard" id="copy-button" data-clipboard-target="#ami-id">
<img src="@routes.Assets.versioned("images/clippy.svg")" width="13" alt="Copy to clipboard">
</button>
</span>
</li>
<li class="list-group-item bake--info">
<span class="bake--info--title">Usage: </span>
<span>@if(inUse){Bake in use and cannot be deleted}else{Bake is not currently used}</span>
</li>
<li class="list-group-item">
<span class="bake--info--refresh--message"><b>Refresh page to see current status.</b></span>
</ul>
</div>
<div class="panel panel-default">
<div class="panel-heading">Actions</div>
<div class="panel-body">
<a href="@routes.BakeController.deleteConfirm(bake.bakeId.recipeId, bake.bakeId.buildNumber)" class="btn btn-danger" @if(inUse){disabled}>Delete bake and all associated AMIs...</a>
</div>
</div>
<div class="well" id="packer-output">
@for(log <- bakeLogs) {
<div class="bake-log">[@log.timestamp.toString("YYYY-MM-dd HH:mm:ss")] @log.messageHtml</div>
}
<div class="bake-log">Refresh the page to view new log messages</div>
</div>
<div class="package-list">
@packageListDiff match {
case Right(PackageListDiff(previousBakeId, removed, added, diff)) => {
<h2>Package Changes</h2>
<div class="row">
<div class="col-md-12">
Package changes since the <a href="@routes.BakeController.showBake(previousBakeId.recipeId, previousBakeId.buildNumber)">last succesful bake</a>.
</div>
</div>
<div class="row">
<div class="col-md-12">
<div class="well package-list">
@for(d <- diff) {
@d.operation match {
case Operation.EQUAL => {
<span>@Html(d.text)</span>
}
case Operation.INSERT => {
<ins class="package-diff-insert">@Html(d.text)</ins>
}
case Operation.DELETE => {
<del class="package-diff-delete">@Html(d.text)</del>
}
}
}
</div>
</div>
</div>
}
case Left(message) => {}
}
</div>
<h2>All installed packages</h2>
<p>
This data comes from the OS default package manager (e.g. apt on Ubuntu, yum on amazon linux).
</p>
@packageList match {
case Left(message) => {
@views.html.fragments.bakeOutput(List(message))
}
case Right(list) => {
@views.html.fragments.bakeOutput(list)
}
}
</div>
} {
<script src="@routes.Assets.versioned("javascripts/show-bake.js")" type="text/javascript"></script>
<script src="@routes.Assets.versioned("javascripts/clipboard.min.js")"></script>
<script>
var copy = document.getElementById('copy-button');
var clipboard = new Clipboard(copy);
clipboard.on('success', function(e) {
console.log(e);
copy.classList.add('btn--success');
});
clipboard.on('error', function(e) {
console.log(e);
});
</script>
}