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/02 14:09:21 UTC

[incubator-dlab] branch feature/projects updated: DLAB-833 added API for activating/deactivating 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


The following commit(s) were added to refs/heads/feature/projects by this push:
     new 5fed1d4  DLAB-833 added API for activating/deactivating project
5fed1d4 is described below

commit 5fed1d452bf3259b20c0d2a080b355cc3162d82f
Author: bhliva <bo...@epam.com>
AuthorDate: Tue Jul 2 17:09:00 2019 +0300

    DLAB-833 added API for activating/deactivating project
---
 ...jectTerminateDTO.java => ProjectActionDTO.java} |  2 +-
 .../dlab/backendapi/resources/ProjectResource.java | 20 ++++++++++--
 .../dlab/backendapi/service/ProjectService.java    |  9 ++++--
 .../service/impl/ProjectServiceImpl.java           | 30 ++++++++++++------
 .../epam/dlab/backendapi/domain/EndpointDTO.java   |  2 ++
 .../epam/dlab/backendapi/domain/ProjectDTO.java    |  7 +++-
 .../dlab/backendapi/resources/ProjectResource.java | 37 ++++++++++++++++++++++
 .../resources/dto/ProjectActionFormDTO.java        | 10 ++++++
 .../dlab/backendapi/service/ProjectService.java    |  2 ++
 .../impl/InfrastructureInfoServiceBase.java        |  6 ++--
 .../service/impl/ProjectServiceImpl.java           | 24 +++++++++++---
 11 files changed, 126 insertions(+), 23 deletions(-)

diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/project/ProjectTerminateDTO.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/project/ProjectActionDTO.java
similarity index 77%
rename from services/dlab-model/src/main/java/com/epam/dlab/dto/project/ProjectTerminateDTO.java
rename to services/dlab-model/src/main/java/com/epam/dlab/dto/project/ProjectActionDTO.java
index 533e342..1634c11 100644
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/project/ProjectTerminateDTO.java
+++ b/services/dlab-model/src/main/java/com/epam/dlab/dto/project/ProjectActionDTO.java
@@ -7,7 +7,7 @@ import lombok.Data;
 
 @Data
 @AllArgsConstructor
