Merge remote-tracking branch 'origin/DATALAB-1895' into DATALAB-1895

# Conflicts:
#	services/self-service/src/main/java/com/epam/datalab/backendapi/dao/ExploratoryDAO.java
#	services/self-service/src/main/java/com/epam/datalab/backendapi/schedulers/CheckInfrastructureStatusScheduler.java
#	services/self-service/src/main/java/com/epam/datalab/backendapi/service/InfrastructureInfoService.java
#	services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/InfrastructureInfoServiceImpl.java
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ResourcesStatusCallbackHandler.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ResourcesStatusCallbackHandler.java
index 53e8d8a..9ca477b 100644
--- a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ResourcesStatusCallbackHandler.java
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ResourcesStatusCallbackHandler.java
@@ -41,16 +41,14 @@
 @Slf4j
 public class ResourcesStatusCallbackHandler extends ResourceCallbackHandler<EnvStatusDTO> {
 
+    private EnvResourceList datalabResourceList;
+
     @JsonCreator
     public ResourcesStatusCallbackHandler(
-            @JacksonInject RESTService selfService, @JsonProperty("action") DockerAction
-            action, @JsonProperty("uuid") String uuid, @JsonProperty("user") String user) {
+            @JacksonInject RESTService selfService, @JsonProperty("action") DockerAction action, @JsonProperty("uuid") String uuid,
+            @JsonProperty("user") String user, EnvResourceList resourceList) {
         super(selfService, user, uuid, action);
-    }
-
-    @Override
-    protected String getCallbackURI() {
-        return INFRASTRUCTURE + STATUS_URI;
+        this.datalabResourceList = resourceList;
     }
 
     @Override
@@ -59,15 +57,15 @@
             return baseStatus;
         }
 
-        EnvResourceList resourceList;
+        EnvResourceList cloudResourceList;
         try {
-            resourceList = mapper.readValue(resultNode.toString(), EnvResourceList.class);
+            cloudResourceList = mapper.readValue(resultNode.toString(), EnvResourceList.class);
         } catch (IOException e) {
-            throw new DatalabException("Docker response for UUID " + getUUID() + " not valid: " + e.getLocalizedMessage()
-                    , e);
+            throw new DatalabException("Docker response for UUID " + getUUID() + " not valid: " + e.getLocalizedMessage(), e);
         }
 
-        baseStatus.withResourceList(resourceList)
+        baseStatus
+                .withResourceList(cloudResourceList)
                 .withUptime(Date.from(Instant.now()));
 
         log.trace("Inner status {}", baseStatus);
@@ -76,17 +74,22 @@
     }
 
     @Override
