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/10 15:19:56 UTC
[ignite-teamcity-bot] branch ignite-gg-14609 updated:
IGNITE-GG-14609: For case build types were not synced,
loading all projects and all types
This is an automated email from the ASF dual-hosted git repository.
dpavlov pushed a commit to branch ignite-gg-14609
in repository https://gitbox.apache.org/repos/asf/ignite-teamcity-bot.git
The following commit(s) were added to refs/heads/ignite-gg-14609 by this push:
new 4c898a9 IGNITE-GG-14609: For case build types were not synced, loading all projects and all types
4c898a9 is described below
commit 4c898a9bc60a857facd2eb9fbbec1e50a8e47645
Author: Dmitriy Pavlov <dp...@apache.org>
AuthorDate: Thu Jan 10 18:19:52 2019 +0300
IGNITE-GG-14609: For case build types were not synced, loading all projects and all types
---
.../main/java/org/apache/ignite/ci/ITeamcity.java | 12 -----
.../apache/ignite/ci/IgnitePersistentTeamcity.java | 51 ++++++++++++---------
.../apache/ignite/ci/IgniteTeamcityConnection.java | 11 +++--
.../ignite/ci/runners/GenerateStatusHtml.java | 4 +-
.../runners/IgniteTeamcityHelperRunnerExample.java | 6 +--
.../tcbot/visa/TcBotTriggerAndSignOffService.java | 21 +++++++--
.../org/apache/ignite/ci/tcmodel/conf/Project.java | 13 ++++--
.../conf/{Project.java => ProjectsList.java} | 52 ++++++++--------------
.../ci/teamcity/ignited/ITeamcityIgnited.java | 2 +
.../ci/teamcity/ignited/TeamcityIgnitedImpl.java | 10 +++--
.../teamcity/ignited/buildtype/BuildTypeSync.java | 9 ++--
.../ignite/ci/teamcity/pure/ITeamcityConn.java | 6 +++
12 files changed, 108 insertions(+), 89 deletions(-)
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 4a62cb7..fa1f3a7 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
@@ -52,18 +52,6 @@ public interface ITeamcity extends ITeamcityConn {
/** Temporary feature toggle: Use New run stat in PR analysis, issue detection. */
boolean NEW_RUN_STAT = true;
- /** {@inheritDoc} */
- @Override default List<BuildType> getBuildTypes(String projectId) {
- return FutureUtil.getResult(getProjectSuites(projectId));
- }
-
- /**
- * List of project suites.
- *
- * @param projectId Project id.
- */
- CompletableFuture<List<BuildType>> getProjectSuites(String projectId);
-
/** */
@Deprecated
CompletableFuture<List<BuildRef>> getQueuedBuilds(@Nullable String branch);
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 61ec4fc..76db429 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
@@ -19,10 +19,30 @@ package org.apache.ignite.ci;
import com.google.common.base.Strings;
import com.google.common.base.Throwables;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.List;
import java.util.SortedSet;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.Executor;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.Function;
+import javax.annotation.Nullable;
+import javax.inject.Inject;
import org.apache.ignite.Ignite;
import org.apache.ignite.IgniteCache;
-import org.apache.ignite.ci.analysis.*;
+import org.apache.ignite.ci.analysis.Expirable;
+import org.apache.ignite.ci.analysis.IVersionedEntity;
+import org.apache.ignite.ci.analysis.LogCheckResult;
+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;
import org.apache.ignite.ci.db.DbMigrations;
import org.apache.ignite.ci.db.TcHelperDb;
import org.apache.ignite.ci.di.AutoProfiling;
@@ -31,36 +51,19 @@ 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;
+import org.apache.ignite.ci.tcmodel.conf.Project;
import org.apache.ignite.ci.tcmodel.conf.bt.BuildTypeFull;
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.tcmodel.result.problems.ProblemOccurrences;
import org.apache.ignite.ci.tcmodel.result.stat.Statistics;
-import org.apache.ignite.ci.tcmodel.result.tests.TestOccurrence;
import org.apache.ignite.ci.tcmodel.result.tests.TestOccurrencesFull;
import org.apache.ignite.ci.tcmodel.user.User;
-import org.apache.ignite.ci.teamcity.ignited.IRunStat;
-import org.apache.ignite.ci.util.CollectionUtil;
import org.apache.ignite.ci.util.ObjectInterner;
import org.apache.ignite.ci.web.model.hist.VisasHistoryStorage;
import org.jetbrains.annotations.NotNull;
-import javax.annotation.Nullable;
-import javax.cache.Cache;
-import javax.inject.Inject;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.util.Comparator;
-import java.util.List;
-import java.util.concurrent.*;
-import java.util.concurrent.atomic.AtomicReference;
-import java.util.function.Function;
-import java.util.function.Predicate;
-import java.util.stream.Stream;
-import java.util.stream.StreamSupport;
-
import static org.apache.ignite.ci.teamcity.ignited.runhist.RunHistSync.normalizeBranch;
/**
@@ -160,8 +163,8 @@ public class IgnitePersistentTeamcity implements IAnalyticsEnabledTeamcity, ITea
/** {@inheritDoc} */
@AutoProfiling
- @Override public CompletableFuture<List<BuildType>> getProjectSuites(String projectId) {
- return teamcity.getProjectSuites(projectId);
+ @Override public List<BuildType> getBuildTypes(String projectId) {
+ return teamcity.getBuildTypes(projectId);
}
/** {@inheritDoc} */
@@ -489,6 +492,7 @@ public class IgnitePersistentTeamcity implements IAnalyticsEnabledTeamcity, ITea
return teamcity.triggerBuild(buildTypeId, branchName, cleanRebuild, queueAtTop);
}
+ /** {@inheritDoc} */
@Override public ProblemOccurrences getProblems(int buildId) {
return teamcity.getProblems(buildId);
}
@@ -503,6 +507,11 @@ public class IgnitePersistentTeamcity implements IAnalyticsEnabledTeamcity, ITea
return problems;
}
+ /** {@inheritDoc} */
+ @Override public List<Project> getProjects() {
+ return teamcity.getProjects();
+ }
+
@Override public Statistics getStatistics(int buildId) {
return teamcity.getStatistics(buildId);
}
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 cd88aea..50c707f 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
@@ -33,6 +33,7 @@ import org.apache.ignite.ci.tcmodel.changes.Change;
import org.apache.ignite.ci.tcmodel.changes.ChangesList;
import org.apache.ignite.ci.tcmodel.conf.BuildType;
import org.apache.ignite.ci.tcmodel.conf.Project;
+import org.apache.ignite.ci.tcmodel.conf.ProjectsList;
import org.apache.ignite.ci.tcmodel.conf.bt.BuildTypeFull;
import org.apache.ignite.ci.tcmodel.hist.BuildRef;
import org.apache.ignite.ci.tcmodel.hist.Builds;
@@ -342,9 +343,10 @@ public class IgniteTeamcityConnection implements ITeamcity {
return getJaxbUsingHref(href, ChangesList.class);
}
+ /** {@inheritDoc} */
@AutoProfiling
@Override public Change getChange(int changeId) {
- String href = "app/rest/latest/changes/id:" + + changeId +"";
+ String href = "app/rest/latest/changes/id:" + +changeId;
return getJaxbUsingHref(href, Change.class);
}
@@ -370,11 +372,12 @@ public class IgniteTeamcityConnection implements ITeamcity {
}
/** {@inheritDoc} */
- @Override public CompletableFuture<List<BuildType>> getProjectSuites(String projectId) {
- return supplyAsync(() -> getProjectSuitesSync(projectId), executor);
+ @Override public List<Project> getProjects() {
+ return sendGetXmlParseJaxb(host + "app/rest/latest/projects", ProjectsList.class).projects();
}
- private List<BuildType> getProjectSuitesSync(String projectId) {
+ /** {@inheritDoc} */
+ @Override public List<BuildType> getBuildTypes(String projectId) {
return sendGetXmlParseJaxb(host + "app/rest/latest/projects/" + projectId, Project.class)
.getBuildTypesNonNull();
}
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/runners/GenerateStatusHtml.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/runners/GenerateStatusHtml.java
index c986665..a987ff1 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/runners/GenerateStatusHtml.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/runners/GenerateStatusHtml.java
@@ -277,12 +277,12 @@ public class GenerateStatusHtml {
private static ProjectStatus getBuildStatuses(
final String tcId,
final String projectId,
- final List<Branch> branchesPriv) throws Exception {
+ final List<Branch> branchesPriv) {
ProjectStatus projStatus = new ProjectStatus();
final IgniteTeamcityConnection teamcityHelper = TcConnectionStaticLinker.create(tcId);
- List<BuildType> suites = teamcityHelper.getProjectSuites(projectId).get();
+ List<BuildType> suites = teamcityHelper.getBuildTypes(projectId);
for (BuildType buildType : suites) {
if (!"-> Run All".equals(buildType.getName())
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/runners/IgniteTeamcityHelperRunnerExample.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/runners/IgniteTeamcityHelperRunnerExample.java
index 1c4500e..05ff217 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/runners/IgniteTeamcityHelperRunnerExample.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/runners/IgniteTeamcityHelperRunnerExample.java
@@ -49,7 +49,7 @@ public class IgniteTeamcityHelperRunnerExample {
int k = 0;
if (k > 0) {
//branch example: "pull/2335/head"
- List<BuildType> buildTypes = helper.getProjectSuites("Ignite20Tests").get();
+ List<BuildType> buildTypes = helper.getBuildTypes("Ignite20Tests");
}
@@ -70,10 +70,10 @@ public class IgniteTeamcityHelperRunnerExample {
}
}
- private static void checkBuildTypes(IgniteTeamcityConnection helper) throws InterruptedException, ExecutionException {
+ private static void checkBuildTypes(IgniteTeamcityConnection helper) {
Map<String, Set<String>> duplicates = new TreeMap<>();
Map<String, String> suiteToBt = new TreeMap<>();
- List<BuildType> buildTypes = helper.getProjectSuites("Ignite20Tests").get();
+ List<BuildType> buildTypes = helper.getBuildTypes("Ignite20Tests");
for (BuildType bt : buildTypes) {
final BuildTypeFull type = helper.getBuildType(bt.getId());
if ("Ignite20Tests_RunAll".equals(type.getId())
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/visa/TcBotTriggerAndSignOffService.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/visa/TcBotTriggerAndSignOffService.java
index 009c63f..41f15b2 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/visa/TcBotTriggerAndSignOffService.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/visa/TcBotTriggerAndSignOffService.java
@@ -429,10 +429,25 @@ public class TcBotTriggerAndSignOffService {
BuildTypeCompacted buildType = buildTypeId.length() > 0 ? teamcity.getBuildType(buildTypeId.toString()) : null;
- String projectId = Objects.nonNull(buildType) ?
- compactor.getStringFromId(buildType.projectId()) : DEFAULT_PROJECT_ID;
+ List<String> compositeBuildTypeIds;
+ String projectId;
+ if (buildType != null) {
+ projectId = compactor.getStringFromId(buildType.projectId());
+ compositeBuildTypeIds = teamcity.getCompositeBuildTypesIdsSortedByBuildNumberCounter(projectId);
+ }
+ else {
+ //for case build type not found, actualizing all projects resync
+ List<String> projects = teamcity.getAllProjectsIds();
+
+ for (String pId : projects)
+ teamcity.getCompositeBuildTypesIdsSortedByBuildNumberCounter(pId);
+
+ compositeBuildTypeIds = new ArrayList<>();
+
+ if (buildTypeId.length() > 0)
+ compositeBuildTypeIds.add(buildTypeId.toString());
+ }
- List<String> compositeBuildTypeIds = teamcity.getCompositeBuildTypesIdsSortedByBuildNumberCounter(projectId);
for (String btId : compositeBuildTypeIds) {
List<BuildRefCompacted> forTests = findBuildsForPr(btId, prId, teamcity);
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/Project.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/Project.java
index 8d9b7da..e27736d 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/Project.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/Project.java
@@ -29,19 +29,19 @@ import javax.xml.bind.annotation.XmlRootElement;
/**
* Content of poject
*/
-@XmlRootElement(name="project")
+@XmlRootElement(name = "project")
@XmlAccessorType(XmlAccessType.FIELD)
public class Project {
/** Id. */
@XmlAttribute public String id;
/** Name. */
- @XmlAttribute(name="name")
+ @XmlAttribute(name = "name")
private String name;
/** Build types. */
- @XmlElementWrapper(name="buildTypes")
- @XmlElement(name="buildType")
+ @XmlElementWrapper(name = "buildTypes")
+ @XmlElement(name = "buildType")
private List<BuildType> buildTypes;
/**
@@ -60,5 +60,10 @@ public class Project {
public String name() {
return name;
}
+
+ /** */
+ public String id() {
+ return id;
+ }
}
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/Project.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/ProjectsList.java
similarity index 52%
copy from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/Project.java
copy to ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/ProjectsList.java
index 8d9b7da..1a9594a 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/Project.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/ProjectsList.java
@@ -19,46 +19,32 @@ package org.apache.ignite.ci.tcmodel.conf;
import java.util.Collections;
import java.util.List;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
+import org.apache.ignite.ci.tcmodel.changes.ChangesListRef;
+import org.jetbrains.annotations.NotNull;
/**
- * Content of poject
+ * List of Projects available at TC.
*/
-@XmlRootElement(name="project")
-@XmlAccessorType(XmlAccessType.FIELD)
-public class Project {
- /** Id. */
- @XmlAttribute public String id;
-
- /** Name. */
- @XmlAttribute(name="name")
- private String name;
-
- /** Build types. */
- @XmlElementWrapper(name="buildTypes")
- @XmlElement(name="buildType")
- private List<BuildType> buildTypes;
-
- /**
- * @return List of project's build types or an empty list if there is no build types presented.
- */
- public List<BuildType> getBuildTypesNonNull() {
- return buildTypes == null ? Collections.emptyList() : buildTypes;
+@XmlRootElement(name = "projects")
+public class ProjectsList extends ChangesListRef {
+ /** Projects. */
+ @XmlElement(name = "project")
+ private List<Project> projects;
+
+ /** Count. */
+ @XmlElement Integer count;
+
+ /** {@inheritDoc} */
+ @Override public String toString() {
+ return "ProjectsList{" +
+ "projects=" + projects +
+ '}';
}
/** */
- public void name(String name) {
- this.name = name;
- }
-
- /** */
- public String name() {
- return name;
+ @NotNull public List<Project> projects() {
+ return projects == null ? Collections.emptyList() : Collections.unmodifiableList(projects);
}
}
-
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 ead6dd7..16f44e0 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
@@ -177,4 +177,6 @@ public interface ITeamcityIgnited {
* @return run statistics of recent runls on all branches.
*/
@Nullable public IRunStat getSuiteRunStatAllBranches(String suiteBuildTypeId);
+
+ List<String> getAllProjectsIds();
}
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 077bb42..65930eb 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
@@ -31,6 +31,7 @@ import org.apache.ignite.ci.jira.ignited.JiraTicketDao;
import org.apache.ignite.ci.jira.ignited.JiraTicketSync;
import org.apache.ignite.ci.jira.Ticket;
import org.apache.ignite.ci.tcbot.trends.MasterTrendsService;
+import org.apache.ignite.ci.tcmodel.conf.Project;
import org.apache.ignite.ci.tcmodel.mute.MuteInfo;
import org.apache.ignite.ci.teamcity.ignited.mute.MuteDao;
import org.apache.ignite.ci.teamcity.ignited.mute.MuteSync;
@@ -427,9 +428,11 @@ public class TeamcityIgnitedImpl implements ITeamcityIgnited {
return runHistCompactedDao.getSuiteRunStatAllBranches(srvIdMaskHigh, suiteBuildTypeId);
}
- /**
- * @param branchName Branch name.
- */
+ /** {@inheritDoc} */
+ @Override public List<String> getAllProjectsIds() {
+ return conn.getProjects().stream().map(Project::id).collect(Collectors.toList());
+ }
+
/** {@inheritDoc} */
@Override public List<String> getCompositeBuildTypesIdsSortedByBuildNumberCounter(String projectId) {
return buildTypeSync.getCompositeBuildTypesIdsSortedByBuildNumberCounter(srvIdMaskHigh, projectId, conn);
@@ -447,6 +450,7 @@ public class TeamcityIgnitedImpl implements ITeamcityIgnited {
/** {@inheritDoc} */
@Override public BuildTypeCompacted getBuildType(String buildTypeId) {
+
return buildTypeDao.getFatBuildType(srvIdMaskHigh, buildTypeId);
}
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeSync.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeSync.java
index eb5fba5..997429a 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeSync.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeSync.java
@@ -107,7 +107,7 @@ public class BuildTypeSync {
* @param conn Pure HTTP Connection API.
*/
private void ensureActualizeBuildTypeRefsRequested(int srvIdMaskHigh, String projectId, ITeamcityConn conn) {
- scheduler.sheduleNamed(taskName("actualizeAllBuildTypeRefs", conn.serverId()),
+ scheduler.sheduleNamed(taskName("actualizeAllBuildTypeRefs", conn.serverId(), projectId),
() -> reindexBuildTypeRefs(srvIdMaskHigh, projectId, conn), 4, TimeUnit.HOURS);
}
@@ -119,7 +119,7 @@ public class BuildTypeSync {
* @param conn Pure HTTP Connection API.
*/
private void ensureActualizeBuildTypesRequested(int srvIdMaskHigh, String projectId, ITeamcityConn conn) {
- scheduler.sheduleNamed(taskName("actualizeAllBuildTypes", conn.serverId()),
+ scheduler.sheduleNamed(taskName("actualizeAllBuildTypeRefs", "actualizeAllBuildTypes", conn.serverId()),
() -> reindexBuildTypes(srvIdMaskHigh, projectId, conn), 24, TimeUnit.HOURS);
}
@@ -241,9 +241,10 @@ public class BuildTypeSync {
/**
* @param taskName Task name.
* @param srvName Server name.
+ * @param prjName Project name.
*/
@NotNull
- private String taskName(String taskName, String srvName) {
- return BuildTypeSync.class.getSimpleName() +"." + taskName + "." + srvName;
+ private String taskName(String taskName, String srvName, String prjName) {
+ return BuildTypeSync.class.getSimpleName() + "." + taskName + "." + srvName + "." + prjName;
}
}
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 9ebecba..4a1bfeb 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
@@ -26,6 +26,7 @@ import javax.annotation.Nullable;
import org.apache.ignite.ci.tcmodel.changes.Change;
import org.apache.ignite.ci.tcmodel.changes.ChangesList;
import org.apache.ignite.ci.tcmodel.conf.BuildType;
+import org.apache.ignite.ci.tcmodel.conf.Project;
import org.apache.ignite.ci.tcmodel.conf.bt.BuildTypeFull;
import org.apache.ignite.ci.tcmodel.hist.BuildRef;
import org.apache.ignite.ci.tcmodel.mute.MuteInfo;
@@ -103,4 +104,9 @@ public interface ITeamcityConn {
/** */
@Deprecated
ProblemOccurrences getProblemsAndRegisterCritical(BuildRef build);
+
+ /**
+ * @return List of all project available at Teamcity server.
+ */
+ List<Project> getProjects();
}