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 2018/09/24 17:46:34 UTC

[ignite-teamcity-bot] branch di-refactoring created (now dba0048)

This is an automated email from the ASF dual-hosted git repository.

dpavlov pushed a change to branch di-refactoring
in repository https://gitbox.apache.org/repos/asf/ignite-teamcity-bot.git.


      at dba0048  DI refactoring to init bot classes using Guice

This branch includes the following new commits:

     new dba0048  DI refactoring to init bot classes using Guice

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[ignite-teamcity-bot] 01/01: DI refactoring to init bot classes using Guice

Posted by dp...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dpavlov pushed a commit to branch di-refactoring
in repository https://gitbox.apache.org/repos/asf/ignite-teamcity-bot.git

commit dba004848b8d2aa6d827070be47cf32e4b863a11
Author: Dmitriy Pavlov <dp...@apache.org>
AuthorDate: Mon Sep 24 20:46:12 2018 +0300

    DI refactoring to init bot classes using Guice
---
 .../java/org/apache/ignite/ci/ITcAnalytics.java    |  4 +-
 .../main/java/org/apache/ignite/ci/ITcHelper.java  |  3 +-
 .../org/apache/ignite/ci/ITcServerProvider.java    | 28 +++++++++
 .../main/java/org/apache/ignite/ci/ITeamcity.java  |  4 +-
 .../apache/ignite/ci/IgnitePersistentTeamcity.java |  9 +--
 ...tyHelper.java => IgniteTeamcityConnection.java} | 12 ++--
 .../main/java/org/apache/ignite/ci/TcHelper.java   | 60 ++++---------------
 .../org/apache/ignite/ci/di/IgniteTcBotModule.java | 37 ++++++++----
 .../ignite/ci/di/TcServerCachingProvider.java      | 69 ++++++++++++++++++++++
 .../org/apache/ignite/ci/logs/LogsAnalyzer.java    |  2 +-
 .../apache/ignite/ci/observer/ObserverTask.java    |  3 +-
 .../ignite/ci/runners/CheckBuildChainResults.java  | 42 ++-----------
 .../ignite/ci/runners/GenerateStatusHtml.java      |  5 +-
 .../runners/IgniteTeamcityHelperRunnerExample.java |  6 +-
 .../java/org/apache/ignite/ci/web/CtxListener.java | 35 +++++++----
 .../ignite/ci/web/rest/GetChainResultsAsHtml.java  |  3 +-
 .../org/apache/ignite/ci/web/rest/Metrics.java     | 11 ++--
 .../org/apache/ignite/ci/web/rest/TopTests.java    | 23 ++++----
 .../apache/ignite/ci/web/rest/TriggerBuild.java    | 10 ++--
 .../ignite/ci/web/rest/build/CompareBuilds.java    | 15 ++---
 .../ci/web/rest/build/GetBuildTestFailures.java    | 15 ++---
 .../org/apache/ignite/ci/web/rest/login/Login.java | 16 ++---
 .../ignite/ci/web/rest/pr/GetPrTestFailures.java   | 16 ++---
 .../rest/tracked/GetTrackedBranchTestResults.java  |  3 +-
 .../org/apache/ignite/ci/di/DiContextTest.java     | 52 ++++++++++++++++
 25 files changed, 291 insertions(+), 192 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 1599497..9320610 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
@@ -24,7 +24,7 @@ import org.apache.ignite.ci.analysis.SingleBuildRunCtx;
 import org.apache.ignite.ci.analysis.SuiteInBranch;
 import org.apache.ignite.ci.analysis.TestInBranch;
 