-    public boolean handle(String fileName, byte[] content) throws Exception {
+    public boolean handle(String fileName, byte[] content) {
         try {
             return super.handle(fileName, content);
         } catch (Exception e) {
-            log.warn("Could not retrive the status of resources for UUID {} and user {}: {}",
+            log.warn("Could not retrieve the status of resources for UUID {} and user {}: {}",
                     getUUID(), getUser(), e.getLocalizedMessage(), e);
         }
         return true; // Always necessary return true for status response
     }
 
     @Override
+    protected String getCallbackURI() {
+        return INFRASTRUCTURE + STATUS_URI;
+    }
+
+    @Override
     public void handleError(String errorMessage) {
         // Nothing action for status response
     }
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/base/InfrastructureService.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/base/InfrastructureService.java
index e9c29ce..6a2d870 100644
--- a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/base/InfrastructureService.java
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/base/InfrastructureService.java
@@ -33,6 +33,7 @@
 import com.epam.datalab.cloud.CloudProvider;
 import com.epam.datalab.dto.UserEnvironmentResources;
 import com.epam.datalab.dto.status.EnvResource;
+import com.epam.datalab.dto.status.EnvResourceList;
 import com.epam.datalab.exceptions.DatalabException;
 import com.epam.datalab.process.model.ProcessInfo;
 import com.epam.datalab.rest.client.RESTService;
@@ -68,7 +69,7 @@
         String uuid = DockerCommands.generateUUID();
         folderListenerExecutor.start(configuration.getImagesDirectory(),
                 configuration.getRequestEnvStatusTimeout(),
-                getFileHandlerCallback(dockerAction, uuid, iamUser));
+                getFileHandlerCallback(dockerAction, uuid, iamUser, dto.getResourceList()));
         try {
 
             removeResourcesWithRunningContainers(username, dto);
@@ -143,8 +144,8 @@
         return runningContainerNames.stream().noneMatch(container -> container.matches(regex));
     }
 
-    protected FileHandlerCallback getFileHandlerCallback(DockerAction action, String uuid, String user) {
-        return new ResourcesStatusCallbackHandler(selfService, action, uuid, user);
+    protected FileHandlerCallback getFileHandlerCallback(DockerAction action, String uuid, String user, EnvResourceList resourceList) {
+        return new ResourcesStatusCallbackHandler(selfService, action, uuid, user, resourceList);
     }
 
     private String nameContainer(String user, DockerAction action, String name) {
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/ExploratoryDAO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/ExploratoryDAO.java
index 2bb60c7..0657107 100644
--- a/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/ExploratoryDAO.java
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/ExploratoryDAO.java
@@ -208,27 +208,27 @@
 
     public List<UserInstanceDTO> fetchProjectExploratoriesWhereStatusNotIn(String project, String endpoint,
                                                                            UserInstanceStatus... statuses) {
-	    final List<String> statusList = statusList(statuses);
-	    return getUserInstances(
-			    and(
-					    eq(PROJECT, project),
-					    eq(ENDPOINT, endpoint),
-					    not(in(STATUS, statusList))
-			    ),
-			    false);
+        final List<String> statusList = statusList(statuses);
+        return getUserInstances(
+                and(
+                        eq(PROJECT, project),
+                        eq(ENDPOINT, endpoint),
+                        not(in(STATUS, statusList))
+                ),
+                false);
     }
 
-	public List<UserInstanceDTO> fetchExploratoriesByEndpointWhereStatusIn(List<String> endpoint, List<UserInstanceStatus> statuses,
-	                                                                       boolean computationalFieldsRequired) {
-		final List<String> exploratoryStatusList = statusList(statuses);
+    public List<UserInstanceDTO> fetchExploratoriesByEndpointWhereStatusIn(List<String> endpoints, List<UserInstanceStatus> statuses,
+                                                                           boolean computationalFieldsRequired) {
+        final List<String> exploratoryStatusList = statusList(statuses);
 
-		return getUserInstances(
-				and(
-						eq(ENDPOINT, endpoint),
-						in(STATUS, exploratoryStatusList)
-				),
-				computationalFieldsRequired);
-	}
+        return getUserInstances(
+                and(
+                        in(ENDPOINT, endpoints),
+                        in(STATUS, exploratoryStatusList)
+                ),
+                computationalFieldsRequired);
+    }
 
 	public List<UserInstanceDTO> fetchExploratoriesByEndpointWhereStatusNotIn(String endpoint, List<UserInstanceStatus> statuses,
 	                                                                          boolean computationalFieldsRequired) {
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/schedulers/CheckInfrastructureStatusScheduler.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/schedulers/CheckInfrastructureStatusScheduler.java
index da0f350..55caf85 100644
--- a/services/self-service/src/main/java/com/epam/datalab/backendapi/schedulers/CheckInfrastructureStatusScheduler.java
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/schedulers/CheckInfrastructureStatusScheduler.java
@@ -39,6 +39,7 @@
 
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -76,42 +77,41 @@
 
 		List<UserInstanceDTO> userInstanceDTOS = exploratoryDAO.fetchExploratoriesByEndpointWhereStatusIn(activeEndpoints, statusesToCheck, Boolean.TRUE);
 
-		Map<String, List<EnvResource>> hostInstanceIds = userInstanceDTOS
+		Map<String, List<EnvResource>> exploratoryAndSparkInstances = userInstanceDTOS
 				.stream()
-				.collect(Collectors.toMap(UserInstanceDTO::getEndpoint, this::getHostInstanceIds));
+				.collect(Collectors.toMap(UserInstanceDTO::getEndpoint, this::getExploratoryAndSparkInstances));
 
-		activeEndpoints.forEach(e ->
-				hostInstanceIds.merge(e, getEdgeInstanceIds(e), (v1, v2) ->
-						Stream.of(v1, v2)
-								.flatMap(Collection::stream)
-								.collect(Collectors.toList())
-				)
+		activeEndpoints.forEach(e -> {
+					List<EnvResource> hostInstances = Stream.of(getEdgeInstances(e), exploratoryAndSparkInstances.get(e))
+							.flatMap(Collection::stream)
+							.collect(Collectors.toList());
+					infrastructureInfoService.updateInfrastructureStatuses(serviceUser, e, hostInstances, Collections.emptyList());
+				}
 		);
-
-		hostInstanceIds.forEach((endpoint, ids) ->
-				infrastructureInfoService.updateInfrastructureStatuses(serviceUser, endpoint, ids));
 	}
 
-	private List<EnvResource> getHostInstanceIds(UserInstanceDTO userInstanceDTO) {
-		List<EnvResource> instanceIds = userInstanceDTO.getResources()
+	private List<EnvResource> getExploratoryAndSparkInstances(UserInstanceDTO userInstanceDTO) {
+		List<EnvResource> instances = userInstanceDTO.getResources()
 				.stream()
 				.filter(c -> DataEngineType.SPARK_STANDALONE == DataEngineType.fromDockerImageName(c.getImageName()))
 				.filter(c -> statusesToCheck.contains(UserInstanceStatus.of(c.getStatus())))
 				.map(r -> new EnvResource()
 						.withId(r.getInstanceId())
 						.withName(r.getComputationalName())
+						.withStatus(r.getStatus())
 						.withResourceType(ResourceType.COMPUTATIONAL))
 				.collect(Collectors.toList());
 
-		instanceIds.add(new EnvResource()
+		instances.add(new EnvResource()
 				.withId(userInstanceDTO.getInstanceId())
 				.withName(userInstanceDTO.getExploratoryName())
+				.withStatus(userInstanceDTO.getStatus())
 				.withResourceType(ResourceType.EXPLORATORY));
 
-		return instanceIds;
+		return instances;
 	}
 
-	private List<EnvResource> getEdgeInstanceIds(String endpoint) {
+	private List<EnvResource> getEdgeInstances(String endpoint) {
 		return projectService.getProjectsByEndpoint(endpoint)
 				.stream()
 				.map(ProjectDTO::getEndpoints)
@@ -122,6 +122,7 @@
 				.map(e -> new EnvResource()
 						.withId(e.getEdgeInfo().getInstanceId())
 						.withName(e.getName())
+						.withStatus(e.getStatus().toString())
 						.withResourceType(ResourceType.EDGE)
 				)
 				.collect(Collectors.toList());
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/InfrastructureInfoService.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/InfrastructureInfoService.java
index fb49c77..b8950ef 100644
--- a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/InfrastructureInfoService.java
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/InfrastructureInfoService.java
@@ -34,5 +34,5 @@
 
     InfrastructureMetaInfoDTO getInfrastructureMetaInfo();
 
-    void updateInfrastructureStatuses(UserInfo user, String endpoint, List<EnvResource> instanceIds);
+    void updateInfrastructureStatuses(UserInfo user, String endpoint, List<EnvResource> hostInstanceIds, List<EnvResource> clusterInstanceIds);
 }
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/InfrastructureInfoServiceImpl.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/InfrastructureInfoServiceImpl.java
index ce81180..efd4088 100644
--- a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/InfrastructureInfoServiceImpl.java
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/InfrastructureInfoServiceImpl.java
@@ -146,20 +146,16 @@
     }
 
     @Override
-    public void updateInfrastructureStatuses(UserInfo user, String endpoint, List<EnvResource> instanceIds) {
-        try {
-            EnvResourceList envResourceList = new EnvResourceList()
-//                    .withClusterList(envResources)
-                    .withHostList(instanceIds);
+    public void updateInfrastructureStatuses(UserInfo user, String endpoint, List<EnvResource> hostInstances, List<EnvResource> clusterInstances) {
+        EnvResourceList envResourceList = new EnvResourceList()
+                .withClusterList(clusterInstances)
+                .withHostList(hostInstances);
 
-            EndpointDTO endpointDTO = endpointService.get(endpoint);
-            String uuid = provisioningService.post(endpointDTO.getUrl() + INFRASTRUCTURE_STAUS, user.getAccessToken(),
-                    requestBuilder.newInfrastructureStatus(user.getName(), endpointDTO.getCloudProvider(), envResourceList),
-                    String.class);
-            requestId.put(user.getName(), uuid);
-        } catch (Exception e) {
-            log.error("Can not post to {} project due to: {}", endpoint, e.getMessage(), e);
-        }
+        EndpointDTO endpointDTO = endpointService.get(endpoint);
+        String uuid = provisioningService.post(endpointDTO.getUrl() + INFRASTRUCTURE_STAUS, user.getAccessToken(),
+                requestBuilder.newInfrastructureStatus(user.getName(), endpointDTO.getCloudProvider(), envResourceList),
+                String.class);
+        requestId.put(user.getName(), uuid);
     }
 
     private List<BillingReport> getExploratoryBillingData(List<UserInstanceDTO> exploratories) {