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

ofuks pushed a commit to branch multiple-cloud
in repository https://gitbox.apache.org/repos/asf/incubator-dlab.git


The following commit(s) were added to refs/heads/multiple-cloud by this push:
     new e6524c5  Updated provisioning callbacks
e6524c5 is described below

commit e6524c5249dd36749a96c5d5f62bf8cfc78522f2
Author: Oleh Fuks <olegfuk...@gmail.com>
AuthorDate: Wed Jan 15 16:29:02 2020 +0200

    Updated provisioning callbacks
---
 .../src/ssn/templates/ssn.yml                      |   3 -
 .../dto/base/computational/ComputationalBase.java  |   8 +-
 services/provisioning-service/pom.xml              |   5 +
 .../backendapi/ProvisioningServiceApplication.java |   2 +-
 .../handlers/ComputationalCallbackHandler.java     |   8 +-
 .../response/handlers/ComputationalConfigure.java  |  11 +-
 .../ComputationalConfigureCallbackHandler.java     |   7 +-
 .../handlers/ExploratoryCallbackHandler.java       |  10 +-
 .../ExploratoryGitCredsCallbackHandler.java        |   7 +-
 .../handlers/ImageCreateCallbackHandler.java       |   6 +-
 .../handlers/LibInstallCallbackHandler.java        |   8 +-
 .../response/handlers/LibListCallbackHandler.java  |   7 +-
 .../java/com/epam/dlab/backendapi/dao/BaseDAO.java | 111 +++++++++++++++++++++
 .../EndpointDAO.java}                              |  31 ++----
 .../dlab/backendapi/dao/impl/EndpointDAOImpl.java  |  54 ++++++++++
 .../dlab/backendapi/modules/ProductionModule.java  |   8 ++
 .../backendapi/modules/ProvisioningDevModule.java  |  12 ++-
 ...lthCheckResource.java => EndpointResource.java} |  30 ++++--
 .../resources/GitExploratoryResource.java          |  15 ++-
 .../dlab/backendapi/resources/ImageResource.java   |   9 +-
 .../dlab/backendapi/resources/LibraryResource.java |  32 +++---
 .../resources/aws/ComputationalResourceAws.java    |  16 ++-
 .../resources/base/ExploratoryService.java         |  14 ++-
 .../resources/gcp/ComputationalResourceGcp.java    |  15 ++-
 .../EndpointService.java}                          |  30 +-----
 .../service/impl/EndpointServiceImpl.java          |  62 ++++++++++++
 .../service/impl/ProjectServiceImpl.java           |   7 +-
 .../service/impl/SparkClusterService.java          |  15 ++-
 .../core/commands/CommandExecutorMockTest.java     |   4 +-
 .../dao/FileSystemCallbackHandlerDaoTest.java      |   9 +-
 .../dropwizard/listeners/MongoStartupListener.java |   7 +-
 .../dlab/backendapi/modules/ModuleFactory.java     |  24 ++---
 .../backendapi/resources/EndpointResource.java     |   2 +-
 .../endpoint/CheckEndpointStatusScheduler.java     |   2 +-
 .../dlab/backendapi/service/EndpointService.java   |   3 +-
 .../service/impl/EndpointServiceImpl.java          |  29 +++++-
 .../epam/dlab/backendapi/util/RequestBuilder.java  |  12 ++-
 37 files changed, 483 insertions(+), 152 deletions(-)

diff --git a/infrastructure-provisioning/src/ssn/templates/ssn.yml 
b/infrastructure-provisioning/src/ssn/templates/ssn.yml
index bed2bf6..70b89e2 100644
--- a/infrastructure-provisioning/src/ssn/templates/ssn.yml
+++ b/infrastructure-provisioning/src/ssn/templates/ssn.yml
@@ -42,9 +42,6 @@ mongo:
   database: dlabdb
 
 selfService:
-  protocol: https
-  host: localhost
-  port: 8443
   jerseyClient:
     timeout: 3s
     connectionTimeout: 3s
diff --git 
a/services/dlab-model/src/main/java/com/epam/dlab/dto/base/computational/ComputationalBase.java
 
b/services/dlab-model/src/main/java/com/epam/dlab/dto/base/computational/ComputationalBase.java
index e3aa000..a55445c 100644
--- 
a/services/dlab-model/src/main/java/com/epam/dlab/dto/base/computational/ComputationalBase.java
+++ 
b/services/dlab-model/src/main/java/com/epam/dlab/dto/base/computational/ComputationalBase.java
@@ -41,7 +41,7 @@ public abstract class ComputationalBase<T extends 
ComputationalBase<?>> extends
        @JsonProperty("project_name")
        private String project;
        @JsonProperty("endpoint_name")
-       private String ednpoint;
+       private String endpoint;
 
        @JsonProperty("tags")
        private Map<String, String> tags;
@@ -96,7 +96,7 @@ public abstract class ComputationalBase<T extends 
ComputationalBase<?>> extends
        }
 
        public T withEndpoint(String endpoint) {
-               this.ednpoint = endpoint;
+               this.endpoint = endpoint;
                return self;
        }
 
@@ -104,6 +104,10 @@ public abstract class ComputationalBase<T extends 
ComputationalBase<?>> extends
                return project;
        }
 
+       public String getEndpoint() {
+               return endpoint;
+       }
+
        @Override
        public ToStringHelper toStringHelper(Object self) {
                return super.toStringHelper(self)
diff --git a/services/provisioning-service/pom.xml 
b/services/provisioning-service/pom.xml
index 1a6548e..5c625a4 100644
--- a/services/provisioning-service/pom.xml
+++ b/services/provisioning-service/pom.xml
@@ -63,6 +63,11 @@
             <artifactId>conveyor</artifactId>
             <version>${com.aegisql.conveyor.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.mongodb</groupId>
+            <artifactId>mongo-java-driver</artifactId>
+            <version>${org.mongodb.version}</version>
+        </dependency>
 
         <dependency>
             <groupId>org.mockito</groupId>
diff --git 
a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/ProvisioningServiceApplication.java
 
b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/ProvisioningServiceApplication.java
index 6f1047b..1a136f1 100644
--- 
a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/ProvisioningServiceApplication.java
+++ 
b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/ProvisioningServiceApplication.java
@@ -144,6 +144,6 @@ public class ProvisioningServiceApplication extends 
Application<ProvisioningServ
                jersey.register(injector.getInstance(KeyResource.class));
                
jersey.register(injector.getInstance(CallbackHandlerResource.class));
                jersey.register(injector.getInstance(ProjectResource.class));
-               
jersey.register(injector.getInstance(ProvisioningHealthCheckResource.class));
+               jersey.register(injector.getInstance(EndpointResource.class));
        }
 }
diff --git 
a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ComputationalCallbackHandler.java
 
b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ComputationalCallbackHandler.java
index 8ccf260..c77476c 100644
--- 
a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ComputationalCallbackHandler.java
+++ 
b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ComputationalCallbackHandler.java
@@ -25,7 +25,6 @@ import com.epam.dlab.dto.UserInstanceStatus;
 import com.epam.dlab.dto.base.computational.ComputationalBase;
 import com.epam.dlab.dto.computational.ComputationalStatusDTO;
 import com.epam.dlab.rest.client.RESTService;
-import com.epam.dlab.rest.contracts.ApiCallbacks;
 import com.fasterxml.jackson.annotation.JacksonInject;
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
@@ -51,17 +50,20 @@ public class ComputationalCallbackHandler extends 
ResourceCallbackHandler<Comput
        @JsonProperty
        private final ComputationalBase<?> dto;
        private ComputationalConfigure computationalConfigure;
