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

Reply via email to