You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@datalab.apache.org by of...@apache.org on 2020/11/17 15:31:58 UTC

[incubator-datalab] branch develop updated: [DATALAB-2130] Fixed double terminating for edge node during endpoint disconnection (#982)

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

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


The following commit(s) were added to refs/heads/develop by this push:
     new 08c320a  [DATALAB-2130] Fixed double terminating for edge node during endpoint disconnection (#982)
08c320a is described below

commit 08c320a5131cf48a2b5ece0edc4fad75bd76d0f8
Author: Kinash Yurii <ur...@gmail.com>
AuthorDate: Tue Nov 17 17:31:48 2020 +0200

    [DATALAB-2130] Fixed double terminating for edge node during endpoint disconnection (#982)
    
    [DATALAB-2130] Fixed double terminating for edge node during endpoint disconnection
---
 .../service/impl/EndpointServiceImpl.java          | 11 +++++--
 .../service/impl/ProjectServiceImpl.java           | 36 +++++++++++++---------
 .../service/impl/EndpointServiceImplTest.java      | 35 +++++++++++++++++++++
 3 files changed, 64 insertions(+), 18 deletions(-)

diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/EndpointServiceImpl.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/EndpointServiceImpl.java
index d284c96..7d82807 100644
--- a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/EndpointServiceImpl.java
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/EndpointServiceImpl.java
@@ -53,6 +53,7 @@ import java.util.stream.Collectors;
 import static com.epam.datalab.backendapi.domain.AuditActionEnum.CONNECT;
 import static com.epam.datalab.backendapi.domain.AuditActionEnum.DISCONNECT;
 import static com.epam.datalab.backendapi.domain.AuditResourceTypeEnum.ENDPOINT;
+import static com.epam.datalab.dto.UserInstanceStatus.TERMINATED;
 
 
 @Slf4j
@@ -89,7 +90,7 @@ public class EndpointServiceImpl implements EndpointService {
     @Override
     public EndpointResourcesDTO getEndpointResources(String endpoint) {
         List<UserInstanceDTO> exploratories = exploratoryDAO.fetchExploratoriesByEndpointWhereStatusNotIn(endpoint,
-		        Arrays.asList(UserInstanceStatus.TERMINATED, UserInstanceStatus.FAILED), Boolean.FALSE);
+                Arrays.asList(TERMINATED, UserInstanceStatus.FAILED), Boolean.FALSE);
 
         List<ProjectDTO> projects = projectService.getProjectsByEndpoint(endpoint);
 
@@ -144,7 +145,8 @@ public class EndpointServiceImpl implements EndpointService {
     }
 
     @Audit(action = DISCONNECT, type = ENDPOINT)
-    public void removeEndpoint(@User UserInfo userInfo, @ResourceName String name, CloudProvider cloudProvider, List<ProjectDTO> projects) {
+    public void removeEndpoint(@User UserInfo userInfo, @ResourceName String name, CloudProvider cloudProvider,
+                               List<ProjectDTO> projects) {
         removeEndpointInAllProjects(userInfo, name, projects);
         endpointDAO.remove(name);
         List<CloudProvider> remainingProviders = endpointDAO.getEndpoints()
@@ -156,7 +158,10 @@ public class EndpointServiceImpl implements EndpointService {
 
     @Override
     public void removeEndpointInAllProjects(UserInfo userInfo, String endpointName, List<ProjectDTO> projects) {
-        projects.forEach(project -> projectService.terminateEndpoint(userInfo, endpointName, project.getName()));
+        projects.stream()
+                .filter(p -> p.getEndpoints().stream()
+                        .noneMatch(e -> e.getName().equals(endpointName) && e.getStatus() == TERMINATED))
+                .forEach(project -> projectService.terminateEndpoint(userInfo, endpointName, project.getName()));
     }
 
     @Override
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/ProjectServiceImpl.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/ProjectServiceImpl.java
index 1a1974c..c76dedb 100644
--- a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/ProjectServiceImpl.java
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/ProjectServiceImpl.java
@@ -92,25 +92,27 @@ public class ProjectServiceImpl implements ProjectService {
     private static final String AUDIT_RECREATE_EDGE_NODE = "Recreate edge node for endpoint %s, requested in project %s";
 
     private final ProjectDAO projectDAO;
+    private final UserGroupDAO userGroupDAO;
+    private final ExploratoryDAO exploratoryDAO;
+
     private final ExploratoryService exploratoryService;
-    private final UserGroupDAO userGroupDao;
     private final RESTService provisioningService;
+    private final EndpointService endpointService;
+
     private final RequestId requestId;
     private final RequestBuilder requestBuilder;
-    private final EndpointService endpointService;
-    private final ExploratoryDAO exploratoryDAO;
     private final SelfServiceApplicationConfiguration configuration;
 
 
     @Inject
     public ProjectServiceImpl(ProjectDAO projectDAO, ExploratoryService exploratoryService,
-                              UserGroupDAO userGroupDao,
+                              UserGroupDAO userGroupDAO,
                               @Named(ServiceConsts.PROVISIONING_SERVICE_NAME) RESTService provisioningService,
                               RequestId requestId, RequestBuilder requestBuilder, EndpointService endpointService,
                               ExploratoryDAO exploratoryDAO, SelfServiceApplicationConfiguration configuration) {
         this.projectDAO = projectDAO;
         this.exploratoryService = exploratoryService;
-        this.userGroupDao = userGroupDao;
+        this.userGroupDAO = userGroupDAO;
         this.provisioningService = provisioningService;
         this.requestId = requestId;
         this.requestBuilder = requestBuilder;
@@ -168,6 +170,7 @@ public class ProjectServiceImpl implements ProjectService {
     @Audit(action = TERMINATE, type = EDGE_NODE)
     @Override
     public void terminateEndpoint(@User UserInfo userInfo, @ResourceName String endpoint, @Project String name) {
+
         projectActionOnCloud(userInfo, name, TERMINATE_PRJ_API, endpoint);
         projectDAO.updateEdgeStatus(name, endpoint, UserInstanceStatus.TERMINATING);
         exploratoryService.updateProjectExploratoryStatuses(userInfo, name, endpoint, UserInstanceStatus.TERMINATING);
@@ -204,7 +207,8 @@ public class ProjectServiceImpl implements ProjectService {
 
     @ProjectAdmin
     @Override
-    public void stopWithResources(@User UserInfo userInfo, List<String> endpoints, @ResourceName @Project String projectName) {
+    public void stopWithResources(@User UserInfo userInfo, List<String> endpoints,
+                                  @ResourceName @Project String projectName) {
         List<ProjectEndpointDTO> endpointDTOs = getProjectEndpointDTOS(endpoints, projectName);
         checkProjectRelatedResourcesInProgress(projectName, endpointDTOs, STOP_ACTION);
 
@@ -237,7 +241,8 @@ public class ProjectServiceImpl implements ProjectService {
     }
 
     @Audit(action = UPDATE, type = PROJECT)
-    public void updateProject(@User UserInfo userInfo, @Project @ResourceName String projectName, UpdateProjectDTO projectDTO, ProjectDTO project, Set<String> newEndpoints,
+    public void updateProject(@User UserInfo userInfo, @Project @ResourceName String projectName,
+                              UpdateProjectDTO projectDTO, ProjectDTO project, Set<String> newEndpoints,
                               @Info String projectAudit) {
         final List<ProjectEndpointDTO> endpointsToBeCreated = newEndpoints
                 .stream()
@@ -260,14 +265,15 @@ public class ProjectServiceImpl implements ProjectService {
     }
 
     @Audit(action = UPDATE, type = PROJECT)
-    public void updateBudget(@User UserInfo userInfo, @Project @ResourceName String name, BudgetDTO budget, @Info String updateBudgetAudit) {
+    public void updateBudget(@User UserInfo userInfo, @Project @ResourceName String name, BudgetDTO budget,
+                             @Info String updateBudgetAudit) {
         projectDAO.updateBudget(name, budget.getValue(), budget.isMonthlyBudget());
     }
 
     @Override
     public boolean isAnyProjectAssigned(UserInfo userInfo) {
         final Set<String> userGroups = concat(userInfo.getRoles().stream(),
-                userGroupDao.getUserGroups(userInfo.getName()).stream())
+                userGroupDAO.getUserGroups(userInfo.getName()).stream())
                 .collect(toSet());
         return projectDAO.isAnyProjectAssigned(userGroups);
     }
@@ -285,8 +291,8 @@ public class ProjectServiceImpl implements ProjectService {
 
     @Audit(action = UPDATE, type = EDGE_NODE)
     @Override
-    public void updateAfterStatusCheck(@User UserInfo userInfo, @Project String project, @ResourceName String endpoint, String instanceID,
-                                       UserInstanceStatus status, @Info String auditInfo) {
+    public void updateAfterStatusCheck(@User UserInfo userInfo, @Project String project, @ResourceName String endpoint,
+                                       String instanceID, UserInstanceStatus status, @Info String auditInfo) {
         projectDAO.updateEdgeStatus(project, endpoint, status);
     }
 
@@ -300,14 +306,14 @@ public class ProjectServiceImpl implements ProjectService {
     }
 
     @Audit(action = CREATE, type = EDGE_NODE)
-    public void createEndpoint(@User UserInfo user, ProjectDTO projectDTO, @ResourceName String endpointName, @Project String projectName,
-                               @Info String auditInfo) {
+    public void createEndpoint(@User UserInfo user, ProjectDTO projectDTO, @ResourceName String endpointName,
+                               @Project String projectName, @Info String auditInfo) {
         createEdgeNode(user, projectDTO, endpointName, CREATE_PRJ_API);
     }
 
     @Audit(action = RECREATE, type = EDGE_NODE)
-    public void recreateEndpoint(@User UserInfo user, ProjectDTO projectDTO, @ResourceName String endpointName, @Project String projectName,
-                                 @Info String auditInfo) {
+    public void recreateEndpoint(@User UserInfo user, ProjectDTO projectDTO, @ResourceName String endpointName,
+                                 @Project String projectName, @Info String auditInfo) {
         createEdgeNode(user, projectDTO, endpointName, RECREATE_PRJ_API);
     }
 
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/EndpointServiceImplTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/EndpointServiceImplTest.java
index a00a2f9..48bcefe 100644
--- a/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/EndpointServiceImplTest.java
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/EndpointServiceImplTest.java
@@ -48,6 +48,7 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Optional;
 
+import static com.epam.datalab.dto.UserInstanceStatus.TERMINATED;
 import static org.junit.Assert.assertEquals;
 import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.anyBoolean;
@@ -57,6 +58,7 @@ import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyNoMoreInteractions;
 import static org.mockito.Mockito.when;
+import static org.mockito.internal.verification.VerificationModeFactory.times;
 
 @RunWith(MockitoJUnitRunner.class)
 public class EndpointServiceImplTest extends TestBase {
@@ -274,6 +276,19 @@ public class EndpointServiceImplTest extends TestBase {
         endpointService.remove(getUserInfo(), ENDPOINT_NAME);
     }
 
+    @Test
+    public void removeEndpointInAllProjectsTest() {
+        List<ProjectDTO> projectDTOs = getProjectDTOsWithDiffStatuses();
+
+        endpointService.removeEndpointInAllProjects(getUserInfo(), ENDPOINT_NAME, projectDTOs);
+        long notTerminatedProjects = projectDTOs.stream()
+                .filter(p -> p.getEndpoints().stream()
+                        .noneMatch(e -> e.getStatus() == TERMINATED))
+                .count();
+
+        verify(projectService, times((int) notTerminatedProjects)).terminateEndpoint(any(), anyString(), any());
+    }
+
     private List<UserInstanceDTO> getUserInstances() {
         return Arrays.asList(
                 new UserInstanceDTO().withExploratoryName(EXPLORATORY_NAME_1).withUser(USER).withProject(PROJECT_NAME_1).withEndpoint(ENDPOINT_NAME),
@@ -302,6 +317,26 @@ public class EndpointServiceImplTest extends TestBase {
         return Arrays.asList(project1, project2);
     }
 
+    private List<ProjectDTO> getProjectDTOsWithDiffStatuses() {
+        ProjectDTO project1 = ProjectDTO.builder()
+                .name(PROJECT_NAME_1)
+                .endpoints(Collections.singletonList(new ProjectEndpointDTO(ENDPOINT_NAME, UserInstanceStatus.RUNNING, null)))
+                .build();
+        ProjectDTO project2 = ProjectDTO.builder()
+                .name(PROJECT_NAME_2)
+                .endpoints(Collections.singletonList(new ProjectEndpointDTO(ENDPOINT_NAME, TERMINATED, null)))
+                .build();
+        ProjectDTO project3 = ProjectDTO.builder()
+                .name(PROJECT_NAME_1)
+                .endpoints(Collections.singletonList(new ProjectEndpointDTO(ENDPOINT_NAME, UserInstanceStatus.CREATED, null)))
+                .build();
+        ProjectDTO project4 = ProjectDTO.builder()
+                .name(PROJECT_NAME_2)
+                .endpoints(Collections.singletonList(new ProjectEndpointDTO(ENDPOINT_NAME, TERMINATED, null)))
+                .build();
+        return Arrays.asList(project1, project2, project3, project4);
+    }
+
     private List<ProjectDTO> getCreatingProjectDTO() {
         ProjectDTO project = ProjectDTO.builder()
                 .name(PROJECT_NAME_1)


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