-public class ProjectTerminateDTO extends ResourceBaseDTO<ProjectTerminateDTO> {
+public class ProjectActionDTO extends ResourceBaseDTO<ProjectActionDTO> {
 	@JsonProperty("project_name")
 	private final String name;
 }
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/ProjectResource.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/ProjectResource.java
index fa7aee1..005ad9f 100644
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/ProjectResource.java
+++ b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/ProjectResource.java
@@ -2,8 +2,8 @@ package com.epam.dlab.backendapi.resources;
 
 import com.epam.dlab.auth.UserInfo;
 import com.epam.dlab.backendapi.service.ProjectService;
+import com.epam.dlab.dto.project.ProjectActionDTO;
 import com.epam.dlab.dto.project.ProjectCreateDTO;
-import com.epam.dlab.dto.project.ProjectTerminateDTO;
 import com.google.inject.Inject;
 import io.dropwizard.auth.Auth;
 
@@ -35,7 +35,23 @@ public class ProjectResource {
 	@POST
 	@Consumes(MediaType.APPLICATION_JSON)
 	@Produces(MediaType.APPLICATION_JSON)
-	public Response terminateProject(@Auth UserInfo userInfo, ProjectTerminateDTO dto) {
+	public Response terminateProject(@Auth UserInfo userInfo, ProjectActionDTO dto) {
 		return Response.ok(projectService.terminate(userInfo, dto)).build();
 	}
+
+	@Path("/start")
+	@POST
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Produces(MediaType.APPLICATION_JSON)
+	public Response startProject(@Auth UserInfo userInfo, ProjectActionDTO dto) {
+		return Response.ok(projectService.start(userInfo, dto)).build();
+	}
+
+	@Path("/stop")
+	@POST
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Produces(MediaType.APPLICATION_JSON)
+	public Response stopProject(@Auth UserInfo userInfo, ProjectActionDTO dto) {
+		return Response.ok(projectService.stop(userInfo, dto)).build();
+	}
 }
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/ProjectService.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/ProjectService.java
index b18aa8c..65d4b70 100644
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/ProjectService.java
+++ b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/ProjectService.java
@@ -1,11 +1,16 @@
 package com.epam.dlab.backendapi.service;
 
 import com.epam.dlab.auth.UserInfo;
+import com.epam.dlab.dto.project.ProjectActionDTO;
 import com.epam.dlab.dto.project.ProjectCreateDTO;
-import com.epam.dlab.dto.project.ProjectTerminateDTO;
 
 public interface ProjectService {
 
 	String create(UserInfo userInfo, ProjectCreateDTO projectCreateDTO);
-	String terminate(UserInfo userInfo, ProjectTerminateDTO dto);
+
+	String terminate(UserInfo userInfo, ProjectActionDTO dto);
+
+	String start(UserInfo userInfo, ProjectActionDTO dto);
+
+	String stop(UserInfo userInfo, ProjectActionDTO dto);
 }
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 4eebcfc..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,8 +8,8 @@ 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.project.ProjectActionDTO;
 import com.epam.dlab.dto.project.ProjectCreateDTO;
-import com.epam.dlab.dto.project.ProjectTerminateDTO;
 import com.epam.dlab.rest.client.RESTService;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.google.inject.Inject;
@@ -18,6 +18,7 @@ import lombok.extern.slf4j.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";
 	@Inject
 	protected RESTService selfService;
 	@Inject
@@ -33,15 +34,26 @@ public class ProjectServiceImpl implements ProjectService {
 
 	@Override
 	public String create(UserInfo userInfo, ProjectCreateDTO dto) {
-		return executeDocker(userInfo, dto, DockerAction.CREATE, dto.getName());
+		return executeDocker(userInfo, dto, DockerAction.CREATE, dto.getName(), "project", PROJECT_IMAGE);
 	}
 
 	@Override
-	public String terminate(UserInfo userInfo, ProjectTerminateDTO dto) {
-		return executeDocker(userInfo, dto, DockerAction.TERMINATE, dto.getName());
+	public String terminate(UserInfo userInfo, ProjectActionDTO dto) {
+		return executeDocker(userInfo, dto, DockerAction.TERMINATE, dto.getName(), "project", PROJECT_IMAGE);
 	}
 
-	private String executeDocker(UserInfo userInfo, ResourceBaseDTO dto, DockerAction action, String projectName) {
+	@Override
+	public String start(UserInfo userInfo, ProjectActionDTO dto) {
+		return executeDocker(userInfo, dto, DockerAction.START, dto.getName(), "edge", EDGE_IMAGE);
+	}
+
+	@Override
+	public String stop(UserInfo userInfo, ProjectActionDTO dto) {
+		return executeDocker(userInfo, dto, DockerAction.STOP, dto.getName(), "edge", EDGE_IMAGE);
+	}
+
+	private String executeDocker(UserInfo userInfo, ResourceBaseDTO dto, DockerAction action, String projectName,
+								 String resourceType, String image) {
 		String uuid = DockerCommands.generateUUID();
 
 		folderListenerExecutor.start(configuration.getKeyLoaderDirectory(),
@@ -51,14 +63,14 @@ public class ProjectServiceImpl implements ProjectService {
 
 		RunDockerCommand runDockerCommand = new RunDockerCommand()
 				.withInteractive()
-				.withName(String.join("_", projectName, "project"))
+				.withName(String.join("_", projectName, resourceType))
 				.withVolumeForRootKeys(configuration.getKeyDirectory())
 				.withVolumeForResponse(configuration.getKeyLoaderDirectory())
-				.withVolumeForLog(configuration.getDockerLogDirectory(), "project")
-				.withResource("project")
+				.withVolumeForLog(configuration.getDockerLogDirectory(), resourceType)
+				.withResource(resourceType)
 				.withRequestId(uuid)
 				.withConfKeyName(configuration.getAdminKey())
-				.withImage(PROJECT_IMAGE)
+				.withImage(image)
 				.withAction(action);
 
 		try {
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/EndpointDTO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/EndpointDTO.java
index 15c2f18..e2cdfb3 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/EndpointDTO.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/EndpointDTO.java
@@ -1,6 +1,7 @@
 package com.epam.dlab.backendapi.domain;
 
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
 import lombok.Data;
 
 @Data
@@ -10,5 +11,6 @@ public class EndpointDTO {
 	private final String name;
 	private final String url;
 	private final String account;
+	@JsonProperty("endpoint_tag")
 	private final String tag;
 }
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 2305774..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
@@ -29,7 +29,12 @@ public class ProjectDTO {
 	public enum Status {
 		CREATING,
 		ACTIVE,
-		FAILED, TERMINATED, TERMINATING;
+		FAILED,
+		TERMINATED,
+		TERMINATING,
+		STOPPING,
+		STARTING,
+		STOPPED;
 
 		public static Status from(UserInstanceStatus userInstanceStatus) {
 			if (userInstanceStatus == UserInstanceStatus.RUNNING) {
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/ProjectResource.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/ProjectResource.java
index 3a2b3ff..d6986cd 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/ProjectResource.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/ProjectResource.java
@@ -3,6 +3,7 @@ package com.epam.dlab.backendapi.resources;
 import com.epam.dlab.auth.UserInfo;
 import com.epam.dlab.backendapi.domain.ProjectDTO;
 import com.epam.dlab.backendapi.domain.UpdateProjectBudgetDTO;
+import com.epam.dlab.backendapi.resources.dto.ProjectActionFormDTO;
 import com.epam.dlab.backendapi.service.ProjectService;
 import com.epam.dlab.rest.dto.ErrorDTO;
 import com.google.inject.Inject;
@@ -61,6 +62,42 @@ public class ProjectResource {
 				.build();
 	}
 
+	@Operation(summary = "Start project", tags = "project")
+	@ApiResponses({
+			@ApiResponse(responseCode = "202", description = "Project is starting"),
+			@ApiResponse(responseCode = "400", description = "Validation error", content = @Content(mediaType =
+					MediaType.APPLICATION_JSON,
+					schema = @Schema(implementation = ErrorDTO.class)))
+	})
+	@Path("start")
+	@POST
+	@Consumes(MediaType.APPLICATION_JSON)
+	public Response startProject(@Parameter(hidden = true) @Auth UserInfo userInfo,
+								 @Valid ProjectActionFormDTO startProjectDto) {
+		projectService.start(userInfo, startProjectDto.getProjectName());
+		return Response
+				.accepted()
+				.build();
+	}
+
+	@Operation(summary = "Stop project", tags = "project")
+	@ApiResponses({
+			@ApiResponse(responseCode = "202", description = "Project is stopping"),
+			@ApiResponse(responseCode = "400", description = "Validation error", content = @Content(mediaType =
+					MediaType.APPLICATION_JSON,
+					schema = @Schema(implementation = ErrorDTO.class)))
+	})
+	@Path("stop")
+	@POST
+	@Consumes(MediaType.APPLICATION_JSON)
+	public Response stopProject(@Parameter(hidden = true) @Auth UserInfo userInfo,
+								@Valid ProjectActionFormDTO startProjectDto) {
+		projectService.stop(userInfo, startProjectDto.getProjectName());
+		return Response
+				.accepted()
+				.build();
+	}
+
 
 	@Operation(summary = "Get project info", tags = "project")
 	@ApiResponses({
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/ProjectActionFormDTO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/ProjectActionFormDTO.java
new file mode 100644
index 0000000..ac3a561
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/ProjectActionFormDTO.java
@@ -0,0 +1,10 @@
+package com.epam.dlab.backendapi.resources.dto;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+@Data
+public class ProjectActionFormDTO {
+	@JsonProperty("project_name")
+	private final String projectName;
+}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/ProjectService.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/ProjectService.java
index 4c15d59..124e609 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/ProjectService.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/ProjectService.java
@@ -15,6 +15,8 @@ public interface ProjectService {
 	ProjectDTO get(String name);
 
 	void terminate(UserInfo userInfo, String name);
+	void start(UserInfo userInfo, String name);
+	void stop(UserInfo userInfo, String name);
 
 	void update(ProjectDTO projectDTO);
 
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 919a5fc..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
@@ -33,7 +33,6 @@ import com.epam.dlab.dto.InfrastructureMetaInfoDTO;
 import com.epam.dlab.dto.base.edge.EdgeInfo;
 import com.epam.dlab.exceptions.DlabException;
 import com.google.inject.Inject;
-import com.jcabi.manifests.Manifests;
 import lombok.extern.slf4j.Slf4j;
 import org.bson.Document;
 
@@ -96,13 +95,14 @@ public abstract class InfrastructureInfoServiceBase<T> implements Infrastructure
 
 	@Override
 	public InfrastructureMetaInfoDTO getInfrastructureMetaInfo() {
-		final String branch = Manifests.read("GIT-Branch");
+		/*final String branch = Manifests.read("GIT-Branch");
 		return InfrastructureMetaInfoDTO.builder()
 				.branch(branch)
 				.commit(Manifests.read("GIT-Commit"))
 				.version(Manifests.read("DLab-Version"))
 				.releaseNotes(String.format(RELEASE_NOTES_FORMAT, branch))
-				.build();
+				.build();*/
+		return InfrastructureMetaInfoDTO.builder().build();
 	}
 
 	protected abstract Map<String, String> getSharedInfo(T sharedInfo);
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 8970939..f401563 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
@@ -8,8 +8,8 @@ import com.epam.dlab.backendapi.domain.RequestId;
 import com.epam.dlab.backendapi.service.EnvironmentService;
 import com.epam.dlab.backendapi.service.ProjectService;
 import com.epam.dlab.constants.ServiceConsts;
+import com.epam.dlab.dto.project.ProjectActionDTO;
 import com.epam.dlab.dto.project.ProjectCreateDTO;
-import com.epam.dlab.dto.project.ProjectTerminateDTO;
 import com.epam.dlab.exceptions.ResourceConflictException;
 import com.epam.dlab.exceptions.ResourceNotFoundException;
 import com.epam.dlab.rest.client.RESTService;
@@ -29,6 +29,8 @@ public class ProjectServiceImpl implements ProjectService {
 
 	private static final String CREATE_PRJ_API = "infrastructure/project/create";
 	private static final String TERMINATE_PRJ_API = "infrastructure/project/terminate";
+	private static final String START_PRJ_API = "infrastructure/project/start";
+	private static final String STOP_PRJ_API = "infrastructure/project/stop";
 	private final ProjectDAO projectDAO;
 	private final EnvironmentService environmentService;
 	private final UserGroupDao userGroupDao;
@@ -75,12 +77,24 @@ public class ProjectServiceImpl implements ProjectService {
 
 	@Override
 	public void terminate(UserInfo userInfo, String name) {
-		terminateProjectOnCloud(userInfo, name);
+		projectActionOnCloud(userInfo, name, TERMINATE_PRJ_API);
 		environmentService.terminateProjectEnvironment(name);
 		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.STARTING);
+	}
+
+	@Override
+	public void stop(UserInfo userInfo, String name) {
+		projectActionOnCloud(userInfo, name, STOP_PRJ_API);
+		projectDAO.updateStatus(name, ProjectDTO.Status.STOPPING);
+	}
+
+	@Override
 	public void update(ProjectDTO projectDTO) {
 		if (!projectDAO.update(projectDTO)) {
 			throw projectNotFound().get();
@@ -116,10 +130,10 @@ public class ProjectServiceImpl implements ProjectService {
 	}
 
 
-	private void terminateProjectOnCloud(UserInfo user, String projectName) {
+	private void projectActionOnCloud(UserInfo user, String projectName, String provisioningApiUri) {
 		try {
-			String uuid = provisioningService.post(TERMINATE_PRJ_API, user.getAccessToken(),
-					new ProjectTerminateDTO(projectName), String.class);
+			String uuid = provisioningService.post(provisioningApiUri, user.getAccessToken(),
+					new ProjectActionDTO(projectName), String.class);
 			requestId.put(user.getName(), uuid);
 		} catch (Exception e) {
 			log.error("Can not terminate project due to: {}", e.getMessage());


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