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