You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by dp...@apache.org on 2019/01/22 09:58:12 UTC
[ignite-teamcity-bot] branch master updated: IGNITE-10989
Triggering info saved into fat build;
removed queued builds methods, builds cache and run history caches. - Fixes
#109.
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 2476674 IGNITE-10989 Triggering info saved into fat build; removed queued builds methods, builds cache and run history caches. - Fixes #109.
2476674 is described below
commit 2476674ed51ce15230e9384634f99e59f8d5ad46
Author: Dmitriy Pavlov <dp...@apache.org>
AuthorDate: Tue Jan 22 12:58:02 2019 +0300
IGNITE-10989 Triggering info saved into fat build; removed queued builds methods, builds cache and run history caches. - Fixes #109.
Signed-off-by: Dmitriy Pavlov <dp...@apache.org>
---
.../java/org/apache/ignite/ci/ITcAnalytics.java | 21 --
.../main/java/org/apache/ignite/ci/ITeamcity.java | 19 --
.../apache/ignite/ci/IgnitePersistentTeamcity.java | 264 +--------------------
.../apache/ignite/ci/IgniteTeamcityConnection.java | 90 -------
.../ignite/ci/analysis/IMultTestOccurrence.java | 4 +-
.../org/apache/ignite/ci/analysis/RunStat.java | 9 +-
.../java/org/apache/ignite/ci/db/DbMigrations.java | 118 +--------
.../org/apache/ignite/ci/jobs/CheckQueueJob.java | 85 +++----
.../ignite/ci/runners/RemoteClientTmpHelper.java | 9 +-
.../ci/tcbot/builds/CompareBuildsService.java | 44 ++--
.../ignite/ci/tcbot/chain/BuildChainProcessor.java | 10 +-
.../ignite/ci/tcbot/chain/PrChainsProcessor.java | 2 +-
.../tcbot/chain/TrackedBranchChainsProcessor.java | 5 +-
.../ignite/ci/tcbot/issue/IssueDetector.java | 27 +--
.../org/apache/ignite/ci/tcmodel/result/Build.java | 20 +-
.../ci/teamcity/ignited/IStringCompactor.java | 4 +-
.../ci/teamcity/ignited/ITeamcityIgnited.java | 23 +-
.../ci/teamcity/ignited/TeamcityIgnitedImpl.java | 25 ++
.../ignited/fatbuild/FatBuildCompacted.java | 50 ++++
.../ignited/fatbuild/ProactiveFatBuildSync.java | 2 +-
.../ignited/fatbuild/TriggeredCompacted.java | 72 ++++++
.../ignited/runhist/RunHistCompactedDao.java | 13 +-
.../ignite/ci/teamcity/pure/ITeamcityConn.java | 20 +-
.../model/current/ChainAtServerCurrentStatus.java | 25 +-
.../ci/web/model/current/SuiteCurrentStatus.java | 64 ++---
.../ignite/ci/web/model/current/TestFailure.java | 16 +-
.../ignite/ci/web/rest/GetChainResultsAsHtml.java | 2 +-
.../ci/web/rest/build/GetBuildTestFailures.java | 2 +-
.../ci/tcbot/chain/BuildChainProcessorTest.java | 5 +-
.../ci/tcbot/chain/PrChainsProcessorTest.java | 19 +-
.../ignited/IgnitedTcInMemoryIntegrationTest.java | 13 +
31 files changed, 343 insertions(+), 739 deletions(-)
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/ITcAnalytics.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/ITcAnalytics.java
index 71a1d83..c4e8155 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/ITcAnalytics.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/ITcAnalytics.java
@@ -17,28 +17,7 @@
package org.apache.ignite.ci;
-import java.util.List;
-import java.util.function.Function;
-import org.apache.ignite.ci.analysis.RunStat;
-import org.apache.ignite.ci.analysis.SingleBuildRunCtx;
-import org.apache.ignite.ci.analysis.SuiteInBranch;
-import org.apache.ignite.ci.analysis.TestInBranch;
-
@Deprecated
public interface ITcAnalytics {
- /**
- * Return build statistics for default branch provider
- *
- * @return map from suite ID to its run statistics
- */
- @Deprecated
- Function<SuiteInBranch, RunStat> getBuildFailureRunStatProvider();
-
- /**
- * @return map from test full name (suite: suite.test) and its branch to its run statistics
- */
- @Deprecated
- Function<TestInBranch, RunStat> getTestRunStatProvider();
-
String getThreadDumpCached(Integer buildId);
}
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/ITeamcity.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/ITeamcity.java
index 4ce064d..a22d1c6 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/ITeamcity.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/ITeamcity.java
@@ -49,16 +49,6 @@ public interface ITeamcity extends ITeamcityConn {
@Deprecated
long DEFAULT_BUILDS_COUNT = 1000;
- /** Temporary feature toggle: Use New run stat in PR analysis, issue detection. */
- boolean NEW_RUN_STAT = true;
-
- /** */
- @Deprecated
- CompletableFuture<List<BuildRef>> getQueuedBuilds(@Nullable String branch);
-
- @Deprecated
- Build getBuild(String href);
-
@NotNull public static String buildHref(int id) {
return "app/rest/latest/builds/id:" + id;
}
@@ -96,15 +86,6 @@ public interface ITeamcity extends ITeamcityConn {
Base64Util.encodeUtf8String(user + ":" + pwd));
}
- /**
- * Get list of teamcity agents.
- *
- * @param connected Connected flag.
- * @param authorized Authorized flag.
- * @return List of teamcity agents.
- */
- List<Agent> agents(boolean connected, boolean authorized);
-
void init(String serverId);
User getUserByUsername(String username);
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IgnitePersistentTeamcity.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IgnitePersistentTeamcity.java
index bfa6376..7e757cc 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IgnitePersistentTeamcity.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IgnitePersistentTeamcity.java
@@ -75,14 +75,8 @@ import static org.apache.ignite.ci.teamcity.ignited.runhist.RunHistSync.normaliz
public class IgnitePersistentTeamcity implements IAnalyticsEnabledTeamcity, ITeamcity, ITcAnalytics {
//V2 caches, 32 parts (V1 caches were 1024 parts)
@Deprecated
- private static final String TESTS_RUN_STAT = "testsRunStat";
- @Deprecated
private static final String LOG_CHECK_RESULT = "logCheckResult";
- //todo need separate cache or separate key for 'execution time' because it is placed in statistics
- private static final String BUILDS_FAILURE_RUN_STAT = "buildsFailureRunStat";
- public static final String BUILDS = "builds";
-
@Inject
private Ignite ignite;
@@ -98,13 +92,7 @@ public class IgnitePersistentTeamcity implements IAnalyticsEnabledTeamcity, ITea
@Nullable
private String serverId;
- /** cached running builds for branch. */
- private ConcurrentMap<String, Expirable<List<BuildRef>>> queuedBuilds = new ConcurrentHashMap<>();
-
- /** cached loads of queued builds for branch. */
- private ConcurrentMap<String, CompletableFuture<List<BuildRef>>> queuedBuildsFuts = new ConcurrentHashMap<>();
-
- //todo: not good code to keep it static
+ //todo: remove triggering dependency from getTrackedBranch processing, use TC Bot DB data.
@Deprecated
private static long lastTriggerMs = System.currentTimeMillis();
@@ -114,10 +102,7 @@ public class IgnitePersistentTeamcity implements IAnalyticsEnabledTeamcity, ITea
DbMigrations migrations = new DbMigrations(ignite, conn.serverId());
- migrations.dataMigration(
- buildsCache(), this::addBuildOccurrenceToFailuresStat,
- buildsFailureRunStatCache(), testRunStatCache(),
- visasHistStorage.visas());
+ migrations.dataMigration(visasHistStorage.visas());
}
/** {@inheritDoc} */
@@ -142,25 +127,6 @@ public class IgnitePersistentTeamcity implements IAnalyticsEnabledTeamcity, ITea
return cache;
}
- /**
- * Creates transactional cache with 32 parts.
- * @param name Cache name.
- */
- private <K, V> IgniteCache<K, V> getOrCreateCacheV2Tx(String name) {
- final IgniteCache<K, V> cache = ignite.getOrCreateCache(TcHelperDb.getCacheV2TxConfig(name));
-
- cache.enableStatistics(true);
-
- return cache;
- }
-
- /**
- * @return {@link Build}s cache, 32 parts.
- */
- private IgniteCache<String, Build> buildsCache() {
- return getOrCreateCacheV2(ignCacheNme(BUILDS));
- }
-
/** {@inheritDoc} */
@AutoProfiling
@Override public List<BuildType> getBuildTypes(String projectId) {
@@ -172,151 +138,10 @@ public class IgnitePersistentTeamcity implements IAnalyticsEnabledTeamcity, ITea
return serverId;
}
- @Deprecated
- private <K, V> CompletableFuture<V> loadAsyncIfAbsentOrExpired(ConcurrentMap<K, Expirable<V>> cache,
- K key,
- ConcurrentMap<K, CompletableFuture<V>> cachedComputations,
- Function<K, CompletableFuture<V>> realLoadFunction,
- int maxAgeSecs,
- boolean alwaysProvidePersisted) {
- @Nullable final Expirable<V> persistedVal = cache.get(key);
-
- if (persistedVal != null && persistedVal.isAgeLessThanSecs(maxAgeSecs))
- return CompletableFuture.completedFuture(persistedVal.getData());
-
- AtomicReference<CompletableFuture<V>> submitRef = new AtomicReference<>();
-
- CompletableFuture<V> loadFut = cachedComputations.computeIfAbsent(key,
- k -> {
- CompletableFuture<V> future = realLoadFunction.apply(k)
- .thenApplyAsync(valueLoaded -> {
- final Expirable<V> cached = new Expirable<>(valueLoaded);
-
- ObjectInterner.internFields(cached);
-
- cache.put(k, cached);
-
- return valueLoaded;
- });
-
- submitRef.set(future);
-
- return future;
- }
- ).thenApply(res -> {
- CompletableFuture<V> f = submitRef.get();
-
- if (f != null)
- cachedComputations.remove(key, f);
-
- return res;
- });
-
- if (alwaysProvidePersisted && persistedVal != null)
- return CompletableFuture.completedFuture(persistedVal.getData());
-
- return loadFut;
- }
-
-
public static int getTriggerRelCacheValidSecs(int defaultSecs) {
long msSinceTrigger = System.currentTimeMillis() - lastTriggerMs;
long secondsSinceTrigger = TimeUnit.MILLISECONDS.toSeconds(msSinceTrigger);
- return Math.min((int)secondsSinceTrigger, defaultSecs);
- }
-
- /** {@inheritDoc} */
- @Override public CompletableFuture<List<BuildRef>> getQueuedBuilds(@Nullable final String branch) {
- int defaultSecs = 60;
- int secondsUseCached = getTriggerRelCacheValidSecs(defaultSecs);
-
- return loadAsyncIfAbsentOrExpired(
- queuedBuilds,
- Strings.nullToEmpty(branch),
- queuedBuildsFuts,
- teamcity::getQueuedBuilds,
- secondsUseCached,
- secondsUseCached == defaultSecs);
- }
-
- /** {@inheritDoc} */
- @Nullable
- @AutoProfiling
- @Override public Build getBuild(String href) {
- final IgniteCache<String, Build> cache = buildsCache();
-
- @Nullable final Build persistedBuild = cache.get(href);
-
- int fields = ObjectInterner.internFields(persistedBuild);
-
- if (persistedBuild != null) {
- if (!persistedBuild.isOutdatedEntityVersion())
- return persistedBuild;
- }
-
- final Build loaded = realLoadBuild(href);
- //can't reload, but cached has value
- if (loaded.isFakeStub() && persistedBuild != null && persistedBuild.isOutdatedEntityVersion()) {
- persistedBuild._version = persistedBuild.latestVersion();
- cache.put(href, persistedBuild);
-
- return persistedBuild;
- }
-
- if (loaded.isFakeStub() || loaded.hasFinishDate()) {
- cache.put(href, loaded);
-
- addBuildOccurrenceToFailuresStat(loaded);
- }
-
- return loaded;
- }
-
- private void addBuildOccurrenceToFailuresStat(Build loaded) {
- if (loaded.isFakeStub())
- return;
-
- String suiteId = loaded.suiteId();
- if (Strings.isNullOrEmpty(suiteId))
- return;
-
- SuiteInBranch key = keyForBuild(loaded);
-
- buildsFailureRunStatCache().invoke(key, (entry, arguments) -> {
- SuiteInBranch suiteInBranch = entry.getKey();
-
- Build build = (Build)arguments[0];
-
- RunStat val = entry.getValue();
-
- if (val == null)
- val = new RunStat(suiteInBranch.getSuiteId());
-
- val.addBuildRun(build);
-
- entry.setValue(val);
-
- return null;
- }, loaded);
- }
-
- @NotNull private SuiteInBranch keyForBuild(Build loaded) {
- return new SuiteInBranch(loaded.suiteId(), normalizeBranch(loaded.branchName));
- }
-
- @Deprecated
- private Build realLoadBuild(String href1) {
- try {
- return teamcity.getBuild(href1);
- }
- catch (Exception e) {
- if (Throwables.getRootCause(e) instanceof FileNotFoundException) {
- System.err.println("Exception " + e.getClass().getSimpleName() + ": " + e.getMessage());
- return Build.createFakeStub();// save null result, because persistence may refer to some non-existent build on TC
- }
- else
- throw e;
- }
+ return Math.min((int) secondsSinceTrigger, defaultSecs);
}
@NotNull private String ignCacheNme(String cache) {
@@ -337,79 +162,6 @@ public class IgnitePersistentTeamcity implements IAnalyticsEnabledTeamcity, ITea
return teamcity.getBuild(buildId);
}
- @Deprecated
- private void registerCriticalBuildProblemInStat(BuildRef build, ProblemOccurrences problems) {
- boolean criticalFail = problems.getProblemsNonNull().stream().anyMatch(occurrence ->
- occurrence.isExecutionTimeout()
- || occurrence.isJvmCrash()
- || occurrence.isFailureOnMetric()
- || occurrence.isCompilationError());
-
- String suiteId = build.suiteId();
- Integer buildId = build.getId();
-
- if (!criticalFail)
- return;
-
- if (buildId != null && !Strings.isNullOrEmpty(suiteId)) {
- SuiteInBranch key = new SuiteInBranch(suiteId, normalizeBranch(build.branchName));
-
- buildsFailureRunStatCache().invoke(key, (entry, arguments) -> {
- SuiteInBranch suiteInBranch = entry.getKey();
-
- Integer bId = (Integer)arguments[0];
-
- RunStat val = entry.getValue();
-
- if (val == null)
- val = new RunStat(suiteInBranch.getSuiteId());
-
- val.setBuildCriticalError(bId);
-
- entry.setValue(val);
-
- return null;
- }, buildId);
- }
- }
-
- /** {@inheritDoc} */
- @Override public Function<TestInBranch, RunStat> getTestRunStatProvider() {
- return key -> key == null ? null : getRunStatForTest(key);
- }
-
- @SuppressWarnings("WeakerAccess")
- @AutoProfiling
- @GuavaCached(maximumSize = 200, expireAfterAccessSecs = 30, softValues = true)
- protected RunStat getRunStatForTest(TestInBranch key) {
- return testRunStatCache().get(key);
- }
-
- @Deprecated
- private IgniteCache<TestInBranch, RunStat> testRunStatCache() {
- return getOrCreateCacheV2(ignCacheNme(TESTS_RUN_STAT));
- }
-
- /** {@inheritDoc} */
- @Override public Function<SuiteInBranch, RunStat> getBuildFailureRunStatProvider() {
- return key -> key == null ? null : getRunStatForSuite(key);
- }
-
-
- @SuppressWarnings("WeakerAccess")
- @AutoProfiling
- @GuavaCached(maximumSize = 500, expireAfterAccessSecs = 90, softValues = true)
- protected RunStat getRunStatForSuite(SuiteInBranch key) {
- return buildsFailureRunStatCache().get(key);
- }
-
- /**
- * @return cache from suite name to its failure statistics
- */
- private IgniteCache<SuiteInBranch, RunStat> buildsFailureRunStatCache() {
- return getOrCreateCacheV2(ignCacheNme(BUILDS_FAILURE_RUN_STAT));
- }
-
private IgniteCache<Integer, LogCheckResult> logCheckResultCache() {
return getOrCreateCacheV2(ignCacheNme(LOG_CHECK_RESULT));
}
@@ -498,16 +250,6 @@ public class IgnitePersistentTeamcity implements IAnalyticsEnabledTeamcity, ITea
}
/** {@inheritDoc} */
- @Deprecated
- @Override public ProblemOccurrences getProblemsAndRegisterCritical(BuildRef build) {
- ProblemOccurrences problems = teamcity.getProblems(build.getId());
-
- registerCriticalBuildProblemInStat(build, problems);
-
- return problems;
- }
-
- /** {@inheritDoc} */
@Override public List<Project> getProjects() {
return teamcity.getProjects();
}
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IgniteTeamcityConnection.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IgniteTeamcityConnection.java
index 6a75fc8..ca621d8 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IgniteTeamcityConnection.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IgniteTeamcityConnection.java
@@ -272,13 +272,6 @@ public class IgniteTeamcityConnection implements ITeamcity {
}
/** {@inheritDoc} */
- @Deprecated
- @AutoProfiling
- @Override public ProblemOccurrences getProblemsAndRegisterCritical(BuildRef build) {
- return getProblems(build.getId());
- }
-
- /** {@inheritDoc} */
@AutoProfiling
@Override public ProblemOccurrences getProblems(int buildId) {
return getJaxbUsingHref("app/rest/latest/problemOccurrences" +
@@ -368,49 +361,6 @@ public class IgniteTeamcityConnection implements ITeamcity {
return XmlUtil.load(rootElem, reader);
}
- /**
- * @param buildTypeId Build type id.
- * @param branchName Branch name.
- * @param dfltFilter Default filter.
- * @param state State.
- * @param sinceDate Since date.
- * @param untilDate Until date.
- * @param sinceBuildId Since build id. Value is ignored if dates filter is present.
- */
- @Deprecated
- private List<BuildRef> getBuildHistory(@Nullable String buildTypeId,
- @Nullable String branchName,
- boolean dfltFilter,
- @Nullable String state,
- @Nullable Date sinceDate,
- @Nullable Date untilDate,
- @Nullable Integer sinceBuildId) {
- String btFilter = isNullOrEmpty(buildTypeId) ? "" : ",buildType:" + buildTypeId;
- String stateFilter = isNullOrEmpty(state) ? "" : (",state:" + state);
- String branchFilter = isNullOrEmpty(branchName) ? "" :",branch:" + branchName;
- String sinceDateFilter = sinceDate == null ? "" : ",sinceDate:" + getDateYyyyMmDdTHhMmSsZ(sinceDate);
- String untilDateFilter = untilDate == null ? "" : ",untilDate:" + getDateYyyyMmDdTHhMmSsZ(untilDate);
- String buildNoFilter = sinceBuildId != null && sinceDateFilter.isEmpty() && untilDateFilter.isEmpty()
- ? ",sinceBuild:(id:" + sinceBuildId + ")" : "";
-
- return sendGetXmlParseJaxb(host + "app/rest/latest/builds"
- + "?locator="
- + "defaultFilter:" + dfltFilter
- + btFilter
- + stateFilter
- + branchFilter
- + buildNoFilter
- + ",count:" + DEFAULT_BUILDS_COUNT
- + sinceDateFilter
- + untilDateFilter, Builds.class).getBuildsNonNull();
- }
-
- public String getDateYyyyMmDdTHhMmSsZ(Date date){
- return new SimpleDateFormat("yyyyMMdd'T'HHmmssZ")
- .format(date)
- .replace("+", "%2B");
- }
-
/** {@inheritDoc} */
@AutoProfiling
@Override public BuildTypeFull getBuildType(String buildTypeId) {
@@ -418,12 +368,6 @@ public class IgniteTeamcityConnection implements ITeamcity {
buildTypeId, BuildTypeFull.class);
}
- @Override
- @AutoProfiling
- public Build getBuild(String href) {
- return getJaxbUsingHref(href, Build.class);
- }
-
/** {@inheritDoc} */
@AutoProfiling
@Override public Build getBuild(int buildId) {
@@ -439,40 +383,6 @@ public class IgniteTeamcityConnection implements ITeamcity {
}
/** {@inheritDoc} */
- @Override
- @AutoProfiling public CompletableFuture<List<BuildRef>> getQueuedBuilds(@Nullable String branch) {
- return supplyAsync(() -> getBuildsInState(null, branch, BuildRef.STATE_QUEUED), executor);
- }
-
- @Deprecated
- private List<BuildRef> getBuildsInState(
- @Nullable final String projectId,
- @Nullable final String branch,
- @Nonnull final String state,
- @Nullable final Integer sinceBuildId) {
- List<BuildRef> finished = getBuildHistory(projectId,
- UrlUtil.escape(branch),
- false,
- state,
- null,
- null,
- sinceBuildId);
- return finished.stream().filter(BuildRef::isNotCancelled).collect(Collectors.toList());
- }
-
-
- @SuppressWarnings("WeakerAccess")
- @AutoProfiling
- @Deprecated
- protected List<BuildRef> getBuildsInState(
- @Nullable final String projectId,
- @Nullable final String branch,
- @Nonnull final String state) {
-
- return getBuildsInState(projectId, branch, state, null);
- }
-
- /** {@inheritDoc} */
@Override public String serverId() {
return tcName;
}
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/IMultTestOccurrence.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/IMultTestOccurrence.java
index ec7cce2..4ae72ac 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/IMultTestOccurrence.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/IMultTestOccurrence.java
@@ -23,9 +23,9 @@ import org.apache.ignite.ci.tcmodel.result.tests.TestOccurrenceFull;
* Multiple test occurrence. For single build context - max 1 failure
*/
public interface IMultTestOccurrence {
- String getName();
+ public String getName();
- boolean isInvestigated();
+ public boolean isInvestigated();
public int failuresCount();
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/RunStat.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/RunStat.java
index ef7ad26..f4449dc 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/RunStat.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/RunStat.java
@@ -186,16 +186,9 @@ public class RunStat implements IRunHistory {
return (long)(1.0 * totalDurationMs / runsWithDuration);
}
+ @Deprecated
public void addBuildRun(Build build) {
runs++;
-// build.lastChanges
-
- //todo ? add duration from statistics
- /*
- if (build.duration != null) {
- totalDurationMs += testOccurrence.duration;
- runsWithDuration++;
- } */
if (!build.isSuccess())
failures++;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/db/DbMigrations.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/db/DbMigrations.java
index 01e3420..42d91fb 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/db/DbMigrations.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/db/DbMigrations.java
@@ -62,8 +62,6 @@ public class DbMigrations {
private static final Logger logger = LoggerFactory.getLogger(DbMigrations.class);
public static final String DONE_MIGRATIONS = "doneMigrations";
- @Deprecated
- private static final String BUILD_RESULTS = "buildResults";
private static final String BUILD_STATISTICS = "buildStatistics";
@@ -130,6 +128,13 @@ public class DbMigrations {
String CALCULATED_STATISTIC = "calculatedStatistic";
+ String BUILDS = "builds";
+
+ String BUILD_RESULTS = "buildResults";
+
+ String BUILDS_FAILURE_RUN_STAT = "buildsFailureRunStat";
+
+ String TESTS_RUN_STAT = "testsRunStat";
}
private final Ignite ignite;
@@ -141,11 +146,7 @@ public class DbMigrations {
this.serverId = srvId;
}
- public void dataMigration(
- Cache<String, Build> buildCache, Consumer<Build> saveBuildToStat,
- IgniteCache<SuiteInBranch, RunStat> suiteHistCache,
- IgniteCache<TestInBranch, RunStat> testHistCache,
- Cache<CompactContributionKey, List<CompactVisaRequest>> visasCache) {
+ public void dataMigration(Cache<CompactContributionKey, List<CompactVisaRequest>> visasCache) {
doneMigrations = doneMigrationsCache();
@@ -202,64 +203,6 @@ public class DbMigrations {
applyMigration("InitialFillLatestRunsV3", () -> {});
- String newBuildsCache = BUILD_RESULTS + "-to-" + IgnitePersistentTeamcity.BUILDS + "V2";
-
- applyMigration("RemoveStatisticsFromBuildCache", ()->{
- if(doneMigrations.containsKey(newBuildsCache))
- return;
-
- final IgniteCache<Object, Object> cache = ignite.getOrCreateCache(ignCacheNme(BUILD_RESULTS));
-
- for (Cache.Entry<Object, Object> next : cache) {
- if(next.getValue() instanceof Statistics) {
- System.err.println("Removed incorrect entity: Statistics from build cache");
-
- cache.remove(next.getKey());
- }
- }
- });
-
- applyMigration(newBuildsCache, () -> {
- IgniteCache<String, Build> oldBuilds = ignite.cache(ignCacheNme(BUILD_RESULTS));
-
- if (oldBuilds == null)
- return;
-
- int size = oldBuilds.size();
- if (size > 0) {
- int i = 0;
- for (Cache.Entry<String, Build> entry : oldBuilds) {
- System.out.println("Migrating build entry " + i + " from " + size + ": " + entry.getKey());
-
- Build val = entry.getValue();
-
- if (buildCache.putIfAbsent(entry.getKey(), val))
- saveBuildToStat.accept(val);
-
- i++;
- }
-
- oldBuilds.clear();
-
- oldBuilds.destroy();
- }
- });
-
- applyMigration("RemoveBuildsWithoutProjectId", () -> {
- final IgniteCache<Object, Build> cache = ignite.getOrCreateCache(ignCacheNme(BUILD_RESULTS));
-
- for (Cache.Entry<Object, Build> next : cache) {
- Build results = next.getValue();
- //non fake builds but without required data
- if (results.getId() != null)
- if (results.getBuildType() == null || results.getBuildType().getProjectId() == null) {
- System.err.println("Removed incorrect entity: Build without filled parameters: " + next);
-
- cache.remove(next.getKey());
- }
- }
- });
-
applyMigration("Remove-" + RUN_STAT_CACHE, ()->{
IgniteCache<String, Build> oldBuilds = ignite.getOrCreateCache(ignCacheNme(RUN_STAT_CACHE));
@@ -268,47 +211,6 @@ public class DbMigrations {
oldBuilds.destroy();
});
- applyMigration("ReplaceKeyTypeOf-" + suiteHistCache.getName(), () -> {
- int i = 0;
- int size = suiteHistCache.size();
-
- for (Cache.Entry<?, RunStat> next : suiteHistCache) {
- Object key = next.getKey();
-
- if (key instanceof String) {
- SuiteInBranch suiteKey = new SuiteInBranch((String)key, ITeamcity.DEFAULT);
-
- suiteHistCache.put(suiteKey, next.getValue());
- ((Cache)suiteHistCache).remove(key);
-
- System.out.println("Migrating entry " + i + " from " + size + ": " + suiteKey);
- }
-
- i++;
- }
- });
-
-
- applyMigration("ReplaceKeyTypeOf-" + testHistCache.getName(), () -> {
- int i = 0;
- int size = testHistCache.size();
-
- for (Cache.Entry<?, RunStat> next : testHistCache) {
- Object key = next.getKey();
-
- if (key instanceof String) {
- TestInBranch testKey = new TestInBranch((String)key, ITeamcity.DEFAULT);
-
- testHistCache.put(testKey, next.getValue());
- ((Cache)testHistCache).remove(key);
-
- System.out.println("Migrating entry " + i + " from " + size + ": " + testKey);
- }
-
- i++;
- }
- });
-
applyRemoveCache(GetTrackedBranchTestResults.ALL_TEST_FAILURES_SUMMARY);
applyRemoveCache(GetTrackedBranchTestResults.TEST_FAILURES_SUMMARY_CACHE_NAME);
@@ -402,6 +304,10 @@ public class DbMigrations {
applyDestroyCacheMigration(Old.BUILD_START_TIME_CACHE_NAME2);
applyDestroyIgnCacheMigration(Old.CALCULATED_STATISTIC);
+ applyDestroyIgnCacheMigration(Old.BUILDS);
+ applyDestroyIgnCacheMigration(Old.BUILD_RESULTS);
+ applyDestroyIgnCacheMigration(Old.BUILDS_FAILURE_RUN_STAT);
+ applyDestroyIgnCacheMigration(Old.TESTS_RUN_STAT);
}
private void applyDestroyIgnCacheMigration(String cacheName) {
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jobs/CheckQueueJob.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jobs/CheckQueueJob.java
index b20363b..0b54c5b 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jobs/CheckQueueJob.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jobs/CheckQueueJob.java
@@ -17,36 +17,31 @@
package org.apache.ignite.ci.jobs;
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeUnit;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-import javax.inject.Inject;
import jersey.repackaged.com.google.common.base.Throwables;
import org.apache.ignite.ci.HelperConfig;
-import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnited;
-import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnitedProvider;
-import org.apache.ignite.ci.teamcity.restcached.ITcServerProvider;
-import org.apache.ignite.ci.ITeamcity;
import org.apache.ignite.ci.conf.BranchTracked;
import org.apache.ignite.ci.conf.ChainAtServerTracked;
import org.apache.ignite.ci.di.AutoProfiling;
import org.apache.ignite.ci.di.MonitoredTask;
import org.apache.ignite.ci.tcmodel.agent.Agent;
-import org.apache.ignite.ci.tcmodel.hist.BuildRef;
import org.apache.ignite.ci.tcmodel.result.Build;
+import org.apache.ignite.ci.tcmodel.result.Triggered;
import org.apache.ignite.ci.tcmodel.user.User;
+import org.apache.ignite.ci.teamcity.ignited.BuildRefCompacted;
+import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
+import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnited;
+import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnitedProvider;
+import org.apache.ignite.ci.teamcity.ignited.fatbuild.FatBuildCompacted;
import org.apache.ignite.ci.user.ICredentialsProv;
-import org.apache.ignite.ci.web.rest.parms.FullQueryParams;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import javax.inject.Inject;
+import java.text.MessageFormat;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
/**
* Trigger build if half of agents are available and there is no self-triggered builds in build queue.
*/
@@ -68,7 +63,7 @@ public class CheckQueueJob implements Runnable {
@Inject private ITeamcityIgnitedProvider tcIgnitedProv;
/** */
- @Inject private ITcServerProvider tcPureProv;
+ @Inject private IStringCompactor compactor;
/** */
private final Map<ChainAtServerTracked, Long> startTimes = new HashMap<>();
@@ -131,17 +126,11 @@ public class CheckQueueJob implements Runnable {
try {
checkQueue(srvId, chains);
}
- catch (RuntimeException | ExecutionException e) {
+ catch (Exception e) {
logger.error("Unable to check queue: " + e.getMessage(), e);
throw Throwables.propagate(e);
}
- catch (InterruptedException e) {
- logger.error("Unable to check queue: " + e.getMessage(), e);
-
- Thread.currentThread().interrupt();
- throw Throwables.propagate(e);
- }
}
return "Checked: " + srvsChecked + "servers, " + chainsChecked + " chains, "
@@ -155,10 +144,11 @@ public class CheckQueueJob implements Runnable {
@AutoProfiling
@MonitoredTask(name = "Check Server Queue", nameExtArgIndex = 0)
protected String checkQueue(String srvId,
- List<ChainAtServerTracked> chains) throws ExecutionException, InterruptedException {
- ITeamcity teamcity = tcPureProv.server(srvId, creds);
+ List<ChainAtServerTracked> chains) {
+
+ ITeamcityIgnited tcIgn = tcIgnitedProv.server(srvId, creds);
- List<Agent> agents = teamcity.agents(true, true);
+ List<Agent> agents = tcIgn.agents(true, true);
int total = agents.size();
int running = 0;
@@ -177,38 +167,51 @@ public class CheckQueueJob implements Runnable {
if (free < CHECK_QUEUE_MIN_FREE_AGENTS_PERCENT)
return "Min agent percent of free agents not met:" + agentStatus;
- logger.info("There are more than half free agents (total={}, free={}).", total, total - running);
+ logger.info("There are more than {}% free agents (total={}, free={}).", CHECK_QUEUE_MIN_FREE_AGENTS_PERCENT,
+ total, total - running);
- List<BuildRef> builds = teamcity.getQueuedBuilds(null).get();
-
- String selfLogin = creds.getUser(teamcity.serverId());
+ String selfLogin = creds.getUser(srvId);
StringBuilder res = new StringBuilder();
for (ChainAtServerTracked chain : chains) {
- if(!Objects.equals(chain.serverId, teamcity.serverId()))
+ if(!Objects.equals(chain.serverId, srvId))
continue;
boolean trigger = true;
- for (BuildRef ref : builds) {
- Build build = teamcity.getBuild(ref.href);
+
+ List<BuildRefCompacted> buildsForBr = tcIgn.getQueuedBuildsCompacted(chain.branchForRest);
+
+ for (BuildRefCompacted refComp : buildsForBr) {
+ Integer buildId = refComp.getId();
+ if (buildId == null)
+ continue; // should not occur;
+
+ final FatBuildCompacted fatBuild = tcIgn.getFatBuild(buildId);
+ final Build build = fatBuild.toBuild(compactor);
+ final Triggered triggered = build.getTriggered();
+
+ if (triggered == null) {
+ logger.info("Unable to get triggering info for queued build {} (type={}).", buildId, build.buildTypeId);
+
+ continue;
+ }
User user = build.getTriggered().getUser();
if (user == null) {
- logger.info("Unable to get username for queued build {} (type={}).", ref.getId(), ref.buildTypeId);
+ logger.info("Unable to get username for queued build {} (type={}).", buildId, build.buildTypeId);
continue;
}
String login = user.username;
- if (selfLogin.equalsIgnoreCase(login)
- && Objects.equals(ref.branchName, chain.branchForRest)) {
+ if (selfLogin.equalsIgnoreCase(login)) {
final String msg
= MessageFormat.format("Queued build {0} was early triggered " +
"(user {1}, branch {2}, suite {3})." +
- " Will not startIgnite build.", ref.getId(), login, ref.branchName, ref.buildTypeId);
+ " Will not start Ignite build.", buildId, login, chain.branchForRest, build.buildTypeId);
logger.info(msg);
@@ -248,9 +251,7 @@ public class CheckQueueJob implements Runnable {
startTimes.put(chain, curr);
- ITeamcityIgnited srv = tcIgnitedProv.server(srvId, creds);
-
- srv.triggerBuild(chain.suiteId, chain.branchForRest, true, false);
+ tcIgn.triggerBuild(chain.suiteId, chain.branchForRest, true, false);
res.append(chain.branchForRest).append(" ").append(chain.suiteId).append(" triggered; ");
}
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/runners/RemoteClientTmpHelper.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/runners/RemoteClientTmpHelper.java
index e938158..4b244b4 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/runners/RemoteClientTmpHelper.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/runners/RemoteClientTmpHelper.java
@@ -30,7 +30,6 @@ import org.apache.ignite.Ignite;
import org.apache.ignite.IgniteCache;
import org.apache.ignite.Ignition;
import org.apache.ignite.ci.ITeamcity;
-import org.apache.ignite.ci.IgnitePersistentTeamcity;
import org.apache.ignite.ci.tcmodel.hist.BuildRef;
import org.apache.ignite.ci.tcmodel.result.Build;
import org.apache.ignite.ci.teamcity.ignited.BuildRefCompacted;
@@ -74,8 +73,6 @@ public class RemoteClientTmpHelper {
IgniteCache<Long, BuildRefCompacted> cacheRef = ignite.cache(BuildRefDao.TEAMCITY_BUILD_CACHE_NAME);
IgniteCache<Long, FatBuildCompacted> cacheFat = ignite.cache(FatBuildDao.TEAMCITY_FAT_BUILD_CACHE_NAME);
- String cacheOldBuild = IgnitePersistentTeamcity.ignCacheNme(IgnitePersistentTeamcity.BUILDS, apacheSrvName);
- IgniteCache<String, Build> buildCache = ignite.cache(cacheOldBuild);
cacheRef.forEach(
entry -> {
BuildRefCompacted buildRef = entry.getValue();
@@ -88,15 +85,11 @@ public class RemoteClientTmpHelper {
if (fat != null && fat.getId() != buildId) {
dumpBuildRef(buildId, buildRef);
dumpFatBuild(cacheFat, apache, buildId);
- String href = ITeamcity.buildHref(buildId);
- Build oldBuild = buildCache.get(href);
- if (oldBuild != null)
- dumpOldBuild(buildId, href, oldBuild);
inconsistent.incrementAndGet();
if(!fat.isOutdatedEntityVersion())
- Preconditions.checkState(false, oldBuild);
+ Preconditions.checkState(false);
}
}
}
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/builds/CompareBuildsService.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/builds/CompareBuildsService.java
index f513809..7d6b075 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/builds/CompareBuildsService.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/builds/CompareBuildsService.java
@@ -17,29 +17,24 @@
package org.apache.ignite.ci.tcbot.builds;
-import java.util.ArrayList;
-import java.util.List;
-import javax.inject.Inject;
-import org.apache.ignite.ci.IAnalyticsEnabledTeamcity;
-import org.apache.ignite.ci.ITeamcity;
import org.apache.ignite.ci.analysis.MultBuildRunCtx;
import org.apache.ignite.ci.tcbot.chain.BuildChainProcessor;
-import org.apache.ignite.ci.tcmodel.hist.BuildRef;
-import org.apache.ignite.ci.tcmodel.result.Build;
import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnited;
import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnitedProvider;
import org.apache.ignite.ci.teamcity.ignited.fatbuild.FatBuildCompacted;
-import org.apache.ignite.ci.teamcity.restcached.ITcServerProvider;
import org.apache.ignite.ci.user.ICredentialsProv;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import javax.inject.Inject;
+import java.util.ArrayList;
+import java.util.List;
+
public class CompareBuildsService {
/** */
private static final Logger logger = LoggerFactory.getLogger(CompareBuildsService.class);
- @Inject ITcServerProvider helper;
@Inject BuildChainProcessor bcp;
@Inject ITeamcityIgnitedProvider tcIgnitedProv;
@Inject IStringCompactor compactor;
@@ -51,40 +46,31 @@ public class CompareBuildsService {
* @return List of build tests.
*/
public List<String> tests0(String srvId, Integer buildId, ICredentialsProv prov ) {
- IAnalyticsEnabledTeamcity teamcity = helper.server(srvId, prov);
-
- String hrefById = ITeamcity.buildHref(buildId);
- BuildRef buildRef = new BuildRef();
-
- buildRef.setId(buildId);
- buildRef.href = hrefById;
-
ITeamcityIgnited srv = tcIgnitedProv.server(srvId, prov);
- return tests0(teamcity, srv, buildRef, bcp);
+ return tests0(srv, buildId, bcp);
}
/** */
- private List<String> tests0(ITeamcity tc, ITeamcityIgnited tcIgnited,
- BuildRef ref, BuildChainProcessor bcp) {
+ private List<String> tests0(ITeamcityIgnited tcIgnited,
+ Integer buildId, BuildChainProcessor bcp) {
List<String> tests = new ArrayList<>();
- Build build = tc.getBuild(ref.href);
+ FatBuildCompacted fatBuild = tcIgnited.getFatBuild(buildId);
- if (build.isComposite()) {
- List<BuildRef> deps = build.getSnapshotDependenciesNonNull();
+ if (fatBuild.isComposite()) {
+ int[] deps = fatBuild.snapshotDependencies();
- logger.info("Build {} is composite ({}).", build.getId(), deps.size());
+ logger.info("Build {} is composite ({}).", fatBuild.getId(), deps.length);
- for (BuildRef ref0 : deps)
- tests.addAll(tests0(tc, tcIgnited, ref0, bcp));
+ for (int ref0 : deps)
+ tests.addAll(tests0(tcIgnited, ref0, bcp));
}
else {
- logger.info("Loading tests for build {}.", build.getId());
+ logger.info("Loading tests for build {}.", fatBuild.getId());
- MultBuildRunCtx buildCtx = new MultBuildRunCtx(build, compactor);
+ MultBuildRunCtx buildCtx = new MultBuildRunCtx(fatBuild.toBuildRef(compactor), compactor);
- final FatBuildCompacted fatBuild = tcIgnited.getFatBuild(build.getId());
buildCtx.addBuild(bcp.loadChanges(fatBuild, tcIgnited));
for (String testName : buildCtx.tests())
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/BuildChainProcessor.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/BuildChainProcessor.java
index 4c91d05..0375527 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/BuildChainProcessor.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/BuildChainProcessor.java
@@ -38,7 +38,6 @@ import java.util.stream.Stream;
import javax.annotation.Nonnull;
import javax.inject.Inject;
import org.apache.ignite.ci.IAnalyticsEnabledTeamcity;
-import org.apache.ignite.ci.ITeamcity;
import org.apache.ignite.ci.analysis.FullChainRunCtx;
import org.apache.ignite.ci.analysis.MultBuildRunCtx;
import org.apache.ignite.ci.analysis.SingleBuildRunCtx;
@@ -199,13 +198,8 @@ public class BuildChainProcessor {
Function<MultBuildRunCtx, Float> function = ctx -> {
SuiteInBranch key = new SuiteInBranch(ctx.suiteId(), RunHistSync.normalizeBranch(failRateBranch));
- //todo place RunStat into suite context to compare
- Function<SuiteInBranch, ? extends IRunHistory> provider =
- ITeamcity.NEW_RUN_STAT
- ? tcIgn::getSuiteRunHist
- : teamcity.getBuildFailureRunStatProvider();
-
- IRunHistory runStat = provider.apply(key);
+ //todo cache RunStat instance into suite context to compare
+ IRunHistory runStat = tcIgn.getSuiteRunHist(key);
if (runStat == null)
return 0f;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/PrChainsProcessor.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/PrChainsProcessor.java
index 8c280e9..595891c 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/PrChainsProcessor.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/PrChainsProcessor.java
@@ -158,7 +158,7 @@ public class PrChainsProcessor {
runningUpdates.addAndGet(cnt0);
//fail rate reference is always default (master)
- chainStatus.initFromContext(tcIgnited, teamcity, ctx, teamcity, baseBranch);
+ chainStatus.initFromContext(tcIgnited, teamcity, ctx, baseBranch);
chainStatus.initJiraAndGitInfo(tcIgnited, jiraIntegration, gitHubConnIgnited);
}
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/TrackedBranchChainsProcessor.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/TrackedBranchChainsProcessor.java
index 8c187ec..137d802 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/TrackedBranchChainsProcessor.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/TrackedBranchChainsProcessor.java
@@ -16,12 +16,11 @@
*/
package org.apache.ignite.ci.tcbot.chain;
-import com.google.common.base.Preconditions;
import java.util.Comparator;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import javax.inject.Inject;
-import org.apache.ignite.ci.HelperConfig;
+
import org.apache.ignite.ci.IAnalyticsEnabledTeamcity;
import org.apache.ignite.ci.analysis.FullChainRunCtx;
import org.apache.ignite.ci.analysis.mode.LatestRebuildMode;
@@ -119,7 +118,7 @@ public class TrackedBranchChainsProcessor {
if (cnt > 0)
runningUpdates.addAndGet(cnt);
- chainStatus.initFromContext(tcIgnited, teamcity, ctx, teamcity, baseBranchTc);
+ chainStatus.initFromContext(tcIgnited, teamcity, ctx, baseBranchTc);
return chainStatus;
})
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 be26ec3..c5b8233 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
@@ -31,12 +31,10 @@ import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
-import java.util.function.Function;
import javax.inject.Inject;
import javax.inject.Provider;
import org.apache.ignite.ci.HelperConfig;
import org.apache.ignite.ci.IAnalyticsEnabledTeamcity;
-import org.apache.ignite.ci.ITeamcity;
import org.apache.ignite.ci.analysis.SuiteInBranch;
import org.apache.ignite.ci.analysis.TestInBranch;
import org.apache.ignite.ci.di.AutoProfiling;
@@ -247,7 +245,7 @@ public class IssueDetector {
final String trackedBranch = res.getTrackedBranch();
for (TestFailure testFailure : suiteCurrentStatus.testFailures) {
- if(registerTestFailIssues(tcIgnited, teamcity, next.serverId, normalizeBranch, testFailure, trackedBranch))
+ if(registerTestFailIssues(tcIgnited, next.serverId, normalizeBranch, testFailure, trackedBranch))
newIssues++;
}
@@ -269,12 +267,7 @@ public class IssueDetector {
SuiteInBranch key = new SuiteInBranch(suiteId, normalizeBranch);
- Function<SuiteInBranch, ? extends IRunHistory> provider =
- ITeamcity.NEW_RUN_STAT
- ? tcIgnited::getSuiteRunHist
- : teamcity.getBuildFailureRunStatProvider();
-
- IRunHistory runStat = provider.apply(key);
+ IRunHistory runStat = tcIgnited.getSuiteRunHist(key);
if (runStat == null)
return false;
@@ -319,21 +312,15 @@ public class IssueDetector {
}
private boolean registerTestFailIssues(ITeamcityIgnited tcIgnited,
- IAnalyticsEnabledTeamcity teamcity,
- String srvId,
- String normalizeBranch,
- TestFailure testFailure,
- String trackedBranch) {
+ String srvId,
+ String normalizeBranch,
+ TestFailure testFailure,
+ String trackedBranch) {
String name = testFailure.name;
TestInBranch testInBranch = new TestInBranch(name, normalizeBranch);
- Function<TestInBranch, ? extends IRunHistory> function =
- ITeamcity.NEW_RUN_STAT
- ? tcIgnited::getTestRunHist
- : teamcity.getTestRunStatProvider();
-
- IRunHistory runStat = function.apply(testInBranch);
+ IRunHistory runStat = tcIgnited.getTestRunHist(testInBranch);
if (runStat == null)
return false;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/Build.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/Build.java
index 12a1cae..59f9eae 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/Build.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/Build.java
@@ -44,9 +44,7 @@ import static org.apache.ignite.ci.util.ExceptionUtil.propagateException;
*/
@XmlRootElement(name = "build")
@XmlAccessorType(XmlAccessType.FIELD)
-public class Build extends BuildRef implements IVersionedEntity {
- public static final int LATEST_VERSION = 2;
-
+public class Build extends BuildRef {
/** Format local. */
@XmlTransient private static ThreadLocal<SimpleDateFormat> fmtLoc
= ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyyMMdd'T'HHmmssZ"));
@@ -67,20 +65,12 @@ public class Build extends BuildRef implements IVersionedEntity {
@XmlElement(name = "statistics") public StatisticsRef statisticsRef;
- @XmlElement(name = "relatedIssues") public RelatedIssuesRef relatedIssuesRef;
-
- /** Changes not included into build.*/
- @XmlElement(name = "lastChanges") public ChangesList lastChanges;
-
/** Changes included into build.*/
@XmlElement(name = "changes") public ChangesListRef changesRef;
/** Information about build triggering. */
@XmlElement(name = "triggered") private Triggered triggered;
- @XmlTransient
- @SuppressWarnings("FieldCanBeLocal") public Integer _version = LATEST_VERSION;
-
@NotNull public static Build createFakeStub() {
return new Build();
}
@@ -156,14 +146,6 @@ public class Build extends BuildRef implements IVersionedEntity {
return buildType;
}
- @Override public int version() {
- return _version == null ? 0 : _version;
- }
-
- @Override public int latestVersion() {
- return LATEST_VERSION;
- }
-
/**
* @return Information about build triggering.
*/
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/IStringCompactor.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/IStringCompactor.java
index dfdc3b2..57e3c15 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/IStringCompactor.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/IStringCompactor.java
@@ -21,12 +21,12 @@ package org.apache.ignite.ci.teamcity.ignited;
*/
public interface IStringCompactor {
/**
- * @param val Value.
+ * @param val Value to be identified as integer.
*/
public int getStringId(String val);
/**
- * @param id Id.
+ * @param id Id of string from {@link #getStringId(String)}. Negative value implies <code>null</code>.
*/
public String getStringFromId(int id);
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/ITeamcityIgnited.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/ITeamcityIgnited.java
index 28b6ca4..df2099a 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/ITeamcityIgnited.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/ITeamcityIgnited.java
@@ -23,6 +23,7 @@ import java.util.Set;
import javax.annotation.Nullable;
import org.apache.ignite.ci.analysis.SuiteInBranch;
import org.apache.ignite.ci.analysis.TestInBranch;
+import org.apache.ignite.ci.tcmodel.agent.Agent;
import org.apache.ignite.ci.tcmodel.mute.MuteInfo;
import org.apache.ignite.ci.tcmodel.result.Build;
import org.apache.ignite.ci.teamcity.ignited.buildcondition.BuildCondition;
@@ -59,6 +60,14 @@ public interface ITeamcityIgnited {
@Nullable String branchName);
/**
+ * Return queued builds for branch and suite, without relation to its status.
+ *
+ * @param branchName Branch name.
+ * @return list of builds in history, includes all statuses: queued, running, etc
+ */
+ public List<BuildRefCompacted> getQueuedBuildsCompacted(String branchName);
+
+ /**
* @param projectId Project id.
* @param creds Credentials.
* @return Mutes for associated server and given project pair.
@@ -178,7 +187,17 @@ public interface ITeamcityIgnited {
*/
@Nullable public IRunStat getSuiteRunStatAllBranches(String suiteBuildTypeId);
- List<String> getAllProjectsIds();
+ public List<String> getAllProjectsIds();
- String gitBranchPrefix();
+ public String gitBranchPrefix();
+
+
+ /**
+ * Get list of teamcity agents. Never cached, request goes directly to pure TC.
+ *
+ * @param connected Connected flag.
+ * @param authorized Authorized flag.
+ * @return List of teamcity agents.
+ */
+ public List<Agent> agents(boolean connected, boolean authorized);
}
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedImpl.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedImpl.java
index 073f1a7..e17eddb 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedImpl.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedImpl.java
@@ -43,7 +43,9 @@ import org.apache.ignite.ci.di.MonitoredTask;
import org.apache.ignite.ci.di.cache.GuavaCached;
import org.apache.ignite.ci.di.scheduler.IScheduler;
import org.apache.ignite.ci.tcbot.trends.MasterTrendsService;
+import org.apache.ignite.ci.tcmodel.agent.Agent;
import org.apache.ignite.ci.tcmodel.conf.Project;
+import org.apache.ignite.ci.tcmodel.hist.BuildRef;
import org.apache.ignite.ci.tcmodel.mute.MuteInfo;
import org.apache.ignite.ci.tcmodel.result.Build;
import org.apache.ignite.ci.teamcity.ignited.buildcondition.BuildCondition;
@@ -340,6 +342,22 @@ public class TeamcityIgnitedImpl implements ITeamcityIgnited {
}
/** {@inheritDoc} */
+ @AutoProfiling
+ @Override public List<BuildRefCompacted> getQueuedBuildsCompacted(
+ @Nullable String branchName) {
+ ensureActualizeRequested();
+
+ Integer stateQueuedId = compactor.getStringIdIfPresent(BuildRef.STATE_QUEUED);
+ if (stateQueuedId == null)
+ return Collections.emptyList();
+
+ List<BuildRefCompacted> builds = buildRefDao.getBuildsForBranch(srvIdMaskHigh, branchForQuery(branchName));
+
+ return builds.stream().filter(b -> b.state() == stateQueuedId).collect(Collectors.toList());
+ }
+
+
+ /** {@inheritDoc} */
@Override public Set<MuteInfo> getMutes(String projectId, ICredentialsProv creds) {
muteSync.ensureActualizeMutes(taskName("actualizeMutes"), projectId, srvIdMaskHigh, conn);
@@ -381,12 +399,14 @@ public class TeamcityIgnitedImpl implements ITeamcityIgnited {
/** {@inheritDoc} */
@Nullable
+ @AutoProfiling
@Override public IRunHistory getTestRunHist(TestInBranch testInBranch) {
return runHistCompactedDao.getTestRunHist(srvIdMaskHigh, testInBranch.name, testInBranch.branch);
}
/** {@inheritDoc} */
@Nullable
+ @AutoProfiling
@Override public IRunHistory getSuiteRunHist(SuiteInBranch suiteInBranch) {
return runHistCompactedDao.getSuiteRunHist(srvIdMaskHigh, suiteInBranch.getSuiteId(), suiteInBranch.branch);
}
@@ -406,6 +426,11 @@ public class TeamcityIgnitedImpl implements ITeamcityIgnited {
return conn.gitBranchPrefix();
}
+ @Override
+ public List<Agent> agents(boolean connected, boolean authorized) {
+ return conn.agents(connected, authorized);
+ }
+
/** {@inheritDoc} */
@Override public List<String> getCompositeBuildTypesIdsSortedByBuildNumberCounter(String projectId) {
return buildTypeSync.getCompositeBuildTypesIdsSortedByBuildNumberCounter(srvIdMaskHigh, projectId, conn);
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/FatBuildCompacted.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/FatBuildCompacted.java
index 91c8df4..360310e 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/FatBuildCompacted.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/FatBuildCompacted.java
@@ -26,10 +26,12 @@ import org.apache.ignite.ci.tcmodel.conf.BuildType;
import org.apache.ignite.ci.tcmodel.hist.BuildRef;
import org.apache.ignite.ci.tcmodel.result.Build;
import org.apache.ignite.ci.tcmodel.result.TestOccurrencesRef;
+import org.apache.ignite.ci.tcmodel.result.Triggered;
import org.apache.ignite.ci.tcmodel.result.problems.ProblemOccurrence;
import org.apache.ignite.ci.tcmodel.result.stat.Statistics;
import org.apache.ignite.ci.tcmodel.result.tests.TestOccurrenceFull;
import org.apache.ignite.ci.tcmodel.result.tests.TestOccurrencesFull;
+import org.apache.ignite.ci.tcmodel.user.User;
import org.apache.ignite.ci.teamcity.ignited.BuildRefCompacted;
import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
import org.apache.ignite.ci.teamcity.ignited.runhist.Invocation;
@@ -106,6 +108,8 @@ public class FatBuildCompacted extends BuildRefCompacted implements IVersionedEn
@Nullable private int changesIds[];
+ @Nullable private TriggeredCompacted triggered;
+
/** {@inheritDoc} */
@Override public int version() {
return _ver;
@@ -166,6 +170,28 @@ public class FatBuildCompacted extends BuildRefCompacted implements IVersionedEn
if (build.isFakeStub())
setFakeStub(true);
+
+ final Triggered trigXml = build.getTriggered();
+
+ if (trigXml != null) {
+ triggered = new TriggeredCompacted();
+
+ triggered.type = compactor.getStringId(trigXml.getType());
+
+ final User trigXmlUser = trigXml.getUser();
+
+ if (trigXmlUser != null) {
+ triggered.userId = Integer.valueOf(trigXmlUser.id);
+ triggered.userUsername = compactor.getStringId(trigXmlUser.username);
+ } else {
+ triggered.userId = -1;
+ triggered.userUsername = -1;
+ }
+
+ final BuildRef trigBuildRef = trigXml.getBuild();
+
+ triggered.buildId = trigBuildRef != null ? trigBuildRef.getId() : -1;
+ }
}
public FatBuildCompacted setFakeStub(boolean val) {
@@ -240,6 +266,29 @@ public class FatBuildCompacted extends BuildRefCompacted implements IVersionedEn
res.defaultBranch = getFlag(DEF_BR_F);
res.composite = getFlag(COMPOSITE_F);
+ if (triggered != null) {
+ final Triggered trigXml = new Triggered();
+
+ trigXml.setType(compactor.getStringFromId(triggered.type));
+ trigXml.setDate(res.queuedDate);
+
+ if (triggered.userId > 0) {
+ final User trigUser = new User();
+ trigUser.id = Integer.toString(triggered.userId);
+ trigUser.username = compactor.getStringFromId(triggered.userUsername);
+ trigXml.setUser(trigUser);
+ }
+
+
+ if (triggered.buildId > 0) {
+ final BuildRef trigBuild = new BuildRef();
+ trigBuild.setId(triggered.buildId);
+ trigXml.setBuild(trigBuild);
+ }
+
+ res.setTriggered(trigXml);
+ }
+
}
/**
@@ -482,6 +531,7 @@ public class FatBuildCompacted extends BuildRefCompacted implements IVersionedEn
.add("problems", problems)
.add("statistics", statistics)
.add("changesIds", changesIds)
+ .add("triggered", triggered)
.toString();
}
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/ProactiveFatBuildSync.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/ProactiveFatBuildSync.java
index 843d991..94a1970 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/ProactiveFatBuildSync.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/ProactiveFatBuildSync.java
@@ -366,7 +366,7 @@ public class ProactiveFatBuildSync {
}
if (build.problemOccurrences != null)
- problems = conn.getProblemsAndRegisterCritical(build).getProblemsNonNull();
+ problems = conn.getProblems(buildId).getProblemsNonNull();
if (build.statisticsRef != null)
statistics = conn.getStatistics(buildId);
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/TriggeredCompacted.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/TriggeredCompacted.java
new file mode 100644
index 0000000..728615d
--- /dev/null
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/TriggeredCompacted.java
@@ -0,0 +1,72 @@
+/*
+ * 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.ci.teamcity.ignited.fatbuild;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Objects;
+
+/**
+ * Triggered build information type/date/user
+ */
+public class TriggeredCompacted {
+ /**
+ * Type of triggering, for example:
+ * "snapshotDependency", ""
+ */
+ public int type;
+
+ /**
+ * User ID by teamcity identification.
+ */
+ public int userId;
+
+ /**
+ * User entity: Username compacted string Id.
+ */
+ public int userUsername;
+
+ /**
+ * Build ID, filled for snapshotDependencies triggering.
+ */
+ public int buildId;
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ TriggeredCompacted that = (TriggeredCompacted) o;
+ return type == that.type &&
+ userId == that.userId &&
+ userUsername == that.userUsername &&
+ buildId == that.buildId;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hashCode(type, userId, userUsername, buildId);
+ }
+
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper(this)
+ .add("type", type)
+ .add("userId", userId)
+ .add("userUsername", userUsername)
+ .add("buildId", buildId)
+ .toString();
+ }
+}
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistCompactedDao.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistCompactedDao.java
index 8ab9815..d22eb39 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistCompactedDao.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistCompactedDao.java
@@ -28,6 +28,7 @@ import org.apache.ignite.cache.query.QueryCursor;
import org.apache.ignite.cache.query.SqlQuery;
import org.apache.ignite.ci.db.TcHelperDb;
import org.apache.ignite.ci.di.AutoProfiling;
+import org.apache.ignite.ci.di.cache.GuavaCached;
import org.apache.ignite.ci.teamcity.ignited.IRunHistory;
import org.apache.ignite.ci.teamcity.ignited.IRunStat;
import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
@@ -63,7 +64,7 @@ public class RunHistCompactedDao {
private IgniteCache<RunHistKey, RunHistCompacted> testHistCache;
/** Suite history cache. */
- private IgniteCache<RunHistKey, RunHistCompacted> suiteHistCacheName;
+ private IgniteCache<RunHistKey, RunHistCompacted> suiteHistCache;
/** Build start time. */
private IgniteCache<Long, Long> buildStartTime;
@@ -87,11 +88,12 @@ public class RunHistCompactedDao {
cfg2.setQueryEntities(Collections.singletonList(new QueryEntity(RunHistKey.class, RunHistCompacted.class)));
- suiteHistCacheName = ignite.getOrCreateCache(cfg2);
+ suiteHistCache = ignite.getOrCreateCache(cfg2);
buildStartTime = ignite.getOrCreateCache(TcHelperDb.getCacheV2Config(BUILD_START_TIME_CACHE_NAME));
}
+ @GuavaCached(maximumSize = 200, expireAfterAccessSecs = 30, softValues = true)
public IRunHistory getTestRunHist(int srvIdMaskHigh, String name, @Nullable String branch) {
RunHistKey key = getKey(srvIdMaskHigh, name, branch);
if (key == null)
@@ -148,7 +150,7 @@ public class RunHistCompactedDao {
if (list.isEmpty())
return 0;
- return suiteHistCacheName.invoke(histKey, RunHistCompactedDao::processEntry, list);
+ return suiteHistCache.invoke(histKey, RunHistCompactedDao::processEntry, list);
}
@NotNull public static Integer processEntry(MutableEntry<RunHistKey, RunHistCompacted> entry, Object[] parms) {
@@ -179,12 +181,13 @@ public class RunHistCompactedDao {
* @param suiteId Suite id.
* @param branch Branch.
*/
+ @GuavaCached(maximumSize = 200, expireAfterAccessSecs = 30, softValues = true)
public IRunHistory getSuiteRunHist(int srvId, String suiteId, @Nullable String branch) {
RunHistKey key = getKey(srvId, suiteId, branch);
if (key == null)
return null;
- return suiteHistCacheName.get(key);
+ return suiteHistCache.get(key);
}
public IRunStat getSuiteRunStatAllBranches(int srvIdMaskHigh, String btId) {
@@ -194,7 +197,7 @@ public class RunHistCompactedDao {
AtomicInteger runs = new AtomicInteger();
AtomicInteger failures = new AtomicInteger();
- try (QueryCursor<Cache.Entry<RunHistKey, RunHistCompacted>> qryCursor = suiteHistCacheName.query(
+ try (QueryCursor<Cache.Entry<RunHistKey, RunHistCompacted>> qryCursor = suiteHistCache.query(
new SqlQuery<RunHistKey, RunHistCompacted>(RunHistCompacted.class, "testOrSuiteName = ? and srvId = ?")
.setArgs(testName, srvIdMaskHigh))) {
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/pure/ITeamcityConn.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/pure/ITeamcityConn.java
index 4c69296..5af968f 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/pure/ITeamcityConn.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/pure/ITeamcityConn.java
@@ -23,6 +23,7 @@ import java.util.concurrent.atomic.AtomicReference;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
+import org.apache.ignite.ci.tcmodel.agent.Agent;
import org.apache.ignite.ci.tcmodel.changes.Change;
import org.apache.ignite.ci.tcmodel.changes.ChangesList;
import org.apache.ignite.ci.tcmodel.conf.BuildType;
@@ -36,13 +37,15 @@ import org.apache.ignite.ci.tcmodel.result.stat.Statistics;
import org.apache.ignite.ci.tcmodel.result.tests.TestOccurrencesFull;
/**
- * Pure Teamcity Connection API for calling methods from REST service: https://confluence.jetbrains.com/display/TCD10/REST+API
+ * Pure Teamcity Connection API for calling methods from REST service: <br>
+ * https://confluence.jetbrains.com/display/TCD10/REST+API
*/
public interface ITeamcityConn {
/**
* @return Internal server ID as string
*/
- @Nullable public String serverId();
+ @Nullable
+ public String serverId();
/**
* @return Normalized Host address, ends with '/'.
@@ -101,10 +104,6 @@ public interface ITeamcityConn {
*/
BuildTypeFull getBuildType(String buildTypeId);
- /** */
- @Deprecated
- ProblemOccurrences getProblemsAndRegisterCritical(BuildRef build);
-
/**
* @return List of all project available at Teamcity server.
*/
@@ -114,4 +113,13 @@ public interface ITeamcityConn {
* @return Branch name mandatory prefix for all PR-less contributions, e.g. "ignite-".
*/
public String gitBranchPrefix();
+
+ /**
+ * Get list of teamcity agents.
+ *
+ * @param connected Connected flag.
+ * @param authorized Authorized flag.
+ * @return List of teamcity agents.
+ */
+ List<Agent> agents(boolean connected, boolean authorized);
}
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/current/ChainAtServerCurrentStatus.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/current/ChainAtServerCurrentStatus.java
index 5d4402b..29b9a19 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/current/ChainAtServerCurrentStatus.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/current/ChainAtServerCurrentStatus.java
@@ -23,10 +23,9 @@ import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
-import java.util.function.Function;
import java.util.stream.Stream;
import javax.annotation.Nullable;
-import org.apache.ignite.ci.ITcAnalytics;
+
import org.apache.ignite.ci.ITeamcity;
import org.apache.ignite.ci.analysis.FullChainRunCtx;
import org.apache.ignite.ci.analysis.IMultTestOccurrence;
@@ -37,8 +36,6 @@ import org.apache.ignite.ci.github.pure.IGitHubConnection;
import org.apache.ignite.ci.jira.pure.IJiraIntegration;
import org.apache.ignite.ci.tcbot.visa.TcBotTriggerAndSignOffService;
import org.apache.ignite.ci.tcmodel.conf.BuildType;
-import org.apache.ignite.ci.analysis.TestInBranch;
-import org.apache.ignite.ci.teamcity.ignited.IRunHistory;
import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnited;
import org.apache.ignite.ci.util.CollectionUtil;
import org.apache.ignite.internal.util.typedef.T2;
@@ -161,7 +158,6 @@ public class ChainAtServerCurrentStatus {
public void initFromContext(ITeamcityIgnited tcIgnited,
@Deprecated ITeamcity teamcity,
FullChainRunCtx ctx,
- @Deprecated ITcAnalytics tcAnalytics,
@Nullable String baseBranchTc) {
failedTests = 0;
failedToFinish = 0;
@@ -172,7 +168,7 @@ public class ChainAtServerCurrentStatus {
suite -> {
final SuiteCurrentStatus suiteCurStatus = new SuiteCurrentStatus();
- suiteCurStatus.initFromContext(tcIgnited, teamcity, suite, tcAnalytics, baseBranchTc);
+ suiteCurStatus.initFromContext(tcIgnited, suite, baseBranchTc);
failedTests += suiteCurStatus.failedTests;
if (suite.hasAnyBuildProblemExceptTestOrSnapshot() || suite.onlyCancelledBuilds())
@@ -184,8 +180,8 @@ public class ChainAtServerCurrentStatus {
durationPrintable = ctx.getDurationPrintable();
testsDurationPrintable = ctx.getTestsDurationPrintable();
lostInTimeouts = ctx.getLostInTimeoutsPrintable();
- webToHist = buildWebLink(teamcity, ctx);
- webToBuild = buildWebLinkToBuild(teamcity, ctx);
+ webToHist = buildWebLink(tcIgnited, ctx);
+ webToBuild = buildWebLinkToBuild(tcIgnited, ctx);
Stream<T2<MultBuildRunCtx, IMultTestOccurrence>> allLongRunning = ctx.suites().flatMap(
suite -> suite.getTopLongRunning().map(t -> new T2<>(suite, t))
@@ -198,14 +194,7 @@ public class ChainAtServerCurrentStatus {
MultBuildRunCtx suite = pairCtxAndOccur.get1();
IMultTestOccurrence longRunningOccur = pairCtxAndOccur.get2();
- Function<TestInBranch, ? extends IRunHistory> function =
- ITeamcity.NEW_RUN_STAT
- ? tcIgnited::getTestRunHist
- : tcAnalytics.getTestRunStatProvider();
-
- TestFailure failure = createOrrucForLongRun(tcIgnited, suite, tcAnalytics, longRunningOccur,
- baseBranchTc,
- function);
+ TestFailure failure = createOrrucForLongRun(tcIgnited, suite, longRunningOccur, baseBranchTc);
failure.testName = "[" + suite.suiteName() + "] " + failure.testName; //may be separate field
@@ -233,11 +222,11 @@ public class ChainAtServerCurrentStatus {
);
}
- private static String buildWebLinkToBuild(ITeamcity teamcity, FullChainRunCtx chain) {
+ private static String buildWebLinkToBuild(ITeamcityIgnited teamcity, FullChainRunCtx chain) {
return teamcity.host() + "viewLog.html?buildId=" + chain.getSuiteBuildId();
}
- private static String buildWebLink(ITeamcity teamcity, FullChainRunCtx suite) {
+ private static String buildWebLink(ITeamcityIgnited teamcity, FullChainRunCtx suite) {
final String branch = branchForLink(suite.branchName());
return teamcity.host() + "viewType.html?buildTypeId=" + suite.suiteId()
+ "&branch=" + escape(branch)
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/current/SuiteCurrentStatus.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/current/SuiteCurrentStatus.java
index afe98b6..269bcb5 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/current/SuiteCurrentStatus.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/current/SuiteCurrentStatus.java
@@ -28,7 +28,7 @@ import java.util.function.Function;
import java.util.stream.Collectors;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
-import org.apache.ignite.ci.ITcAnalytics;
+
import org.apache.ignite.ci.ITeamcity;
import org.apache.ignite.ci.analysis.IMultTestOccurrence;
import org.apache.ignite.ci.analysis.MultBuildRunCtx;
@@ -122,9 +122,7 @@ import static org.apache.ignite.ci.util.UrlUtil.escape;
public Boolean possibleBlocker;
public void initFromContext(ITeamcityIgnited tcIgnited,
- @Nonnull final ITeamcity teamcity,
@Nonnull final MultBuildRunCtx suite,
- @NotNull final ITcAnalytics tcAnalytics,
@Nullable final String baseBranch) {
name = suite.suiteName();
@@ -132,19 +130,9 @@ import static org.apache.ignite.ci.util.UrlUtil.escape;
String failRateNormalizedBranch = normalizeBranch(baseBranch);
String curBranchNormalized = normalizeBranch(suite.branchName());
- Function<TestInBranch, ? extends IRunHistory> testStatProv =
- ITeamcity.NEW_RUN_STAT
- ? tcIgnited::getTestRunHist
- : tcAnalytics.getTestRunStatProvider();
-
String suiteId = suite.suiteId();
- Function<SuiteInBranch, ? extends IRunHistory> provider =
- ITeamcity.NEW_RUN_STAT
- ? tcIgnited::getSuiteRunHist
- : tcAnalytics.getBuildFailureRunStatProvider();
-
- initSuiteStat(provider, failRateNormalizedBranch, curBranchNormalized, suiteId);
+ initSuiteStat(tcIgnited, failRateNormalizedBranch, curBranchNormalized, suiteId);
Set<String> collect = suite.lastChangeUsers().collect(Collectors.toSet());
@@ -156,15 +144,15 @@ import static org.apache.ignite.ci.util.UrlUtil.escape;
failedTests = suite.failedTests();
durationPrintable = millisToDurationPrintable(suite.getBuildDuration());
testsDurationPrintable = millisToDurationPrintable(suite.getAvgTestsDuration());
- webToHist = buildWebLink(teamcity, suite);
- webToHistBaseBranch = buildWebLink(teamcity, suite, baseBranch);
- webToBuild = buildWebLinkToBuild(teamcity, suite);
+ webToHist = buildWebLink(tcIgnited, suite);
+ webToHistBaseBranch = buildWebLink(tcIgnited, suite, baseBranch);
+ webToBuild = buildWebLinkToBuild(tcIgnited, suite);
List<IMultTestOccurrence> tests = suite.getFailedTests();
Function<IMultTestOccurrence, Float> function = foccur -> {
TestInBranch testInBranch = new TestInBranch(foccur.getName(), failRateNormalizedBranch);
- IRunHistory apply = testStatProv.apply(testInBranch);
+ IRunHistory apply = tcIgnited.getTestRunHist(testInBranch);
return apply == null ? 0f : apply.getFailRate();
};
@@ -174,14 +162,14 @@ import static org.apache.ignite.ci.util.UrlUtil.escape;
tests.forEach(occurrence -> {
final TestFailure failure = new TestFailure();
failure.initFromOccurrence(occurrence, tcIgnited, suite.projectId(), suite.branchName(), baseBranch);
- failure.initStat(testStatProv, failRateNormalizedBranch, curBranchNormalized);
+ failure.initStat(tcIgnited, failRateNormalizedBranch, curBranchNormalized);
testFailures.add(failure);
});
suite.getTopLongRunning().forEach(occurrence -> {
- final TestFailure failure = createOrrucForLongRun(tcIgnited, suite, tcAnalytics,
- occurrence, baseBranch, testStatProv);
+ final TestFailure failure = createOrrucForLongRun(tcIgnited, suite,
+ occurrence, baseBranch);
topLongRunning.add(failure);
});
@@ -211,29 +199,29 @@ import static org.apache.ignite.ci.util.UrlUtil.escape;
suite.getBuildsWithThreadDump().forEach(buildId -> {
webUrlThreadDump = "/rest/" + GetBuildLog.GET_BUILD_LOG + "/" + GetBuildLog.THREAD_DUMP
- + "?" + GetBuildLog.SERVER_ID + "=" + teamcity.serverId()
+ + "?" + GetBuildLog.SERVER_ID + "=" + tcIgnited.serverId()
+ "&" + GetBuildLog.BUILD_NO + "=" + buildId
+ "&" + GetBuildLog.FILE_IDX + "=" + -1;
});
runningBuildCount = suite.runningBuildCount();
queuedBuildCount = suite.queuedBuildCount();
- serverId = teamcity.serverId();
+ serverId = tcIgnited.serverId();
this.suiteId = suite.suiteId();
branchName = branchForLink(suite.branchName());
// todo implement this logic in suite possibleBlocker = suite.hasPossibleBlocker();
}
- private void initSuiteStat(Function<SuiteInBranch, ? extends IRunHistory> suiteFailProv,
- String failRateNormalizedBranch,
- String curBranchNormalized,
- String suiteId) {
+ private void initSuiteStat(ITeamcityIgnited tcIgnited,
+ String failRateNormalizedBranch,
+ String curBranchNormalized,
+ String suiteId) {
if (Strings.isNullOrEmpty(suiteId) )
return;
SuiteInBranch key = new SuiteInBranch(suiteId, failRateNormalizedBranch);
- final IRunHistory stat = suiteFailProv.apply(key);
+ final IRunHistory stat = tcIgnited.getSuiteRunHist(key);
if (stat != null) {
failures = stat.getFailuresCount();
@@ -255,7 +243,7 @@ import static org.apache.ignite.ci.util.UrlUtil.escape;
if (!failRateNormalizedBranch.equals(curBranchNormalized)) {
SuiteInBranch keyForStripe = new SuiteInBranch(suiteId, curBranchNormalized);
- final IRunHistory statForStripe = suiteFailProv.apply(keyForStripe);
+ final IRunHistory statForStripe = tcIgnited.getSuiteRunHist(keyForStripe);
latestRunsSrc = statForStripe;
latestRuns = statForStripe != null ? statForStripe.getLatestRunResults() : null;
@@ -280,20 +268,16 @@ import static org.apache.ignite.ci.util.UrlUtil.escape;
}
@NotNull public static TestFailure createOrrucForLongRun(ITeamcityIgnited tcIgnited,
- @Nonnull MultBuildRunCtx suite,
- @Nullable final ITcAnalytics tcAnalytics,
- final IMultTestOccurrence occurrence,
- @Nullable final String failRateBranch,
- Function<TestInBranch, ? extends IRunHistory> supplier) {
+ @Nonnull MultBuildRunCtx suite,
+ final IMultTestOccurrence occurrence,
+ @Nullable final String failRateBranch) {
final TestFailure failure = new TestFailure();
failure.initFromOccurrence(occurrence, tcIgnited, suite.projectId(), suite.branchName(), failRateBranch);
- if (tcAnalytics != null) {
- failure.initStat(supplier,
+ failure.initStat(tcIgnited,
normalizeBranch(failRateBranch),
normalizeBranch(suite.branchName()));
- }
return failure;
}
@@ -314,17 +298,17 @@ import static org.apache.ignite.ci.util.UrlUtil.escape;
failure.warnings.addAll(logCheckRes.getWarns());
}
- private static String buildWebLinkToBuild(ITeamcity teamcity, MultBuildRunCtx suite) {
+ private static String buildWebLinkToBuild(ITeamcityIgnited teamcity, MultBuildRunCtx suite) {
return teamcity.host() + "viewLog.html?buildId=" + Integer.toString(suite.getBuildId());
}
- private static String buildWebLink(ITeamcity teamcity, MultBuildRunCtx suite) {
+ private static String buildWebLink(ITeamcityIgnited teamcity, MultBuildRunCtx suite) {
String branchName = suite.branchName();
return buildWebLink(teamcity, suite, branchName);
}
- @NotNull private static String buildWebLink(ITeamcity teamcity, MultBuildRunCtx suite, String branchName) {
+ @NotNull private static String buildWebLink(ITeamcityIgnited teamcity, MultBuildRunCtx suite, String branchName) {
final String branch = branchForLink(branchName);
return teamcity.host() + "viewType.html?buildTypeId=" + suite.suiteId()
+ "&branch=" + escape(branch)
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/current/TestFailure.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/current/TestFailure.java
index 5a469a7..1448222 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/current/TestFailure.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/current/TestFailure.java
@@ -21,13 +21,11 @@ import com.google.common.base.Objects;
import com.google.common.base.Strings;
import java.util.ArrayList;
import java.util.List;
-import java.util.function.Function;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import org.apache.ignite.ci.analysis.IMultTestOccurrence;
-import org.apache.ignite.ci.analysis.RunStat;
import org.apache.ignite.ci.analysis.TestInBranch;
import org.apache.ignite.ci.issue.EventTemplates;
import org.apache.ignite.ci.issue.ProblemRef;
@@ -189,19 +187,17 @@ import static org.apache.ignite.ci.web.model.current.SuiteCurrentStatus.branchFo
}
/**
- * @param runStatSupplier Run stat supplier.
+ * @param tcIgnited TC service as Run stat supplier.
* @param failRateNormalizedBranch Base branch: Fail rate and flakyness detection normalized branch.
* @param curBranchNormalized Cur branch normalized.
*/
- public void initStat(@Nullable final Function<TestInBranch, ? extends IRunHistory> runStatSupplier,
- String failRateNormalizedBranch,
- String curBranchNormalized) {
- if (runStatSupplier == null)
- return;
+ public void initStat(ITeamcityIgnited tcIgnited,
+ String failRateNormalizedBranch,
+ String curBranchNormalized) {
TestInBranch testInBranch = new TestInBranch(name, failRateNormalizedBranch);
- final IRunHistory stat = runStatSupplier.apply(testInBranch);
+ final IRunHistory stat = tcIgnited.getTestRunHist(testInBranch);
histBaseBranch.init(stat);
@@ -210,7 +206,7 @@ import static org.apache.ignite.ci.web.model.current.SuiteCurrentStatus.branchFo
if (!curBranchNormalized.equals(failRateNormalizedBranch)) {
TestInBranch testInBranchS = new TestInBranch(name, curBranchNormalized);
- statForProblemsDetection = runStatSupplier.apply(testInBranchS);
+ statForProblemsDetection = tcIgnited.getTestRunHist(testInBranchS);
if(statForProblemsDetection!=null) {
histCurBranch = new TestHistory();
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 1b72d4c..7465e99 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
@@ -92,7 +92,7 @@ public class GetChainResultsAsHtml {
status.chainName = ctx.suiteName();
- status.initFromContext(tcIgn, teamcity, ctx, teamcity, failRateBranch);
+ status.initFromContext(tcIgn, teamcity, ctx, failRateBranch);
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 0ad6c3e..d87182b 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
@@ -150,7 +150,7 @@ public class GetBuildTestFailures {
if (cnt > 0)
runningUpdates.addAndGet(cnt);
- chainStatus.initFromContext(tcIgnited, teamcity, ctx, teamcity, failRateBranch);
+ chainStatus.initFromContext(tcIgnited, teamcity, ctx, failRateBranch);
res.addChainOnServer(chainStatus);
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 8e6390c..eeebd72 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
@@ -194,10 +194,7 @@ public class BuildChainProcessorTest {
}
@NotNull public static IAnalyticsEnabledTeamcity tcOldMock() {
- IAnalyticsEnabledTeamcity teamcity = Mockito.mock(IAnalyticsEnabledTeamcity.class);
- when(teamcity.getBuildFailureRunStatProvider()).thenReturn(Mockito.mock(Function.class));
- when(teamcity.getTestRunStatProvider()).thenReturn(Mockito.mock(Function.class));
- return teamcity;
+ return Mockito.mock(IAnalyticsEnabledTeamcity.class);
}
@NotNull public ITeamcityIgnited tcIgnitedMock(Map<Integer, FatBuildCompacted> builds) {
diff --git a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/chain/PrChainsProcessorTest.java b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/chain/PrChainsProcessorTest.java
index 5e80e1f..3c07d25 100644
--- a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/chain/PrChainsProcessorTest.java
+++ b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/chain/PrChainsProcessorTest.java
@@ -130,25 +130,20 @@ public class PrChainsProcessorTest {
assertTrue(containsTestFailure(blockers, TEST_WITH_HISTORY_PASSING_IN_MASTER));
- if (ITeamcity.NEW_RUN_STAT) {
- assertFalse(containsTestFailure(blockers, TEST_WITH_HISTORY_FAILING_IN_MASTER));
- assertFalse(containsTestFailure(blockers, TEST_FLAKY_IN_MASTER));
- }
+ assertFalse(containsTestFailure(blockers, TEST_WITH_HISTORY_FAILING_IN_MASTER));
+ assertFalse(containsTestFailure(blockers, TEST_FLAKY_IN_MASTER));
Optional<TestFailure> testOpt = findBlockerTestFailure(blockers, TEST_WITH_HISTORY_PASSING_IN_MASTER);
assertTrue(testOpt.isPresent());
- if (ITeamcity.NEW_RUN_STAT) {
- List<Integer> etalon = new ArrayList<>();
- for (int i = 0; i < NUM_OF_TESTS_IN_MASTER; i++)
- etalon.add(RunStat.RunStatus.RES_OK.getCode());
+ List<Integer> etalon = new ArrayList<>();
+ for (int i = 0; i < NUM_OF_TESTS_IN_MASTER; i++)
+ etalon.add(RunStat.RunStatus.RES_OK.getCode());
- assertEquals(etalon, testOpt.get().histBaseBranch.latestRuns);
- }
+ assertEquals(etalon, testOpt.get().histBaseBranch.latestRuns);
assertTrue(containsTestFailure(blockers, TEST_WAS_FIXED_IN_MASTER));
- if(ITeamcity.NEW_RUN_STAT)
- assertFalse(containsTestFailure(blockers, TEST_WITH_HISTORY_FAILING_IN_MASTER));
+ assertFalse(containsTestFailure(blockers, TEST_WITH_HISTORY_FAILING_IN_MASTER));
// otherwise this non-blocker will not be filtered out
assertTrue(containsTestFailure(blockers, TEST_WITH_HISTORY_PASSING_IN_MASTER));
diff --git a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/ignited/IgnitedTcInMemoryIntegrationTest.java b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/ignited/IgnitedTcInMemoryIntegrationTest.java
index e768ceb..6ca6a82 100644
--- a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/ignited/IgnitedTcInMemoryIntegrationTest.java
+++ b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/ignited/IgnitedTcInMemoryIntegrationTest.java
@@ -56,6 +56,7 @@ import org.apache.ignite.ci.tcmodel.hist.BuildRef;
import org.apache.ignite.ci.tcmodel.mute.MuteInfo;
import org.apache.ignite.ci.tcmodel.mute.Mutes;
import org.apache.ignite.ci.tcmodel.result.Build;
+import org.apache.ignite.ci.tcmodel.result.Triggered;
import org.apache.ignite.ci.tcmodel.result.problems.ProblemOccurrence;
import org.apache.ignite.ci.tcmodel.result.problems.ProblemOccurrences;
import org.apache.ignite.ci.tcmodel.result.stat.Statistics;
@@ -470,6 +471,18 @@ public class IgnitedTcInMemoryIntegrationTest {
assertEquals(refBuild.buildTypeId(), actBuild.buildTypeId());
assertEquals(refBuild.getStartDate(), actBuild.getStartDate());
assertEquals(refBuild.getFinishDate(), actBuild.getFinishDate());
+
+ final Triggered refTrig = refBuild.getTriggered();
+ final Triggered actTrig = actBuild.getTriggered();
+ assertNotNull(refTrig);
+ assertNotNull(actTrig);
+
+ assertNotNull(refTrig.getUser());
+ assertNotNull(actTrig.getUser());
+
+ assertEquals(refTrig.getUser().username, actTrig.getUser().username);
+ assertEquals(refTrig.getBuild().getId(), actTrig.getBuild().getId());
+
BuildType refBt = refBuild.getBuildType();
BuildType actBt = actBuild.getBuildType();
assertEquals(refBt.getName(), actBt.getName());