| <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("⌛ 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> |
| |
| <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> |
| <span>Sort: </span> |
| <select v-model="sortOption" @change="formChanged"> |
| <option value="FailureRate">Failure Rate</option> |
| <option value="SuiteDuration">Suite Duration</option> |
| </select> |
| <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"> |
| |
| <span title="Show ignored tests">Ignored: </span> |
| <input type="checkbox" v-model="ignored" @change="formChanged"> |
| |
| |
| <span title="Show trusted tests count">Trusted tests: </span> |
| <input type="checkbox" v-model="trustedTests" @change="formChanged"> |
| <span title="Download and parse all logs">Check logs: </span> |
| <input type="checkbox" v-model="checkAllLogs" @change="formChanged"> |
| |
| <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> |
| |
| <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> |
| |
| <span> <a id="permalink"></a> </span> |
| |
| |
| |
| |
| <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> |