-public interface ITcAnalytics extends AutoCloseable {
+public interface ITcAnalytics {
     List<RunStat> topTestFailing(int cnt);
 
     List<RunStat> topTestsLongRunning(int cnt);
@@ -51,6 +51,4 @@ public interface ITcAnalytics extends AutoCloseable {
      * @param ctx Context as provider build data.
      */
     void calculateBuildStatistic(SingleBuildRunCtx ctx);
-
-    @Override void close();
 }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/ITcHelper.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/ITcHelper.java
index 1077a0e..8dcf3cb 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/ITcHelper.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/ITcHelper.java
@@ -30,7 +30,7 @@ import java.util.Collection;
 /**
  * Teamcity Bot main interface
  */
-public interface ITcHelper {
+public interface ITcHelper extends ITcServerProvider {
     /** System property to specify: Teamcity helper home. Ignite home will be set to same dir. */
     public String TEAMCITY_HELPER_HOME = "teamcity.helper.home";
 
@@ -48,7 +48,6 @@ public interface ITcHelper {
      */
     BuildObserver buildObserver();
 
-    IAnalyticsEnabledTeamcity server(String srvId, @Nullable ICredentialsProv prov);
 
     ITcAnalytics tcAnalytics(String serverId);
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/ITcServerProvider.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/ITcServerProvider.java
new file mode 100644
index 0000000..96d4ad1
--- /dev/null
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/ITcServerProvider.java
@@ -0,0 +1,28 @@
+/*
+ * 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;
+
+import org.apache.ignite.ci.user.ICredentialsProv;
+
+import javax.annotation.Nullable;
+
+/**
+ * Provides instance to server with appropriate credentials, may cache instances to avoid odd server instances.
+ */
+public interface ITcServerProvider {
+    IAnalyticsEnabledTeamcity server(String srvId, @Nullable ICredentialsProv prov);
+}
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 6be0446..b48c621 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
@@ -51,7 +51,7 @@ import static org.apache.ignite.ci.db.DbMigrations.TESTS_COUNT_7700;
  * API for calling methods from REST service:
  * https://confluence.jetbrains.com/display/TCD10/REST+API
  */
-public interface ITeamcity extends AutoCloseable {
+public interface ITeamcity {
 
     String DEFAULT = "<default>";
     long DEFAULT_BUILDS_COUNT = 1000;
@@ -214,8 +214,6 @@ public interface ITeamcity extends AutoCloseable {
         return ctx;
     }
 
-    @Override void close();
-
     CompletableFuture<File> unzipFirstFile(CompletableFuture<File> fut);
 
     CompletableFuture<File> downloadBuildLogZip(int id);
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 2982f78..5d7b3d7 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
@@ -144,14 +144,14 @@ public class IgnitePersistentTeamcity implements IAnalyticsEnabledTeamcity, ITea
 
     @Deprecated
     public IgnitePersistentTeamcity(Ignite ignite, @Nullable String srvId) {
-        this(ignite, new IgniteTeamcityHelper(srvId));
+        this(ignite, new IgniteTeamcityConnection(srvId));
     }
 
     //for DI
     public IgnitePersistentTeamcity() {}
 
     @Deprecated
-    private IgnitePersistentTeamcity(Ignite ignite, IgniteTeamcityHelper teamcity) {
+    private IgnitePersistentTeamcity(Ignite ignite, IgniteTeamcityConnection teamcity) {
         init(teamcity);
         this.ignite = ignite;
     }
@@ -900,11 +900,6 @@ public class IgnitePersistentTeamcity implements IAnalyticsEnabledTeamcity, ITea
     }
 
     /** {@inheritDoc} */
-    @Override public void close() {
-
-    }
-
-    /** {@inheritDoc} */
     @Override public CompletableFuture<File> unzipFirstFile(CompletableFuture<File> fut) {
         return teamcity.unzipFirstFile(fut);
     }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IgniteTeamcityHelper.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IgniteTeamcityConnection.java
similarity index 98%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IgniteTeamcityHelper.java
rename to ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IgniteTeamcityConnection.java
index 28ece3c..74f0dc7 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IgniteTeamcityHelper.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IgniteTeamcityConnection.java
@@ -19,7 +19,6 @@ package org.apache.ignite.ci;
 
 import com.google.common.base.Preconditions;
 import com.google.common.base.Stopwatch;
-import com.google.common.base.Throwables;
 import com.google.common.util.concurrent.MoreExecutors;
 import com.google.gson.Gson;
 import java.io.File;
@@ -91,9 +90,9 @@ import static org.apache.ignite.ci.util.XmlUtil.xmlEscapeText;
  * https://confluence.jetbrains.com/display/TCD10/REST+API
  * https://developer.github.com/v3/
  */
-public class IgniteTeamcityHelper implements ITeamcity {
+public class IgniteTeamcityConnection implements ITeamcity {
     /** Logger. */
-    private static final Logger logger = LoggerFactory.getLogger(IgniteTeamcityHelper.class);
+    private static final Logger logger = LoggerFactory.getLogger(IgniteTeamcityConnection.class);
 
     private Executor executor;
     private File logsDir;
@@ -114,12 +113,12 @@ public class IgniteTeamcityHelper implements ITeamcity {
 
     private ConcurrentHashMap<Integer, CompletableFuture<LogCheckTask>> buildLogProcessingRunning = new ConcurrentHashMap<>();
 
-    public IgniteTeamcityHelper(@Nullable String tcName) {
+    public IgniteTeamcityConnection(@Nullable String tcName) {
         init(tcName);
     }
 
     //for DI
-    public IgniteTeamcityHelper() {
+    public IgniteTeamcityConnection() {
     }
 
     public void init(@Nullable String tcName) {
@@ -551,9 +550,6 @@ public class IgniteTeamcityHelper implements ITeamcity {
         return sendGetXmlParseJaxb(host + (href.startsWith("/") ? href.substring(1) : href), elem);
     }
 
-    @Override public void close() {
-    }
-
     /** {@inheritDoc} */
     @AutoProfiling
     @Override public List<BuildRef> getFinishedBuilds(String projectId,
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/TcHelper.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/TcHelper.java
index e1b709e..be0689b 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/TcHelper.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/TcHelper.java
@@ -61,23 +61,17 @@ public class TcHelper implements ITcHelper {
     /** Stop guard. */
     private AtomicBoolean stop = new AtomicBoolean();
 
-    private final Cache<String, IAnalyticsEnabledTeamcity> srvs
-        = CacheBuilder.<String, String>newBuilder()
-        .maximumSize(100)
-        .expireAfterAccess(16, TimeUnit.MINUTES)
-        .softValues()
-        .build();
-
-    private TcUpdatePool tcUpdatePool = new TcUpdatePool();
     @Inject
-    private IssuesStorage issuesStorage;
+    private TcUpdatePool tcUpdatePool;
 
     @Inject
-    private IssueDetector detector;
+    private IssuesStorage issuesStorage;
 
     @Inject
-    private IServerFactory serverProv;
+    private ITcServerProvider serverProvider;
 
+    @Inject
+    private IssueDetector detector;
     /** Build observer. */
     private BuildObserver buildObserver;
 
@@ -108,30 +102,7 @@ public class TcHelper implements ITcHelper {
         if (stop.get())
             throw new IllegalStateException("Shutdown");
 
-        Callable<IAnalyticsEnabledTeamcity> call = () -> {
-            IAnalyticsEnabledTeamcity teamcity = serverProv.createServer(srvId);
-
-            teamcity.setExecutor(getService());
-
-            if (prov != null) {
-                final String user = prov.getUser(srvId);
-                final String password = prov.getPassword(srvId);
-                teamcity.setAuthData(user, password);
-            }
-
-            return teamcity;
-        };
-        String fullKey = Strings.nullToEmpty(prov == null ? null : prov.getUser(srvId)) + ":" + Strings.nullToEmpty(srvId);
-
-        IAnalyticsEnabledTeamcity teamcity;
-        try {
-            teamcity = srvs.get(fullKey, call);
-        }
-        catch (ExecutionException e) {
-            throw ExceptionUtil.propagateException(e);
-        }
-
-        return teamcity;
+        return serverProvider.server(srvId, prov);
     }
 
     /** {@inheritDoc} */
@@ -169,7 +140,8 @@ public class TcHelper implements ITcHelper {
         String branchForTc,
         String ticket
     ) {
-        try (IAnalyticsEnabledTeamcity teamcity = server(srvId, prov)) {
+         IAnalyticsEnabledTeamcity teamcity = server(srvId, prov);
+         {
             List<BuildRef> builds = teamcity.getFinishedBuildsIncludeSnDepFailed(buildTypeId, branchForTc);
 
             if (builds.isEmpty())
@@ -329,20 +301,12 @@ public class TcHelper implements ITcHelper {
 
     public void close() {
         if (stop.compareAndSet(false, true)) {
-            srvs.asMap().values().forEach(v -> {
-                try {
-                    v.close();
-                } catch (Exception e) {
-                    e.printStackTrace();
-                }
-            });
-        }
+            tcUpdatePool.stop();
 
-        tcUpdatePool.stop();
+            detector.stop();
 
-        detector.stop();
-
-        buildObserver.stop();
+            buildObserver.stop();
+        }
     }
 
     public ExecutorService getService() {
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/IgniteTcBotModule.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/IgniteTcBotModule.java
index 0b42693..8020229 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/IgniteTcBotModule.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/IgniteTcBotModule.java
@@ -19,20 +19,19 @@ package org.apache.ignite.ci.di;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Strings;
 import com.google.inject.AbstractModule;
+import com.google.inject.Injector;
+import com.google.inject.internal.SingletonScope;
 import com.google.inject.matcher.Matchers;
 import org.apache.ignite.Ignite;
-import org.apache.ignite.ci.IAnalyticsEnabledTeamcity;
-import org.apache.ignite.ci.ITeamcity;
-import org.apache.ignite.ci.IgnitePersistentTeamcity;
-import org.apache.ignite.ci.IgniteTeamcityHelper;
+import org.apache.ignite.ci.*;
+import org.apache.ignite.ci.db.Ignite1Init;
 import org.apache.ignite.ci.util.ExceptionUtil;
+import org.apache.ignite.ci.web.TcUpdatePool;
 import org.apache.ignite.ci.web.rest.exception.ServiceStartingException;
 
 import javax.inject.Inject;
 import javax.inject.Provider;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
+import java.util.concurrent.*;
 
 public class IgniteTcBotModule extends AbstractModule {
     private Future<Ignite> igniteFuture;
@@ -58,12 +57,13 @@ public class IgniteTcBotModule extends AbstractModule {
         });
 
         //Simple connection
-        bind(ITeamcity.class).to(IgniteTeamcityHelper.class);
+        bind(ITeamcity.class).to(IgniteTeamcityConnection.class);
         //With REST persistence
         bind(IAnalyticsEnabledTeamcity.class).to(IgnitePersistentTeamcity.class);
-        bind(IServerFactory.class).toInstance(
-                new MyIServerFactory()
-        );
+        bind(IServerFactory.class).to(InitializingServerFactory.class).in(new SingletonScope());
+        bind(ITcServerProvider.class).to(TcServerCachingProvider.class).in(new SingletonScope());
+        bind(TcUpdatePool.class).in(new SingletonScope());
+       //todo bind(IssueDetector.clas)
     }
 
     private void configProfiling() {
@@ -91,13 +91,24 @@ public class IgniteTcBotModule extends AbstractModule {
         this.igniteFuture = igniteFuture;
     }
 
-    private static class MyIServerFactory implements IServerFactory {
+    public Injector startIgniteInit(Injector injector) {
+        final Ignite1Init instance = injector.getInstance(Ignite1Init.class);
+        final Future<Ignite> submit = instance.getIgniteFuture();
+        setIgniteFuture(submit);
+
+        return injector;
+    }
+
+    private static class InitializingServerFactory implements IServerFactory {
         @Inject
         Provider<IAnalyticsEnabledTeamcity> tcPersistProv;
 
         @Inject
         Provider<ITeamcity> tcConnProv;
 
+        @Inject
+        TcUpdatePool tcUpdatePool;
+
         @Override
         public IAnalyticsEnabledTeamcity createServer(String serverId) {
             ITeamcity tcConn = tcConnProv.get();
@@ -106,6 +117,8 @@ public class IgniteTcBotModule extends AbstractModule {
             IAnalyticsEnabledTeamcity instance = tcPersistProv.get();
             instance.init(tcConn);
 
+            instance.setExecutor(tcUpdatePool.getService());
+
             return instance;
         }
     }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/TcServerCachingProvider.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/TcServerCachingProvider.java
new file mode 100644
index 0000000..52185d8
--- /dev/null
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/TcServerCachingProvider.java
@@ -0,0 +1,69 @@
+/*
+ * 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.di;
+
+import com.google.common.base.Strings;
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheBuilder;
+import org.apache.ignite.ci.IAnalyticsEnabledTeamcity;
+import org.apache.ignite.ci.ITcServerProvider;
+import org.apache.ignite.ci.user.ICredentialsProv;
+import org.apache.ignite.ci.util.ExceptionUtil;
+
+import javax.annotation.Nullable;
+import javax.inject.Inject;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+
+public class TcServerCachingProvider implements ITcServerProvider {
+    @Inject
+    private IServerFactory serverFactory;
+
+    private final Cache<String, IAnalyticsEnabledTeamcity> srvs
+            = CacheBuilder.<String, String>newBuilder()
+            .maximumSize(100)
+            .expireAfterAccess(16, TimeUnit.MINUTES)
+            .softValues()
+            .build();
+
+    @Override
+    public IAnalyticsEnabledTeamcity server(String srvId, @Nullable ICredentialsProv prov) {
+        Callable<IAnalyticsEnabledTeamcity> call = () -> {
+            IAnalyticsEnabledTeamcity teamcity = serverFactory.createServer(srvId);
+
+
+            if (prov != null) {
+                final String user = prov.getUser(srvId);
+                final String password = prov.getPassword(srvId);
+                teamcity.setAuthData(user, password);
+            }
+
+            return teamcity;
+        };
+        String fullKey = Strings.nullToEmpty(prov == null ? null : prov.getUser(srvId)) + ":" + Strings.nullToEmpty(srvId);
+
+        IAnalyticsEnabledTeamcity teamcity;
+        try {
+            teamcity = srvs.get(fullKey, call);
+        }
+        catch (ExecutionException e) {
+            throw ExceptionUtil.propagateException(e);
+        }
+        return teamcity;
+    }
+}
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/logs/LogsAnalyzer.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/logs/LogsAnalyzer.java
index e64ccaf..fbbeadb 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/logs/LogsAnalyzer.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/logs/LogsAnalyzer.java
@@ -27,7 +27,7 @@ import java.util.List;
 import java.util.function.Function;
 import java.util.stream.Stream;
 import javax.annotation.concurrent.NotThreadSafe;
-import org.apache.ignite.ci.IgniteTeamcityHelper;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/observer/ObserverTask.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/observer/ObserverTask.java
index fcc1e86..519a070 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/observer/ObserverTask.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/observer/ObserverTask.java
@@ -45,7 +45,8 @@ public class ObserverTask extends TimerTask {
     /** {@inheritDoc} */
     @Override public void run() {
         for (BuildInfo info : builds) {
-            try (IAnalyticsEnabledTeamcity teamcity = helper.server(info.srvId, info.prov)) {
+            IAnalyticsEnabledTeamcity teamcity = helper.server(info.srvId, info.prov);
+            {
                 Build build = teamcity.getBuild(info.build.getId());
 
                 if (!"finished".equals(build.state))
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/runners/CheckBuildChainResults.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/runners/CheckBuildChainResults.java
index 96d6ea9..1ce99d2 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/runners/CheckBuildChainResults.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/runners/CheckBuildChainResults.java
@@ -121,46 +121,12 @@ public class CheckBuildChainResults {
             history = new BuildMetricsHistory();
 
 
-            try (ITeamcity teamcity = new IgnitePersistentTeamcity(ignite, "public")) {
-                collectHistory(history, teamcity, "Ignite20Tests_RunAll", "pull/2296/head");
-            }
-
-            try (ITeamcity teamcity = new IgnitePersistentTeamcity(ignite, "private")) {
-                collectHistory(history, teamcity, "id8xIgniteGridGainTests_RunAll", "ignite-2.1.3");
-            }
+            ITeamcity teamcity = new IgnitePersistentTeamcity(ignite, "apache");
+            collectHistory(history, teamcity, "Ignite20Tests_RunAll", "pull/2296/head");
 
-            try (ITeamcity teamcity = new IgnitePersistentTeamcity(ignite, "public")) {
-                collectHistory(history, teamcity, "Ignite20Tests_RunAll", "refs/heads/master");
-            }
-            try (ITeamcity teamcity = new IgnitePersistentTeamcity(ignite, "private")) {
-                collectHistory(history, teamcity, "id8xIgniteGridGainTests_RunAll", "refs/heads/master");
-            }
-
-            try (ITeamcity teamcity = new IgnitePersistentTeamcity(ignite, "public")) {
-                collectHistory(history, teamcity, "Ignite20Tests_RunAll", "pull/2400/head");
-            }
-
-            try (ITeamcity teamcity = new IgnitePersistentTeamcity(ignite, "public")) {
-                collectHistory(history, teamcity, "Ignite20Tests_RunAll", "ignite-2.2");
-            }
+            collectHistory(history, teamcity, "Ignite20Tests_RunAll", "ignite-2.2");
 
-            try (ITeamcity teamcity = new IgnitePersistentTeamcity(ignite, "public")) {
-                collectHistory(history, teamcity, "Ignite20Tests_RunAll", "pull/2380/head");
-            }
-
-            try (ITeamcity teamcity = new IgnitePersistentTeamcity(ignite, "private")) {
-                collectHistory(history, teamcity, "id8xIgniteGridGainTests_RunAll", "ignite-2.1.4");
-            }
-
-            try (ITeamcity teamcity = new IgnitePersistentTeamcity(ignite, "public")) {
-                collectHistory(history, teamcity, "Ignite20Tests_RunAll", "pull/2508/head");
-            }
-
-            try (ITeamcity teamcity = new IgnitePersistentTeamcity(ignite, "private")) {
-                collectHistory(history, teamcity, "id8xIgniteGridGainTests_RunAll", "ignite-2.1.5");
-            }
-        }
-        finally {
+        } finally {
             TcHelperDb.stop(ignite);
         }
 
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 cdd223c..4510dae 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
@@ -34,7 +34,7 @@ import java.util.TreeMap;
 import java.util.TreeSet;
 import java.util.function.Predicate;
 import org.apache.ignite.ci.HelperConfig;
-import org.apache.ignite.ci.IgniteTeamcityHelper;
+import org.apache.ignite.ci.IgniteTeamcityConnection;
 import org.apache.ignite.ci.tcmodel.conf.BuildType;
 
 import static com.google.common.base.Strings.isNullOrEmpty;
@@ -308,7 +308,8 @@ public class GenerateStatusHtml {
         final List<Branch> branchesPriv) throws Exception {
 
         ProjectStatus projStatus = new ProjectStatus();
-        try (IgniteTeamcityHelper teamcityHelper = new IgniteTeamcityHelper(tcId)) {
+         IgniteTeamcityConnection teamcityHelper = new IgniteTeamcityConnection(tcId);
+          {
             List<BuildType> suites = teamcityHelper.getProjectSuites(projectId).get();
 
             for (BuildType buildType : suites) {
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 bdfc34a..160a1cb 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
@@ -30,7 +30,7 @@ import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
 import java.util.stream.Collectors;
 
-import org.apache.ignite.ci.IgniteTeamcityHelper;
+import org.apache.ignite.ci.IgniteTeamcityConnection;
 import org.apache.ignite.ci.tcmodel.conf.BuildType;
 import org.apache.ignite.ci.tcmodel.conf.bt.BuildTypeFull;
 import org.apache.ignite.ci.tcmodel.conf.bt.SnapshotDependency;
@@ -44,7 +44,7 @@ public class IgniteTeamcityHelperRunnerExample {
     public static void main(String[] args) throws Exception {
         String serverIdPriv = "private";
         String serverIdPub = "public";
-        final IgniteTeamcityHelper helper = new IgniteTeamcityHelper(serverIdPub); //public_auth_properties
+        final IgniteTeamcityConnection helper = new IgniteTeamcityConnection(serverIdPub); //public_auth_properties
 
         int k = 0;
         if (k > 0) {
@@ -107,7 +107,7 @@ public class IgniteTeamcityHelperRunnerExample {
         }
     }
 
-    private static void checkBuildTypes(IgniteTeamcityHelper helper) throws InterruptedException, ExecutionException {
+    private static void checkBuildTypes(IgniteTeamcityConnection helper) throws InterruptedException, ExecutionException {
         Map<String, Set<String>> duplicates = new TreeMap<>();
         Map<String, String> suiteToBt = new TreeMap<>();
         List<BuildType> buildTypes = helper.getProjectSuites("Ignite20Tests").get();
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/CtxListener.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/CtxListener.java
index 8d7a066..47d573d 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/CtxListener.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/CtxListener.java
@@ -18,19 +18,24 @@
 package org.apache.ignite.ci.web;
 
 import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Future;
-import javax.servlet.ServletContext;
+`import javax.servlet.ServletContext;
 import javax.servlet.ServletContextEvent;
 import javax.servlet.ServletContextListener;
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.QueryParam;
 
+import com.google.common.base.Preconditions;
 import com.google.inject.Guice;
 import com.google.inject.Injector;
 import org.apache.ignite.Ignite;
+import org.apache.ignite.ci.IAnalyticsEnabledTeamcity;
+import org.apache.ignite.ci.ITcServerProvider;
 import org.apache.ignite.ci.ITcHelper;
 import org.apache.ignite.ci.TcHelper;
-import org.apache.ignite.ci.db.Ignite1Init;
 import org.apache.ignite.ci.db.TcHelperDb;
 import org.apache.ignite.ci.di.IgniteTcBotModule;
+import org.apache.ignite.ci.user.ICredentialsProv;
+import org.jetbrains.annotations.Nullable;
 
 /**
  */
@@ -60,16 +65,24 @@ public class CtxListener implements ServletContextListener {
         return (BackgroundUpdater)ctx.getAttribute(UPDATER);
     }
 
-    @Override public void contextInitialized(ServletContextEvent sctxEvt) {
+    public static IAnalyticsEnabledTeamcity server(@QueryParam("serverId") @Nullable String srvId,
+                                                   ServletContext ctx,
+                                                   HttpServletRequest req) {
+        ITcHelper tcHelper = getTcHelper(ctx);
+        final ICredentialsProv creds = ICredentialsProv.get(req);
+        return tcHelper.server(srvId, creds);
+    }
 
+    @Override public void contextInitialized(ServletContextEvent sctxEvt) {
         IgniteTcBotModule igniteTcBotModule = new IgniteTcBotModule();
-        final ServletContext ctx = sctxEvt.getServletContext();
+        Injector injectorPreCreated = Guice.createInjector(igniteTcBotModule);
 
-        Injector injector = Guice.createInjector(igniteTcBotModule);
+        Injector injector = igniteTcBotModule.startIgniteInit(injectorPreCreated);
 
-        final Ignite1Init instance = injector.getInstance(Ignite1Init.class);
-        final Future<Ignite> submit = instance.getIgniteFuture();
-        igniteTcBotModule.setIgniteFuture(submit);
+        ITcServerProvider instance = injector.getInstance(ITcServerProvider.class);
+        Preconditions.checkState(instance == injector.getInstance(ITcServerProvider.class));
+
+        final ServletContext ctx = sctxEvt.getServletContext();
 
         ctx.setAttribute(INJECTOR, injector);
 
@@ -90,8 +103,9 @@ public class CtxListener implements ServletContextListener {
     @Override public void contextDestroyed(ServletContextEvent sctxEvt) {
         final ServletContext ctx = sctxEvt.getServletContext();
 
+        Injector injector = getInjector(ctx);
         try {
-            TcHelperDb.stop(getIgnite(ctx));
+            TcHelperDb.stop(injector.getInstance(Ignite.class));
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -100,6 +114,7 @@ public class CtxListener implements ServletContextListener {
 
         TcHelper helper = (TcHelper)getTcHelper(ctx);
         helper.close();
+
     }
 }
 
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 8529683..ad82bb5 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
@@ -60,7 +60,8 @@ public class GetChainResultsAsHtml {
     public void showChainOnServersResults(StringBuilder res, Integer buildId, String serverId) {
 
         //todo solve report auth problem
-        try (IgnitePersistentTeamcity teamcity = new IgnitePersistentTeamcity(CtxListener.getIgnite(context), serverId)) {
+        IgnitePersistentTeamcity teamcity = new IgnitePersistentTeamcity(CtxListener.getIgnite(context), serverId);
+         {
             teamcity.setExecutor(CtxListener.getPool(context));
 
             //processChainByRef(teamcity, includeLatestRebuild, build, true, true)
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/Metrics.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/Metrics.java
index 9c3798a..c22d418 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/Metrics.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/Metrics.java
@@ -75,9 +75,10 @@ public class Metrics {
             throw ServiceUnauthorizedException.noCreds(serverId);
         }
 
-        try (ITeamcity teamcity = CtxListener.getTcHelper(context).server(serverId, prov)) {
+        ITeamcity teamcity = CtxListener.getTcHelper(context).server(serverId, prov);
+
             collectHistory(history, teamcity, "IgniteTests24Java8_RunAll", "refs/heads/master");
-        }
+
         return convertToChart(history);
     }
 
@@ -110,11 +111,9 @@ public class Metrics {
             throw ServiceUnauthorizedException.noCreds(serverId);
         }
 
-        try (ITeamcity teamcity = CtxListener.getTcHelper(context).server(serverId, prov)) {
-            teamcity.setExecutor(CtxListener.getPool(context));
+        ITeamcity teamcity = CtxListener.getTcHelper(context).server(serverId, prov);
+        collectHistory(history, teamcity, "id8xIgniteGridGainTestsJava8_RunAll", "refs/heads/master");
 
-            collectHistory(history, teamcity, "id8xIgniteGridGainTestsJava8_RunAll", "refs/heads/master");
-        }
         return convertToChart(history);
     }
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/TopTests.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/TopTests.java
index 6b768c4..2a65184 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/TopTests.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/TopTests.java
@@ -55,11 +55,10 @@ public class TopTests {
         @Nullable @QueryParam("count") Integer count) {
         final List<FailingTest> res = new ArrayList<>();
         for (ChainAtServerTracked chainTracked : branchMandatory(branchOrNull).chains) {
-            try (ITcAnalytics teamcity = CtxListener.getTcHelper(context).tcAnalytics( chainTracked.serverId)) {
+            ITcAnalytics teamcity = CtxListener.getTcHelper(context).tcAnalytics(chainTracked.serverId);
 
-                int cnt = count == null ? 10 : count;
-                teamcity.topTestFailing(cnt).stream().map(this::converToUiModel).forEach(res::add);
-            }
+            int cnt = count == null ? 10 : count;
+            teamcity.topTestFailing(cnt).stream().map(this::converToUiModel).forEach(res::add);
         }
         return res;
     }
@@ -71,10 +70,10 @@ public class TopTests {
         @Nullable @QueryParam("count") Integer count) {
         final List<FailingTest> res = new ArrayList<>();
         for (ChainAtServerTracked chainTracked : branchMandatory(branchOrNull).chains) {
-            try (ITcAnalytics teamcity = CtxListener.getTcHelper(context).tcAnalytics(chainTracked.serverId)) {
-                int cnt = count == null ? 10 : count;
-                teamcity.topFailingSuite(cnt).stream().map(this::converToUiModel).forEach(res::add);
-            }
+            ITcAnalytics teamcity = CtxListener.getTcHelper(context).tcAnalytics(chainTracked.serverId);
+
+            int cnt = count == null ? 10 : count;
+            teamcity.topFailingSuite(cnt).stream().map(this::converToUiModel).forEach(res::add);
         }
         return res;
     }
@@ -88,10 +87,10 @@ public class TopTests {
 
         final List<FailingTest> res = new ArrayList<>();
         for (ChainAtServerTracked chainTracked : tracked.chains) {
-            try (ITcAnalytics teamcity = CtxListener.getTcHelper(context).tcAnalytics(chainTracked.serverId)) {
-                int cnt = count == null ? 10 : count;
-                teamcity.topTestsLongRunning(cnt).stream().map(this::converToUiModel).forEach(res::add);
-            }
+            ITcAnalytics teamcity = CtxListener.getTcHelper(context).tcAnalytics(chainTracked.serverId);
+
+            int cnt = count == null ? 10 : count;
+            teamcity.topTestsLongRunning(cnt).stream().map(this::converToUiModel).forEach(res::add);
         }
         return res;
     }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/TriggerBuild.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/TriggerBuild.java
index f5619ef..dd9fbd4 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/TriggerBuild.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/TriggerBuild.java
@@ -67,12 +67,12 @@ public class TriggerBuild {
 
         ITcHelper helper = CtxListener.getTcHelper(context);
 
-        try (final ITeamcity teamcity = helper.server(srvId, prov)) {
+        final ITeamcity teamcity = helper.server(srvId, prov);
+
             Build build = teamcity.triggerBuild(suiteId, branchForTc, false, top != null && top);
 
             if (observe != null && observe)
                 jiraRes = observeJira(srvId, branchForTc, ticketId, helper, teamcity, build, prov);
-        }
 
         return new SimpleResult("Tests started." + (!jiraRes.isEmpty() ? "<br>" + jiraRes : ""));
     }
@@ -107,7 +107,8 @@ public class TriggerBuild {
         ITcHelper helper = CtxListener.getTcHelper(context);
         String jiraRes = "";
 
-        try (final ITeamcity teamcity = helper.server(srvId, prov)) {
+          final ITeamcity teamcity = helper.server(srvId, prov);
+          {
             if (Strings.isNullOrEmpty(ticketId)) {
                 PullRequest pr = teamcity.getPullRequest(branchForTc);
 
@@ -207,7 +208,8 @@ public class TriggerBuild {
         if (strings.isEmpty())
             return new SimpleResult("Error: nothing to run");
 
-        try (final ITeamcity helper = CtxListener.getTcHelper(context).server(serverId, prov)) {
+          final ITeamcity helper = CtxListener.getTcHelper(context).server(serverId, prov);
+          {
             boolean queueToTop = top != null && top;
 
             for (String suiteId : strings) {
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/build/CompareBuilds.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/build/CompareBuilds.java
index 6f0b04c..8bd9062 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/build/CompareBuilds.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/build/CompareBuilds.java
@@ -131,15 +131,16 @@ public class CompareBuilds {
         if (!prov.hasAccess(srv))
             throw ServiceUnauthorizedException.noCreds(srv);
 
-        try (IAnalyticsEnabledTeamcity teamcity = helper.server(srv, prov)) {
-            String hrefById = teamcity.getBuildHrefById(buildId);
-            BuildRef buildRef = new BuildRef();
+        IAnalyticsEnabledTeamcity teamcity = helper.server(srv, prov);
 
-            buildRef.setId(buildId);
-            buildRef.href = hrefById;
+        String hrefById = teamcity.getBuildHrefById(buildId);
+        BuildRef buildRef = new BuildRef();
+
+        buildRef.setId(buildId);
+        buildRef.href = hrefById;
+
+        return tests0(teamcity, buildRef);
 
-            return tests0(teamcity, buildRef);
-        }
     }
 
     /** */
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 22ebd16..25daebf 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
@@ -119,7 +119,8 @@ public class GetBuildTestFailures {
         if(!prov.hasAccess(serverId))
             throw ServiceUnauthorizedException.noCreds(serverId);
 
-        try (IAnalyticsEnabledTeamcity teamcity = helper.server(serverId, prov)) {
+        IAnalyticsEnabledTeamcity teamcity = helper.server(serverId, prov);
+          {
             //processChainByRef(teamcity, includeLatestRebuild, build, true, true)
             String hrefById = teamcity.getBuildHrefById(buildId);
             BuildRef build = new BuildRef();
@@ -171,7 +172,8 @@ public class GetBuildTestFailures {
 
         final ICredentialsProv prov = ICredentialsProv.get(req);
 
-        try (IAnalyticsEnabledTeamcity teamcity = tcHelper.server(srvId, prov)) {
+        IAnalyticsEnabledTeamcity teamcity = tcHelper.server(srvId, prov);
+    {
 
             int[] finishedBuilds = teamcity.getBuildNumbersFromHistory(buildTypeId, branchName, cnt);
 
@@ -205,12 +207,11 @@ public class GetBuildTestFailures {
 
         final ICredentialsProv creds = ICredentialsProv.get(req);
 
-        try (IAnalyticsEnabledTeamcity teamcity = tcHelper.server(srvId, creds)) {
+        IAnalyticsEnabledTeamcity teamcity = tcHelper.server(srvId, creds);
 
-            BuildStatisticsSummary stat = new BuildStatisticsSummary(teamcity.getBuild(buildId));
-            stat.initialize(teamcity);
+        BuildStatisticsSummary stat = new BuildStatisticsSummary(teamcity.getBuild(buildId));
+        stat.initialize(teamcity);
 
-            return stat;
-        }
+        return stat;
     }
 }
\ No newline at end of file
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/login/Login.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/login/Login.java
index 5069c49..536112a 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/login/Login.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/login/Login.java
@@ -20,7 +20,7 @@ package org.apache.ignite.ci.web.rest.login;
 import com.google.common.base.Preconditions;
 import org.apache.ignite.ci.IAnalyticsEnabledTeamcity;
 import org.apache.ignite.ci.ITcHelper;
-import org.apache.ignite.ci.IgniteTeamcityHelper;
+import org.apache.ignite.ci.IgniteTeamcityConnection;
 import org.apache.ignite.ci.tcmodel.user.User;
 import org.apache.ignite.ci.user.TcHelperUser;
 import org.apache.ignite.ci.user.UserAndSessionsStorage;
@@ -162,10 +162,11 @@ public class Login {
 
     public static User checkServiceUserAndPassword(String serverId, String username, String password) {
         try {
-            try(IgniteTeamcityHelper igniteTeamcityHelper = new IgniteTeamcityHelper(serverId)) {
-                igniteTeamcityHelper.setAuthData(username, password);
+            IgniteTeamcityConnection tcConn = new IgniteTeamcityConnection(serverId);
 
-                final User tcUser = igniteTeamcityHelper.getUserByUsername(username);
+            tcConn.setAuthData(username, password);
+
+            final User tcUser = tcConn.getUserByUsername(username);
 
                 /*
                 final List<UserRef> usersRefs = users.getUsersRefs();
@@ -176,11 +177,10 @@ public class Login {
                     }
                 }*/
 
-                if (tcUser != null)
-                    System.err.println(tcUser);
+            if (tcUser != null)
+                System.err.println(tcUser);
 
-                return tcUser;
-            }
+            return tcUser;
         } catch (ServiceUnauthorizedException e) {
             System.err.println("Service " + serverId + " rejected credentials from " + username);
             return null;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/pr/GetPrTestFailures.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/pr/GetPrTestFailures.java
index fc21717..dc51512 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/pr/GetPrTestFailures.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/pr/GetPrTestFailures.java
@@ -150,7 +150,8 @@ public class GetPrTestFailures {
         final AtomicInteger runningUpdates = new AtomicInteger();
 
         //using here non persistent TC allows to skip update statistic
-        try (IAnalyticsEnabledTeamcity teamcity = helper.server(srvId, creds)) {
+          IAnalyticsEnabledTeamcity teamcity = helper.server(srvId, creds);
+          {
             res.setJavaFlags(teamcity);
 
             LatestRebuildMode rebuild;
@@ -229,16 +230,15 @@ public class GetPrTestFailures {
         if (!branchForTc.startsWith("pull/"))
             return "Given branch is not a pull request. Notify works only for pull requests.";
 
-        ITcHelper tcHelper = CtxListener.getTcHelper(ctx);
-        final ICredentialsProv creds = ICredentialsProv.get(req);
+        IAnalyticsEnabledTeamcity teamcity = CtxListener.server(srvId, ctx, req);
 
-        try (IAnalyticsEnabledTeamcity teamcity = tcHelper.server(srvId, creds)) {
-            PullRequest pr = teamcity.getPullRequest(branchForTc);
-            String statusesUrl = pr.getStatusesUrl();
+        PullRequest pr = teamcity.getPullRequest(branchForTc);
+        String statusesUrl = pr.getStatusesUrl();
+
+        teamcity.notifyGit(statusesUrl, msg);
 
-            teamcity.notifyGit(statusesUrl, msg);
-        }
 
         return "Git was notified.";
     }
+
 }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/tracked/GetTrackedBranchTestResults.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/tracked/GetTrackedBranchTestResults.java
index d589e0b..d2808b9 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/tracked/GetTrackedBranchTestResults.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/tracked/GetTrackedBranchTestResults.java
@@ -171,7 +171,8 @@ public class GetTrackedBranchTestResults {
 
                     chainStatus.baseBranchForTc = baseBranchTc;
 
-                    try (IAnalyticsEnabledTeamcity teamcity = helper.server(srvId, creds)) {
+                     IAnalyticsEnabledTeamcity teamcity = helper.server(srvId, creds);
+                     {
 
                         final List<BuildRef> builds = teamcity.getFinishedBuildsIncludeSnDepFailed(
                             chainTracked.getSuiteIdMandatory(),
diff --git a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/di/DiContextTest.java b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/di/DiContextTest.java
new file mode 100644
index 0000000..440ce10
--- /dev/null
+++ b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/di/DiContextTest.java
@@ -0,0 +1,52 @@
+/*
+ * 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.di;
+
+import com.google.common.base.Preconditions;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import org.apache.ignite.ci.ITcServerProvider;
+import org.apache.ignite.ci.web.TcUpdatePool;
+import org.junit.Test;
+
+public class DiContextTest {
+    @Test
+    public void checkSingletons() {
+        IgniteTcBotModule igniteTcBotModule = new IgniteTcBotModule();
+        Injector injector = Guice.createInjector(igniteTcBotModule);
+
+        validateInstanceCachedFor(injector, ITcServerProvider.class);
+        validateInstanceCachedFor(injector, IServerFactory.class);
+    }
+
+    @Test
+    public void checkPoolIsOne() {
+        IgniteTcBotModule igniteTcBotModule = new IgniteTcBotModule();
+        Injector injector = Guice.createInjector(igniteTcBotModule);
+
+        TcUpdatePool pool = injector.getInstance(TcUpdatePool.class);
+        Preconditions.checkState(pool == injector.getInstance((Class<?>) TcUpdatePool.class),
+                "Instance not cached for type " + TcUpdatePool.class);
+
+        pool.stop();
+    }
+
+    public void validateInstanceCachedFor(Injector injector, Class<?> type) {
+        Preconditions.checkState(injector.getInstance(type) == injector.getInstance(type),
+                "Instance not cached for type " + type);
+    }
+}