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 <olegfuk...@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-unsubscr...@dlab.apache.org For additional commands, e-mail: commits-h...@dlab.apache.org