You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dlab.apache.org by of...@apache.org on 2020/01/15 14:29:38 UTC

[incubator-dlab] branch multiple-cloud updated: Updated provisioning callbacks

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 <ol...@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-unsubscribe@dlab.apache.org
For additional commands, e-mail: commits-help@dlab.apache.org