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