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/04 13:35:36 UTC

[incubator-dlab] 01/02: 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 feature/projects
in repository https://gitbox.apache.org/repos/asf/incubator-dlab.git

commit ba717679e6dc810fd137c2dc93e21a9328c44fb2
Author: bhliva <bo...@epam.com>
AuthorDate: Thu Jul 4 15:48:09 2019 +0300

    DLAB-841 modified API to return edge info per project
---
 .../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   |   4 +-
 .../epam/dlab/backendapi/domain/ProjectDTO.java    |  22 ++-
 .../resources/InfrastructureInfoResource.java      |   5 +-
 .../resources/callback/ProjectCallback.java        |   2 +-
 ...ureInfo.java => ProjectInfrastructureInfo.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, 95 insertions(+), 271 deletions(-)

diff --git a/infrastructure-provisioning/src/general/scripts/aws/edge_configure.py b/infrastructure-provisioning/src/general/scripts/aws/edge_configure.py
index c215fd2..294a27e 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/edge_configure.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/edge_configure.py
@@ -246,6 +246,7 @@ 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 19ae1cc..ddcf8c4 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,47 +22,49 @@ 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
deleted file mode 100644
index 0bf1c20..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/base/project/ProjectEdgeInfo.java
+++ /dev/null
@@ -1,28 +0,0 @@
-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 c1e6827..8d9bf8f 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,6 +1,7 @@
 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;
@@ -8,7 +9,7 @@ import lombok.Data;
 @Data
 @JsonIgnoreProperties(ignoreUnknown = true)
 public class ProjectResult extends StatusBaseDTO<ProjectResult> {
-	private ProjectEdgeInfo edgeInfo;
+	private EdgeInfo edgeInfo;
 	@JsonProperty("project_name")
 	private String projectName;
 
diff --git a/services/provisioning-service/provisioning.yml b/services/provisioning-service/provisioning.yml
index 7e56267..6fef93d 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: true
+      validateCerts: false
       keyStorePath: ${KEY_STORE_PATH}
       keyStorePassword: ${KEY_STORE_PASSWORD}
       trustStorePath: ${TRUST_STORE_PATH}
@@ -66,7 +66,7 @@ server:
     - type: https
       port: 8085
       certAlias: dlab
-      validateCerts: true
+      validateCerts: false
       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 71a21e1..d6b1f71 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.project.ProjectEdgeInfo;
+import com.epam.dlab.dto.base.edge.EdgeInfo;
 import com.epam.dlab.dto.base.project.ProjectResult;
 import com.epam.dlab.exceptions.DlabException;
 import com.epam.dlab.rest.client.RESTService;
@@ -16,12 +16,15 @@ 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) {
+								  String uuid, DockerAction action, String callbackUri, String projectName,
+								  Class<? extends EdgeInfo> clazz) {
 		super(systemUserInfoService, selfService, user, uuid, action);
 		this.callbackUri = callbackUri;
 		this.projectName = projectName;
+		this.clazz = clazz;
 	}
 
 	@Override
@@ -35,7 +38,7 @@ public class ProjectCallbackHandler extends ResourceCallbackHandler<ProjectResul
 		if (resultNode != null && getAction() == DockerAction.CREATE
 				&& UserInstanceStatus.of(baseStatus.getStatus()) != UserInstanceStatus.FAILED) {
 			try {
-				final ProjectEdgeInfo projectEdgeInfo = mapper.readValue(resultNode.toString(), ProjectEdgeInfo.class);
+				final EdgeInfo projectEdgeInfo = mapper.readValue(resultNode.toString(), clazz);
 				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 c0a1335..7e53c97 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,6 +8,7 @@ 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;
@@ -19,6 +20,7 @@ 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
@@ -59,7 +61,7 @@ public class ProjectServiceImpl implements ProjectService {
 		folderListenerExecutor.start(configuration.getKeyLoaderDirectory(),
 				configuration.getKeyLoaderPollTimeout(),
 				new ProjectCallbackHandler(systemUserInfoService, selfService, userInfo.getName(), uuid,
-						action, "/api/project/status", projectName));
+						action, CALLBACK_URI, projectName, EdgeInfoGcp.class));
 
 		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 9f59b6d..31ca8e5 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,7 +48,8 @@
       "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}"
+      "project_name": "${PROJECT_NAME}",
+      "@class": "com.epam.dlab.dto.gcp.edge.EdgeInfoGcp"
     },
     "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 0532f17..e8f428b 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,7 +2,7 @@ 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.dto.base.edge.EdgeInfo;
 
 import java.util.List;
 import java.util.Optional;
