blob: 311b1b6a22ef1a6b09835f251811924022156d9f [file] [log] [blame]
<html>
<head>
<title>Apache Ignite Teamcity Bot - Current Failures</title>
<link rel="icon" href="img/leaf-icon-png-7066.png">
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.4.2/css/all.css"
integrity="sha384-/rXc/GQVaYpyDdyxK+ecHPVYJSN9bmVFBvjA/9eOB+pb3F2w2N6fc5qB9Ew5yIns" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vue@2.x/dist/vue.js"></script>
<!--<link href="https://cdn.jsdelivr.net/npm/vuetify/dist/vuetify.min.css" rel="stylesheet">-->
<link rel="stylesheet" href="css/vue-slider-1.0.css">
<link rel="stylesheet" href="https://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<link rel="stylesheet" href="css/style-1.5.css">
<script src="https://cdn.jsdelivr.net/npm/vuetify@2.x/dist/vuetify.js"></script>
<script src="js/common-1.6.js"></script>
<script src="js/testfails-2.2.js"></script>
</head>
<body>
<script>
let g_shownDataHashCodeHex = "";
let g_checkForUpdateSched = false;
let gVue;
function genLink() {
let newUrl = "./current.html" + parmsForRest();
let permalink = $("#permalink");
permalink.attr("href", newUrl);
permalink.html("Permalink");
}
function showQueryForm() {
let min, max;
let minFailRate = findGetParameter("minFailRate");
if (minFailRate != null) {
min = parseInt(minFailRate);
} else {
min = 0;
}
let maxFailRate = findGetParameter("maxFailRate");
if (maxFailRate != null) {
max = parseInt(maxFailRate);
} else {
max = 100;
}
gVue = new Vue({
el: '#vueQueryForm',
vuetify: new Vuetify(),
data: {
tagSelected: '',
tagsPresent: [""],
tagForHistSelected: '',
tagsForHistPresent: [""],
displayMode: 'Failures',
sortOption: 'FailureRate',
//count of builds to merge
count: 1,
muted: false,
ignored: false,
trustedTests: true,
checkAllLogs: false,
hideFlakyFailures: false,
showTestLongerThan: '',
absMinFailRate: 0,
absMaxFailRate: 100,
failRateRange: [min, max]
},
methods: {
formChanged: function () {
if (count < 1)
count = 1;
loadData();
genLink();
}
}
});
let tagSelected = findGetParameter("tagSelected");
if (tagSelected != null) {
gVue.$data.tagsPresent.push(tagSelected);
gVue.$data.tagSelected = tagSelected;
}
let displayMode = findGetParameter("displayMode");
if (displayMode != null) {
gVue.$data.displayMode = displayMode;
}
let sortOption = findGetParameter("sortOption");
if (sortOption != null) {
gVue.$data.sortOption = sortOption;
}
let count = findGetParameter("count");
if (count != null) {
gVue.$data.count = count;
}
let parm = findGetParameter("trustedTests");
if (isDefinedAndFilled(parm)) {
gVue.$data.trustedTests = parm === "true";
}
gVue.$data.muted = findGetParameter("muted") === "true";
gVue.$data.ignored = findGetParameter("ignored") === "true";
gVue.$data.checkAllLogs = findGetParameter("checkAllLogs") === "true";
gVue.$data.hideFlakyFailures = findGetParameter("hideFlakyFailures") === "true";
let showTestLongerThan = findGetParameter("showTestLongerThan");
if (showTestLongerThan != null)
gVue.$data.showTestLongerThan = showTestLongerThan;
let tagForHistSelected = findGetParameter("tagForHistSelected");
if (tagForHistSelected != null) {
gVue.$data.tagsForHistPresent.push(tagForHistSelected);
gVue.$data.tagForHistSelected = tagForHistSelected;
}
genLink();
}
$(document).ready(function() {
$.getScript("js/testfails-2.2.js", function(data, textStatus, jqxhr){ });
$( document ).tooltip();
showQueryForm();
loadData();
$.ajax({ url: "/rest/branches/version", success: showVersionInfo, error: showErrInLoadStatus });
});
function parmsForRest() {
var curReqParms = "";
var branch = findGetParameter("branch");
curReqParms += "?branch=" + (branch != null ? branch : "master");
if (gVue.$data.checkAllLogs === true) {
curReqParms += "&checkAllLogs=" + gVue.$data.checkAllLogs;
}
if (gVue.$data.trustedTests === false) {
curReqParms += "&trustedTests=" + gVue.$data.trustedTests;
}
if (gVue.$data.muted === true) {
curReqParms += "&muted=" + gVue.$data.muted;
}
if (gVue.$data.ignored === true) {
curReqParms += "&ignored=" + gVue.$data.ignored;
}
var tagSelected = gVue.$data.tagSelected;
if (tagSelected != null && tagSelected !== "") {
curReqParms += "&tagSelected=" + tagSelected;
}
var displayMode = gVue.$data.displayMode;
if (displayMode != null && displayMode !== "" && displayMode !== "Failures") {
curReqParms += "&displayMode=" + displayMode;
}
var sortOption = gVue.$data.sortOption;
if (sortOption != null && sortOption !== "" && sortOption !== "FailureRate") {
curReqParms += "&sortOption=" + sortOption;
}
let count = gVue.$data.count;
if (count != null && count > 1)
curReqParms += "&count=" + count;
let minFailRate = gVue.$data.failRateRange[0];
if (minFailRate != null && minFailRate > 0)
curReqParms += "&minFailRate=" + minFailRate;
let maxFailRate = gVue.$data.failRateRange[1];
if (maxFailRate != null && maxFailRate < 100)
curReqParms += "&maxFailRate=" + maxFailRate;
let hideFlakyFailures = gVue.$data.hideFlakyFailures;
if (hideFlakyFailures != null && hideFlakyFailures === true)
curReqParms += "&hideFlakyFailures=" + hideFlakyFailures;
let tagForHistSelected = gVue.$data.tagForHistSelected;
if (tagForHistSelected != null && tagForHistSelected !== "")
curReqParms += "&tagForHistSelected=" + tagForHistSelected;
let runTime = gVue.$data.showTestLongerThan;
if (runTime != null && runTime > 0)
curReqParms += "&showTestLongerThan=" + runTime;
return curReqParms;
}
function checkForUpdate() {
var curFailuresUrl = "rest/tracked/updates" + parmsForRest();
g_checkForUpdateSched = false;
$.ajax({
url: curFailuresUrl,
success: function (result) {
if (g_shownDataHashCodeHex !== "" && isDefinedAndFilled(result.hashCodeHex)) {
if (g_shownDataHashCodeHex === result.hashCodeHex) {
if (!g_checkForUpdateSched) {
g_checkForUpdateSched = true;
setTimeout(checkForUpdate, 60000);
}
$("#loadStatus").html("");
} else {
loadData(); // data changed, show new
}
} else {
loadData();
}
},
error: showErrInLoadStatus
});
}
function loadData() {
var curFailuresUrl = "rest/tracked/results" + parmsForRest();
$("#loadStatus").html("<img src='https://www.wallies.com/filebin/images/loading_apple.gif' width=20px height=20px> Please wait");
setTimeout(loadPartialData, 3000);
$.ajax({
url: curFailuresUrl,
success: function (result) {
showData(result);
g_shownDataHashCodeHex = isDefinedAndFilled(result.hashCodeHex) ? result.hashCodeHex : "";
if (!g_checkForUpdateSched) {
g_checkForUpdateSched = true;
setTimeout(checkForUpdate, 20000);
}
},
error: showErrInLoadStatus
});
}
function loadPartialData() {
var curFailuresUrl = "rest/tracked/resultsNoSync" + parmsForRest();
if (g_shownDataHashCodeHex !== "") {
return;
}
$.ajax({
url: curFailuresUrl,
success: function (result) {
if (g_shownDataHashCodeHex !== "") {
return;
}
var validResult = true;
for (var i = 0; i < result.servers.length; i++) {
var server = result.servers[i];
if (isDefinedAndFilled(server.buildNotFound) && server.buildNotFound) {
validResult = false;
break;
}
}
if (validResult)
showData(result);
setTimeout(loadPartialData, 3000);
},
error: showErrInLoadStatus
});
}
function showData(result) {
let setOfTags = new Set(gVue.$data.tagsPresent);
let setOfHistTags = new Set(gVue.$data.tagsForHistPresent);
for (let i = 0; i < result.servers.length; i++) {
let chain = result.servers[i];
for (let j = 0; j < chain.suites.length; j++) {
let suite = chain.suites[j];
if(isDefinedAndFilled(suite.tags)) {
for (let k = 0; k < suite.tags.length; k++) {
const tag = suite.tags[k];
setOfTags.add(tag);
setOfHistTags.add(tag);
}
}
}
}
gVue.$data.tagsPresent = Array.from(setOfTags);
gVue.$data.tagsForHistPresent = Array.from(setOfHistTags);
//var txtUrl = "rest/tracked/results/txt" + parmsForRest();
var minFailRate = gVue.$data.failRateRange[0];
var maxFailRate = gVue.$data.failRateRange[1];
var hideFlakyFailures = gVue.$data.hideFlakyFailures === true;
let resHtml = showChainResultsWithSettings(result, new Settings(minFailRate, maxFailRate, result.javaFlags, hideFlakyFailures));
$("#divFailures").html(resHtml);
// + " <a href='"+ txtUrl + "'>txt</a>");
}
</script>
<div id="vueQueryForm">
<v-app id="prQueryForm" name="prQueryForm">
<div class="formgroup">
<table>
<tr>
<td>
<span title="Tag filter for displaying suites">Tag filter: </span>
<select v-model="tagSelected" @change="formChanged">
<option disabled value="">Please select one</option>
<option v-for="option in tagsPresent" v-bind:value="option">
{{ option }}
</option>
</select>
&nbsp;&nbsp;&nbsp;<span title="Tag filter for filtering history of suites">History tag filter: </span>
<select v-model="tagForHistSelected" @change="formChanged">
<option disabled value="">Please select one</option>
<option v-for="option in tagsForHistPresent" v-bind:value="option">
{{ option }}
</option>
</select>
<br>
<span>Display Mode: </span>
<select v-model="displayMode" @change="formChanged">
<option value="Failures">Show failures only</option>
<option value="AllSuites">Show all suites</option>
</select>
&nbsp;&nbsp;&nbsp;<span>Sort: </span>
<select v-model="sortOption" @change="formChanged">
<option value="FailureRate">Failure Rate</option>
<option value="SuiteDuration">Suite Duration</option>
</select>
&nbsp;&nbsp;&nbsp;<span>Merge Builds: </span>
<input v-model.number="count" type="number" @change="formChanged">
<br>
<span title="Show muted tests">Muted: </span>
<input type="checkbox" v-model="muted" @change="formChanged">
&nbsp;&nbsp;&nbsp;
<span title="Show ignored tests">Ignored: </span>
<input type="checkbox" v-model="ignored" @change="formChanged">
&nbsp;&nbsp;&nbsp;
<span title="Show trusted tests count">Trusted tests: </span>
<input type="checkbox" v-model="trustedTests" @change="formChanged">
&nbsp;&nbsp;&nbsp;<span title="Download and parse all logs">Check logs: </span>
<input type="checkbox" v-model="checkAllLogs" @change="formChanged">
&nbsp;&nbsp;&nbsp;<span>Tests longer than, seconds: </span>
<input v-model.number="showTestLongerThan" type="number" @change="formChanged">
</td>
<td style="width: 50%">
<v-expansion-panels>
<v-expansion-panel>
<v-expansion-panel-header>More options</v-expansion-panel-header>
<v-expansion-panel-content>
&nbsp;&nbsp;<span title="Hide flaky failures">Hide flaky: </span>
<input type="checkbox" v-model="hideFlakyFailures" @change="formChanged">
<v-range-slider
v-model="failRateRange"
:max="absMaxFailRate"
:min="absMinFailRate"
hide-details
class="align-center"
@change="formChanged"
>
<template v-slot:prepend>
<span>Min failure rate: </span>
<v-text-field
v-model="failRateRange[0]"
class="mt-0 pt-0"
hide-details
single-line
type="number"
style="width: 60px"
@change="formChanged"></v-text-field>
<span>Max failure rate: </span>
<v-text-field
v-model="failRateRange[1]"
class="mt-0 pt-0"
hide-details
single-line
type="number"
style="width: 60px"
@change="formChanged"></v-text-field>
</template>
<template v-slot:append>
</template>
</v-range-slider>
</v-expansion-panel-content>
</v-expansion-panel>
</v-expansion-panels>
</td>
</tr>
</table>
&nbsp;&nbsp; <span> <a id="permalink"></a> </span>
&nbsp;&nbsp;
<span id="loadStatus"></span>
</div>
<br>
<div id="divFailures"></div>
</v-app>
</div>
<div id="version"></div>
<div style="visibility:hidden;"><div id="triggerConfirm" title="Trigger Confirmation"></div><div id="triggerDialog" title="Trigger Result"></div></div>
</body>
</html>