+       private String callbackUri;
 
        @JsonCreator
        public ComputationalCallbackHandler(@JacksonInject 
ComputationalConfigure computationalConfigure,
                                                                                
@JacksonInject RESTService selfService,
                                                                                
@JsonProperty("action") DockerAction action,
                                                                                
@JsonProperty("uuid") String uuid,
-                                                                               
@JsonProperty("dto") ComputationalBase<?> dto) {
+                                                                               
@JsonProperty("dto") ComputationalBase<?> dto,
+                                                                               
String callbackUri) {
 
                super(selfService, dto.getCloudSettings().getIamUser(), uuid, 
action);
                this.computationalConfigure = computationalConfigure;
                this.dto = dto;
+               this.callbackUri = callbackUri;
        }
 
        protected ComputationalBase<?> getDto() {
@@ -70,7 +72,7 @@ public class ComputationalCallbackHandler extends 
ResourceCallbackHandler<Comput
 
        @Override
        protected String getCallbackURI() {
-               return ApiCallbacks.COMPUTATIONAL + ApiCallbacks.STATUS_URI;
+               return callbackUri;
        }
 
        @Override
diff --git 
a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ComputationalConfigure.java
 
b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ComputationalConfigure.java
index adba483..16826b1 100644
--- 
a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ComputationalConfigure.java
+++ 
b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ComputationalConfigure.java
@@ -24,12 +24,14 @@ import com.epam.dlab.backendapi.core.Directories;
 import com.epam.dlab.backendapi.core.FileHandlerCallback;
 import com.epam.dlab.backendapi.core.commands.*;
 import 
com.epam.dlab.backendapi.core.response.folderlistener.FolderListenerExecutor;
+import com.epam.dlab.backendapi.service.EndpointService;
 import com.epam.dlab.dto.aws.computational.SparkComputationalCreateAws;
 import com.epam.dlab.dto.base.DataEngineType;
 import com.epam.dlab.dto.base.computational.ComputationalBase;
 import com.epam.dlab.dto.gcp.computational.SparkComputationalCreateGcp;
 import com.epam.dlab.exceptions.DlabException;
 import com.epam.dlab.rest.client.RESTService;
+import com.epam.dlab.rest.contracts.ApiCallbacks;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
 import lombok.extern.slf4j.Slf4j;
@@ -49,6 +51,8 @@ public class ComputationalConfigure implements DockerCommands 
{
        private CommandBuilder commandBuilder;
        @Inject
        private RESTService selfService;
+       @Inject
+       private EndpointService endpointService;
 
        public String configure(String uuid, ComputationalBase<?> dto) {
                switch (configuration.getCloudProvider()) {
@@ -79,7 +83,8 @@ public class ComputationalConfigure implements DockerCommands 
{
                folderListenerExecutor.start(
                                configuration.getImagesDirectory(),
                                configuration.getResourceStatusPollTimeout(),
-                               getFileHandlerCallback(CONFIGURE, uuid, dto));
+                               getFileHandlerCallback(CONFIGURE, uuid, dto, 
endpointService.getEndpointUrl(dto.getEndpoint()) +
+                                               ApiCallbacks.COMPUTATIONAL + 
ApiCallbacks.STATUS_URI));
                try {
                        commandExecutor.executeAsync(
                                        dto.getEdgeUserName(),
@@ -106,8 +111,8 @@ public class ComputationalConfigure implements 
DockerCommands {
        }
 
        private FileHandlerCallback getFileHandlerCallback(DockerAction action, 
String originalUuid, ComputationalBase<?>
-                       dto) {
-               return new ComputationalConfigureCallbackHandler(selfService, 
action, originalUuid, dto);
+                       dto, String callbackUri) {
+               return new ComputationalConfigureCallbackHandler(selfService, 
action, originalUuid, dto, callbackUri);
        }
 
        private String nameContainer(String user, DockerAction action, String 
exploratoryName, String name) {
diff --git 
a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ComputationalConfigureCallbackHandler.java
 
b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ComputationalConfigureCallbackHandler.java
index c53c86e..aa4174e 100644
--- 
a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ComputationalConfigureCallbackHandler.java
+++ 
b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ComputationalConfigureCallbackHandler.java
@@ -36,19 +36,22 @@ public class ComputationalConfigureCallbackHandler extends 
ResourceCallbackHandl
 
        @JsonProperty
        private final ComputationalBase<?> dto;
+       private String callbackUri;
 
        @JsonCreator
        public ComputationalConfigureCallbackHandler(@JacksonInject RESTService 
selfService,
                                                                                
                 @JsonProperty("action") DockerAction action,
                                                                                
                 @JsonProperty("uuid") String uuid,
-                                                                               
                 @JsonProperty("dto") ComputationalBase<?> dto) {
+                                                                               
                 @JsonProperty("dto") ComputationalBase<?> dto,
+                                                                               
                 String callbackUri) {
                super(selfService, dto.getCloudSettings().getIamUser(), uuid, 
action);
                this.dto = dto;
+               this.callbackUri = callbackUri;
        }
 
        @Override
        protected String getCallbackURI() {
-               return ApiCallbacks.COMPUTATIONAL + ApiCallbacks.STATUS_URI;
+               return callbackUri;
        }
 
        @Override
diff --git 
a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ExploratoryCallbackHandler.java
 
b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ExploratoryCallbackHandler.java
index 62746e8..0569690 100644
--- 
a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ExploratoryCallbackHandler.java
+++ 
b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ExploratoryCallbackHandler.java
@@ -35,9 +35,6 @@ import org.slf4j.LoggerFactory;
 import java.io.IOException;
 import java.util.List;
 
-import static com.epam.dlab.rest.contracts.ApiCallbacks.EXPLORATORY;
-import static com.epam.dlab.rest.contracts.ApiCallbacks.STATUS_URI;
-
 public class ExploratoryCallbackHandler extends 
ResourceCallbackHandler<ExploratoryStatusDTO> {
        private static final Logger LOGGER = 
LoggerFactory.getLogger(ExploratoryCallbackHandler.class);
 
@@ -50,19 +47,22 @@ public class ExploratoryCallbackHandler extends 
ResourceCallbackHandler<Explorat
 
        @JsonProperty
        private final String exploratoryName;
+       private String callbackUri;
 
        @JsonCreator
        public ExploratoryCallbackHandler(@JacksonInject RESTService 
selfService,
                                                                          
@JsonProperty("action") DockerAction action,
                                                                          
@JsonProperty("uuid") String uuid, @JsonProperty("user") String user,
-                                                                         
@JsonProperty("exploratoryName") String exploratoryName) {
+                                                                         
@JsonProperty("exploratoryName") String exploratoryName,
+                                                                         
String callbackUri) {
                super(selfService, user, uuid, action);
                this.exploratoryName = exploratoryName;
+               this.callbackUri = callbackUri;
        }
 
        @Override
        protected String getCallbackURI() {
-               return EXPLORATORY + STATUS_URI;
+               return callbackUri;
        }
 
        @Override
diff --git 
a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ExploratoryGitCredsCallbackHandler.java
 
b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ExploratoryGitCredsCallbackHandler.java
index b6857e5..9bfe366 100644
--- 
a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ExploratoryGitCredsCallbackHandler.java
+++ 
b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ExploratoryGitCredsCallbackHandler.java
@@ -35,20 +35,23 @@ public class ExploratoryGitCredsCallbackHandler extends 
ResourceCallbackHandler<
 
        @JsonProperty
        private final String exploratoryName;
+       private String callbackUri;
 
        @JsonCreator
        public ExploratoryGitCredsCallbackHandler(@JacksonInject RESTService 
selfService,
                                                                                
          @JsonProperty("action") DockerAction action,
                                                                                
          @JsonProperty("uuid") String uuid,
                                                                                
          @JsonProperty("user") String user,
-                                                                               
          @JsonProperty("exploratoryName") String exploratoryName) {
+                                                                               
          @JsonProperty("exploratoryName") String exploratoryName,
+                                                                               
          String callbackUri) {
                super(selfService, user, uuid, action);
                this.exploratoryName = exploratoryName;
+               this.callbackUri = callbackUri;
        }
 
        @Override
        protected String getCallbackURI() {
-               return ApiCallbacks.GIT_CREDS;
+               return callbackUri;
        }
 
        @Override
diff --git 
a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ImageCreateCallbackHandler.java
 
b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ImageCreateCallbackHandler.java
index dbbc535..108aa26 100644
--- 
a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ImageCreateCallbackHandler.java
+++ 
b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ImageCreateCallbackHandler.java
@@ -44,14 +44,16 @@ public class ImageCreateCallbackHandler extends 
ResourceCallbackHandler<ImageCre
        private final String project;
        @JsonProperty
        private final String endpoint;
+       private String callbackUri;
 
        public ImageCreateCallbackHandler(RESTService selfService, String uuid, 
DockerAction action,
-                       ExploratoryImageDTO image) {
+                       ExploratoryImageDTO image, String callbackUri) {
                super(selfService, image.getCloudSettings().getIamUser(), uuid, 
action);
                this.imageName = image.getImageName();
                this.exploratoryName = image.getExploratoryName();
                this.project = image.getProject();
                this.endpoint = image.getEndpoint();
+               this.callbackUri = callbackUri;
        }
 
        @JsonCreator
@@ -72,7 +74,7 @@ public class ImageCreateCallbackHandler extends 
ResourceCallbackHandler<ImageCre
 
        @Override
        protected String getCallbackURI() {
-               return ApiCallbacks.IMAGE_STATUS_URI;
+               return callbackUri;
        }
 
        @Override
diff --git 
a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/LibInstallCallbackHandler.java
 
b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/LibInstallCallbackHandler.java
index a31fea3..947232b 100644
--- 
a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/LibInstallCallbackHandler.java
+++ 
b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/LibInstallCallbackHandler.java
@@ -26,7 +26,6 @@ import com.epam.dlab.dto.exploratory.LibInstallStatusDTO;
 import com.epam.dlab.dto.exploratory.LibraryInstallDTO;
 import com.epam.dlab.exceptions.DlabException;
 import com.epam.dlab.rest.client.RESTService;
-import com.epam.dlab.rest.contracts.ApiCallbacks;
 import com.fasterxml.jackson.annotation.JacksonInject;
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
@@ -60,6 +59,7 @@ public class LibInstallCallbackHandler extends 
ResourceCallbackHandler<LibInstal
         */
        @JsonProperty
        private final LibraryInstallDTO dto;
+       private String callbackUri;
 
        /**
         * Instantiate handler for process of docker response for libraries 
installation.
@@ -74,14 +74,16 @@ public class LibInstallCallbackHandler extends 
ResourceCallbackHandler<LibInstal
                        @JacksonInject RESTService selfService,
                        @JsonProperty("action") DockerAction action,
                        @JsonProperty("uuid") String uuid, 
@JsonProperty("user") String user,
-                       @JsonProperty("dto") LibraryInstallDTO dto) {
+                       @JsonProperty("dto") LibraryInstallDTO dto,
+                       String callbackUri) {
                super(selfService, user, uuid, action);
                this.dto = dto;
+               this.callbackUri = callbackUri;
        }
 
        @Override
        protected String getCallbackURI() {
-               return ApiCallbacks.LIB_STATUS_URI;
+               return callbackUri;
        }
 
        @Override
diff --git 
a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/LibListCallbackHandler.java
 
b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/LibListCallbackHandler.java
index ca0268c..b68d385 100644
--- 
a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/LibListCallbackHandler.java
+++ 
b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/LibListCallbackHandler.java
@@ -50,6 +50,7 @@ public class LibListCallbackHandler extends 
ResourceCallbackHandler<LibListStatu
         */
        @JsonProperty
        private final String imageName;
+       private String callbackUri;
 
        /**
         * Instantiate handler for process of docker response for list of 
libraries.
@@ -64,14 +65,16 @@ public class LibListCallbackHandler extends 
ResourceCallbackHandler<LibListStatu
        public LibListCallbackHandler(
                        @JacksonInject RESTService selfService, 
@JsonProperty("action") DockerAction action,
                        @JsonProperty("uuid") String uuid, 
@JsonProperty("user") String user,
-                       @JsonProperty("imageName") String imageName) {
+                       @JsonProperty("imageName") String imageName,
+                       String callbackUri) {
                super(selfService, user, uuid, action);
                this.imageName = imageName;
+               this.callbackUri = callbackUri;
        }
 
        @Override
        protected String getCallbackURI() {
-               return ApiCallbacks.UPDATE_LIBS_URI;
+               return callbackUri;
        }
 
        @Override
diff --git 
a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/dao/BaseDAO.java
 
b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/dao/BaseDAO.java
new file mode 100644
index 0000000..af23922
--- /dev/null
+++ 
b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/dao/BaseDAO.java
@@ -0,0 +1,111 @@
+/*
+ * 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 com.epam.dlab.backendapi.dao;
+
+import com.epam.dlab.exceptions.DlabException;
+import com.epam.dlab.mongo.MongoService;
+import com.epam.dlab.util.mongo.modules.IsoDateModule;
+import com.epam.dlab.util.mongo.modules.JavaPrimitiveModule;
+import com.epam.dlab.util.mongo.modules.MongoModule;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.inject.Inject;
+import com.mongodb.MongoException;
+import com.mongodb.client.FindIterable;
+import com.mongodb.client.MongoCursor;
+import com.mongodb.client.MongoIterable;
+import lombok.extern.slf4j.Slf4j;
+import org.bson.Document;
+import org.bson.conversions.Bson;
+
+import java.io.IOException;
+import java.util.Date;
+import java.util.Optional;
+import java.util.UUID;
+
+@Slf4j
+public class BaseDAO {
+    public static final String ID = "_id";
+    public static final String TIMESTAMP = "timestamp";
+
+    private static final ObjectMapper MAPPER = new ObjectMapper()
+            .configure(JsonParser.Feature.AUTO_CLOSE_SOURCE, true)
+            .registerModule(new IsoDateModule())
+            .registerModule(new JavaPrimitiveModule())
+            .registerModule(new MongoModule());
+
+    @Inject
+    protected MongoService mongoService;
+
+    protected Optional<Document> findOne(String collection, Bson condition) {
+        FindIterable<Document> found = find(collection, condition);
+        return limitOne(found);
+    }
+
+    protected void insertOne(String collection, Object object) {
+        insertOne(collection, object, generateUUID());
+    }
+
+    protected FindIterable<Document> find(String collection) {
+        return mongoService.getCollection(collection).find();
+    }
+
+    private FindIterable<Document> find(String collection, Bson condition) {
+        return mongoService.getCollection(collection).find(condition);
+    }
+
+    private Optional<Document> limitOne(MongoIterable<Document> documents) {
+        Document first = documents.first();
+        try (MongoCursor<Document> iterator = documents.iterator()) {
+            if (iterator.hasNext()) {
+                iterator.next();
+                if (iterator.hasNext()) {
+                    log.error("Too many items found while one is expected");
+                    throw new DlabException("Too many items found while one is 
expected");
+                }
+            }
+        }
+        return Optional.ofNullable(first);
+    }
+
+    private void insertOne(String collection, Object object, String uuid) {
+        try {
+            mongoService.getCollection(collection)
+                    .insertOne(convertToBson(object)
+                            .append(ID, uuid)
+                            .append(TIMESTAMP, new Date()));
+        } catch (MongoException e) {
+            log.error("Insert to Mongo DB fails: {}", e.getLocalizedMessage(), 
e);
+            throw new DlabException("Insert to Mongo DB fails: " + 
e.getLocalizedMessage(), e);
+        }
+    }
+
+    private Document convertToBson(Object object) {
+        try {
+            return Document.parse(MAPPER.writeValueAsString(object));
+        } catch (IOException e) {
+            throw new DlabException("error converting to bson", e);
+        }
+    }
+
+    private String generateUUID() {
+        return UUID.randomUUID().toString();
+    }
+}
diff --git 
a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/ProvisioningHealthCheckResource.java
 
b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/dao/EndpointDAO.java
similarity index 51%
copy from 
services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/ProvisioningHealthCheckResource.java
copy to 
services/provisioning-service/src/main/java/com/epam/dlab/backendapi/dao/EndpointDAO.java
index e50d7ae..3ef5d68 100644
--- 
a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/ProvisioningHealthCheckResource.java
+++ 
b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/dao/EndpointDAO.java
@@ -17,30 +17,17 @@
  * under the License.
  */
 
-package com.epam.dlab.backendapi.resources;
+package com.epam.dlab.backendapi.dao;
 
+import org.bson.Document;
 
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.ProvisioningServiceApplicationConfiguration;
-import com.google.inject.Inject;
-import io.dropwizard.auth.Auth;
+import java.util.List;
+import java.util.Optional;
 
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
+public interface EndpointDAO {
+    Optional<Document> findOne(String name);
 
-@Path("/healthcheck")
-@Produces(MediaType.APPLICATION_JSON)
-public class ProvisioningHealthCheckResource {
-    private static final String HEALTH_CHECK = "ProvisioningHealthCheck";
+    List<Document> findAll();
 
-    @Inject
-    private ProvisioningServiceApplicationConfiguration configuration;
-
-    @GET
-    public Response status(@Auth UserInfo ui) {
-        return Response.ok(configuration.getCloudProvider()).build();
-    }
-}
\ No newline at end of file
+    void create(String name, String url);
+}
diff --git 
a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/dao/impl/EndpointDAOImpl.java
 
b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/dao/impl/EndpointDAOImpl.java
new file mode 100644
index 0000000..39aa9b0
--- /dev/null
+++ 
b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/dao/impl/EndpointDAOImpl.java
@@ -0,0 +1,54 @@
+/*
+ * 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 com.epam.dlab.backendapi.dao.impl;
+
+import com.epam.dlab.backendapi.dao.BaseDAO;
+import com.epam.dlab.backendapi.dao.EndpointDAO;
+import org.bson.Document;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+
+import static com.mongodb.client.model.Filters.eq;
+
+public class EndpointDAOImpl extends BaseDAO implements EndpointDAO {
+    private static final String SELFSERVICE_COLLECTION = "selfservice";
+    private static final String NAME = "name";
+    private static final String URL = "url";
+
+
+    @Override
+    public Optional<Document> findOne(String name) {
+        return findOne(SELFSERVICE_COLLECTION, eq(NAME, name));
+    }
+
+    @Override
+    public List<Document> findAll() {
+        return find(SELFSERVICE_COLLECTION).into(new ArrayList<>());
+    }
+
+    @Override
+    public void create(String name, String url) {
+        Document document = new Document(URL, url);
+        document.append(NAME, name);
+        insertOne(SELFSERVICE_COLLECTION, document);
+    }
+}
diff --git 
a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/modules/ProductionModule.java
 
b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/modules/ProductionModule.java
index 40744fa..2b574f7 100644
--- 
a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/modules/ProductionModule.java
+++ 
b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/modules/ProductionModule.java
@@ -27,13 +27,18 @@ import 
com.epam.dlab.backendapi.core.commands.CommandExecutor;
 import com.epam.dlab.backendapi.core.commands.ICommandExecutor;
 import com.epam.dlab.backendapi.core.response.handlers.dao.CallbackHandlerDao;
 import 
com.epam.dlab.backendapi.core.response.handlers.dao.FileSystemCallbackHandlerDao;
+import com.epam.dlab.backendapi.dao.EndpointDAO;
+import com.epam.dlab.backendapi.dao.impl.EndpointDAOImpl;
 import com.epam.dlab.backendapi.service.CheckInactivityService;
+import com.epam.dlab.backendapi.service.EndpointService;
 import com.epam.dlab.backendapi.service.ProjectService;
 import com.epam.dlab.backendapi.service.RestoreCallbackHandlerService;
 import com.epam.dlab.backendapi.service.impl.CheckInactivityServiceImpl;
+import com.epam.dlab.backendapi.service.impl.EndpointServiceImpl;
 import com.epam.dlab.backendapi.service.impl.ProjectServiceImpl;
 import com.epam.dlab.backendapi.service.impl.RestoreCallbackHandlerServiceImpl;
 import com.epam.dlab.constants.ServiceConsts;
+import com.epam.dlab.mongo.MongoService;
 import com.epam.dlab.rest.client.RESTService;
 import com.fasterxml.jackson.core.JsonParser;
 import com.fasterxml.jackson.databind.ObjectMapper;
@@ -58,6 +63,7 @@ public class ProductionModule extends 
ModuleBase<ProvisioningServiceApplicationC
        @Override
        protected void configure() {
                
bind(ProvisioningServiceApplicationConfiguration.class).toInstance(configuration);
+               
bind(MongoService.class).toInstance(configuration.getMongoFactory().build(environment));
 
                
bind(RESTService.class).annotatedWith(Names.named(ServiceConsts.SECURITY_SERVICE_NAME))
                                .toInstance(configuration.getSecurityFactory()
@@ -73,5 +79,7 @@ public class ProductionModule extends 
ModuleBase<ProvisioningServiceApplicationC
                
bind(RestoreCallbackHandlerService.class).to(RestoreCallbackHandlerServiceImpl.class);
                
bind(CheckInactivityService.class).to(CheckInactivityServiceImpl.class);
                bind(ProjectService.class).to(ProjectServiceImpl.class);
+               bind(EndpointDAO.class).to(EndpointDAOImpl.class);
+               bind(EndpointService.class).to(EndpointServiceImpl.class);
        }
 }
diff --git 
a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/modules/ProvisioningDevModule.java
 
b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/modules/ProvisioningDevModule.java
index 73d333f..e0957dd 100644
--- 
a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/modules/ProvisioningDevModule.java
+++ 
b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/modules/ProvisioningDevModule.java
@@ -30,14 +30,16 @@ import 
com.epam.dlab.backendapi.core.commands.CommandExecutorMock;
 import com.epam.dlab.backendapi.core.commands.ICommandExecutor;
 import com.epam.dlab.backendapi.core.response.handlers.dao.CallbackHandlerDao;
 import 
com.epam.dlab.backendapi.core.response.handlers.dao.FileSystemCallbackHandlerDao;
-import com.epam.dlab.backendapi.service.ProjectService;
-import com.epam.dlab.backendapi.service.RestoreCallbackHandlerService;
-import com.epam.dlab.backendapi.service.CheckInactivityService;
+import com.epam.dlab.backendapi.dao.EndpointDAO;
+import com.epam.dlab.backendapi.dao.impl.EndpointDAOImpl;
+import com.epam.dlab.backendapi.service.*;
 import com.epam.dlab.backendapi.service.RestoreCallbackHandlerService;
 import com.epam.dlab.backendapi.service.impl.CheckInactivityServiceImpl;
+import com.epam.dlab.backendapi.service.impl.EndpointServiceImpl;
 import com.epam.dlab.backendapi.service.impl.ProjectServiceImpl;
 import com.epam.dlab.backendapi.service.impl.RestoreCallbackHandlerServiceImpl;
 import com.epam.dlab.constants.ServiceConsts;
+import com.epam.dlab.mongo.MongoService;
 import com.epam.dlab.rest.client.RESTService;
 import com.epam.dlab.rest.contracts.DockerAPI;
 import com.fasterxml.jackson.core.JsonParser;
@@ -69,6 +71,8 @@ public class ProvisioningDevModule extends 
ModuleBase<ProvisioningServiceApplica
        @Override
        protected void configure() {
                
bind(ProvisioningServiceApplicationConfiguration.class).toInstance(configuration);
+               
bind(MongoService.class).toInstance(configuration.getMongoFactory().build(environment));
+
                
bind(RESTService.class).annotatedWith(Names.named(ServiceConsts.SECURITY_SERVICE_NAME)).toInstance
                                (createAuthenticationService());
                
bind(RESTService.class).toInstance(configuration.getSelfFactory().build(environment,
 ServiceConsts
@@ -80,6 +84,8 @@ public class ProvisioningDevModule extends 
ModuleBase<ProvisioningServiceApplica
                
bind(RestoreCallbackHandlerService.class).to(RestoreCallbackHandlerServiceImpl.class);
                
bind(CheckInactivityService.class).to(CheckInactivityServiceImpl.class);
                bind(ProjectService.class).to(ProjectServiceImpl.class);
+               bind(EndpointDAO.class).to(EndpointDAOImpl.class);
+               bind(EndpointService.class).to(EndpointServiceImpl.class);
        }
 
        /**
diff --git 
a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/ProvisioningHealthCheckResource.java
 
b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/EndpointResource.java
similarity index 57%
copy from 
services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/ProvisioningHealthCheckResource.java
copy to 
services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/EndpointResource.java
index e50d7ae..1a85d39 100644
--- 
a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/ProvisioningHealthCheckResource.java
+++ 
b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/EndpointResource.java
@@ -19,28 +19,44 @@
 
 package com.epam.dlab.backendapi.resources;
 
-
 import com.epam.dlab.auth.UserInfo;
 import com.epam.dlab.backendapi.ProvisioningServiceApplicationConfiguration;
+import com.epam.dlab.backendapi.service.EndpointService;
 import com.google.inject.Inject;
 import io.dropwizard.auth.Auth;
 
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.Consumes;
 import javax.ws.rs.GET;
+import javax.ws.rs.POST;
 import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
+import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 
-@Path("/healthcheck")
+@Path("infrastructure/endpoint")
+@Consumes(MediaType.APPLICATION_JSON)
 @Produces(MediaType.APPLICATION_JSON)
-public class ProvisioningHealthCheckResource {
-    private static final String HEALTH_CHECK = "ProvisioningHealthCheck";
+public class EndpointResource {
+    private final EndpointService endpointService;
+    private final ProvisioningServiceApplicationConfiguration configuration;
 
     @Inject
-    private ProvisioningServiceApplicationConfiguration configuration;
+    public EndpointResource(EndpointService endpointService, 
ProvisioningServiceApplicationConfiguration configuration) {
+        this.endpointService = endpointService;
+        this.configuration = configuration;
+    }
 
     @GET
-    public Response status(@Auth UserInfo ui) {
+    @Path("/healthcheck")
+    public Response status(@Auth UserInfo userInfo) {
+        return Response.ok().build();
+    }
+
+    @POST
+    public Response connectEndpoint(@Auth UserInfo userInfo, @Context 
HttpServletRequest request, String name) {
+        endpointService.create(name, request.getScheme() + "://" + 
request.getRemoteHost());
         return Response.ok(configuration.getCloudProvider()).build();
     }
-}
\ No newline at end of file
+}
diff --git 
a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/GitExploratoryResource.java
 
b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/GitExploratoryResource.java
index 80a3d5b..0afeea4 100644
--- 
a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/GitExploratoryResource.java
+++ 
b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/GitExploratoryResource.java
@@ -26,10 +26,13 @@ import com.epam.dlab.backendapi.core.commands.DockerAction;
 import com.epam.dlab.backendapi.core.commands.DockerCommands;
 import com.epam.dlab.backendapi.core.commands.RunDockerCommand;
 import 
com.epam.dlab.backendapi.core.response.handlers.ExploratoryGitCredsCallbackHandler;
+import com.epam.dlab.backendapi.service.EndpointService;
 import com.epam.dlab.backendapi.service.impl.DockerService;
 import com.epam.dlab.dto.exploratory.ExploratoryBaseDTO;
 import com.epam.dlab.dto.exploratory.ExploratoryGitCredsUpdateDTO;
+import com.epam.dlab.rest.contracts.ApiCallbacks;
 import com.fasterxml.jackson.core.JsonProcessingException;
+import com.google.inject.Inject;
 import io.dropwizard.auth.Auth;
 import lombok.extern.slf4j.Slf4j;
 
@@ -45,6 +48,9 @@ import javax.ws.rs.core.MediaType;
 @Slf4j
 public class GitExploratoryResource extends DockerService implements 
DockerCommands {
 
+       @Inject
+       private EndpointService endpointService;
+
        @Path("/git_creds")
        @POST
        public String gitCredsUpdate(@Auth UserInfo ui, 
ExploratoryGitCredsUpdateDTO dto) throws JsonProcessingException {
@@ -56,7 +62,8 @@ public class GitExploratoryResource extends DockerService 
implements DockerComma
                String uuid = DockerCommands.generateUUID();
                folderListenerExecutor.start(configuration.getImagesDirectory(),
                                configuration.getResourceStatusPollTimeout(),
-                               getFileHandlerCallback(action, uuid, dto));
+                               getFileHandlerCallback(action, uuid, dto, 
endpointService.getEndpointUrl(dto.getEndpoint()) +
+                                               ApiCallbacks.GIT_CREDS));
 
                RunDockerCommand runDockerCommand = new RunDockerCommand()
                                .withInteractive()
@@ -74,8 +81,10 @@ public class GitExploratoryResource extends DockerService 
implements DockerComma
                return uuid;
        }
 
-       private FileHandlerCallback getFileHandlerCallback(DockerAction action, 
String uuid, ExploratoryBaseDTO<?> dto) {
-               return new ExploratoryGitCredsCallbackHandler(selfService, 
action, uuid, dto.getCloudSettings().getIamUser(), dto.getExploratoryName());
+       private FileHandlerCallback getFileHandlerCallback(DockerAction action, 
String uuid, ExploratoryBaseDTO<?> dto,
+                                                                               
                           String callbackUri) {
+               return new ExploratoryGitCredsCallbackHandler(selfService, 
action, uuid, dto.getCloudSettings().getIamUser(),
+                               dto.getExploratoryName(), callbackUri);
        }
 
        private String nameContainer(String user, DockerAction action, String 
name) {
diff --git 
a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/ImageResource.java
 
b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/ImageResource.java
index b57f5b2..cccc600 100644
--- 
a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/ImageResource.java
+++ 
b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/ImageResource.java
@@ -25,10 +25,13 @@ import com.epam.dlab.backendapi.core.commands.DockerAction;
 import com.epam.dlab.backendapi.core.commands.DockerCommands;
 import com.epam.dlab.backendapi.core.commands.RunDockerCommand;
 import 
com.epam.dlab.backendapi.core.response.handlers.ImageCreateCallbackHandler;
+import com.epam.dlab.backendapi.service.EndpointService;
 import com.epam.dlab.backendapi.service.impl.DockerService;
 import com.epam.dlab.dto.exploratory.ExploratoryImageDTO;
+import com.epam.dlab.rest.contracts.ApiCallbacks;
 import com.epam.dlab.rest.contracts.ExploratoryAPI;
 import com.fasterxml.jackson.core.JsonProcessingException;
+import com.google.inject.Inject;
 import io.dropwizard.auth.Auth;
 import lombok.extern.slf4j.Slf4j;
 
@@ -45,12 +48,16 @@ import javax.ws.rs.core.Response;
 @Slf4j
 public class ImageResource extends DockerService implements DockerCommands {
 
+       @Inject
+       private EndpointService endpointService;
+
        @POST
        public Response createImage(@Auth UserInfo ui, ExploratoryImageDTO 
image) throws JsonProcessingException {
                final String uuid = DockerCommands.generateUUID();
 
                
folderListenerExecutor.start(configuration.getImagesDirectory(), 
configuration.getResourceStatusPollTimeout(),
-                               new ImageCreateCallbackHandler(selfService, 
uuid, DockerAction.CREATE_IMAGE, image));
+                               new ImageCreateCallbackHandler(selfService, 
uuid, DockerAction.CREATE_IMAGE, image,
+                                               
endpointService.getEndpointUrl(image.getEndpoint()) + 
ApiCallbacks.IMAGE_STATUS_URI));
                String command = 
commandBuilder.buildCommand(getDockerCommand(DockerAction.CREATE_IMAGE, uuid, 
image), image);
                commandExecutor.executeAsync(ui.getName(), uuid, command);
                log.debug("Docker command: " + command);
diff --git 
a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/LibraryResource.java
 
b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/LibraryResource.java
index 0e07d69..28bf9ae 100644
--- 
a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/LibraryResource.java
+++ 
b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/LibraryResource.java
@@ -27,15 +27,18 @@ import 
com.epam.dlab.backendapi.core.commands.DockerCommands;
 import com.epam.dlab.backendapi.core.commands.RunDockerCommand;
 import 
com.epam.dlab.backendapi.core.response.handlers.LibInstallCallbackHandler;
 import com.epam.dlab.backendapi.core.response.handlers.LibListCallbackHandler;
+import com.epam.dlab.backendapi.service.EndpointService;
 import com.epam.dlab.backendapi.service.impl.DockerService;
 import com.epam.dlab.dto.LibListComputationalDTO;
 import com.epam.dlab.dto.base.DataEngineType;
 import com.epam.dlab.dto.exploratory.ExploratoryActionDTO;
 import com.epam.dlab.dto.exploratory.ExploratoryBaseDTO;
 import com.epam.dlab.dto.exploratory.LibraryInstallDTO;
+import com.epam.dlab.rest.contracts.ApiCallbacks;
 import com.epam.dlab.rest.contracts.ComputationalAPI;
 import com.epam.dlab.rest.contracts.ExploratoryAPI;
 import com.fasterxml.jackson.core.JsonProcessingException;
+import com.google.inject.Inject;
 import io.dropwizard.auth.Auth;
 import lombok.extern.slf4j.Slf4j;
 
@@ -51,6 +54,8 @@ import javax.ws.rs.core.MediaType;
 @Slf4j
 public class LibraryResource extends DockerService implements DockerCommands {
 
+       @Inject
+       private EndpointService endpointService;
 
        @POST
        @Path(ExploratoryAPI.EXPLORATORY + "/lib_list")
@@ -81,7 +86,8 @@ public class LibraryResource extends DockerService implements 
DockerCommands {
                String uuid = DockerCommands.generateUUID();
                folderListenerExecutor.start(configuration.getImagesDirectory(),
                                configuration.getResourceStatusPollTimeout(),
-                               getFileHandlerCallbackExploratory(action, uuid, 
dto));
+                               getFileHandlerCallbackExploratory(action, uuid, 
dto, endpointService.getEndpointUrl(dto.getEndpoint()) +
+                                               ApiCallbacks.LIB_STATUS_URI));
 
                RunDockerCommand runDockerCommand = 
getDockerCommandExploratory(dto, action, uuid);
 
@@ -94,7 +100,8 @@ public class LibraryResource extends DockerService 
implements DockerCommands {
                String uuid = DockerCommands.generateUUID();
                folderListenerExecutor.start(configuration.getImagesDirectory(),
                                configuration.getResourceStatusPollTimeout(),
-                               getFileHandlerCallbackComputational(action, 
uuid, dto));
+                               getFileHandlerCallbackComputational(action, 
uuid, dto, endpointService.getEndpointUrl(dto.getEndpoint()) +
+                                               ApiCallbacks.LIB_STATUS_URI));
 
                RunDockerCommand runDockerCommand = 
getDockerCommandComputational(dto, action, uuid);
 
@@ -149,29 +156,28 @@ public class LibraryResource extends DockerService 
implements DockerCommands {
        }
 
        private FileHandlerCallback 
getFileHandlerCallbackExploratory(DockerAction action, String uuid,
-                                                                               
                                                  ExploratoryBaseDTO<?> dto) {
+                                                                               
                                                  ExploratoryBaseDTO<?> dto, 
String callbackUri) {
                switch (action) {
-                       case LIB_INSTALL:
-                               return new 
LibInstallCallbackHandler(selfService, action, uuid,
-                                               
dto.getCloudSettings().getIamUser(),
-                                               (LibraryInstallDTO) dto);
                        case LIB_LIST:
                                return new LibListCallbackHandler(selfService, 
DockerAction.LIB_LIST, uuid,
-                                               
dto.getCloudSettings().getIamUser(), dto.getNotebookImage());
+                                               
dto.getCloudSettings().getIamUser(), dto.getNotebookImage(), callbackUri);
+                       case LIB_INSTALL:
+                               return new 
LibInstallCallbackHandler(selfService, action, uuid, 
dto.getCloudSettings().getIamUser(),
+                                               (LibraryInstallDTO) dto, 
callbackUri);
                        default:
                                throw new IllegalArgumentException("Unknown 
action " + action);
                }
        }
 
        private FileHandlerCallback 
getFileHandlerCallbackComputational(DockerAction action, String uuid,
-                                                                               
                                                        ExploratoryBaseDTO<?> 
dto) {
+                                                                               
                                                        ExploratoryBaseDTO<?> 
dto, String callbackUri) {
                switch (action) {
                        case LIB_LIST:
-                               return new LibListCallbackHandler(selfService, 
action, uuid,
-                                               
dto.getCloudSettings().getIamUser(), ((LibListComputationalDTO) 
dto).getLibCacheKey());
+                               return new LibListCallbackHandler(selfService, 
action, uuid, dto.getCloudSettings().getIamUser(),
+                                               ((LibListComputationalDTO) 
dto).getLibCacheKey(), callbackUri);
                        case LIB_INSTALL:
-                               return new 
LibInstallCallbackHandler(selfService, action, uuid,
-                                               
dto.getCloudSettings().getIamUser(), ((LibraryInstallDTO) dto));
+                               return new 
LibInstallCallbackHandler(selfService, action, uuid, 
dto.getCloudSettings().getIamUser(),
+                                               ((LibraryInstallDTO) dto), 
callbackUri);
 
                        default:
                                throw new IllegalArgumentException("Unknown 
action " + action);
diff --git 
a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/aws/ComputationalResourceAws.java
 
b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/aws/ComputationalResourceAws.java
index 8e8730c..932848f 100644
--- 
a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/aws/ComputationalResourceAws.java
+++ 
b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/aws/ComputationalResourceAws.java
@@ -27,6 +27,7 @@ import com.epam.dlab.backendapi.core.commands.DockerCommands;
 import com.epam.dlab.backendapi.core.commands.RunDockerCommand;
 import 
com.epam.dlab.backendapi.core.response.handlers.ComputationalCallbackHandler;
 import com.epam.dlab.backendapi.core.response.handlers.ComputationalConfigure;
+import com.epam.dlab.backendapi.service.EndpointService;
 import com.epam.dlab.backendapi.service.impl.DockerService;
 import com.epam.dlab.backendapi.service.impl.SparkClusterService;
 import com.epam.dlab.dto.aws.computational.AwsComputationalTerminateDTO;
@@ -38,6 +39,7 @@ import 
com.epam.dlab.dto.computational.ComputationalClusterConfigDTO;
 import com.epam.dlab.dto.computational.ComputationalStartDTO;
 import com.epam.dlab.dto.computational.ComputationalStopDTO;
 import com.epam.dlab.exceptions.DlabException;
+import com.epam.dlab.rest.contracts.ApiCallbacks;
 import com.epam.dlab.rest.contracts.ComputationalAPI;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.google.inject.Inject;
@@ -64,15 +66,19 @@ public class ComputationalResourceAws extends DockerService 
implements DockerCom
        private ComputationalConfigure computationalConfigure;
        @Inject
        private SparkClusterService sparkClusterService;
+       @Inject
+       private EndpointService endpointService;
 
        @POST
        @Path(ComputationalAPI.COMPUTATIONAL_CREATE_CLOUD_SPECIFIC)
        public String create(@Auth UserInfo ui, ComputationalCreateAws dto) {
                log.debug("Create computational resources {} for user {}: {}", 
dto.getComputationalName(), ui.getName(), dto);
                String uuid = DockerCommands.generateUUID();
+
                folderListenerExecutor.start(configuration.getImagesDirectory(),
                                configuration.getResourceStatusPollTimeout(),
-                               getFileHandlerCallback(CREATE, uuid, dto));
+                               getFileHandlerCallback(CREATE, uuid, dto, 
endpointService.getEndpointUrl(dto.getEndpoint()) +
+                                               ApiCallbacks.COMPUTATIONAL + 
ApiCallbacks.STATUS_URI));
                try {
                        long timeout = 
configuration.getResourceStatusPollTimeout().toSeconds();
                        commandExecutor.executeAsync(
@@ -111,7 +117,8 @@ public class ComputationalResourceAws extends DockerService 
implements DockerCom
                String uuid = DockerCommands.generateUUID();
                folderListenerExecutor.start(configuration.getImagesDirectory(),
                                configuration.getResourceStatusPollTimeout(),
-                               getFileHandlerCallback(TERMINATE, uuid, dto));
+                               getFileHandlerCallback(TERMINATE, uuid, dto, 
endpointService.getEndpointUrl(dto.getEndpoint()) +
+                                               ApiCallbacks.COMPUTATIONAL + 
ApiCallbacks.STATUS_URI));
                try {
                        commandExecutor.executeAsync(
                                        ui.getName(),
@@ -183,8 +190,9 @@ public class ComputationalResourceAws extends DockerService 
implements DockerCom
                return sparkClusterService.updateConfig(ui, config);
        }
 
-       private FileHandlerCallback getFileHandlerCallback(DockerAction action, 
String uuid, ComputationalBase<?> dto) {
-               return new ComputationalCallbackHandler(computationalConfigure, 
selfService, action, uuid, dto);
+       private FileHandlerCallback getFileHandlerCallback(DockerAction action, 
String uuid, ComputationalBase<?> dto,
+                                                                               
                           String callbackUri) {
+               return new ComputationalCallbackHandler(computationalConfigure, 
selfService, action, uuid, dto, callbackUri);
        }
 
        private String nameContainer(String user, DockerAction action, String 
exploratoryName, String name) {
diff --git 
a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/base/ExploratoryService.java
 
b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/base/ExploratoryService.java
index c25f484..a59442c 100644
--- 
a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/base/ExploratoryService.java
+++ 
b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/base/ExploratoryService.java
@@ -25,20 +25,27 @@ import com.epam.dlab.backendapi.core.commands.DockerAction;
 import com.epam.dlab.backendapi.core.commands.DockerCommands;
 import com.epam.dlab.backendapi.core.commands.RunDockerCommand;
 import 
com.epam.dlab.backendapi.core.response.handlers.ExploratoryCallbackHandler;
+import com.epam.dlab.backendapi.service.EndpointService;
 import com.epam.dlab.backendapi.service.impl.DockerService;
 import com.epam.dlab.dto.exploratory.ExploratoryBaseDTO;
+import com.epam.dlab.rest.contracts.ApiCallbacks;
 import com.fasterxml.jackson.core.JsonProcessingException;
+import com.google.inject.Inject;
 import lombok.extern.slf4j.Slf4j;
 
 @Slf4j
 public class ExploratoryService extends DockerService implements 
DockerCommands {
 
+       @Inject
+       private EndpointService endpointService;
+
        public String action(String username, ExploratoryBaseDTO<?> dto, 
DockerAction action) throws JsonProcessingException {
                log.debug("{} exploratory environment", action);
                String uuid = DockerCommands.generateUUID();
                folderListenerExecutor.start(configuration.getImagesDirectory(),
                                configuration.getResourceStatusPollTimeout(),
-                               getFileHandlerCallback(action, uuid, dto));
+                               getFileHandlerCallback(action, uuid, dto, 
endpointService.getEndpointUrl(dto.getEndpoint()) +
+                                               ApiCallbacks.EXPLORATORY + 
ApiCallbacks.STATUS_URI));
 
                RunDockerCommand runDockerCommand = new RunDockerCommand()
                                .withInteractive()
@@ -60,9 +67,10 @@ public class ExploratoryService extends DockerService 
implements DockerCommands
                return Directories.NOTEBOOK_LOG_DIRECTORY;
        }
 
-       private FileHandlerCallback getFileHandlerCallback(DockerAction action, 
String uuid, ExploratoryBaseDTO<?> dto) {
+       private FileHandlerCallback getFileHandlerCallback(DockerAction action, 
String uuid, ExploratoryBaseDTO<?> dto,
+                                                                               
                           String callbackUri) {
                return new ExploratoryCallbackHandler(selfService, action, 
uuid, dto.getCloudSettings().getIamUser(),
-                               dto.getExploratoryName());
+                               dto.getExploratoryName(), callbackUri);
        }
 
        private String nameContainer(String user, DockerAction action, String 
name) {
diff --git 
a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/gcp/ComputationalResourceGcp.java
 
b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/gcp/ComputationalResourceGcp.java
index 0db357b..06efd9f 100644
--- 
a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/gcp/ComputationalResourceGcp.java
+++ 
b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/gcp/ComputationalResourceGcp.java
@@ -27,6 +27,7 @@ import com.epam.dlab.backendapi.core.commands.DockerCommands;
 import com.epam.dlab.backendapi.core.commands.RunDockerCommand;
 import 
com.epam.dlab.backendapi.core.response.handlers.ComputationalCallbackHandler;
 import com.epam.dlab.backendapi.core.response.handlers.ComputationalConfigure;
+import com.epam.dlab.backendapi.service.EndpointService;
 import com.epam.dlab.backendapi.service.impl.DockerService;
 import com.epam.dlab.backendapi.service.impl.SparkClusterService;
 import com.epam.dlab.dto.base.DataEngineType;
@@ -38,6 +39,7 @@ import 
com.epam.dlab.dto.gcp.computational.ComputationalCreateGcp;
 import com.epam.dlab.dto.gcp.computational.GcpComputationalTerminateDTO;
 import com.epam.dlab.dto.gcp.computational.SparkComputationalCreateGcp;
 import com.epam.dlab.exceptions.DlabException;
+import com.epam.dlab.rest.contracts.ApiCallbacks;
 import com.epam.dlab.rest.contracts.ComputationalAPI;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.google.inject.Inject;
@@ -64,6 +66,8 @@ public class ComputationalResourceGcp extends DockerService 
implements DockerCom
        private ComputationalConfigure computationalConfigure;
        @Inject
        private SparkClusterService sparkClusterService;
+       @Inject
+       private EndpointService endpointService;
 
        @POST
        @Path(ComputationalAPI.COMPUTATIONAL_CREATE_CLOUD_SPECIFIC)
@@ -72,7 +76,8 @@ public class ComputationalResourceGcp extends DockerService 
implements DockerCom
                String uuid = DockerCommands.generateUUID();
                folderListenerExecutor.start(configuration.getImagesDirectory(),
                                configuration.getResourceStatusPollTimeout(),
-                               getFileHandlerCallback(CREATE, uuid, dto));
+                               getFileHandlerCallback(CREATE, uuid, dto, 
endpointService.getEndpointUrl(dto.getEndpoint()) +
+                                               ApiCallbacks.COMPUTATIONAL + 
ApiCallbacks.STATUS_URI));
                try {
                        commandExecutor.executeAsync(
                                        ui.getName(),
@@ -108,7 +113,8 @@ public class ComputationalResourceGcp extends DockerService 
implements DockerCom
                String uuid = DockerCommands.generateUUID();
                folderListenerExecutor.start(configuration.getImagesDirectory(),
                                configuration.getResourceStatusPollTimeout(),
-                               getFileHandlerCallback(TERMINATE, uuid, dto));
+                               getFileHandlerCallback(TERMINATE, uuid, dto, 
endpointService.getEndpointUrl(dto.getEndpoint()) +
+                                               ApiCallbacks.COMPUTATIONAL + 
ApiCallbacks.STATUS_URI));
                try {
                        commandExecutor.executeAsync(
                                        ui.getName(),
@@ -182,8 +188,9 @@ public class ComputationalResourceGcp extends DockerService 
implements DockerCom
                return sparkClusterService.updateConfig(ui, config);
        }
 
-       private FileHandlerCallback getFileHandlerCallback(DockerAction action, 
String uuid, ComputationalBase<?> dto) {
-               return new ComputationalCallbackHandler(computationalConfigure, 
selfService, action, uuid, dto);
+       private FileHandlerCallback getFileHandlerCallback(DockerAction action, 
String uuid, ComputationalBase<?> dto,
+                                                                               
                           String callbackUri) {
+               return new ComputationalCallbackHandler(computationalConfigure, 
selfService, action, uuid, dto, callbackUri);
        }
 
        private String nameContainer(String user, DockerAction action, String 
exploratoryName, String name) {
diff --git 
a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/ProvisioningHealthCheckResource.java
 
b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/EndpointService.java
similarity index 51%
rename from 
services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/ProvisioningHealthCheckResource.java
rename to 
services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/EndpointService.java
index e50d7ae..7bbd25a 100644
--- 
a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/ProvisioningHealthCheckResource.java
+++ 
b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/EndpointService.java
@@ -17,30 +17,10 @@
  * under the License.
  */
 
-package com.epam.dlab.backendapi.resources;
+package com.epam.dlab.backendapi.service;
 
+public interface EndpointService {
+    String getEndpointUrl(String name);
 
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.ProvisioningServiceApplicationConfiguration;
-import com.google.inject.Inject;
-import io.dropwizard.auth.Auth;
-
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-@Path("/healthcheck")
-@Produces(MediaType.APPLICATION_JSON)
-public class ProvisioningHealthCheckResource {
-    private static final String HEALTH_CHECK = "ProvisioningHealthCheck";
-
-    @Inject
-    private ProvisioningServiceApplicationConfiguration configuration;
-
-    @GET
-    public Response status(@Auth UserInfo ui) {
-        return Response.ok(configuration.getCloudProvider()).build();
-    }
-}
\ No newline at end of file
+    void create(String name, String url);
+}
diff --git 
a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/EndpointServiceImpl.java
 
b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/EndpointServiceImpl.java
new file mode 100644
index 0000000..650ac0d
--- /dev/null
+++ 
b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/EndpointServiceImpl.java
@@ -0,0 +1,62 @@
+/*
+ * 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 com.epam.dlab.backendapi.service.impl;
+
+import com.epam.dlab.backendapi.dao.EndpointDAO;
+import com.epam.dlab.backendapi.service.EndpointService;
+import com.epam.dlab.exceptions.DlabException;
+import com.google.inject.Inject;
+import lombok.extern.slf4j.Slf4j;
+import org.bson.Document;
+
+import java.util.List;
+
+@Slf4j
+public class EndpointServiceImpl implements EndpointService {
+    private static final String URL = "url";
+    private final EndpointDAO endpointDAO;
+
+    @Inject
+    public EndpointServiceImpl(EndpointDAO endpointDAO) {
+        this.endpointDAO = endpointDAO;
+    }
+
+    @Override
+    public String getEndpointUrl(String name) {
+        return (String) getOrError(name).get(URL);
+    }
+
+    @Override
+    public void create(String name, String url) {
+        List<Document> all = endpointDAO.findAll();
+        if (all.isEmpty()) {
+            endpointDAO.create(name, url);
+            log.debug("Successfully created connection with selfservice url: 
{}", url);
+        } else {
+            log.error("Endpoint is already connected, excising {}, url {}", 
all, url);
+            throw new DlabException("Endpoint is already connected");
+        }
+    }
+
+    private Document getOrError(String name) {
+        return endpointDAO.findOne(name).orElseThrow(() ->
+                new DlabException("Cannot find selfservice endpoint url with 
name " + name));
+    }
+}
diff --git 
a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/ProjectServiceImpl.java
 
b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/ProjectServiceImpl.java
index 47c4dee..24b68fc 100644
--- 
a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/ProjectServiceImpl.java
+++ 
b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/ProjectServiceImpl.java
@@ -5,6 +5,7 @@ import 
com.epam.dlab.backendapi.ProvisioningServiceApplicationConfiguration;
 import com.epam.dlab.backendapi.core.commands.*;
 import 
com.epam.dlab.backendapi.core.response.folderlistener.FolderListenerExecutor;
 import com.epam.dlab.backendapi.core.response.handlers.ProjectCallbackHandler;
+import com.epam.dlab.backendapi.service.EndpointService;
 import com.epam.dlab.backendapi.service.ProjectService;
 import com.epam.dlab.cloud.CloudProvider;
 import com.epam.dlab.dto.ResourceBaseDTO;
@@ -33,6 +34,8 @@ public class ProjectServiceImpl implements ProjectService {
        private ICommandExecutor commandExecutor;
        @Inject
        private CommandBuilder commandBuilder;
+       @Inject
+       private EndpointService endpointService;
 
        @Override
        public String create(UserInfo userInfo, ProjectCreateDTO dto) {
@@ -60,10 +63,12 @@ public class ProjectServiceImpl implements ProjectService {
                                                                 String 
resourceType, String image, String endpoint) {
                String uuid = DockerCommands.generateUUID();
 
+               log.debug(endpointService.getEndpointUrl(endpoint) + 
CALLBACK_URI);
                
folderListenerExecutor.start(configuration.getKeyLoaderDirectory(),
                                configuration.getKeyLoaderPollTimeout(),
                                new ProjectCallbackHandler(selfService, 
userInfo.getName(), uuid,
-                                               action, CALLBACK_URI, 
projectName, getEdgeClass(), endpoint));
+                                               action, 
endpointService.getEndpointUrl(endpoint) + CALLBACK_URI, projectName,
+                                               getEdgeClass(), endpoint));
 
                RunDockerCommand runDockerCommand = new RunDockerCommand()
                                .withInteractive()
diff --git 
a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/SparkClusterService.java
 
b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/SparkClusterService.java
index a773b70..22d6698 100644
--- 
a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/SparkClusterService.java
+++ 
b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/SparkClusterService.java
@@ -27,6 +27,7 @@ import com.epam.dlab.backendapi.core.commands.DockerCommands;
 import com.epam.dlab.backendapi.core.commands.RunDockerCommand;
 import 
com.epam.dlab.backendapi.core.response.handlers.ComputationalCallbackHandler;
 import com.epam.dlab.backendapi.core.response.handlers.ComputationalConfigure;
+import com.epam.dlab.backendapi.service.EndpointService;
 import com.epam.dlab.dto.base.DataEngineType;
 import com.epam.dlab.dto.base.computational.ComputationalBase;
 import com.epam.dlab.dto.computational.ComputationalClusterConfigDTO;
@@ -34,6 +35,7 @@ import com.epam.dlab.dto.computational.ComputationalStartDTO;
 import com.epam.dlab.dto.computational.ComputationalStopDTO;
 import com.epam.dlab.dto.computational.ComputationalTerminateDTO;
 import com.epam.dlab.exceptions.DlabException;
+import com.epam.dlab.rest.contracts.ApiCallbacks;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
@@ -47,6 +49,8 @@ public class SparkClusterService extends DockerService 
implements DockerCommands
 
        @Inject
        private ComputationalConfigure computationalConfigure;
+       @Inject
+       private EndpointService endpointService;
 
        public String create(UserInfo ui, ComputationalBase<?> dto) {
                return action(ui, dto, CREATE);
@@ -68,7 +72,8 @@ public class SparkClusterService extends DockerService 
implements DockerCommands
                String uuid = DockerCommands.generateUUID();
                folderListenerExecutor.start(configuration.getImagesDirectory(),
                                configuration.getResourceStatusPollTimeout(),
-                               getFileHandlerCallback(RECONFIGURE_SPARK, uuid, 
clusterConfigDTO));
+                               getFileHandlerCallback(RECONFIGURE_SPARK, uuid, 
clusterConfigDTO, endpointService.getEndpointUrl(
+                                               clusterConfigDTO.getEndpoint()) 
+ ApiCallbacks.COMPUTATIONAL + ApiCallbacks.STATUS_URI));
                runReconfigureSparkDockerCommand(ui, clusterConfigDTO, uuid);
                return uuid;
        }
@@ -101,7 +106,8 @@ public class SparkClusterService extends DockerService 
implements DockerCommands
                String uuid = DockerCommands.generateUUID();
                folderListenerExecutor.start(configuration.getImagesDirectory(),
                                configuration.getResourceStatusPollTimeout(),
-                               getFileHandlerCallback(action, uuid, dto));
+                               getFileHandlerCallback(action, uuid, dto, 
endpointService.getEndpointUrl(dto.getEndpoint()) +
+                                               ApiCallbacks.COMPUTATIONAL + 
ApiCallbacks.STATUS_URI));
                try {
                        final RunDockerCommand dockerCommand = new 
RunDockerCommand()
                                        .withInteractive()
@@ -124,8 +130,9 @@ public class SparkClusterService extends DockerService 
implements DockerCommands
                return uuid;
        }
 
-       private FileHandlerCallback getFileHandlerCallback(DockerAction action, 
String uuid, ComputationalBase<?> dto) {
-               return new ComputationalCallbackHandler(computationalConfigure, 
selfService, action, uuid, dto);
+       private FileHandlerCallback getFileHandlerCallback(DockerAction action, 
String uuid, ComputationalBase<?> dto,
+                                                                               
                           String callbackUri) {
+               return new ComputationalCallbackHandler(computationalConfigure, 
selfService, action, uuid, dto, callbackUri);
        }
 
        private String nameContainer(String user, DockerAction action, String 
exploratoryName, String name) {
diff --git 
a/services/provisioning-service/src/test/java/com/epam/dlab/backendapi/core/commands/CommandExecutorMockTest.java
 
b/services/provisioning-service/src/test/java/com/epam/dlab/backendapi/core/commands/CommandExecutorMockTest.java
index bf92609..773f4e3 100644
--- 
a/services/provisioning-service/src/test/java/com/epam/dlab/backendapi/core/commands/CommandExecutorMockTest.java
+++ 
b/services/provisioning-service/src/test/java/com/epam/dlab/backendapi/core/commands/CommandExecutorMockTest.java
@@ -70,7 +70,7 @@ public class CommandExecutorMockTest {
 
                RESTServiceMock selfService = new RESTServiceMock();
                ExploratoryCallbackHandler handler = new 
ExploratoryCallbackHandler(selfService, action,
-                               getRequestId(exec), getEdgeUserName(exec), 
getExploratoryName(exec));
+                               getRequestId(exec), getEdgeUserName(exec), 
getExploratoryName(exec), "someCallbackUri");
                handler.handle(exec.getResponseFileName(), 
Files.readAllBytes(Paths.get(exec.getResponseFileName())));
 
                try {
@@ -98,7 +98,7 @@ public class CommandExecutorMockTest {
                                getRequestId(exec), getEdgeUserName(exec), 
getExploratoryName(exec));
                */
                ResourceCallbackHandler<?> handler = new 
LibListCallbackHandler(selfService, action, getRequestId(exec),
-                               getEdgeUserName(exec), 
getExploratoryName(exec));
+                               getEdgeUserName(exec), 
getExploratoryName(exec), "someCallbackUri");
 
                handler.handle(exec.getResponseFileName(), 
Files.readAllBytes(Paths.get(exec.getResponseFileName())));
 
diff --git 
a/services/provisioning-service/src/test/java/com/epam/dlab/backendapi/core/response/handlers/dao/FileSystemCallbackHandlerDaoTest.java
 
b/services/provisioning-service/src/test/java/com/epam/dlab/backendapi/core/response/handlers/dao/FileSystemCallbackHandlerDaoTest.java
index 0dc3663..dc6377c 100644
--- 
a/services/provisioning-service/src/test/java/com/epam/dlab/backendapi/core/response/handlers/dao/FileSystemCallbackHandlerDaoTest.java
+++ 
b/services/provisioning-service/src/test/java/com/epam/dlab/backendapi/core/response/handlers/dao/FileSystemCallbackHandlerDaoTest.java
@@ -76,7 +76,8 @@ public class FileSystemCallbackHandlerDaoTest {
                when(mapper.writeValueAsBytes(any())).thenReturn("{'test': 
'test'}".getBytes());
                final PersistentFileHandler persistentFileHandler =
                                new PersistentFileHandler(new 
LibListCallbackHandler(null,
-                                               DockerAction.LIB_LIST, "uuid", 
"test", "das"), 1L, "/opt/test");
+                                               DockerAction.LIB_LIST, "uuid", 
"test", "das", "someCallbackUri"),
+                                               1L, "/opt/test");
 
                fileSystemCallbackHandlerDao.upsert(persistentFileHandler);
 
@@ -95,10 +96,12 @@ public class FileSystemCallbackHandlerDaoTest {
                                .new DockerFileHandlerCallback("sameUUID"), 1L, 
"/opt/test");
                final PersistentFileHandler persistentFileHandler2 =
                                new PersistentFileHandler(new 
LibListCallbackHandler(null,
-                                               DockerAction.LIB_LIST, 
"sameUUID", "test", "das1"), 1L, "/opt/test");
+                                               DockerAction.LIB_LIST, 
"sameUUID", "test", "das1", "someCallbackUri"),
+                                               1L, "/opt/test");
                final PersistentFileHandler persistentFileHandler3 =
                                new PersistentFileHandler(new 
LibListCallbackHandler(null,
-                                               DockerAction.LIB_LIST, 
"anotherUUID", "test", "das2"), 1L, "/opt/test");
+                                               DockerAction.LIB_LIST, 
"anotherUUID", "test", "das2", "someCallbackUri"),
+                                               1L, "/opt/test");
 
 
                fileSystemCallbackHandlerDao.upsert(persistentFileHandler1);
diff --git 
a/services/self-service/src/main/java/com/epam/dlab/backendapi/dropwizard/listeners/MongoStartupListener.java
 
b/services/self-service/src/main/java/com/epam/dlab/backendapi/dropwizard/listeners/MongoStartupListener.java
index d83bfe7..eb9c553 100644
--- 
a/services/self-service/src/main/java/com/epam/dlab/backendapi/dropwizard/listeners/MongoStartupListener.java
+++ 
b/services/self-service/src/main/java/com/epam/dlab/backendapi/dropwizard/listeners/MongoStartupListener.java
@@ -29,8 +29,8 @@ public class MongoStartupListener implements 
ServerLifecycleListener {
        private final SettingsDAO settingsDAO;
 
        @Inject
-       public MongoStartupListener(UserRoleDao userRoleDao,
-                                                               
SelfServiceApplicationConfiguration configuration, SettingsDAO settingsDAO) {
+       public MongoStartupListener(UserRoleDao userRoleDao, 
SelfServiceApplicationConfiguration configuration,
+                                                               SettingsDAO 
settingsDAO) {
                this.userRoleDao = userRoleDao;
                this.configuration = configuration;
                this.settingsDAO = settingsDAO;
@@ -50,8 +50,7 @@ public class MongoStartupListener implements 
ServerLifecycleListener {
        }
 
        private List<UserRoleDto> getRoles() {
-               try (InputStream is = 
getClass().getResourceAsStream(format(ROLES_FILE_FORMAT,
-                               configuration.getCloudProvider().getName()))) {
+               try (InputStream is = 
getClass().getResourceAsStream(format(ROLES_FILE_FORMAT, 
CloudProvider.AWS.getName()))) {
                        return MAPPER.readValue(is, new 
TypeReference<List<UserRoleDto>>() {
                        });
                } catch (IOException e) {
diff --git 
a/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/ModuleFactory.java
 
b/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/ModuleFactory.java
index 7ab2ac0..4ca089f 100644
--- 
a/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/ModuleFactory.java
+++ 
b/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/ModuleFactory.java
@@ -49,16 +49,16 @@ public class ModuleFactory {
                return new CloudProviderModule();
        }
 
-       private static CloudModule 
getCloudModule(SelfServiceApplicationConfiguration configuration) {
-               switch (configuration.getCloudProvider()) {
-                       case AWS:
-                               return new AwsSelfServiceModule();
-                       case AZURE:
-                               return new AzureSelfServiceModule();
-                       case GCP:
-                               return new GcpSelfServiceModule();
-                       default:
-                               throw new 
UnsupportedOperationException("Unsupported cloud provider " + 
configuration.getCloudProvider());
-               }
-       }
+//     private static CloudModule 
getCloudModule(SelfServiceApplicationConfiguration configuration) {
+//             switch (configuration.getCloudProvider()) {
+//                     case AWS:
+//                             return new AwsSelfServiceModule();
+//                     case AZURE:
+//                             return new AzureSelfServiceModule();
+//                     case GCP:
+//                             return new GcpSelfServiceModule();
+//                     default:
+//                             throw new 
UnsupportedOperationException("Unsupported cloud provider " + 
configuration.getCloudProvider());
+//             }
+//     }
 }
diff --git 
a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/EndpointResource.java
 
b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/EndpointResource.java
index 71873eb..6707571 100644
--- 
a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/EndpointResource.java
+++ 
b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/EndpointResource.java
@@ -153,7 +153,7 @@ public class EndpointResource {
        public Response checkEndpointUrl(@Parameter(hidden = true) @Auth 
UserInfo userInfo,
                                                                         
@Parameter(description = "Endpoint url")
                                                                         
@PathParam("url") String url) {
-               endpointService.checkEndpointUrl(userInfo, url);
+               endpointService.checkUrl(userInfo, url);
                return Response.ok().build();
        }
 }
diff --git 
a/services/self-service/src/main/java/com/epam/dlab/backendapi/schedulers/endpoint/CheckEndpointStatusScheduler.java
 
b/services/self-service/src/main/java/com/epam/dlab/backendapi/schedulers/endpoint/CheckEndpointStatusScheduler.java
index 658370a..2f34688 100644
--- 
a/services/self-service/src/main/java/com/epam/dlab/backendapi/schedulers/endpoint/CheckEndpointStatusScheduler.java
+++ 
b/services/self-service/src/main/java/com/epam/dlab/backendapi/schedulers/endpoint/CheckEndpointStatusScheduler.java
@@ -49,7 +49,7 @@ public class CheckEndpointStatusScheduler implements Job {
 
     private boolean checkUrl(UserInfo serviceUser, EndpointDTO endpoint) {
         try {
-            endpointService.checkEndpointUrl(serviceUser, endpoint.getUrl());
+            endpointService.checkUrl(serviceUser, endpoint.getUrl());
         } catch (Exception e) {
             return true;
         }
diff --git 
a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/EndpointService.java
 
b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/EndpointService.java
index dde3547..9ad6bfe 100644
--- 
a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/EndpointService.java
+++ 
b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/EndpointService.java
@@ -4,7 +4,6 @@ import com.epam.dlab.auth.UserInfo;
 import com.epam.dlab.backendapi.domain.EndpointDTO;
 import com.epam.dlab.backendapi.domain.EndpointResourcesDTO;
 import com.epam.dlab.backendapi.domain.ProjectDTO;
-import com.epam.dlab.cloud.CloudProvider;
 
 import java.util.List;
 
@@ -25,5 +24,5 @@ public interface EndpointService {
 
        void removeEndpointInAllProjects(UserInfo userInfo, String 
endpointName, List<ProjectDTO> projects);
 
-    CloudProvider checkEndpointUrl(UserInfo userInfo, String url);
+    void checkUrl(UserInfo userInfo, String url);
 }
diff --git 
a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/EndpointServiceImpl.java
 
b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/EndpointServiceImpl.java
index 812c21b..6c70927 100644
--- 
a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/EndpointServiceImpl.java
+++ 
b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/EndpointServiceImpl.java
@@ -24,10 +24,12 @@ import javax.ws.rs.core.Response;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
+import java.util.Objects;
 
 @Slf4j
 public class EndpointServiceImpl implements EndpointService {
-       private static final String HEALTH_CHECK = "healthcheck";
+       private static final String ENDPOINT = "infrastructure/endpoint";
+       private static final String HEALTH_CHECK = 
"infrastructure/endpoint/healthcheck";
        private final EndpointDAO endpointDAO;
        private final ProjectService projectService;
        private final ExploratoryDAO exploratoryDAO;
@@ -71,8 +73,11 @@ public class EndpointServiceImpl implements EndpointService {
 
        @Override
        public void create(UserInfo userInfo, EndpointDTO endpointDTO) {
-               CloudProvider cloudProvider = checkEndpointUrl(userInfo, 
endpointDTO.getUrl());
                if (!endpointDAO.get(endpointDTO.getName()).isPresent()) {
+                       CloudProvider cloudProvider = connectEndpoint(userInfo, 
endpointDTO.getUrl(), endpointDTO.getName());
+                       if (!Objects.nonNull(cloudProvider)) {
+                               throw new DlabException("CloudProvider cannot 
be null");
+                       }
                        endpointDAO.create(new 
EndpointDTO(endpointDTO.getName(), endpointDTO.getUrl(), 
endpointDTO.getAccount(),
                                        endpointDTO.getTag(), 
EndpointDTO.EndpointStatus.ACTIVE, cloudProvider));
                } else {
@@ -102,12 +107,10 @@ public class EndpointServiceImpl implements 
EndpointService {
        }
 
        @Override
-       public CloudProvider checkEndpointUrl(UserInfo userInfo, String url) {
+       public void checkUrl(UserInfo userInfo, String url) {
                Response response;
-               CloudProvider cloudProvider;
                try {
                        response = provisioningService.get(url + HEALTH_CHECK, 
userInfo.getAccessToken(), Response.class);
-                       cloudProvider = 
response.readEntity(CloudProvider.class);
                } catch (Exception e) {
                        log.error("Cannot connect to url '{}'", url);
                        throw new DlabException(String.format("Cannot connect 
to url '%s'", url), e);
@@ -116,6 +119,22 @@ public class EndpointServiceImpl implements 
EndpointService {
                        log.warn("Endpoint url {} is not valid", url);
                        throw new 
ResourceNotFoundException(String.format("Endpoint url '%s' is not valid", url));
                }
+       }
+
+       private CloudProvider connectEndpoint(UserInfo userInfo, String url, 
String name) {
+               Response response;
+               CloudProvider cloudProvider;
+               try {
+                       response = provisioningService.post(url + ENDPOINT, 
userInfo.getAccessToken(), name, Response.class);
+                       cloudProvider = 
response.readEntity(CloudProvider.class);
+               } catch (Exception e) {
+                       log.error("Cannot connect to url '{}'", url);
+                       throw new DlabException(String.format("Cannot connect 
to url '%s'", url), e);
+               }
+               if (response.getStatus() != 200) {
+                       log.warn("Endpoint connection failed, url {}", url);
+                       throw new 
ResourceNotFoundException(String.format("Endpoint url '%s' is not valid", url));
+               }
                return cloudProvider;
        }
 
diff --git 
a/services/self-service/src/main/java/com/epam/dlab/backendapi/util/RequestBuilder.java
 
b/services/self-service/src/main/java/com/epam/dlab/backendapi/util/RequestBuilder.java
index fd9e45c..bd67fab 100644
--- 
a/services/self-service/src/main/java/com/epam/dlab/backendapi/util/RequestBuilder.java
+++ 
b/services/self-service/src/main/java/com/epam/dlab/backendapi/util/RequestBuilder.java
@@ -283,6 +283,7 @@ public class RequestBuilder {
                return (T) newResourceSysBaseDTO(userInfo, 
endpointDTO.getCloudProvider(), ExploratoryActionDTO.class)
                                
.withNotebookInstanceName(userInstance.getExploratoryId())
                                .withProject(userInstance.getProject())
+                               .withEndpoint(endpointDTO.getName())
                                .withNotebookImage(userInstance.getImageName())
                                
.withApplicationName(getApplicationNameFromImage(userInstance.getImageName()))
                                
.withExploratoryName(userInstance.getExploratoryName());
@@ -307,7 +308,7 @@ public class RequestBuilder {
        public <T extends LibListComputationalDTO> T 
newLibComputationalList(UserInfo userInfo,
                                                                                
                                                                 
UserInstanceDTO userInstance,
                                                                                
                                                                 
UserComputationalResource
-                                                                               
                                                                                
 computationalResource,
+                                                                               
                                                                                
         computationalResource,
                                                                                
                                                                 EndpointDTO 
endpointDTO) {
 
                
checkInappropriateCloudProviderOrElseThrowException(endpointDTO.getCloudProvider());
@@ -316,7 +317,8 @@ public class RequestBuilder {
                                .withProject(userInstance.getProject())
                                
.withComputationalImage(computationalResource.getImageName())
                                
.withLibCacheKey(ExploratoryLibCache.libraryCacheKey(userInstance))
-                               
.withApplicationName(getApplicationNameFromImage(userInstance.getImageName()));
+                               
.withApplicationName(getApplicationNameFromImage(userInstance.getImageName()))
+                               .withEndpoint(endpointDTO.getName());
        }
 
        @SuppressWarnings("unchecked")
@@ -472,7 +474,8 @@ public class RequestBuilder {
                                .withComputationalName(computationalName)
                                
.withNotebookInstanceName(exploratory.getExploratoryId())
                                
.withApplicationName(getApplicationNameFromImage(exploratory.getImageName()))
-                               .withProject(exploratory.getProject());
+                               .withProject(exploratory.getProject())
+                               .withEndpoint(endpointDTO.getName());
        }
 
        @SuppressWarnings("unchecked")
@@ -483,7 +486,8 @@ public class RequestBuilder {
                                .withComputationalName(computationalName)
                                
.withNotebookInstanceName(exploratory.getExploratoryId())
                                
.withApplicationName(getApplicationNameFromImage(exploratory.getImageName()))
-                               .withProject(exploratory.getProject());
+                               .withProject(exploratory.getProject())
+                               .withEndpoint(endpointDTO.getName());
        }
 
        @SuppressWarnings("unchecked")


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@dlab.apache.org
For additional commands, e-mail: commits-h...@dlab.apache.org

Reply via email to