@@ -17,7 +17,7 @@ public interface ProjectDAO {
 
 	void updateStatus(String projectName, ProjectDTO.Status status);
 
-	void updateEdgeInfoAndStatus(String projectName, ProjectEdgeInfo edgeInfo, ProjectDTO.Status status);
+	void updateEdgeInfoAndStatus(String projectName, EdgeInfo 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 484438d..f54cbc6 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
@@ -2,7 +2,7 @@ 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.dto.base.edge.EdgeInfo;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Sets;
 import com.google.inject.Inject;
@@ -55,7 +55,7 @@ public class ProjectDAOImpl extends BaseDAO implements ProjectDAO {
 	}
 
 	@Override
-	public void updateEdgeInfoAndStatus(String projectName, ProjectEdgeInfo edgeInfo, ProjectDTO.Status status) {
+	public void updateEdgeInfoAndStatus(String projectName, EdgeInfo 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 2354857..631cc99 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,6 +1,7 @@
 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;
 
@@ -24,21 +25,32 @@ 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,
-		TERMINATED,
-		TERMINATING,
-		STOPPING,
-		STARTING,
-		STOPPED;
+		DELETED,
+		DELETING,
+		DEACTIVATING,
+		ACTIVATING,
+		NOT_ACTIVE;
 
 		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 daec244..6a7efc0 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.InfrastructureInfo;
+import com.epam.dlab.backendapi.resources.dto.ProjectInfrastructureInfo;
 import com.epam.dlab.backendapi.resources.swagger.SwaggerSecurityInfo;
 import com.epam.dlab.backendapi.roles.UserRoles;
 import com.epam.dlab.backendapi.service.InfrastructureInfoService;
@@ -33,6 +33,7 @@ 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.
@@ -84,7 +85,7 @@ public class InfrastructureInfoResource {
 	@GET
 	@Path("/info")
 	@ApiOperation("Returns list of user's resources")
-	public InfrastructureInfo getUserResources(@ApiParam(hidden = true) @Auth UserInfo userInfo) {
+	public List<ProjectInfrastructureInfo> 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 a1b0039..60ef82b 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.CREATED == status) {
+		if (UserInstanceStatus.RUNNING == 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/InfrastructureInfo.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/ProjectInfrastructureInfo.java
similarity index 93%
rename from services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/InfrastructureInfo.java
rename to services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/ProjectInfrastructureInfo.java
index 3143473..9fa3a02 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/InfrastructureInfo.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/ProjectInfrastructureInfo.java
@@ -28,7 +28,9 @@ import java.util.Map;
 
 @AllArgsConstructor
 @ToString
-public class InfrastructureInfo {
+public class ProjectInfrastructureInfo {
+    @JsonProperty
+    private String project;
     @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 5fcd194..55661c7 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,4 +30,6 @@ 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 64e45be..aa23d1d 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,11 +21,13 @@ 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.InfrastructureInfo;
+import com.epam.dlab.backendapi.resources.dto.ProjectInfrastructureInfo;
 import com.epam.dlab.dto.InfrastructureMetaInfoDTO;
 
+import java.util.List;
+
 public interface InfrastructureInfoService {
-	InfrastructureInfo getUserResources(String user);
+	List<ProjectInfrastructureInfo> 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 d0de247..e62b52f 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,6 +22,7 @@ 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;
@@ -44,6 +45,8 @@ public class EdgeServiceImpl implements EdgeService {
 
 	@Inject
 	private KeyDAO keyDAO;
+	@Inject
+	private ProjectDAO projectDAO;
 
 	@Inject
 	@Named(ServiceConsts.PROVISIONING_SERVICE_NAME)
@@ -122,6 +125,11 @@ 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 3ba548e..eaeab69 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.InfrastructureInfo;
+import com.epam.dlab.backendapi.resources.dto.ProjectInfrastructureInfo;
 import com.epam.dlab.backendapi.service.InfrastructureInfoService;
 import com.epam.dlab.backendapi.service.ProjectService;
 import com.epam.dlab.dto.InfrastructureMetaInfoDTO;
@@ -36,7 +36,10 @@ 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 {
@@ -63,12 +66,20 @@ public abstract class InfrastructureInfoServiceBase<T> implements Infrastructure
 	}
 
 	@Override
-	public InfrastructureInfo getUserResources(String user) {
+	public List<ProjectInfrastructureInfo> getUserResources(String user) {
 		log.debug("Loading list of provisioned resources for user {}", user);
 		try {
 			Iterable<Document> documents = expDAO.findExploratory(user);
-			EdgeInfo edgeInfo = keyDAO.getEdgeInfo(user);
-			return new InfrastructureInfo(getSharedInfo(edgeInfo), documents);
+
+			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());
 		} 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 f401563..9de3dea 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
@@ -79,19 +79,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.TERMINATING);
+		projectDAO.updateStatus(name, ProjectDTO.Status.DELETING);
 	}
 
 	@Override
 	public void start(UserInfo userInfo, String name) {
 		projectActionOnCloud(userInfo, name, START_PRJ_API);
-		projectDAO.updateStatus(name, ProjectDTO.Status.STARTING);
+		projectDAO.updateStatus(name, ProjectDTO.Status.ACTIVATING);
 	}
 
 	@Override
 	public void stop(UserInfo userInfo, String name) {
 		projectActionOnCloud(userInfo, name, STOP_PRJ_API);
-		projectDAO.updateStatus(name, ProjectDTO.Status.STOPPING);
+		projectDAO.updateStatus(name, ProjectDTO.Status.DEACTIVATING);
 	}
 
 	@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 e2ab690..b92335e 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,7 +21,6 @@ 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;
@@ -35,7 +34,6 @@ 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;
@@ -157,42 +155,6 @@ 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() {
@@ -223,7 +185,8 @@ 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());
 	}
 
@@ -232,8 +195,4 @@ 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
deleted file mode 100644
index 2c7d127..0000000
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/InfrastructureInfoServiceBaseTest.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * 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