This is an automated email from the ASF dual-hosted git repository.
dpavlov pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite-teamcity-bot.git
The following commit(s) were added to refs/heads/master by this push:
new 927e940 IGNITE-11994: Added query option for detailed report for
current tracked branch - Fixes #135.
927e940 is described below
commit 927e940832659f16324acbc82961274d15967211
Author: Dmitriy Pavlov <[email protected]>
AuthorDate: Fri Jul 19 21:45:58 2019 +0300
IGNITE-11994: Added query option for detailed report for current tracked
branch - Fixes #135.
Signed-off-by: Dmitriy Pavlov <[email protected]>
---
.../ignite/ci/tcbot/issue/IssueDetector.java | 11 +-
.../ignite/ci/web/rest/GetChainResultsAsHtml.java | 6 +-
.../ci/web/rest/build/GetBuildTestFailures.java | 5 +-
.../rest/tracked/GetTrackedBranchTestResults.java | 62 +++++++----
ignite-tc-helper-web/src/main/webapp/current.html | 122 ++++++++++++++++++++-
.../src/main/webapp/js/testfails-2.2.js | 10 +-
ignite-tc-helper-web/src/main/webapp/pr.html | 2 -
.../ci/tcbot/chain/BuildChainProcessorTest.java | 6 +-
.../ci/tcbot/chain/TrackedBranchProcessorTest.java | 3 +-
.../tcbot/engine/chain/BuildChainProcessor.java | 49 ++++++---
.../ignite/tcbot/engine/chain/FullChainRunCtx.java | 49 +++++----
.../ignite/tcbot/engine/chain/MultBuildRunCtx.java | 7 +-
.../ignite/tcbot/engine/chain/SortOption.java | 45 ++++++++
.../ignite/tcbot/engine/pr/PrChainsProcessor.java | 15 ++-
.../ignite/tcbot/engine/tracked/DisplayMode.java | 45 ++++++++
.../tracked/IDetailedStatusForTrackedBranch.java | 11 +-
.../tracked/TrackedBranchChainsProcessor.java | 12 +-
.../apache/ignite/tcbot/engine/ui/DsChainUi.java | 92 +++++++++-------
.../apache/ignite/tcbot/engine/ui/DsSuiteUi.java | 13 ++-
19 files changed, 437 insertions(+), 128 deletions(-)
diff --git
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/issue/IssueDetector.java
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/issue/IssueDetector.java
index ef0c678..7d6ebbb 100644
---
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/issue/IssueDetector.java
+++
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/issue/IssueDetector.java
@@ -37,6 +37,7 @@ import org.apache.ignite.ci.issue.Issue;
import org.apache.ignite.ci.issue.IssueKey;
import org.apache.ignite.ci.issue.IssueType;
import org.apache.ignite.ci.jobs.CheckQueueJob;
+import org.apache.ignite.tcbot.engine.tracked.DisplayMode;
import org.apache.ignite.tcbot.notify.ISlackSender;
import org.apache.ignite.ci.tcbot.user.IUserStorage;
import org.apache.ignite.ci.teamcity.ignited.change.ChangeCompacted;
@@ -575,7 +576,10 @@ public class IssueDetector {
buildsToQry,
creds,
SyncMode.RELOAD_QUEUED,
- false);
+ false,
+ null,
+ DisplayMode.None,
+ null);
DsSummaryUi failures =
tbProc.getTrackedBranchTestFailures(brachName,
@@ -583,7 +587,10 @@ public class IssueDetector {
1,
creds,
SyncMode.RELOAD_QUEUED,
- false);
+ false,
+ null,
+ DisplayMode.OnlyFailures,
+ null);
String issRes = registerIssuesAndNotifyLater(failures,
backgroundOpsCreds);
diff --git
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/GetChainResultsAsHtml.java
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/GetChainResultsAsHtml.java
index f8eccb7..6fc3b53 100644
---
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/GetChainResultsAsHtml.java
+++
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/GetChainResultsAsHtml.java
@@ -81,7 +81,8 @@ public class GetChainResultsAsHtml {
ProcessLogsMode.SUITE_NOT_COMPLETE,
false,
failRateBranch,
- SyncMode.RELOAD_QUEUED);
+ SyncMode.RELOAD_QUEUED,
+ null);
DsChainUi status = new DsChainUi(srvCode, tcIgn.serverCode(),
ctx.branchName());
@@ -89,7 +90,8 @@ public class GetChainResultsAsHtml {
status.chainName = ctx.suiteName();
- status.initFromContext(tcIgn, ctx, failRateBranch,
injector.getInstance(IStringCompactor.class), false);
+ IStringCompactor c = injector.getInstance(IStringCompactor.class);
+ status.initFromContext(tcIgn, ctx, failRateBranch, c, false, null,
null);
res.append(showChainAtServerData(status));
diff --git
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/build/GetBuildTestFailures.java
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/build/GetBuildTestFailures.java
index 6dd733e..0960b68 100644
---
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/build/GetBuildTestFailures.java
+++
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/build/GetBuildTestFailures.java
@@ -131,7 +131,8 @@ public class GetBuildTestFailures {
procLogs,
false,
failRateBranch,
- syncMode);
+ syncMode,
+ null);
DsChainUi chainStatus = new DsChainUi(srvCode, tcIgnited.serverCode(),
ctx.branchName());
@@ -139,7 +140,7 @@ public class GetBuildTestFailures {
if (cnt > 0)
runningUpdates.addAndGet(cnt);
- chainStatus.initFromContext(tcIgnited, ctx, failRateBranch,
injector.getInstance(IStringCompactor.class), false);
+ chainStatus.initFromContext(tcIgnited, ctx, failRateBranch,
injector.getInstance(IStringCompactor.class), false, null, null);
res.addChainOnServer(chainStatus);
diff --git
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/tracked/GetTrackedBranchTestResults.java
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/tracked/GetTrackedBranchTestResults.java
index e0fbc41..a9affe8 100644
---
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/tracked/GetTrackedBranchTestResults.java
+++
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/tracked/GetTrackedBranchTestResults.java
@@ -19,6 +19,7 @@ package org.apache.ignite.ci.web.rest.tracked;
import com.google.inject.Injector;
import java.util.Set;
+import javax.annotation.Nonnull;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.GET;
@@ -27,14 +28,17 @@ import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
-import org.apache.ignite.tcbot.engine.tracked.TrackedBranchChainsProcessor;
-import org.apache.ignite.tcbot.engine.conf.ITcBotConfig;
import org.apache.ignite.ci.tcbot.visa.TcBotTriggerAndSignOffService;
import org.apache.ignite.ci.user.ITcBotUserCreds;
import org.apache.ignite.ci.web.CtxListener;
+import org.apache.ignite.internal.util.typedef.F;
+import org.apache.ignite.tcbot.engine.chain.SortOption;
+import org.apache.ignite.tcbot.engine.conf.ITcBotConfig;
+import org.apache.ignite.tcbot.engine.tracked.DisplayMode;
+import org.apache.ignite.tcbot.engine.tracked.IDetailedStatusForTrackedBranch;
+import org.apache.ignite.tcbot.engine.tracked.TrackedBranchChainsProcessor;
import org.apache.ignite.tcbot.engine.ui.DsSummaryUi;
import org.apache.ignite.tcbot.engine.ui.UpdateInfo;
-import org.apache.ignite.internal.util.typedef.F;
import org.apache.ignite.tcignited.ITeamcityIgnitedProvider;
import org.apache.ignite.tcignited.SyncMode;
import org.apache.ignite.tcservice.model.mute.MuteInfo;
@@ -61,8 +65,12 @@ public class GetTrackedBranchTestResults {
@Path("updates")
public UpdateInfo getTestFailsUpdates(@Nullable @QueryParam("branch")
String branchOrNull,
@Nullable @QueryParam("checkAllLogs") Boolean checkAllLogs,
- @QueryParam("trustedTests") @Nullable Boolean trustedTests) {
- return new
UpdateInfo().copyFrom(getTestFailsResultsNoSync(branchOrNull, checkAllLogs,
trustedTests));
+ @Nullable @QueryParam("trustedTests") Boolean trustedTests,
+ @Nullable @QueryParam("tagSelected") String tagSelected,
+ @Nullable @QueryParam("displayMode") String displayMode,
+ @Nullable @QueryParam("sortOption") String sortOption) {
+ return new
UpdateInfo().copyFrom(getTestFailsResultsNoSync(branchOrNull, checkAllLogs,
trustedTests, tagSelected,
+ displayMode, sortOption));
}
@GET
@@ -70,8 +78,11 @@ public class GetTrackedBranchTestResults {
@Produces(MediaType.TEXT_PLAIN)
public String getTestFailsText(@Nullable @QueryParam("branch") String
branchOrNull,
@Nullable @QueryParam("checkAllLogs") Boolean checkAllLogs,
- @QueryParam("trustedTests") @Nullable Boolean trustedTests) {
- return getTestFailsResultsNoSync(branchOrNull, checkAllLogs,
trustedTests).toString();
+ @Nullable @QueryParam("trustedTests") Boolean trustedTests,
+ @Nullable @QueryParam("tagSelected") String tagSelected,
+ @Nullable @QueryParam("displayMode") String displayMode,
+ @Nullable @QueryParam("sortOption") String sortOption) {
+ return getTestFailsResultsNoSync(branchOrNull, checkAllLogs,
trustedTests, tagSelected, displayMode, sortOption).toString();
}
@GET
@@ -79,8 +90,11 @@ public class GetTrackedBranchTestResults {
public DsSummaryUi getTestFailsResultsNoSync(
@Nullable @QueryParam("branch") String branch,
@Nullable @QueryParam("checkAllLogs") Boolean checkAllLogs,
- @QueryParam("trustedTests") @Nullable Boolean trustedTests) {
- return latestBuildResults(branch, checkAllLogs, trustedTests,
SyncMode.NONE);
+ @Nullable @QueryParam("trustedTests") Boolean trustedTests,
+ @Nullable @QueryParam("tagSelected") String tagSelected,
+ @Nullable @QueryParam("displayMode") String displayMode,
+ @Nullable @QueryParam("sortOption") String sortOption) {
+ return latestBuildResults(branch, checkAllLogs, trustedTests,
tagSelected, SyncMode.NONE, displayMode, sortOption);
}
@GET
@@ -89,22 +103,30 @@ public class GetTrackedBranchTestResults {
public DsSummaryUi getTestFailsNoCache(
@Nullable @QueryParam("branch") String branch,
@Nullable @QueryParam("checkAllLogs") Boolean checkAllLogs,
- @QueryParam("trustedTests") @Nullable Boolean trustedTests) {
- return latestBuildResults(branch, checkAllLogs, trustedTests,
SyncMode.RELOAD_QUEUED);
+ @Nullable @QueryParam("trustedTests") Boolean trustedTests,
+ @Nullable @QueryParam("tagSelected") String tagSelected,
+ @Nullable @QueryParam("displayMode") String displayMode,
+ @Nullable @QueryParam("sortOption") String sortOption) {
+ return latestBuildResults(branch, checkAllLogs, trustedTests,
tagSelected, SyncMode.RELOAD_QUEUED, displayMode, sortOption);
}
- @NotNull public DsSummaryUi latestBuildResults(
- @QueryParam("branch") @Nullable String branch,
- @QueryParam("checkAllLogs") @Nullable Boolean checkAllLogs,
- @QueryParam("trustedTests") @Nullable Boolean trustedTests,
- SyncMode mode) {
+ @NotNull private DsSummaryUi latestBuildResults(
+ @Nullable String branch,
+ @Nullable Boolean checkAllLogs,
+ @Nullable Boolean trustedTests,
+ @Nullable String tagSelected,
+ @Nonnull SyncMode mode,
+ @Nullable String displayMode,
+ @Nullable String sortOption) {
ITcBotUserCreds creds = ITcBotUserCreds.get(req);
Injector injector = CtxListener.getInjector(ctx);
- return injector.getInstance(TrackedBranchChainsProcessor.class)
+ return injector.getInstance(IDetailedStatusForTrackedBranch.class)
.getTrackedBranchTestFailures(branch, checkAllLogs, 1, creds, mode,
- Boolean.TRUE.equals(trustedTests));
+ Boolean.TRUE.equals(trustedTests), tagSelected,
+ DisplayMode.parseStringValue(displayMode),
+ SortOption.parseStringValue(sortOption));
}
@GET
@@ -132,7 +154,7 @@ public class GetTrackedBranchTestResults {
return mergedBuildsResults(branchOpt, cnt, checkAllLogs,
SyncMode.RELOAD_QUEUED);
}
- @NotNull public DsSummaryUi mergedBuildsResults(
+ @NotNull private DsSummaryUi mergedBuildsResults(
@QueryParam("branch") @Nullable String branchOpt,
@QueryParam("count") Integer cnt,
@QueryParam("checkAllLogs") @Nullable Boolean checkAllLogs,
@@ -142,7 +164,7 @@ public class GetTrackedBranchTestResults {
Injector injector = CtxListener.getInjector(ctx);
return injector.getInstance(TrackedBranchChainsProcessor.class)
- .getTrackedBranchTestFailures(branchOpt, checkAllLogs, cntLimit,
creds, mode, false);
+ .getTrackedBranchTestFailures(branchOpt, checkAllLogs, cntLimit,
creds, mode, false, null, DisplayMode.OnlyFailures, null);
}
/**
diff --git a/ignite-tc-helper-web/src/main/webapp/current.html
b/ignite-tc-helper-web/src/main/webapp/current.html
index 882a8b0..50d619a 100644
--- a/ignite-tc-helper-web/src/main/webapp/current.html
+++ b/ignite-tc-helper-web/src/main/webapp/current.html
@@ -10,17 +10,78 @@
<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/dist/vue.js"></script>
+
<script src="js/common-1.6.js"></script>
<script src="js/testfails-2.2.js"></script>
</head>
<body>
<script>
var g_shownDataHashCodeHex = "";
+var gVue;
+
+function genLink() {
+ let newUrl = "./current.html?";
+
+ var branch = findGetParameter("branch");
+ newUrl += "branch=" + (branch != null ? branch : "master");
+
+ if (isDefinedAndFilled(gVue.$data.tagSelected))
+ newUrl += "&tagSelected=" + gVue.$data.tagSelected;
+
+ if (gVue.$data.displayMode != null)
+ newUrl += "&displayMode=" + gVue.$data.displayMode;
+
+ if (gVue.$data.sortOption != null)
+ newUrl += "&sortOption=" + gVue.$data.sortOption;
+
+ let permalink = $("#permalink");
+ permalink.attr("href", newUrl);
+
+ permalink.html("Permalink");
+}
+
+function showQueryForm() {
+ gVue = new Vue({
+ el: '#vueQueryForm',
+ data: {
+ tagSelected: '',
+ tagsPresent: [""],
+ displayMode: 'Failures',
+ sortOption: 'FailureRate'
+ },
+ methods: {
+ formChanged: function () {
+ checkForUpdate();
+ 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;
+ }
+
+ 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 });
@@ -43,6 +104,21 @@ function parmsForRest() {
curReqParms += "&trustedTests=" + trustedTests;
}
+ var tagSelected = gVue.$data.tagSelected;
+ if (tagSelected != null) {
+ curReqParms += "&tagSelected=" + tagSelected;
+ }
+
+ var displayMode = gVue.$data.displayMode;
+ if (displayMode != null) {
+ curReqParms += "&displayMode=" + displayMode;
+ }
+
+ var sortOption = gVue.$data.sortOption;
+ if (sortOption != null) {
+ curReqParms += "&sortOption=" + sortOption;
+ }
+
return curReqParms;
}
@@ -126,6 +202,25 @@ function loadPartialData() {
}
function showData(result) {
+ let setOfTags = new Set(gVue.$data.tagsPresent);
+ 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);
+ }
+ }
+ }
+ }
+
+ gVue.$data.tagsPresent = Array.from(setOfTags);
+
//var txtUrl = "rest/tracked/results/txt" + parmsForRest();
$("#divFailures").html(showChainOnServersResults(result));
@@ -135,7 +230,32 @@ function showData(result) {
</script>
<div id="loadStatus"></div>
-<div id="divFailures"></div>
+
+<div id="vueQueryForm" class="h-25">
+ <v-app id="prQueryForm" name="prQueryForm" class="h-25">
+ <span>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>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> <a id="permalink"></a></span>
+ <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>
diff --git a/ignite-tc-helper-web/src/main/webapp/js/testfails-2.2.js
b/ignite-tc-helper-web/src/main/webapp/js/testfails-2.2.js
index 88e9348..0947a62 100644
--- a/ignite-tc-helper-web/src/main/webapp/js/testfails-2.2.js
+++ b/ignite-tc-helper-web/src/main/webapp/js/testfails-2.2.js
@@ -614,7 +614,7 @@ function showSuiteData(suite, settings, prNum) {
moreInfoTxt += "<br>";
var res = "<tr class='suiteBlock'><td colspan='4' style='width: 100%'>" +
- "<table style='width: 100%' border='0px'>"
+ "<table style='width: 100%' border='0px'>";
res += "<tr bgcolor='#FAFAFF'><td align='right' valign='top' width='10%'
colspan='2'>";
@@ -641,7 +641,13 @@ function showSuiteData(suite, settings, prNum) {
res += "<span title='"+ suite.problemRef.name +"'>🐞</span> "
}
- var color = failureRateToColor(suite.failureRate);
+ var color;
+
+ if(isDefinedAndFilled(suite.success) && suite.success===true) {
+ color = 'green';
+ } else {
+ color = failureRateToColor(suite.failureRate);
+ }
if (isDefinedAndFilled(suite.latestRuns)) {
res += drawLatestRuns(suite.latestRuns) + " ";
diff --git a/ignite-tc-helper-web/src/main/webapp/pr.html
b/ignite-tc-helper-web/src/main/webapp/pr.html
index b9f097d..278a70c 100644
--- a/ignite-tc-helper-web/src/main/webapp/pr.html
+++ b/ignite-tc-helper-web/src/main/webapp/pr.html
@@ -51,10 +51,8 @@
},
error: showErrInLoadStatus
});
-
}
-
$(document).ready(function () {
$.getScript("js/testfails-2.2.js", function (data, textStatus, jqxhr)
{});
diff --git
a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/chain/BuildChainProcessorTest.java
b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/chain/BuildChainProcessorTest.java
index e8b213f..97f2eda 100644
---
a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/chain/BuildChainProcessorTest.java
+++
b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/chain/BuildChainProcessorTest.java
@@ -87,7 +87,7 @@ public class BuildChainProcessorTest {
FullChainRunCtx ctx = bcp.loadFullChainContext(tcIgnited,
entry,
- LatestRebuildMode.ALL, ProcessLogsMode.SUITE_NOT_COMPLETE, false,
ITeamcity.DEFAULT, SyncMode.NONE);
+ LatestRebuildMode.ALL, ProcessLogsMode.SUITE_NOT_COMPLETE, false,
ITeamcity.DEFAULT, SyncMode.NONE, null);
List<MultBuildRunCtx> suites =
ctx.failedChildSuites().collect(Collectors.toList());
assertTrue(!suites.isEmpty());
@@ -123,7 +123,7 @@ public class BuildChainProcessorTest {
FullChainRunCtx ctx2 = bcp.loadFullChainContext(tcIgnited,
entry,
- LatestRebuildMode.ALL, ProcessLogsMode.SUITE_NOT_COMPLETE, false,
ITeamcity.DEFAULT, SyncMode.NONE);
+ LatestRebuildMode.ALL, ProcessLogsMode.SUITE_NOT_COMPLETE, false,
ITeamcity.DEFAULT, SyncMode.NONE, null);
List<MultBuildRunCtx> suites2 =
ctx2.failedChildSuites().collect(Collectors.toList());
assertTrue(!suites2.isEmpty());
@@ -153,7 +153,7 @@ public class BuildChainProcessorTest {
FullChainRunCtx ctx = bcp.loadFullChainContext(tcIgnitedMock(builds),
entry,
- LatestRebuildMode.LATEST, ProcessLogsMode.SUITE_NOT_COMPLETE,
false, ITeamcity.DEFAULT, SyncMode.NONE);
+ LatestRebuildMode.LATEST, ProcessLogsMode.SUITE_NOT_COMPLETE,
false, ITeamcity.DEFAULT, SyncMode.NONE, null);
List<MultBuildRunCtx> suites =
ctx.failedChildSuites().collect(Collectors.toList());
assertTrue(!suites.isEmpty());
diff --git
a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/chain/TrackedBranchProcessorTest.java
b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/chain/TrackedBranchProcessorTest.java
index c6211e6..499337a 100644
---
a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/chain/TrackedBranchProcessorTest.java
+++
b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/chain/TrackedBranchProcessorTest.java
@@ -26,6 +26,7 @@ import java.util.Map;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
+import org.apache.ignite.tcbot.engine.tracked.DisplayMode;
import org.apache.ignite.tcbot.engine.tracked.TrackedBranchChainsProcessor;
import org.apache.ignite.tcservice.ITeamcity;
import org.apache.ignite.tcbot.engine.conf.BranchTracked;
@@ -120,7 +121,7 @@ public class TrackedBranchProcessorTest {
false,
1,
mock, SyncMode.RELOAD_QUEUED,
- false);
+ false, null, DisplayMode.OnlyFailures, null);
Gson gson = new GsonBuilder().setPrettyPrinting().create();
System.out.println(gson.toJson(failures));
diff --git
a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/chain/BuildChainProcessor.java
b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/chain/BuildChainProcessor.java
index 579dbb0..f4f38e3 100644
---
a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/chain/BuildChainProcessor.java
+++
b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/chain/BuildChainProcessor.java
@@ -138,16 +138,18 @@ public class BuildChainProcessor {
* @param includeScheduledInfo Include scheduled info.
* @param failRateBranch Fail rate branch.
* @param mode background data update mode.
+ * @param sortOption how to sort suites in context, default is by failure
rate (most often - first).
*/
@AutoProfiling
public FullChainRunCtx loadFullChainContext(
- ITeamcityIgnited tcIgn,
- Collection<Integer> entryPoints,
- LatestRebuildMode includeLatestRebuild,
- ProcessLogsMode procLog,
- boolean includeScheduledInfo,
- @Nullable String failRateBranch,
- SyncMode mode) {
+ ITeamcityIgnited tcIgn,
+ Collection<Integer> entryPoints,
+ LatestRebuildMode includeLatestRebuild,
+ ProcessLogsMode procLog,
+ boolean includeScheduledInfo,
+ @Nullable String failRateBranch,
+ SyncMode mode,
+ @Nullable SortOption sortOption) {
if (entryPoints.isEmpty())
return new FullChainRunCtx(Build.createFakeStub());
@@ -199,21 +201,34 @@ public class BuildChainProcessor {
contexts.add(ctx);
});
- Function<MultBuildRunCtx, Float> function = ctx -> {
- IRunHistory runStat = ctx.history(tcIgn, failRateBranchId);
-
- if (runStat == null)
- return 0f;
-
- //some hack to bring timed out suites to top
- return runStat.getCriticalFailRate() * 3.14f +
runStat.getFailRate();
- };
Integer someEntryPnt = entryPoints.iterator().next();
Future<FatBuildCompacted> build = getOrLoadBuild(someEntryPnt, mode,
builds, tcIgn);
FullChainRunCtx fullChainRunCtx = new
FullChainRunCtx(FutureUtil.getResult(build).toBuild(compactor));
- contexts.sort(Comparator.comparing(function).reversed());
+ Function<MultBuildRunCtx, Double> function = null;
+
+ if (sortOption == null || sortOption == SortOption.FailureRate) {
+ function = ctx -> {
+ IRunHistory runStat = ctx.history(tcIgn, failRateBranchId);
+
+ if (runStat == null)
+ return 0d;
+
+ //some hack to bring timed out suites to top
+ return runStat.getCriticalFailRate() * 3.14d +
runStat.getFailRate();
+ };
+ }
+ else if (sortOption == SortOption.SuiteDuration) {
+ function = ctx -> {
+ Long duration = ctx.buildDuration();
+
+ return duration == null ? 0 : (double)duration;
+ };
+ }
+
+ if (function != null)
+ contexts.sort(Comparator.comparing(function).reversed());
fullChainRunCtx.addAllSuites(contexts);
diff --git
a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/chain/FullChainRunCtx.java
b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/chain/FullChainRunCtx.java
index b6a2eaf..849ce9a 100644
---
a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/chain/FullChainRunCtx.java
+++
b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/chain/FullChainRunCtx.java
@@ -21,6 +21,7 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.Future;
+import java.util.function.Predicate;
import java.util.stream.Stream;
import org.apache.ignite.tcservice.model.result.Build;
import org.apache.ignite.tcbot.common.util.TimeUtil;
@@ -67,28 +68,34 @@ public class FullChainRunCtx {
/**
* @return may return less time than actual duration if not all statistic
is provided
+ * @param suiteFilter
*/
- public Long getTotalDuration() {
- return sumOfNonNulls(getDurations());
+ public Long getTotalDuration(
+ Predicate<MultBuildRunCtx> suiteFilter) {
+ return sumOfNonNulls(getDurations(suiteFilter));
}
- public boolean hasFullDurationInfo() {
- return getDurations().noneMatch(Objects::isNull);
+ public boolean hasFullDurationInfo(
+ Predicate<MultBuildRunCtx> suiteFilter) {
+ return getDurations(suiteFilter).noneMatch(Objects::isNull);
}
/**
* @return returns durations of all suites (last builds)
+ * @param suiteFilter
*/
- private Stream<Long> getDurations() {
- return suitesNonComposite().map(MultBuildRunCtx::buildDuration);
+ private Stream<Long> getDurations(Predicate<MultBuildRunCtx> suiteFilter) {
+ return
suitesNonComposite().filter(suiteFilter).map(MultBuildRunCtx::buildDuration);
}
/**
* @return sum of durations of all suites printable.
+ * @param suiteFilter
*/
- @Nonnull public String getDurationPrintable() {
- return (TimeUtil.millisToDurationPrintable(getTotalDuration()))
- + (hasFullDurationInfo() ? "" : "+");
+ @Nonnull public String getDurationPrintable(
+ Predicate<MultBuildRunCtx> suiteFilter) {
+ return
(TimeUtil.millisToDurationPrintable(getTotalDuration(suiteFilter)))
+ + (hasFullDurationInfo(suiteFilter) ? "" : "+");
}
public void addAllSuites(List<MultBuildRunCtx> suites) {
@@ -107,8 +114,8 @@ public class FullChainRunCtx {
return fakeStub;
}
- public String getTestsDurationPrintable() {
- long tests =
sumOfNonNulls(suitesNonComposite().map(MultBuildRunCtx::getAvgTestsDuration));
+ public String getTestsDurationPrintable(Predicate<MultBuildRunCtx>
suiteFilter) {
+ long tests =
sumOfNonNulls(suitesNonComposite().filter(suiteFilter).map(MultBuildRunCtx::getAvgTestsDuration));
return (TimeUtil.millisToDurationPrintable(tests));
}
@@ -117,30 +124,30 @@ public class FullChainRunCtx {
return suites().filter(ctx -> !ctx.isComposite());
}
- public String getLostInTimeoutsPrintable() {
- long timeouts =
suitesNonComposite().mapToLong(MultBuildRunCtx::getLostInTimeouts).sum();
+ public String getLostInTimeoutsPrintable(Predicate<MultBuildRunCtx>
suiteFilter) {
+ long timeouts =
suitesNonComposite().filter(suiteFilter).mapToLong(MultBuildRunCtx::getLostInTimeouts).sum();
return TimeUtil.millisToDurationPrintable(timeouts);
}
- public String durationNetTimePrintable() {
+ public String durationNetTimePrintable(Predicate<MultBuildRunCtx>
suiteFilter) {
return TimeUtil.millisToDurationPrintable(
-
sumOfNonNulls(suitesNonComposite().map(MultBuildRunCtx::buildDurationNetTime)));
+
sumOfNonNulls(suitesNonComposite().filter(suiteFilter).map(MultBuildRunCtx::buildDurationNetTime)));
}
- public String sourceUpdateDurationPrintable() {
+ public String sourceUpdateDurationPrintable(Predicate<MultBuildRunCtx>
suiteFilter) {
return TimeUtil.millisToDurationPrintable(
-
sumOfNonNulls(suitesNonComposite().map(MultBuildRunCtx::sourceUpdateDuration)));
+
sumOfNonNulls(suitesNonComposite().filter(suiteFilter).map(MultBuildRunCtx::sourceUpdateDuration)));
}
- public String artifcactPublishingDurationPrintable() {
+ public String
artifcactPublishingDurationPrintable(Predicate<MultBuildRunCtx> suiteFilter) {
return TimeUtil.millisToDurationPrintable(
-
sumOfNonNulls(suitesNonComposite().map(MultBuildRunCtx::artifcactPublishingDuration)));
+
sumOfNonNulls(suitesNonComposite().filter(suiteFilter).map(MultBuildRunCtx::artifcactPublishingDuration)));
}
- public String dependeciesResolvingDurationPrintable() {
+ public String
dependeciesResolvingDurationPrintable(Predicate<MultBuildRunCtx> suiteFilter) {
return TimeUtil.millisToDurationPrintable(
-
sumOfNonNulls(suitesNonComposite().map(MultBuildRunCtx::dependeciesResolvingDuration)));
+
sumOfNonNulls(suitesNonComposite().filter(suiteFilter).map(MultBuildRunCtx::dependeciesResolvingDuration)));
}
public long sumOfNonNulls(Stream<Long> st) {
diff --git
a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/chain/MultBuildRunCtx.java
b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/chain/MultBuildRunCtx.java
index b947da0..c605fa3 100644
---
a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/chain/MultBuildRunCtx.java
+++
b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/chain/MultBuildRunCtx.java
@@ -604,12 +604,12 @@ public class MultBuildRunCtx implements ISuiteResults {
|| hasMetricProblem();
}
- public Integer totalTests() {
+ public int totalTests() {
return
(int)buildsStream().mapToInt(SingleBuildRunCtx::totalNotMutedTests).average().orElse(0.0);
}
- public Integer trustedTests(ITeamcityIgnited tcIgnited,
- String normalizedBaseBranch) {
+ public int trustedTests(ITeamcityIgnited tcIgnited,
+ @Nullable Integer branchName) {
AtomicInteger trustedCnt = new AtomicInteger();
Map<Integer, TestCompactedMult> res = new HashMap<>();
@@ -619,7 +619,6 @@ public class MultBuildRunCtx implements ISuiteResults {
saveToMap(res,
singleBuildRunCtx.getAllTests().filter(t -> !t.isIgnoredTest()
&& !t.isMutedTest()));
});
- Integer branchName =
compactor.getStringIdIfPresent(normalizedBaseBranch);
res.forEach((testNameId, compactedMult) -> {
IRunHistory stat = compactedMult.history(tcIgnited, branchName);
diff --git
a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/chain/SortOption.java
b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/chain/SortOption.java
new file mode 100644
index 0000000..959a94c
--- /dev/null
+++
b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/chain/SortOption.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.ignite.tcbot.engine.chain;
+
+import com.google.common.base.Strings;
+
+public enum SortOption {
+ /** No Sort. */ None("None"),
+ /** Most Often failed. */ FailureRate("FailureRate"),
+ /** Suite Duration. */ SuiteDuration("SuiteDuration") ;
+
+ private String name;
+
+ SortOption(String name) {
+ this.name = name;
+ }
+
+ public static SortOption parseStringValue(String v) {
+ if (Strings.isNullOrEmpty(v))
+ return FailureRate;
+ SortOption[] values = SortOption.values();
+
+ for (int i = 0; i < values.length; i++) {
+ SortOption val = values[i];
+ if (val.name.equals(v))
+ return val;
+ }
+
+ return FailureRate;
+ }
+}
diff --git
a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/pr/PrChainsProcessor.java
b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/pr/PrChainsProcessor.java
index 8c1640e..ad2cfb8 100644
---
a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/pr/PrChainsProcessor.java
+++
b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/pr/PrChainsProcessor.java
@@ -147,7 +147,8 @@ public class PrChainsProcessor {
logs,
buildResMergeCnt == 1,
baseBranchForTc,
- mode);
+ mode,
+ null);
DsChainUi chainStatus = new DsChainUi(srvCodeOrAlias,
tcIgnited.serverCode(), branchForTc);
@@ -162,7 +163,7 @@ public class PrChainsProcessor {
runningUpdates.addAndGet(cnt0);
//fail rate reference is always default (master)
- chainStatus.initFromContext(tcIgnited, ctx, baseBranchForTc,
compactor, false); // don't need for PR
+ chainStatus.initFromContext(tcIgnited, ctx, baseBranchForTc,
compactor, false, null, null); // don't need for PR
initJiraAndGitInfo(chainStatus, jiraIntegration,
gitHubConnIgnited);
}
@@ -265,7 +266,8 @@ public class PrChainsProcessor {
ProcessLogsMode.SUITE_NOT_COMPLETE,
false,
baseBranch,
- syncMode);
+ syncMode,
+ null);
if (ctx.isFakeStub())
return null;
@@ -274,14 +276,15 @@ public class PrChainsProcessor {
}
/**
- * @return Failures for given server.
+ * @return Blocker failures for given server.
* @param fullChainRunCtx
* @param tcIgnited
* @param baseBranch
*/
//todo may avoid creation of UI model for simple comment.
- private List<DsSuiteUi> findBlockerFailures(FullChainRunCtx
fullChainRunCtx, ITeamcityIgnited tcIgnited,
- String baseBranch) {
+ private List<DsSuiteUi> findBlockerFailures(FullChainRunCtx
fullChainRunCtx,
+ ITeamcityIgnited tcIgnited,
+ String baseBranch) {
return fullChainRunCtx
.failedChildSuites()
.map((ctx) -> {
diff --git
a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/tracked/DisplayMode.java
b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/tracked/DisplayMode.java
new file mode 100644
index 0000000..77fd6b7
--- /dev/null
+++
b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/tracked/DisplayMode.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.ignite.tcbot.engine.tracked;
+
+import com.google.common.base.Strings;
+
+public enum DisplayMode {
+ /** Technical mode for skipping UI conversions. */ None("None"),
+ /** Show only Failures. */ OnlyFailures("Failures"),
+ /** Show all suites. */ ShowAllSuites("AllSuites");
+
+ private String name;
+
+ DisplayMode(String name) {
+ this.name = name;
+ }
+
+ public static DisplayMode parseStringValue(String v) {
+ if (Strings.isNullOrEmpty(v))
+ return OnlyFailures;
+ DisplayMode[] values = DisplayMode.values();
+
+ for (int i = 0; i < values.length; i++) {
+ DisplayMode val = values[i];
+ if (val.name.equals(v))
+ return val;
+ }
+
+ return OnlyFailures;
+ }
+}
diff --git
a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/tracked/IDetailedStatusForTrackedBranch.java
b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/tracked/IDetailedStatusForTrackedBranch.java
index 8b9372c..851ba38 100644
---
a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/tracked/IDetailedStatusForTrackedBranch.java
+++
b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/tracked/IDetailedStatusForTrackedBranch.java
@@ -17,6 +17,7 @@
package org.apache.ignite.tcbot.engine.tracked;
import javax.annotation.Nullable;
+import org.apache.ignite.tcbot.engine.chain.SortOption;
import org.apache.ignite.tcbot.engine.ui.DsSummaryUi;
import org.apache.ignite.tcignited.SyncMode;
import org.apache.ignite.tcignited.creds.ICredentialsProv;
@@ -31,7 +32,10 @@ public interface IDetailedStatusForTrackedBranch {
* @param buildResMergeCnt Build results merge count.
* @param creds Credentials.
* @param syncMode Sync mode.
- * @param calcTrustedTests Calc trusted tests.
+ * @param calcTrustedTests Calculate trusted tests count.
+ * @param tagSelected Selected tag based filter. If null or empty all data
is returned.
+ * @param displayMode Suites and tests display mode. Default - failures
only.
+ * @param sortOption Sort mode
*/
public DsSummaryUi getTrackedBranchTestFailures(
@Nullable String branch,
@@ -39,7 +43,10 @@ public interface IDetailedStatusForTrackedBranch {
int buildResMergeCnt,
ICredentialsProv creds,
SyncMode syncMode,
- boolean calcTrustedTests);
+ boolean calcTrustedTests,
+ @Nullable String tagSelected,
+ @Nullable DisplayMode displayMode,
+ @Nullable SortOption sortOption);
// * @param baseTrackedBranch Branch tracked branch in Bot, has a
priority if both TC & Bot branches (baseBranchForTcParm) present.
}
diff --git
a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/tracked/TrackedBranchChainsProcessor.java
b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/tracked/TrackedBranchChainsProcessor.java
index a266d3c..8777df3 100644
---
a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/tracked/TrackedBranchChainsProcessor.java
+++
b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/tracked/TrackedBranchChainsProcessor.java
@@ -28,6 +28,7 @@ import
org.apache.ignite.tcbot.engine.chain.BuildChainProcessor;
import org.apache.ignite.tcbot.engine.chain.FullChainRunCtx;
import org.apache.ignite.tcbot.engine.chain.LatestRebuildMode;
import org.apache.ignite.tcbot.engine.chain.ProcessLogsMode;
+import org.apache.ignite.tcbot.engine.chain.SortOption;
import org.apache.ignite.tcbot.engine.conf.ITcBotConfig;
import org.apache.ignite.tcbot.engine.conf.ITrackedBranch;
import org.apache.ignite.tcbot.engine.ui.DsChainUi;
@@ -57,6 +58,7 @@ public class TrackedBranchChainsProcessor implements
IDetailedStatusForTrackedBr
/** Compactor. */
@Inject private IStringCompactor compactor;
+ /** {@inheritDoc} */
@AutoProfiling
@Nonnull
@Override public DsSummaryUi getTrackedBranchTestFailures(
@@ -65,7 +67,10 @@ public class TrackedBranchChainsProcessor implements
IDetailedStatusForTrackedBr
int buildResMergeCnt,
ICredentialsProv creds,
SyncMode syncMode,
- boolean calcTrustedTests) {
+ boolean calcTrustedTests,
+ @Nullable String tagSelected,
+ @Nullable DisplayMode displayMode,
+ @Nullable SortOption sortOption) {
final DsSummaryUi res = new DsSummaryUi();
final AtomicInteger runningUpdates = new AtomicInteger();
@@ -113,14 +118,15 @@ public class TrackedBranchChainsProcessor implements
IDetailedStatusForTrackedBr
logs,
includeScheduled,
baseBranchTc,
- syncMode
+ syncMode,
+ sortOption
);
int cnt = (int)ctx.getRunningUpdates().count();
if (cnt > 0)
runningUpdates.addAndGet(cnt);
- chainStatus.initFromContext(tcIgnited, ctx, baseBranchTc,
compactor, calcTrustedTests);
+ chainStatus.initFromContext(tcIgnited, ctx, baseBranchTc,
compactor, calcTrustedTests, tagSelected, displayMode);
return chainStatus;
})
diff --git
a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/ui/DsChainUi.java
b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/ui/DsChainUi.java
index a6904c7..4f1994e 100644
---
a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/ui/DsChainUi.java
+++
b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/ui/DsChainUi.java
@@ -17,11 +17,13 @@
package org.apache.ignite.tcbot.engine.ui;
+import com.google.common.base.Strings;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Objects;
+import java.util.function.Predicate;
import java.util.stream.Stream;
import javax.annotation.Nullable;
import org.apache.ignite.internal.util.typedef.T2;
@@ -30,6 +32,7 @@ import org.apache.ignite.tcbot.common.util.UrlUtil;
import org.apache.ignite.tcbot.engine.chain.FullChainRunCtx;
import org.apache.ignite.tcbot.engine.chain.MultBuildRunCtx;
import org.apache.ignite.tcbot.engine.chain.TestCompactedMult;
+import org.apache.ignite.tcbot.engine.tracked.DisplayMode;
import org.apache.ignite.tcbot.persistence.IStringCompactor;
import org.apache.ignite.tcignited.ITeamcityIgnited;
import org.apache.ignite.tcservice.model.conf.BuildType;
@@ -37,6 +40,7 @@ import org.apache.ignite.tcservice.model.conf.BuildType;
import static org.apache.ignite.tcbot.engine.ui.DsSuiteUi.branchForLink;
import static
org.apache.ignite.tcbot.engine.ui.DsSuiteUi.createOccurForLogConsumer;
import static
org.apache.ignite.tcbot.engine.ui.DsSuiteUi.createOrrucForLongRun;
+import static org.apache.ignite.tcignited.history.RunHistSync.normalizeBranch;
/**
* Detailed status of PR or tracked branch for chain.
@@ -155,62 +159,74 @@ public class DsChainUi {
this.webToPr = webToPr;
}
-
-
-
public void initFromContext(ITeamcityIgnited tcIgnited,
FullChainRunCtx ctx,
@Nullable String baseBranchTc,
IStringCompactor compactor,
- boolean calcTrustedTests) {
+ boolean calcTrustedTests,
+ @Nullable String tagSelected,
+ @Nullable DisplayMode displayMode) {
failedTests = 0;
failedToFinish = 0;
totalTests = 0;
trustedTests = 0;
- //todo mode with not failed
- Stream<MultBuildRunCtx> stream = ctx.failedChildSuites();
- stream.forEach(
- suite -> {
- final DsSuiteUi suiteCurStatus = new DsSuiteUi();
+ String failRateNormalizedBranch = normalizeBranch(baseBranchTc);
+ Integer baseBranchId =
compactor.getStringIdIfPresent(failRateNormalizedBranch);
- suiteCurStatus.initFromContext(tcIgnited, suite, baseBranchTc,
compactor, true, calcTrustedTests);
+ DisplayMode dModeToUse
+ = displayMode == null ? DisplayMode.OnlyFailures : displayMode;
- failedTests += suiteCurStatus.failedTests != null ?
suiteCurStatus.failedTests : 0;
- totalTests += suiteCurStatus.totalTests != null ?
suiteCurStatus.totalTests : 0;
- trustedTests += suiteCurStatus.trustedTests != null ?
suiteCurStatus.trustedTests : 0;
- if (suite.hasAnyBuildProblemExceptTestOrSnapshot() ||
suite.onlyCancelledBuilds())
- failedToFinish++;
+ Predicate<MultBuildRunCtx> suiteFilter = suite -> {
+ if (Strings.isNullOrEmpty(tagSelected))
+ return true;
- suites.add(suiteCurStatus);
- }
- );
+ return suite.tags().contains(tagSelected);
+ };
- if(calcTrustedTests) {
- //todo odd convertion
- ctx.suites().filter(s -> !s.isFailed()).forEach(suite -> {
+ ctx.suites()
+ .filter(suite -> !suite.isComposite())
+ .filter(suiteFilter)
+ .peek(suite -> {
+ Integer totalTests = suite.totalTests();
+ this.totalTests += totalTests != null ? totalTests : 0;
- final DsSuiteUi suiteCurStatus = new DsSuiteUi();
+ if (calcTrustedTests)
+ trustedTests += suite.trustedTests(tcIgnited,
baseBranchId);
+ })
+ .forEach(suite -> {
+ if (dModeToUse == DisplayMode.None)
+ return; //don't convert any suite for UI
- suiteCurStatus.initFromContext(tcIgnited, suite, baseBranchTc,
compactor, true, calcTrustedTests);
+ if (suite.isFailed() || dModeToUse ==
DisplayMode.ShowAllSuites) {
+ final DsSuiteUi suiteCurStatus = new DsSuiteUi();
- totalTests += suiteCurStatus.totalTests != null ?
suiteCurStatus.totalTests : 0;
- trustedTests += suiteCurStatus.trustedTests != null ?
suiteCurStatus.trustedTests : 0;
+ suiteCurStatus.initFromContext(tcIgnited, suite,
baseBranchTc, compactor, true, calcTrustedTests);
+
+ failedTests += suiteCurStatus.failedTests != null ?
suiteCurStatus.failedTests : 0;
+
+ if (suite.hasAnyBuildProblemExceptTestOrSnapshot() ||
suite.onlyCancelledBuilds())
+ failedToFinish++;
+
+ suites.add(suiteCurStatus);
+ }
});
- }
totalBlockers =
suites.stream().mapToInt(DsSuiteUi::totalBlockers).sum();
- durationPrintable = ctx.getDurationPrintable();
- testsDurationPrintable = ctx.getTestsDurationPrintable();
- durationNetTimePrintable = ctx.durationNetTimePrintable();
- sourceUpdateDurationPrintable = ctx.sourceUpdateDurationPrintable();
- artifcactPublishingDurationPrintable =
ctx.artifcactPublishingDurationPrintable();
- dependeciesResolvingDurationPrintable =
ctx.dependeciesResolvingDurationPrintable();
- lostInTimeouts = ctx.getLostInTimeoutsPrintable();
+ durationPrintable = ctx.getDurationPrintable(suiteFilter);
+ testsDurationPrintable = ctx.getTestsDurationPrintable(suiteFilter);
+ durationNetTimePrintable = ctx.durationNetTimePrintable(suiteFilter);
+ sourceUpdateDurationPrintable =
ctx.sourceUpdateDurationPrintable(suiteFilter);
+ artifcactPublishingDurationPrintable =
ctx.artifcactPublishingDurationPrintable(suiteFilter);
+ dependeciesResolvingDurationPrintable =
ctx.dependeciesResolvingDurationPrintable(suiteFilter);
+ lostInTimeouts = ctx.getLostInTimeoutsPrintable(suiteFilter);
webToHist = buildWebLink(tcIgnited, ctx);
webToBuild = buildWebLinkToBuild(tcIgnited, ctx);
- Stream<T2<MultBuildRunCtx, TestCompactedMult>> allLongRunning =
ctx.suites().flatMap(
+ Stream<T2<MultBuildRunCtx, TestCompactedMult>> allLongRunning =
ctx.suites()
+ .filter(suite -> !suite.isComposite())
+ .filter(suiteFilter)
+ .flatMap(
suite -> suite.getTopLongRunning().map(t -> new T2<>(suite, t))
);
Comparator<T2<MultBuildRunCtx, TestCompactedMult>> durationComp
@@ -229,9 +245,11 @@ public class DsChainUi {
}
);
- Stream<T2<MultBuildRunCtx, Map.Entry<String, Long>>> allLogConsumers =
ctx.suites().flatMap(
- suite -> suite.getTopLogConsumers().map(t -> new T2<>(suite, t))
- );
+ Stream<T2<MultBuildRunCtx, Map.Entry<String, Long>>> allLogConsumers =
ctx.suites()
+ .filter(suite -> !suite.isComposite())
+ .filter(suiteFilter)
+ .flatMap(suite -> suite.getTopLogConsumers().map(t -> new
T2<>(suite, t)));
+
Comparator<T2<MultBuildRunCtx, Map.Entry<String, Long>>>
longConsumingComp
= Comparator.comparing((pair) -> pair.get2().getValue());
diff --git
a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/ui/DsSuiteUi.java
b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/ui/DsSuiteUi.java
index eea9212..0d69840 100644
---
a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/ui/DsSuiteUi.java
+++
b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/ui/DsSuiteUi.java
@@ -25,6 +25,7 @@ import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
+import java.util.concurrent.TimeUnit;
import java.util.function.Function;
import java.util.stream.Collectors;
import javax.annotation.Nonnull;
@@ -145,6 +146,8 @@ public class DsSuiteUi extends DsHistoryStatUi {
*/
@Nullable public String blockerComment;
+ public boolean success = false;
+
/**
* @param tcIgnited Tc ignited.
* @param suite Suite.
@@ -209,9 +212,11 @@ public class DsSuiteUi extends DsHistoryStatUi {
});
suite.getTopLongRunning().forEach(occurrence -> {
- final DsTestFailureUi failure =
createOrrucForLongRun(tcIgnited, compactor, suite, occurrence, baseBranch);
+ if (occurrence.getAvgDurationMs() >
TimeUnit.SECONDS.toMillis(15)) {
+ final DsTestFailureUi failure =
createOrrucForLongRun(tcIgnited, compactor, suite, occurrence, baseBranch);
- topLongRunning.add(failure);
+ topLongRunning.add(failure);
+ }
});
suite.getCriticalFailLastStartedTest().forEach(
@@ -240,7 +245,7 @@ public class DsSuiteUi extends DsHistoryStatUi {
totalTests = suite.totalTests();
if(calcTrustedTests)
- trustedTests = suite.trustedTests(tcIgnited,
failRateNormalizedBranch);
+ trustedTests = suite.trustedTests(tcIgnited, baseBranchId);
}
suite.getBuildsWithThreadDump().forEach(buildId -> {
@@ -260,6 +265,8 @@ public class DsSuiteUi extends DsHistoryStatUi {
blockerComment = suite.getPossibleBlockerComment(compactor,
baseBranchHist, tcIgnited.config());
+ success = !suite.isFailed();
+
return this;
}