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

[incubator-dlab] branch DLAB-1321 updated: [DLAB-1320] Convey all resources which will be terminated on confirmation dialog

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

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


The following commit(s) were added to refs/heads/DLAB-1321 by this push:
     new d14c358  [DLAB-1320] Convey all resources which will be terminated on confirmation dialog
d14c358 is described below

commit d14c35815fb94cd9509ab0643b903210d1883c77
Author: Oleh Fuks <ol...@gmail.com>
AuthorDate: Fri Dec 13 14:40:49 2019 +0200

    [DLAB-1320] Convey all resources which will be terminated on confirmation dialog
---
 .../epam/dlab/backendapi/dao/ExploratoryDAO.java   | 18 +++++++++-
 .../com/epam/dlab/backendapi/dao/ProjectDAO.java   |  2 ++
 .../epam/dlab/backendapi/dao/ProjectDAOImpl.java   |  5 +++
 .../backendapi/resources/EndpointResource.java     |  6 ++--
 .../dlab/backendapi/service/EndpointService.java   |  6 +++-
 .../dlab/backendapi/service/ProjectService.java    |  4 +++
 .../service/impl/EndpointServiceImpl.java          | 36 ++++++++++++++++++--
 .../service/impl/ProjectServiceImpl.java           | 39 ++++++++++++++--------
 8 files changed, 96 insertions(+), 20 deletions(-)

diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ExploratoryDAO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ExploratoryDAO.java
index 944c155..cba6b74 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ExploratoryDAO.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ExploratoryDAO.java
@@ -68,6 +68,7 @@ public class ExploratoryDAO extends BaseDAO {
 	public static final String EXPLORATORY_NOT_FOUND_MSG = "Exploratory for user %s with name %s not found";
 	private static final String EXPLORATORY_LAST_ACTIVITY = "last_activity";
 	private static final String PROJECT = "project";
+	private static final String ENDPOINT = "endpoint";
 
 	public ExploratoryDAO() {
 		log.info("{} is initialized", getClass().getSimpleName());
@@ -187,6 +188,21 @@ public class ExploratoryDAO extends BaseDAO {
 				false);
 	}
 
+	public List<UserInstanceDTO> fetchProjectEndpointExploratoriesWhereStatusIn(String project, List<String> endpoints,
+																				List<UserInstanceStatus> exploratoryStatuses,
+																				UserInstanceStatus... computationalStatuses) {
+		final List<String> exploratoryStatusList = statusList(exploratoryStatuses);
+		final List<String> computationalStatusList = statusList(computationalStatuses);
+		return getUserInstances(
+				and(
+						eq(PROJECT, project),
+						in(ENDPOINT, endpoints),
+						or(in(STATUS, exploratoryStatusList),
+								in(COMPUTATIONAL_RESOURCES + "." + STATUS, computationalStatusList))
+				),
+				false);
+	}
+
 	/**
 	 * Finds and returns the info of all user's notebooks whose status is absent among predefined ones.
 	 *
@@ -209,7 +225,7 @@ public class ExploratoryDAO extends BaseDAO {
 		return getUserInstances(
 				and(
 						eq(PROJECT, project),
-						eq("endpoint", endpoint),
+						eq(ENDPOINT, endpoint),
 						not(in(STATUS, statusList))
 				),
 				false);
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 a9a89f5..245df5b 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
@@ -28,6 +28,8 @@ public interface ProjectDAO {
 
 	Optional<ProjectDTO> get(String name);
 
+	List<ProjectDTO> getProjectsByEndpoint(String endpointName);
+
 	boolean update(ProjectDTO projectDTO);
 
 	void remove(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 a74a07b..1e86808 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
@@ -99,6 +99,11 @@ public class ProjectDAOImpl extends BaseDAO implements ProjectDAO {
 	}
 
 	@Override
+	public List<ProjectDTO> getProjectsByEndpoint(String endpointName) {
+		return find(PROJECTS_COLLECTION, elemMatch(ENDPOINTS, eq("name", endpointName)), ProjectDTO.class);
+	}
+
+	@Override
 	public boolean update(ProjectDTO projectDTO) {
 		BasicDBObject updateProject = new BasicDBObject();
 		updateProject.put(GROUPS, projectDTO.getGroups());
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/EndpointResource.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/EndpointResource.java
index ff206df..d3ccf57 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/EndpointResource.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/EndpointResource.java
@@ -101,8 +101,10 @@ public class EndpointResource {
 	@Path("{name}")
 	public Response removeEndpoint(@Parameter(hidden = true) @Auth UserInfo userInfo,
 								   @Parameter(description = "Endpoint name")
-								   @PathParam("name") String name) {
-		endpointService.remove(name);
+								   @PathParam("name") String name,
+								   @Parameter(description = "Delete endpoint only or with related resources")
+								   @QueryParam("with-resources") @DefaultValue("true") boolean withResources) {
+		endpointService.remove(userInfo, name, withResources);
 		return Response.ok().build();
 	}
 }
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/EndpointService.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/EndpointService.java
index fca6c5d..61f663e 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/EndpointService.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/EndpointService.java
@@ -1,14 +1,18 @@
 package com.epam.dlab.backendapi.service;
 
+import com.epam.dlab.auth.UserInfo;
 import com.epam.dlab.backendapi.domain.EndpointDTO;
 
 import java.util.List;
 
 public interface EndpointService {
 	List<EndpointDTO> getEndpoints();
+
 	EndpointDTO get(String name);
 
 	void create(EndpointDTO endpointDTO);
 
-	void remove(String name);
+	void remove(UserInfo userInfo, String name, boolean withResources);
+
+	void removeEndpointInAllProjects(UserInfo userInfo, String endpointName);
 }
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 bc1dea0..e01280c 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
@@ -16,6 +16,8 @@ public interface ProjectService {
 
 	List<ProjectDTO> getProjectsWithStatus(ProjectDTO.Status status);
 
+	List<ProjectDTO> getProjectsByEndpoint(String endpointName);
+
 	void create(UserInfo userInfo, ProjectDTO projectDTO);
 
 	ProjectDTO get(String name);
@@ -37,4 +39,6 @@ public interface ProjectService {
 	void updateBudget(List<ProjectDTO> projects);
 
 	boolean isAnyProjectAssigned(UserInfo userInfo);
+
+	boolean checkExploratoriesAndComputationalProgress(String projectName, List<String> endpoints);
 }
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/EndpointServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/EndpointServiceImpl.java
index fd9273c..2414c9f 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/EndpointServiceImpl.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/EndpointServiceImpl.java
@@ -1,20 +1,28 @@
 package com.epam.dlab.backendapi.service.impl;
 
+import com.epam.dlab.auth.UserInfo;
 import com.epam.dlab.backendapi.dao.EndpointDAO;
 import com.epam.dlab.backendapi.domain.EndpointDTO;
+import com.epam.dlab.backendapi.domain.ProjectDTO;
 import com.epam.dlab.backendapi.service.EndpointService;
+import com.epam.dlab.backendapi.service.ProjectService;
+import com.epam.dlab.dto.UserInstanceStatus;
 import com.epam.dlab.exceptions.ResourceConflictException;
 import com.epam.dlab.exceptions.ResourceNotFoundException;
 import com.google.inject.Inject;
 
+import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 
 public class EndpointServiceImpl implements EndpointService {
 	private final EndpointDAO endpointDAO;
+	private final ProjectService projectService;
 
 	@Inject
-	public EndpointServiceImpl(EndpointDAO endpointDAO) {
+	public EndpointServiceImpl(EndpointDAO endpointDAO, ProjectService projectService) {
 		this.endpointDAO = endpointDAO;
+		this.projectService = projectService;
 	}
 
 	@Override
@@ -38,7 +46,31 @@ public class EndpointServiceImpl implements EndpointService {
 	}
 
 	@Override
-	public void remove(String name) {
+	public void remove(UserInfo userInfo, String name, boolean withResources) {
+		if (withResources) {
+			removeEndpointInAllProjects(userInfo, name);
+		}
 		endpointDAO.remove(name);
 	}
+
+	@Override
+	public void removeEndpointInAllProjects(UserInfo userInfo, String endpointName) {
+		List<ProjectDTO> projects = projectService.getProjectsByEndpoint(endpointName);
+		checkProjectEndpointResourcesStatuses(projects, endpointName);
+
+		projects.forEach(project -> projectService.terminateEndpoint(userInfo, endpointName, project.getName()));
+	}
+
+	private void checkProjectEndpointResourcesStatuses(List<ProjectDTO> projects, String endpoint) {
+		boolean isTerminationEnabled = projects.stream().anyMatch(p ->
+				!projectService.checkExploratoriesAndComputationalProgress(p.getName(), Collections.singletonList(endpoint)) ||
+						p.getEndpoints().stream().anyMatch(e -> e.getName().equals(endpoint) &&
+								Arrays.asList(UserInstanceStatus.CREATING, UserInstanceStatus.STARTING, UserInstanceStatus.STOPPING,
+										UserInstanceStatus.TERMINATING).contains(e.getStatus())));
+
+		if (isTerminationEnabled) {
+			throw new ResourceConflictException(("Can not terminate resources of endpoint because one of project " +
+					"resource is in processing stage"));
+		}
+	}
 }
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 b3c3665..16a57e0 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
@@ -17,7 +17,6 @@ import com.epam.dlab.backendapi.service.ProjectService;
 import com.epam.dlab.backendapi.service.SecurityService;
 import com.epam.dlab.backendapi.util.RequestBuilder;
 import com.epam.dlab.constants.ServiceConsts;
-import com.epam.dlab.dto.UserInstanceDTO;
 import com.epam.dlab.dto.UserInstanceStatus;
 import com.epam.dlab.exceptions.ResourceConflictException;
 import com.epam.dlab.exceptions.ResourceNotFoundException;
@@ -96,6 +95,11 @@ public class ProjectServiceImpl implements ProjectService {
 		return projectDAO.getProjectsWithStatus(status);
 	}
 
+	@Override
+	public List<ProjectDTO> getProjectsByEndpoint(String endpointName) {
+		return projectDAO.getProjectsByEndpoint(endpointName);
+	}
+
 	@BudgetLimited
 	@Override
 	public void create(UserInfo user, ProjectDTO projectDTO) {
@@ -122,9 +126,10 @@ public class ProjectServiceImpl implements ProjectService {
 
 	@Override
 	public void terminateProject(UserInfo userInfo, String name) {
-		checkProjectRelatedResourcesInProgress(name, TERMINATE_ACTION);
-		get(name).getEndpoints()
-				.stream()
+		List<ProjectEndpointDTO> endpoints = get(name).getEndpoints();
+		checkProjectRelatedResourcesInProgress(name, endpoints, TERMINATE_ACTION);
+
+		endpoints.stream()
 				.map(ProjectEndpointDTO::getName)
 				.forEach(endpoint -> terminateEndpoint(userInfo, endpoint, name));
 	}
@@ -144,12 +149,13 @@ public class ProjectServiceImpl implements ProjectService {
 
 	@Override
 	public void stopWithResources(UserInfo userInfo, String projectName) {
-		checkProjectRelatedResourcesInProgress(projectName, STOP_ACTION);
+		List<ProjectEndpointDTO> endpoints = get(projectName).getEndpoints();
+		checkProjectRelatedResourcesInProgress(projectName, endpoints, STOP_ACTION);
 
 		exploratoryDAO.fetchRunningExploratoryFieldsForProject(projectName).forEach(e ->
 				exploratoryService.stop(new UserInfo(e.getUser(), userInfo.getAccessToken()), e.getExploratoryName()));
 
-		get(projectName).getEndpoints().stream().filter(e -> !Arrays.asList(UserInstanceStatus.TERMINATED,
+		endpoints.stream().filter(e -> !Arrays.asList(UserInstanceStatus.TERMINATED,
 				UserInstanceStatus.TERMINATING, UserInstanceStatus.STOPPED).contains(e.getStatus()))
 				.forEach(e -> stop(userInfo, e.getName(), projectName));
 	}
@@ -190,6 +196,15 @@ public class ProjectServiceImpl implements ProjectService {
 		return projectDAO.isAnyProjectAssigned(userGroups);
 	}
 
+	@Override
+	public boolean checkExploratoriesAndComputationalProgress(String projectName, List<String> endpoints) {
+		return exploratoryDAO.fetchProjectEndpointExploratoriesWhereStatusIn(projectName, endpoints, Arrays.asList(
+				UserInstanceStatus.CREATING, UserInstanceStatus.STARTING, UserInstanceStatus.CREATING_IMAGE,
+				UserInstanceStatus.RECONFIGURING), UserInstanceStatus.CREATING, UserInstanceStatus.CONFIGURING,
+				UserInstanceStatus.STARTING, UserInstanceStatus.RECONFIGURING, UserInstanceStatus.CREATING_IMAGE)
+				.isEmpty();
+	}
+
 	private void createProjectOnCloud(UserInfo user, ProjectDTO projectDTO) {
 		try {
 			projectDTO.getEndpoints().forEach(endpoint -> createEndpoint(user, projectDTO,
@@ -220,17 +235,13 @@ public class ProjectServiceImpl implements ProjectService {
 		}
 	}
 
-	private void checkProjectRelatedResourcesInProgress(String projectName, String action) {
-        boolean edgeProgress = get(projectName).getEndpoints().stream().anyMatch(e ->
+	private void checkProjectRelatedResourcesInProgress(String projectName, List<ProjectEndpointDTO> endpoints, String action) {
+        boolean edgeProgress = endpoints.stream().anyMatch(e ->
                 Arrays.asList(UserInstanceStatus.CREATING, UserInstanceStatus.STARTING, UserInstanceStatus.STOPPING,
                         UserInstanceStatus.TERMINATING).contains(e.getStatus()));
 
-		List<UserInstanceDTO> userInstanceDTOs = exploratoryDAO.fetchProjectExploratoriesWhereStatusIn(projectName,
-				Arrays.asList(UserInstanceStatus.CREATING, UserInstanceStatus.STARTING,
-                        UserInstanceStatus.CREATING_IMAGE, UserInstanceStatus.RECONFIGURING),
-                UserInstanceStatus.CREATING, UserInstanceStatus.CONFIGURING, UserInstanceStatus.STARTING,
-                UserInstanceStatus.RECONFIGURING, UserInstanceStatus.CREATING_IMAGE);
-        if (edgeProgress || !userInstanceDTOs.isEmpty()) {
+		List<String> endpointsName = endpoints.stream().map(ProjectEndpointDTO::getName).collect(Collectors.toList());
+		if (edgeProgress || !checkExploratoriesAndComputationalProgress(projectName, endpointsName)) {
 			throw new ResourceConflictException((String.format("Can not %s environment because one of project " +
 					"resource is in processing stage", action)));
 		}


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