You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dlab.apache.org by bh...@apache.org on 2019/07/08 13:28:08 UTC

[incubator-dlab] 01/02: Revert "DLAB-841 modified API to return edge info per project"

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

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

commit 909be8612f67866a46b0d20b696425d8b9ce33d2
Author: bhliva <bo...@epam.com>
AuthorDate: Mon Jul 8 16:17:59 2019 +0300

    Revert "DLAB-841 modified API to return edge info per project"
    
    This reverts commit ba717679
---
 .../src/general/scripts/aws/edge_configure.py      |   1 -
 .../java/com/epam/dlab/dto/base/edge/EdgeInfo.java |  32 ++---
 .../dlab/dto/base/project/ProjectEdgeInfo.java     |  28 ++++
 .../epam/dlab/dto/base/project/ProjectResult.java  |   3 +-
 services/provisioning-service/provisioning.yml     |   4 +-
 .../response/handlers/ProjectCallbackHandler.java  |   9 +-
 .../service/impl/ProjectServiceImpl.java           |   4 +-
 .../mock_response/gcp/project_create.json          |   3 +-
 .../com/epam/dlab/backendapi/dao/ProjectDAO.java   |   4 +-
 .../epam/dlab/backendapi/dao/ProjectDAOImpl.java   |   3 +-
 .../epam/dlab/backendapi/domain/ProjectDTO.java    |  22 +--
 .../resources/InfrastructureInfoResource.java      |   5 +-
 .../resources/callback/ProjectCallback.java        |   2 +-
 ...astructureInfo.java => InfrastructureInfo.java} |   4 +-
 .../epam/dlab/backendapi/service/EdgeService.java  |   2 -
 .../service/InfrastructureInfoService.java         |   6 +-
 .../backendapi/service/impl/EdgeServiceImpl.java   |   8 --
 .../impl/InfrastructureInfoServiceBase.java        |  19 +--
 .../service/impl/ProjectServiceImpl.java           |   6 +-
 .../resources/InfrastructureInfoResourceTest.java  |  45 +++++-
 .../impl/InfrastructureInfoServiceBaseTest.java    | 155 +++++++++++++++++++++
 21 files changed, 271 insertions(+), 94 deletions(-)

diff --git a/infrastructure-provisioning/src/general/scripts/aws/edge_configure.py b/infrastructure-provisioning/src/general/scripts/aws/edge_configure.py
index 294a27e..c215fd2 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/edge_configure.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/edge_configure.py
@@ -246,7 +246,6 @@ if __name__ == "__main__":
                    "notebook_subnet": edge_conf['private_subnet_cidr'],
                    "full_edge_conf": edge_conf,
                    "project_name": os.environ['project_name'],
-                   "@class": "com.epam.dlab.dto.gcp.edge.EdgeInfoGcp"
                    "Action": "Create new EDGE server"}
             print(json.dumps(res))
             result.write(json.dumps(res))
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/base/edge/EdgeInfo.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/base/edge/EdgeInfo.java
index ddcf8c4..19ae1cc 100644
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/base/edge/EdgeInfo.java
+++ b/services/dlab-model/src/main/java/com/epam/dlab/dto/base/edge/EdgeInfo.java
@@ -22,49 +22,47 @@ package com.epam.dlab.dto.base.edge;
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.annotation.JsonTypeInfo;
 import lombok.Data;
 
 @Data
 @JsonIgnoreProperties(ignoreUnknown = true)
-@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS)
 public class EdgeInfo {
-	@JsonProperty("_id")
-	@JsonInclude(JsonInclude.Include.NON_EMPTY)
-	private String id;
+    @JsonProperty("_id")
+    @JsonInclude(JsonInclude.Include.NON_EMPTY)
+    private String id;
 
-	@JsonProperty("instance_id")
-	private String instanceId;
+    @JsonProperty("instance_id")
+    private String instanceId;
 
 	@JsonProperty
-	private String hostname;
+    private String hostname;
 
 	@JsonProperty("public_ip")
-	private String publicIp;
+    private String publicIp;
 
 	@JsonProperty
-	private String ip;
+    private String ip;
 
 	@JsonProperty("key_name")
-	private String keyName;
+    private String keyName;
 
 	@JsonProperty("tunnel_port")
-	private String tunnelPort;
+    private String tunnelPort;
 
 	@JsonProperty("socks_port")
-	private String socksPort;
+    private String socksPort;
 
 	@JsonProperty("notebook_sg")
-	private String notebookSg;
+    private String notebookSg;
 
 	@JsonProperty("edge_sg")
-	private String edgeSg;
+    private String edgeSg;
 
 	@JsonProperty("notebook_subnet")
-	private String notebookSubnet;
+    private String notebookSubnet;
 
 	@JsonProperty("edge_status")
-	private String edgeStatus;
+    private String edgeStatus;
 
 	@JsonProperty("reupload_key_required")
 	private boolean reuploadKeyRequired = false;
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/base/project/ProjectEdgeInfo.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/base/project/ProjectEdgeInfo.java
new file mode 100644
index 0000000..0bf1c20
--- /dev/null
+++ b/services/dlab-model/src/main/java/com/epam/dlab/dto/base/project/ProjectEdgeInfo.java
@@ -0,0 +1,28 @@
+package com.epam.dlab.dto.base.project;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class ProjectEdgeInfo {
+	@JsonInclude(JsonInclude.Include.NON_EMPTY)
+	private String id;
+
+	@JsonProperty("instance_id")
+	private String instanceId;
+
+	@JsonProperty
+	private String hostname;
+
+	@JsonProperty("public_ip")
+	private String publicIp;
+
+	@JsonProperty
+	private String ip;
+
+	@JsonProperty("key_name")
+	private String keyName;
+}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/base/project/ProjectResult.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/base/project/ProjectResult.java
index 8d9bf8f..c1e6827 100644
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/base/project/ProjectResult.java
+++ b/services/dlab-model/src/main/java/com/epam/dlab/dto/base/project/ProjectResult.java
@@ -1,7 +1,6 @@
 package com.epam.dlab.dto.base.project;
 
 import com.epam.dlab.dto.StatusBaseDTO;
-import com.epam.dlab.dto.base.edge.EdgeInfo;
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import lombok.Data;
@@ -9,7 +8,7 @@ import lombok.Data;
 @Data
 @JsonIgnoreProperties(ignoreUnknown = true)
 public class ProjectResult extends StatusBaseDTO<ProjectResult> {
-	private EdgeInfo edgeInfo;
+	private ProjectEdgeInfo edgeInfo;
 	@JsonProperty("project_name")
 	private String projectName;
 
diff --git a/services/provisioning-service/provisioning.yml b/services/provisioning-service/provisioning.yml
index 6fef93d..7e56267 100644
--- a/services/provisioning-service/provisioning.yml
+++ b/services/provisioning-service/provisioning.yml
@@ -56,7 +56,7 @@ server:
     - type: https
       port: 8084
       certAlias: dlab
-      validateCerts: false
+      validateCerts: true
       keyStorePath: ${KEY_STORE_PATH}
       keyStorePassword: ${KEY_STORE_PASSWORD}
       trustStorePath: ${TRUST_STORE_PATH}
@@ -66,7 +66,7 @@ server:
     - type: https
       port: 8085
       certAlias: dlab
-      validateCerts: false
+      validateCerts: true
       keyStorePath: ${KEY_STORE_PATH}
       keyStorePassword: ${KEY_STORE_PASSWORD}
       trustStorePath: ${TRUST_STORE_PATH}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ProjectCallbackHandler.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ProjectCallbackHandler.java
index d6b1f71..71a21e1 100644
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ProjectCallbackHandler.java
+++ b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ProjectCallbackHandler.java
@@ -3,7 +3,7 @@ package com.epam.dlab.backendapi.core.response.handlers;
 import com.epam.dlab.auth.SystemUserInfoService;
 import com.epam.dlab.backendapi.core.commands.DockerAction;
 import com.epam.dlab.dto.UserInstanceStatus;
-import com.epam.dlab.dto.base.edge.EdgeInfo;
+import com.epam.dlab.dto.base.project.ProjectEdgeInfo;
 import com.epam.dlab.dto.base.project.ProjectResult;
 import com.epam.dlab.exceptions.DlabException;
 import com.epam.dlab.rest.client.RESTService;
@@ -16,15 +16,12 @@ public class ProjectCallbackHandler extends ResourceCallbackHandler<ProjectResul
 
 	private final String callbackUri;
 	private final String projectName;
-	private final Class<? extends EdgeInfo> clazz;
 
 	public ProjectCallbackHandler(SystemUserInfoService systemUserInfoService, RESTService selfService, String user,
-								  String uuid, DockerAction action, String callbackUri, String projectName,
-								  Class<? extends EdgeInfo> clazz) {
+								  String uuid, DockerAction action, String callbackUri, String projectName) {
 		super(systemUserInfoService, selfService, user, uuid, action);
 		this.callbackUri = callbackUri;
 		this.projectName = projectName;
-		this.clazz = clazz;
 	}
 
 	@Override
@@ -38,7 +35,7 @@ public class ProjectCallbackHandler extends ResourceCallbackHandler<ProjectResul
 		if (resultNode != null && getAction() == DockerAction.CREATE
 				&& UserInstanceStatus.of(baseStatus.getStatus()) != UserInstanceStatus.FAILED) {
 			try {
-				final EdgeInfo projectEdgeInfo = mapper.readValue(resultNode.toString(), clazz);
+				final ProjectEdgeInfo projectEdgeInfo = mapper.readValue(resultNode.toString(), ProjectEdgeInfo.class);
 				baseStatus.setEdgeInfo(projectEdgeInfo);
 			} catch (IOException e) {
 				throw new DlabException("Cannot parse the EDGE info in JSON: " + e.getLocalizedMessage(), e);
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 7e53c97..c0a1335 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
@@ -8,7 +8,6 @@ import com.epam.dlab.backendapi.core.response.folderlistener.FolderListenerExecu
 import com.epam.dlab.backendapi.core.response.handlers.ProjectCallbackHandler;
 import com.epam.dlab.backendapi.service.ProjectService;
 import com.epam.dlab.dto.ResourceBaseDTO;
-import com.epam.dlab.dto.gcp.edge.EdgeInfoGcp;
 import com.epam.dlab.dto.project.ProjectActionDTO;
 import com.epam.dlab.dto.project.ProjectCreateDTO;
 import com.epam.dlab.rest.client.RESTService;
@@ -20,7 +19,6 @@ import lombok.extern.slf4j.Slf4j;
 public class ProjectServiceImpl implements ProjectService {
 	private static final String PROJECT_IMAGE = "docker.dlab-project";
 	private static final String EDGE_IMAGE = "docker.dlab-edge";
-	private static final String CALLBACK_URI = "/api/project/status";
 	@Inject
 	protected RESTService selfService;
 	@Inject
@@ -61,7 +59,7 @@ public class ProjectServiceImpl implements ProjectService {
 		folderListenerExecutor.start(configuration.getKeyLoaderDirectory(),
 				configuration.getKeyLoaderPollTimeout(),
 				new ProjectCallbackHandler(systemUserInfoService, selfService, userInfo.getName(), uuid,
-						action, CALLBACK_URI, projectName, EdgeInfoGcp.class));
+						action, "/api/project/status", projectName));
 
 		RunDockerCommand runDockerCommand = new RunDockerCommand()
 				.withInteractive()
diff --git a/services/provisioning-service/src/main/resources/mock_response/gcp/project_create.json b/services/provisioning-service/src/main/resources/mock_response/gcp/project_create.json
index 31ca8e5..9f59b6d 100644
--- a/services/provisioning-service/src/main/resources/mock_response/gcp/project_create.json
+++ b/services/provisioning-service/src/main/resources/mock_response/gcp/project_create.json
@@ -48,8 +48,7 @@
       "user_own_bucket_name": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-bucket",
       "socks_port": "1080",
       "notebook_subnet": "10.10.16.0/24",
-      "project_name": "${PROJECT_NAME}",
-      "@class": "com.epam.dlab.dto.gcp.edge.EdgeInfoGcp"
+      "project_name" : "${PROJECT_NAME}"
     },
     "log": "/var/log/dlab/edge/edge_${EDGE_USER_NAME}_${REQUEST_ID}.log"
   },
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ProjectDAO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ProjectDAO.java
index 7624bce..25398c8 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ProjectDAO.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ProjectDAO.java
@@ -2,8 +2,8 @@ package com.epam.dlab.backendapi.dao;
 
 import com.epam.dlab.auth.UserInfo;
 import com.epam.dlab.backendapi.domain.ProjectDTO;
+import com.epam.dlab.dto.base.project.ProjectEdgeInfo;
 import com.epam.dlab.backendapi.domain.UpdateProjectDTO;
-import com.epam.dlab.dto.base.edge.EdgeInfo;
 
 import java.util.List;
 import java.util.Optional;
@@ -18,7 +18,7 @@ public interface ProjectDAO {
 
 	void updateStatus(String projectName, ProjectDTO.Status status);
 
-	void updateEdgeInfoAndStatus(String projectName, EdgeInfo edgeInfo, ProjectDTO.Status status);
+	void updateEdgeInfoAndStatus(String projectName, ProjectEdgeInfo edgeInfo, ProjectDTO.Status status);
 
 	Optional<ProjectDTO> get(String name);
 
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ProjectDAOImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ProjectDAOImpl.java
index 059d08e..8c4db13 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ProjectDAOImpl.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ProjectDAOImpl.java
@@ -4,6 +4,7 @@ import com.epam.dlab.auth.UserInfo;
 import com.epam.dlab.backendapi.domain.ProjectDTO;
 import com.epam.dlab.backendapi.domain.UpdateProjectDTO;
 import com.epam.dlab.dto.base.edge.EdgeInfo;
+import com.epam.dlab.dto.base.project.ProjectEdgeInfo;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Sets;
 import com.google.inject.Inject;
@@ -57,7 +58,7 @@ public class ProjectDAOImpl extends BaseDAO implements ProjectDAO {
 	}
 
 	@Override
-	public void updateEdgeInfoAndStatus(String projectName, EdgeInfo edgeInfo, ProjectDTO.Status status) {
+	public void updateEdgeInfoAndStatus(String projectName, ProjectEdgeInfo edgeInfo, ProjectDTO.Status status) {
 		BasicDBObject dbObject = new BasicDBObject();
 		dbObject.put(STATUS_FIELD, status.toString());
 		dbObject.put(EDGE_INFO_FIELD, convertToBson(edgeInfo));
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/ProjectDTO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/ProjectDTO.java
index 631cc99..2354857 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/ProjectDTO.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/ProjectDTO.java
@@ -1,7 +1,6 @@
 package com.epam.dlab.backendapi.domain;
 
 import com.epam.dlab.dto.UserInstanceStatus;
-import com.epam.dlab.dto.base.edge.EdgeInfo;
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 import lombok.Data;
 
@@ -25,32 +24,21 @@ public class ProjectDTO {
 	private final String tag;
 	private final Integer budget;
 	private final Status status = Status.CREATING;
-	private EdgeInfo edgeInfo;
 
 
 	public enum Status {
 		CREATING,
 		ACTIVE,
 		FAILED,
-		DELETED,
-		DELETING,
-		DEACTIVATING,
-		ACTIVATING,
-		NOT_ACTIVE;
+		TERMINATED,
+		TERMINATING,
+		STOPPING,
+		STARTING,
+		STOPPED;
 
 		public static Status from(UserInstanceStatus userInstanceStatus) {
 			if (userInstanceStatus == UserInstanceStatus.RUNNING) {
 				return ACTIVE;
-			} else if (userInstanceStatus == UserInstanceStatus.TERMINATED) {
-				return DELETED;
-			} else if (userInstanceStatus == UserInstanceStatus.TERMINATING) {
-				return DELETING;
-			} else if (userInstanceStatus == UserInstanceStatus.STOPPING) {
-				return DEACTIVATING;
-			} else if (userInstanceStatus == UserInstanceStatus.STOPPED) {
-				return NOT_ACTIVE;
-			} else if (userInstanceStatus == UserInstanceStatus.STARTING) {
-				return ACTIVATING;
 			}
 			return Status.valueOf(userInstanceStatus.name());
 		}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/InfrastructureInfoResource.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/InfrastructureInfoResource.java
index 6a7efc0..daec244 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/InfrastructureInfoResource.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/InfrastructureInfoResource.java
@@ -21,7 +21,7 @@ package com.epam.dlab.backendapi.resources;
 
 import com.epam.dlab.auth.UserInfo;
 import com.epam.dlab.backendapi.resources.dto.HealthStatusPageDTO;
-import com.epam.dlab.backendapi.resources.dto.ProjectInfrastructureInfo;
+import com.epam.dlab.backendapi.resources.dto.InfrastructureInfo;
 import com.epam.dlab.backendapi.resources.swagger.SwaggerSecurityInfo;
 import com.epam.dlab.backendapi.roles.UserRoles;
 import com.epam.dlab.backendapi.service.InfrastructureInfoService;
@@ -33,7 +33,6 @@ import lombok.extern.slf4j.Slf4j;
 import javax.ws.rs.*;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
-import java.util.List;
 
 /**
  * Provides the REST API for the basic information about infrastructure.
@@ -85,7 +84,7 @@ public class InfrastructureInfoResource {
 	@GET
 	@Path("/info")
 	@ApiOperation("Returns list of user's resources")
-	public List<ProjectInfrastructureInfo> getUserResources(@ApiParam(hidden = true) @Auth UserInfo userInfo) {
+	public InfrastructureInfo getUserResources(@ApiParam(hidden = true) @Auth UserInfo userInfo) {
 		return infrastructureInfoService.getUserResources(userInfo.getName());
 
 	}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/callback/ProjectCallback.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/callback/ProjectCallback.java
index 60ef82b..a1b0039 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/callback/ProjectCallback.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/callback/ProjectCallback.java
@@ -36,7 +36,7 @@ public class ProjectCallback {
 		requestId.checkAndRemove(projectResult.getRequestId());
 		final String projectName = projectResult.getProjectName();
 		final UserInstanceStatus status = UserInstanceStatus.of(projectResult.getStatus());
-		if (UserInstanceStatus.RUNNING == status) {
+		if (UserInstanceStatus.CREATED == status) {
 			projectDAO.updateEdgeInfoAndStatus(projectName, projectResult.getEdgeInfo(), ProjectDTO.Status.ACTIVE);
 		} else {
 			projectDAO.updateStatus(projectName, ProjectDTO.Status.from(status));
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/ProjectInfrastructureInfo.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/InfrastructureInfo.java
similarity index 93%
rename from services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/ProjectInfrastructureInfo.java
rename to services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/InfrastructureInfo.java
index 9fa3a02..3143473 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/ProjectInfrastructureInfo.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/InfrastructureInfo.java
@@ -28,9 +28,7 @@ import java.util.Map;
 
 @AllArgsConstructor
 @ToString
-public class ProjectInfrastructureInfo {
-    @JsonProperty
-    private String project;
+public class InfrastructureInfo {
     @JsonProperty
     private Map<String, String> shared;
     @JsonProperty
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/EdgeService.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/EdgeService.java
index 55661c7..5fcd194 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/EdgeService.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/EdgeService.java
@@ -30,6 +30,4 @@ public interface EdgeService {
 	String terminate(UserInfo userInfo);
 
 	void updateReuploadKeyFlag(String user, boolean reuploadKeyRequired, UserInstanceStatus... edgeStatuses);
-
-	String getEdgeInfo(UserInfo userInfo, String projectName);
 }
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/InfrastructureInfoService.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/InfrastructureInfoService.java
index aa23d1d..64e45be 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/InfrastructureInfoService.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/InfrastructureInfoService.java
@@ -21,13 +21,11 @@ package com.epam.dlab.backendapi.service;
 
 import com.epam.dlab.auth.UserInfo;
 import com.epam.dlab.backendapi.resources.dto.HealthStatusPageDTO;
-import com.epam.dlab.backendapi.resources.dto.ProjectInfrastructureInfo;
+import com.epam.dlab.backendapi.resources.dto.InfrastructureInfo;
 import com.epam.dlab.dto.InfrastructureMetaInfoDTO;
 
-import java.util.List;
-
 public interface InfrastructureInfoService {
-	List<ProjectInfrastructureInfo> getUserResources(String user);
+	InfrastructureInfo getUserResources(String user);
 
 	HealthStatusPageDTO getHeathStatus(UserInfo user, boolean fullReport, boolean isAdmin);
 
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/EdgeServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/EdgeServiceImpl.java
index e62b52f..d0de247 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/EdgeServiceImpl.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/EdgeServiceImpl.java
@@ -22,7 +22,6 @@ package com.epam.dlab.backendapi.service.impl;
 import com.epam.dlab.auth.UserInfo;
 import com.epam.dlab.backendapi.annotation.BudgetLimited;
 import com.epam.dlab.backendapi.dao.KeyDAO;
-import com.epam.dlab.backendapi.dao.ProjectDAO;
 import com.epam.dlab.backendapi.domain.RequestId;
 import com.epam.dlab.backendapi.service.EdgeService;
 import com.epam.dlab.backendapi.util.RequestBuilder;
@@ -45,8 +44,6 @@ public class EdgeServiceImpl implements EdgeService {
 
 	@Inject
 	private KeyDAO keyDAO;
-	@Inject
-	private ProjectDAO projectDAO;
 
 	@Inject
 	@Named(ServiceConsts.PROVISIONING_SERVICE_NAME)
@@ -125,11 +122,6 @@ public class EdgeServiceImpl implements EdgeService {
 		keyDAO.updateEdgeReuploadKey(user, reuploadKeyRequired, edgeStatuses);
 	}
 
-	@Override
-	public String getEdgeInfo(UserInfo userInfo, String projectName) {
-		return null;
-	}
-
 	/**
 	 * Sends the post request to the provisioning service and update the status of EDGE node.
 	 *
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/InfrastructureInfoServiceBase.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/InfrastructureInfoServiceBase.java
index eaeab69..3ba548e 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/InfrastructureInfoServiceBase.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/InfrastructureInfoServiceBase.java
@@ -26,7 +26,7 @@ import com.epam.dlab.backendapi.dao.EnvDAO;
 import com.epam.dlab.backendapi.dao.ExploratoryDAO;
 import com.epam.dlab.backendapi.dao.KeyDAO;
 import com.epam.dlab.backendapi.resources.dto.HealthStatusPageDTO;
-import com.epam.dlab.backendapi.resources.dto.ProjectInfrastructureInfo;
+import com.epam.dlab.backendapi.resources.dto.InfrastructureInfo;
 import com.epam.dlab.backendapi.service.InfrastructureInfoService;
 import com.epam.dlab.backendapi.service.ProjectService;
 import com.epam.dlab.dto.InfrastructureMetaInfoDTO;
@@ -36,10 +36,7 @@ import com.google.inject.Inject;
 import lombok.extern.slf4j.Slf4j;
 import org.bson.Document;
 
-import java.util.List;
 import java.util.Map;
-import java.util.stream.Collectors;
-import java.util.stream.StreamSupport;
 
 @Slf4j
 public abstract class InfrastructureInfoServiceBase<T> implements InfrastructureInfoService {
@@ -66,20 +63,12 @@ public abstract class InfrastructureInfoServiceBase<T> implements Infrastructure
 	}
 
 	@Override
-	public List<ProjectInfrastructureInfo> getUserResources(String user) {
+	public InfrastructureInfo getUserResources(String user) {
 		log.debug("Loading list of provisioned resources for user {}", user);
 		try {
 			Iterable<Document> documents = expDAO.findExploratory(user);
-
-			return StreamSupport.stream(documents.spliterator(),
-					false)
-					.collect(Collectors.groupingBy(d -> d.getString("project")))
-					.entrySet()
-					.stream()
-					.map(e -> new ProjectInfrastructureInfo(e.getKey(),
-							getSharedInfo(projectService.get(e.getKey()).getEdgeInfo()),
-							e.getValue()))
-					.collect(Collectors.toList());
+			EdgeInfo edgeInfo = keyDAO.getEdgeInfo(user);
+			return new InfrastructureInfo(getSharedInfo(edgeInfo), documents);
 		} catch (Exception e) {
 			log.error("Could not load list of provisioned resources for user: {}", user, e);
 			throw new DlabException("Could not load list of provisioned resources for user: ");
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ProjectServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ProjectServiceImpl.java
index 23d0e9f..02f9fc9 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ProjectServiceImpl.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ProjectServiceImpl.java
@@ -80,19 +80,19 @@ public class ProjectServiceImpl implements ProjectService {
 	public void terminate(UserInfo userInfo, String name) {
 		projectActionOnCloud(userInfo, name, TERMINATE_PRJ_API);
 		environmentService.terminateProjectEnvironment(name);
-		projectDAO.updateStatus(name, ProjectDTO.Status.DELETING);
+		projectDAO.updateStatus(name, ProjectDTO.Status.TERMINATING);
 	}
 
 	@Override
 	public void start(UserInfo userInfo, String name) {
 		projectActionOnCloud(userInfo, name, START_PRJ_API);
-		projectDAO.updateStatus(name, ProjectDTO.Status.ACTIVATING);
+		projectDAO.updateStatus(name, ProjectDTO.Status.STARTING);
 	}
 
 	@Override
 	public void stop(UserInfo userInfo, String name) {
 		projectActionOnCloud(userInfo, name, STOP_PRJ_API);
-		projectDAO.updateStatus(name, ProjectDTO.Status.DEACTIVATING);
+		projectDAO.updateStatus(name, ProjectDTO.Status.STOPPING);
 	}
 
 	@Override
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/InfrastructureInfoResourceTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/InfrastructureInfoResourceTest.java
index b92335e..e2ab690 100644
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/InfrastructureInfoResourceTest.java
+++ b/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/InfrastructureInfoResourceTest.java
@@ -21,6 +21,7 @@ package com.epam.dlab.backendapi.resources;
 
 import com.epam.dlab.auth.UserInfo;
 import com.epam.dlab.backendapi.resources.dto.HealthStatusPageDTO;
+import com.epam.dlab.backendapi.resources.dto.InfrastructureInfo;
 import com.epam.dlab.backendapi.service.InfrastructureInfoService;
 import com.epam.dlab.dto.InfrastructureMetaInfoDTO;
 import com.epam.dlab.exceptions.DlabException;
@@ -34,6 +35,7 @@ import org.junit.Test;
 import javax.ws.rs.core.HttpHeaders;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
+import java.util.Collections;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
@@ -155,6 +157,42 @@ public class InfrastructureInfoResourceTest extends TestBase {
 		verifyNoMoreInteractions(infrastructureInfoService);
 	}
 
+	@Test
+	public void getUserResources() {
+		InfrastructureInfo info = getInfrastructureInfo();
+		when(infrastructureInfoService.getUserResources(anyString())).thenReturn(info);
+		final Response response = resources.getJerseyTest()
+				.target("/infrastructure/info")
+				.request()
+				.header("Authorization", "Bearer " + TOKEN)
+				.get();
+
+		assertEquals(HttpStatus.SC_OK, response.getStatus());
+		assertEquals(info.toString(), response.readEntity(InfrastructureInfo.class).toString());
+		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+		verify(infrastructureInfoService).getUserResources(USER.toLowerCase());
+		verifyNoMoreInteractions(infrastructureInfoService);
+	}
+
+	@Test
+	public void getUserResourcesWithFailedAuth() throws AuthenticationException {
+		authFailSetup();
+		InfrastructureInfo info = getInfrastructureInfo();
+		when(infrastructureInfoService.getUserResources(anyString())).thenReturn(info);
+		final Response response = resources.getJerseyTest()
+				.target("/infrastructure/info")
+				.request()
+				.header("Authorization", "Bearer " + TOKEN)
+				.get();
+
+		assertEquals(HttpStatus.SC_OK, response.getStatus());
+		assertEquals(info.toString(), response.readEntity(InfrastructureInfo.class).toString());
+		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+		verify(infrastructureInfoService).getUserResources(USER.toLowerCase());
+		verifyNoMoreInteractions(infrastructureInfoService);
+	}
 
 	@Test
 	public void getUserResourcesWithException() {
@@ -185,8 +223,7 @@ public class InfrastructureInfoResourceTest extends TestBase {
 				.header("Authorization", "Bearer " + TOKEN)
 				.get();
 
-		final InfrastructureMetaInfoDTO infrastructureMetaInfoDTO =
-				response.readEntity(InfrastructureMetaInfoDTO.class);
+		final InfrastructureMetaInfoDTO infrastructureMetaInfoDTO = response.readEntity(InfrastructureMetaInfoDTO.class);
 		assertEquals("1.0", infrastructureMetaInfoDTO.getVersion());
 	}
 
@@ -195,4 +232,8 @@ public class InfrastructureInfoResourceTest extends TestBase {
 		hspdto.setStatus("someStatus");
 		return hspdto;
 	}
+
+	private InfrastructureInfo getInfrastructureInfo() {
+		return new InfrastructureInfo(Collections.emptyMap(), Collections.emptyList());
+	}
 }
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/InfrastructureInfoServiceBaseTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/InfrastructureInfoServiceBaseTest.java
new file mode 100644
index 0000000..2c7d127
--- /dev/null
+++ b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/InfrastructureInfoServiceBaseTest.java
@@ -0,0 +1,155 @@
+/*
+ * 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.auth.UserInfo;
+import com.epam.dlab.backendapi.SelfServiceApplicationConfiguration;
+import com.epam.dlab.backendapi.dao.BillingDAO;
+import com.epam.dlab.backendapi.dao.EnvDAO;
+import com.epam.dlab.backendapi.dao.ExploratoryDAO;
+import com.epam.dlab.backendapi.dao.KeyDAO;
+import com.epam.dlab.backendapi.resources.dto.HealthStatusEnum;
+import com.epam.dlab.backendapi.resources.dto.HealthStatusPageDTO;
+import com.epam.dlab.backendapi.resources.dto.InfrastructureInfo;
+import com.epam.dlab.backendapi.service.ProjectService;
+import com.epam.dlab.dto.base.edge.EdgeInfo;
+import com.epam.dlab.exceptions.DlabException;
+import org.bson.Document;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+
+import java.lang.reflect.Field;
+import java.util.Collections;
+
+import static org.junit.Assert.*;
+import static org.mockito.Mockito.*;
+
+@RunWith(MockitoJUnitRunner.class)
+public class InfrastructureInfoServiceBaseTest {
+
+	private final String USER = "test";
+
+	@Mock
+	private EnvDAO envDAO;
+	@Mock
+	private ExploratoryDAO expDAO;
+	@Mock
+	private KeyDAO keyDAO;
+	@Mock
+	private SelfServiceApplicationConfiguration configuration;
+	@Mock
+	private BillingDAO billingDAO;
+	@Mock
+	private ProjectService projectService;
+
+	@InjectMocks
+	private InfrastructureInfoServiceBase infrastructureInfoServiceBase = spy(InfrastructureInfoServiceBase.class);
+
+	@Test
+	public void getUserResources() throws NoSuchFieldException, IllegalAccessException {
+		Iterable<Document> documents = Collections.singletonList(new Document());
+		when(expDAO.findExploratory(anyString())).thenReturn(documents);
+
+		EdgeInfo edgeInfo = new EdgeInfo();
+		edgeInfo.setInstanceId("someId");
+		edgeInfo.setEdgeStatus("someStatus");
+		when(keyDAO.getEdgeInfo(anyString())).thenReturn(edgeInfo);
+
+		InfrastructureInfo expectedInfrastructureInfo = new InfrastructureInfo(Collections.emptyMap(), documents);
+		InfrastructureInfo actualInfrastructureInfo = infrastructureInfoServiceBase.getUserResources(USER);
+		assertNotNull(actualInfrastructureInfo);
+		assertTrue(areInfrastructureInfoObjectsEqual(actualInfrastructureInfo, expectedInfrastructureInfo));
+
+		verify(expDAO).findExploratory(USER);
+		verify(keyDAO).getEdgeInfo(USER);
+		verifyNoMoreInteractions(expDAO, keyDAO);
+	}
+
+	@Test
+	public void getUserResourcesWhenMethodGetEdgeInfoThrowsException() {
+		Iterable<Document> documents = Collections.singletonList(new Document());
+		when(expDAO.findExploratory(anyString())).thenReturn(documents);
+
+		EdgeInfo edgeInfo = new EdgeInfo();
+		edgeInfo.setInstanceId("someId");
+		edgeInfo.setEdgeStatus("someStatus");
+		doThrow(new DlabException("Edge info not found")).when(keyDAO).getEdgeInfo(anyString());
+
+		try {
+			infrastructureInfoServiceBase.getUserResources(USER);
+		} catch (DlabException e) {
+			assertEquals("Could not load list of provisioned resources for user: ", e.getMessage());
+		}
+		verify(expDAO).findExploratory(USER);
+		verify(keyDAO).getEdgeInfo(USER);
+		verifyNoMoreInteractions(expDAO, keyDAO);
+	}
+
+	@Test
+	public void getHeathStatus() {
+		when(envDAO.getHealthStatusPageDTO(anyString(), anyBoolean())).thenReturn(new HealthStatusPageDTO()
+				.withStatus(HealthStatusEnum.OK));
+		when(configuration.isBillingSchedulerEnabled()).thenReturn(false);
+		when(billingDAO.getBillingQuoteUsed()).thenReturn(10);
+
+		HealthStatusPageDTO actualHealthStatusPageDTO =
+				infrastructureInfoServiceBase.getHeathStatus(new UserInfo(USER, "token"), false, true);
+		assertNotNull(actualHealthStatusPageDTO);
+		assertEquals(HealthStatusEnum.OK.toString(), actualHealthStatusPageDTO.getStatus());
+		assertFalse(actualHealthStatusPageDTO.isBillingEnabled());
+		assertTrue(actualHealthStatusPageDTO.isAdmin());
+		assertFalse(actualHealthStatusPageDTO.isProjectAssigned());
+		assertEquals(10, actualHealthStatusPageDTO.getBillingQuoteUsed());
+
+		verify(envDAO).getHealthStatusPageDTO(USER, false);
+		verify(configuration).isBillingSchedulerEnabled();
+		verifyNoMoreInteractions(envDAO, configuration);
+	}
+
+	@Test
+	public void getHeathStatusWhenMethodGetHealthStatusPageDTOThrowsException() {
+		doThrow(new DlabException("Cannot fetch health status!"))
+				.when(envDAO).getHealthStatusPageDTO(anyString(), anyBoolean());
+		try {
+			infrastructureInfoServiceBase.getHeathStatus(new UserInfo(USER, null), false, false);
+		} catch (DlabException e) {
+			assertEquals("Cannot fetch health status!", e.getMessage());
+		}
+		verify(envDAO).getHealthStatusPageDTO(USER, false);
+		verifyNoMoreInteractions(envDAO);
+	}
+
+	private boolean areInfrastructureInfoObjectsEqual(InfrastructureInfo object1, InfrastructureInfo object2) throws
+			NoSuchFieldException, IllegalAccessException {
+		Field shared1 = object1.getClass().getDeclaredField("shared");
+		shared1.setAccessible(true);
+		Field shared2 = object2.getClass().getDeclaredField("shared");
+		shared2.setAccessible(true);
+		Field exploratory1 = object1.getClass().getDeclaredField("exploratory");
+		exploratory1.setAccessible(true);
+		Field exploratory2 = object2.getClass().getDeclaredField("exploratory");
+		exploratory2.setAccessible(true);
+		return shared1.get(object1).equals(shared2.get(object2))
+				&& exploratory1.get(object1).equals(exploratory2.get(object2));
+	}
+}


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