You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dlab.apache.org by dg...@apache.org on 2020/03/19 11:19:34 UTC
[incubator-dlab] branch develop updated: Dlab 1633 (#664)
This is an automated email from the ASF dual-hosted git repository.
dgnatyshyn pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/incubator-dlab.git
The following commit(s) were added to refs/heads/develop by this push:
new 904c6cb Dlab 1633 (#664)
904c6cb is described below
commit 904c6cb4db63f863d21f181445f5910ceccb4360
Author: Dmytro Gnatyshyn <42...@users.noreply.github.com>
AuthorDate: Thu Mar 19 13:19:24 2020 +0200
Dlab 1633 (#664)
[DLAB-1633]: Fixed issue with instance management fails via environment management on remote/local endpoints
---
.../backendapi/resources/EnvironmentResource.java | 66 ++++++
.../backendapi/service/EnvironmentService.java | 11 +
.../service/impl/EnvironmentServiceImpl.java | 30 +++
.../management/management.component.ts | 1 +
.../services/managementEnvironments.service.ts | 4 +-
.../confirmation-dialog.model.ts | 6 +-
.../resources/EnvironmentResourceTest.java | 253 +++++++++++++++++++++
.../service/impl/EnvironmentServiceImplTest.java | 94 ++++++++
8 files changed, 460 insertions(+), 5 deletions(-)
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/EnvironmentResource.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/EnvironmentResource.java
index 879b527..ae60e39 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/EnvironmentResource.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/EnvironmentResource.java
@@ -24,10 +24,14 @@ import com.epam.dlab.backendapi.service.EnvironmentService;
import com.google.inject.Inject;
import io.dropwizard.auth.Auth;
import lombok.extern.slf4j.Slf4j;
+import org.hibernate.validator.constraints.NotEmpty;
import javax.annotation.security.RolesAllowed;
+import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
+import javax.ws.rs.POST;
import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
@@ -59,4 +63,66 @@ public class EnvironmentResource {
log.debug("Admin {} requested information about all user's environment", userInfo.getName());
return Response.ok(environmentService.getAllEnv()).build();
}
+
+ @POST
+ @Consumes(MediaType.TEXT_PLAIN)
+ @Produces(MediaType.APPLICATION_JSON)
+ @Path("stop/{projectName}")
+ public Response stopEnv(@Auth UserInfo userInfo, @NotEmpty String user, @PathParam("projectName") String projectName) {
+ log.info("User {} is stopping {} environment", userInfo.getName(), user);
+ environmentService.stopEnvironment(userInfo, user, projectName);
+ return Response.ok().build();
+ }
+
+ @POST
+ @Consumes(MediaType.TEXT_PLAIN)
+ @Produces(MediaType.APPLICATION_JSON)
+ @Path("stop/{projectName}/{exploratoryName}")
+ public Response stopNotebook(@Auth UserInfo userInfo, @NotEmpty String user,
+ @PathParam("projectName") String projectName,
+ @PathParam("exploratoryName") String exploratoryName) {
+ log.info("Admin {} is stopping notebook {} of user {}", userInfo.getName(), exploratoryName, user);
+ environmentService.stopExploratory(userInfo, user, projectName, exploratoryName);
+ return Response.ok().build();
+ }
+
+ @POST
+ @Consumes(MediaType.TEXT_PLAIN)
+ @Produces(MediaType.APPLICATION_JSON)
+ @Path("stop/{projectName}/{exploratoryName}/{computationalName}")
+ public Response stopCluster(@Auth UserInfo userInfo, @NotEmpty String user,
+ @PathParam("projectName") String projectName,
+ @PathParam("exploratoryName") String exploratoryName,
+ @PathParam("computationalName") String computationalName) {
+ log.info("Admin {} is stopping computational resource {} affiliated with exploratory {} of user {}",
+ userInfo.getName(), computationalName, exploratoryName, user);
+ environmentService.stopComputational(userInfo, user, projectName, exploratoryName, computationalName);
+ return Response.ok().build();
+ }
+
+ @POST
+ @Consumes(MediaType.TEXT_PLAIN)
+ @Produces(MediaType.APPLICATION_JSON)
+ @Path("terminate/{projectName}/{exploratoryName}")
+ public Response terminateNotebook(@Auth UserInfo userInfo, @NotEmpty String user,
+ @PathParam("projectName") String projectName,
+ @PathParam("exploratoryName") String exploratoryName) {
+ log.info("Admin {} is terminating notebook {} of user {}", userInfo.getName(), exploratoryName, user);
+ environmentService.terminateExploratory(userInfo, user, projectName, exploratoryName);
+ return Response.ok().build();
+ }
+
+ @POST
+ @Consumes(MediaType.TEXT_PLAIN)
+ @Produces(MediaType.APPLICATION_JSON)
+ @Path("terminate/{projectName}/{exploratoryName}/{computationalName}")
+ public Response terminateCluster(@Auth UserInfo userInfo, @NotEmpty String user,
+ @PathParam("projectName") String projectName,
+ @PathParam("exploratoryName") String exploratoryName,
+ @PathParam("computationalName") String computationalName) {
+ log.info("Admin {} is terminating computational resource {} affiliated with exploratory {} of user {}",
+ userInfo.getName(), computationalName, exploratoryName, user);
+ environmentService.terminateComputational(userInfo, user, projectName, exploratoryName, computationalName);
+ return Response.ok().build();
+ }
}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/EnvironmentService.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/EnvironmentService.java
index de4dcb3..f765aa4 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/EnvironmentService.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/EnvironmentService.java
@@ -19,6 +19,7 @@
package com.epam.dlab.backendapi.service;
+import com.epam.dlab.auth.UserInfo;
import com.epam.dlab.backendapi.resources.dto.UserDTO;
import com.epam.dlab.backendapi.resources.dto.UserResourceInfo;
@@ -35,7 +36,17 @@ public interface EnvironmentService {
void stopAll();
+ void stopEnvironment(UserInfo userInfo, String user, String project);
+
void stopEnvironmentWithServiceAccount(String user);
void stopProjectEnvironment(String project);
+
+ void stopExploratory(UserInfo userInfo, String user, String project, String exploratoryName);
+
+ void stopComputational(UserInfo userInfo, String user, String project, String exploratoryName, String computationalName);
+
+ void terminateExploratory(UserInfo userInfo, String user, String project, String exploratoryName);
+
+ void terminateComputational(UserInfo userInfo, String user, String project, String exploratoryName, String computationalName);
}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/EnvironmentServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/EnvironmentServiceImpl.java
index 18a354b..3dfaaae 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/EnvironmentServiceImpl.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/EnvironmentServiceImpl.java
@@ -112,6 +112,14 @@ public class EnvironmentServiceImpl implements EnvironmentService {
}
@Override
+ public void stopEnvironment(UserInfo userInfo, String user, String project) {
+ log.debug("Stopping environment for user {}", user);
+ checkState(user, "stop");
+ exploratoryDAO.fetchRunningExploratoryFields(user)
+ .forEach(e -> stopExploratory(userInfo, user, project, e.getExploratoryName()));
+ }
+
+ @Override
public void stopEnvironmentWithServiceAccount(String user) {
log.debug("Stopping environment for user {} by scheduler", user);
checkState(user, "stop");
@@ -132,6 +140,28 @@ public class EnvironmentServiceImpl implements EnvironmentService {
endpoint.getName(), project));
}
+ @Override
+ public void stopExploratory(UserInfo userInfo, String user, String project, String exploratoryName) {
+ exploratoryService.stop(new UserInfo(user, userInfo.getAccessToken()), project, exploratoryName);
+ }
+
+ @Override
+ public void stopComputational(UserInfo userInfo, String user, String project, String exploratoryName, String computationalName) {
+ computationalService.stopSparkCluster(new UserInfo(user, userInfo.getAccessToken()), project, exploratoryName,
+ computationalName);
+ }
+
+ @Override
+ public void terminateExploratory(UserInfo userInfo, String user, String project, String exploratoryName) {
+ exploratoryService.terminate(new UserInfo(user, userInfo.getAccessToken()), project, exploratoryName);
+ }
+
+ @Override
+ public void terminateComputational(UserInfo userInfo, String user, String project, String exploratoryName, String computationalName) {
+ computationalService.terminateComputational(new UserInfo(user, userInfo.getAccessToken()), project, exploratoryName,
+ computationalName);
+ }
+
private UserDTO toUserDTO(String u, UserDTO.Status status) {
return new UserDTO(u, settingsDAO.getAllowedBudget(u).orElse(null), status);
}
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/management/management.component.ts b/services/self-service/src/main/resources/webapp/src/app/administration/management/management.component.ts
index da2122b..d31783a 100644
--- a/services/self-service/src/main/resources/webapp/src/app/administration/management/management.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/management/management.component.ts
@@ -78,6 +78,7 @@ export class ManagementComponent implements OnInit {
.environmentManagement(
$event.environment.user,
$event.action,
+ $event.environment.project,
$event.environment.type === 'edge node' ? 'edge' : $event.environment.name,
$event.resource ? $event.resource.computational_name : null
).subscribe(
diff --git a/services/self-service/src/main/resources/webapp/src/app/core/services/managementEnvironments.service.ts b/services/self-service/src/main/resources/webapp/src/app/core/services/managementEnvironments.service.ts
index 4b759b6..2d21fd5 100644
--- a/services/self-service/src/main/resources/webapp/src/app/core/services/managementEnvironments.service.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/core/services/managementEnvironments.service.ts
@@ -36,8 +36,8 @@ export class ManageEnvironmentsService {
catchError(ErrorUtils.handleServiceError));
}
- environmentManagement(data, action: string, resource: string, computational?: string): Observable<{}> {
- const params = computational ? `/${action}/${resource}/${computational}` : `/${action}/${resource}`;
+ environmentManagement(data, action: string, project: string, resource: string, computational?: string): Observable<{}> {
+ const params = computational ? `/${action}/${project}/${resource}/${computational}` : `/${action}/${project}/${resource}`;
return this.applicationServiceFacade
.buildEnvironmentManagement(params, data)
.pipe(
diff --git a/services/self-service/src/main/resources/webapp/src/app/shared/modal-dialog/confirmation-dialog/confirmation-dialog.model.ts b/services/self-service/src/main/resources/webapp/src/app/shared/modal-dialog/confirmation-dialog/confirmation-dialog.model.ts
index 41c31cc..1bfcd06 100644
--- a/services/self-service/src/main/resources/webapp/src/app/shared/modal-dialog/confirmation-dialog/confirmation-dialog.model.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/shared/modal-dialog/confirmation-dialog/confirmation-dialog.model.ts
@@ -71,19 +71,19 @@ export class ConfirmationDialogModel {
private stopExploratory(): Observable<{}> {
return this.manageAction
- ? this.manageEnvironmentsService.environmentManagement(this.notebook.user, 'stop', this.notebook.name)
+ ? this.manageEnvironmentsService.environmentManagement(this.notebook.user, 'stop', this.notebook.project, this.notebook.name)
: this.userResourceService.suspendExploratoryEnvironment(this.notebook, 'stop');
}
private terminateExploratory(): Observable<{}> {
return this.manageAction
- ? this.manageEnvironmentsService.environmentManagement(this.notebook.user, 'terminate', this.notebook.name)
+ ? this.manageEnvironmentsService.environmentManagement(this.notebook.user, 'terminate', this.notebook.project, this.notebook.name)
: this.userResourceService.suspendExploratoryEnvironment(this.notebook, 'terminate');
}
private stopEdgeNode(): Observable<{}> {
return this.manageAction
- ? this.manageEnvironmentsService.environmentManagement(this.notebook.user, 'stop', 'edge')
+ ? this.manageEnvironmentsService.environmentManagement(this.notebook.user, 'stop', this.notebook.project, 'edge')
: this.healthStatusService.suspendEdgeNode();
}
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/EnvironmentResourceTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/EnvironmentResourceTest.java
index 8df0856..c257995 100644
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/EnvironmentResourceTest.java
+++ b/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/EnvironmentResourceTest.java
@@ -19,8 +19,10 @@
package com.epam.dlab.backendapi.resources;
+import com.epam.dlab.auth.UserInfo;
import com.epam.dlab.backendapi.resources.dto.UserDTO;
import com.epam.dlab.backendapi.service.EnvironmentService;
+import com.epam.dlab.exceptions.ResourceConflictException;
import io.dropwizard.auth.AuthenticationException;
import io.dropwizard.testing.junit.ResourceTestRule;
import org.apache.http.HttpStatus;
@@ -28,6 +30,7 @@ import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
+import javax.ws.rs.client.Entity;
import javax.ws.rs.core.GenericType;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
@@ -36,6 +39,11 @@ import java.util.Collections;
import java.util.List;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
@@ -122,4 +130,249 @@ public class EnvironmentResourceTest extends TestBase {
verifyZeroInteractions(environmentService);
}
+
+ @Test
+ public void stopEnv() {
+ doNothing().when(environmentService).stopEnvironment(any(UserInfo.class), anyString(), anyString());
+ final Response response = resources.getJerseyTest()
+ .target("/environment/stop/projectName")
+ .request()
+ .header("Authorization", "Bearer " + TOKEN)
+ .post(Entity.text(USER));
+
+ assertEquals(HttpStatus.SC_OK, response.getStatus());
+ assertNull(response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+ verify(environmentService).stopEnvironment(new UserInfo(USER, TOKEN), USER, "projectName");
+ verifyNoMoreInteractions(environmentService);
+ }
+
+ @Test
+ public void stopEnvWithFailedAuth() throws AuthenticationException {
+ authFailSetup();
+ doNothing().when(environmentService).stopEnvironment(any(UserInfo.class), anyString(), anyString());
+ final Response response = resources.getJerseyTest()
+ .target("/environment/stop/projectName")
+ .request()
+ .header("Authorization", "Bearer " + TOKEN)
+ .post(Entity.text(USER));
+
+ assertEquals(HttpStatus.SC_FORBIDDEN, response.getStatus());
+ assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+ verifyZeroInteractions(environmentService);
+ }
+
+ @Test
+ public void stopEnvWithResourceConflictException() {
+ doThrow(new ResourceConflictException("Can not stop environment because one of the user resources is in " +
+ "status CREATING or STARTING")).when(environmentService).stopEnvironment(any(UserInfo.class), anyString(), anyString());
+ final Response response = resources.getJerseyTest()
+ .target("/environment/stop/projectName")
+ .request()
+ .header("Authorization", "Bearer " + TOKEN)
+ .post(Entity.text(USER));
+
+ assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
+ assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+ verify(environmentService).stopEnvironment(new UserInfo(USER, TOKEN), USER, "projectName");
+ verifyNoMoreInteractions(environmentService);
+ }
+
+ @Test
+ public void stopNotebook() {
+ doNothing().when(environmentService).stopExploratory(any(UserInfo.class), anyString(), anyString(), anyString());
+ final Response response = resources.getJerseyTest()
+ .target("/environment/stop/projectName/explName")
+ .request()
+ .header("Authorization", "Bearer " + TOKEN)
+ .post(Entity.text(USER));
+
+ assertEquals(HttpStatus.SC_OK, response.getStatus());
+ assertNull(response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+ verify(environmentService).stopExploratory(new UserInfo(USER, TOKEN), USER, "projectName", "explName");
+ verifyNoMoreInteractions(environmentService);
+ }
+
+ @Test
+ public void stopNotebookWithFailedAuth() throws AuthenticationException {
+ authFailSetup();
+ doNothing().when(environmentService).stopExploratory(any(UserInfo.class), anyString(), anyString(), anyString());
+ final Response response = resources.getJerseyTest()
+ .target("/environment/stop/projectName/explName")
+ .request()
+ .header("Authorization", "Bearer " + TOKEN)
+ .post(Entity.text(USER));
+
+ assertEquals(HttpStatus.SC_FORBIDDEN, response.getStatus());
+ assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+ verifyZeroInteractions(environmentService);
+ }
+
+ @Test
+ public void stopNotebookWithResourceConflictException() {
+ doThrow(new ResourceConflictException("Can not stop notebook because its status is CREATING or STARTING"))
+ .when(environmentService).stopExploratory(any(UserInfo.class), anyString(), anyString(), anyString());
+ final Response response = resources.getJerseyTest()
+ .target("/environment/stop/projectName/explName")
+ .request()
+ .header("Authorization", "Bearer " + TOKEN)
+ .post(Entity.text(USER));
+
+ assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
+ assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+ verify(environmentService).stopExploratory(new UserInfo(USER, TOKEN), USER, "projectName", "explName");
+ verifyNoMoreInteractions(environmentService);
+ }
+
+ @Test
+ public void stopCluster() {
+ doNothing().when(environmentService).stopComputational(any(UserInfo.class), anyString(), anyString(), anyString(), anyString());
+ final Response response = resources.getJerseyTest()
+ .target("/environment/stop/projectName/explName/compName")
+ .request()
+ .header("Authorization", "Bearer " + TOKEN)
+ .post(Entity.text(USER));
+
+ assertEquals(HttpStatus.SC_OK, response.getStatus());
+ assertNull(response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+ verify(environmentService).stopComputational(new UserInfo(USER, TOKEN), USER, "projectName", "explName", "compName");
+ verifyNoMoreInteractions(environmentService);
+ }
+
+ @Test
+ public void stopClusterWithFailedAuth() throws AuthenticationException {
+ authFailSetup();
+ doNothing().when(environmentService).stopComputational(any(UserInfo.class), anyString(), anyString(), anyString(), anyString());
+ final Response response = resources.getJerseyTest()
+ .target("/environment/stop/projectName/explName/compName")
+ .request()
+ .header("Authorization", "Bearer " + TOKEN)
+ .post(Entity.text(USER));
+
+ assertEquals(HttpStatus.SC_FORBIDDEN, response.getStatus());
+ assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+ verifyZeroInteractions(environmentService);
+ }
+
+ @Test
+ public void stopClusterWithResourceConflictException() {
+ doThrow(new ResourceConflictException("Can not stop cluster because its status is CREATING or STARTING"))
+ .when(environmentService).stopComputational(any(UserInfo.class), anyString(), anyString(), anyString(), anyString());
+ final Response response = resources.getJerseyTest()
+ .target("/environment/stop/projectName/explName/compName")
+ .request()
+ .header("Authorization", "Bearer " + TOKEN)
+ .post(Entity.text(USER));
+
+ assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
+ assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+ verify(environmentService).stopComputational(new UserInfo(USER, TOKEN), USER, "projectName", "explName", "compName");
+ verifyNoMoreInteractions(environmentService);
+ }
+
+ @Test
+ public void terminateNotebook() {
+ doNothing().when(environmentService).terminateExploratory(any(UserInfo.class), anyString(), anyString(), anyString());
+ final Response response = resources.getJerseyTest()
+ .target("/environment/terminate/projectName/explName")
+ .request()
+ .header("Authorization", "Bearer " + TOKEN)
+ .post(Entity.text(USER));
+
+ assertEquals(HttpStatus.SC_OK, response.getStatus());
+ assertNull(response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+ verify(environmentService).terminateExploratory(new UserInfo(USER, TOKEN), USER, "projectName", "explName");
+ verifyNoMoreInteractions(environmentService);
+ }
+
+ @Test
+ public void terminateNotebookWithFailedAuth() throws AuthenticationException {
+ authFailSetup();
+ doNothing().when(environmentService).terminateExploratory(any(UserInfo.class), anyString(), anyString(), anyString());
+ final Response response = resources.getJerseyTest()
+ .target("/environment/terminate/projectName/explName")
+ .request()
+ .header("Authorization", "Bearer " + TOKEN)
+ .post(Entity.text(USER));
+
+ assertEquals(HttpStatus.SC_FORBIDDEN, response.getStatus());
+ assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+ verifyZeroInteractions(environmentService);
+ }
+
+ @Test
+ public void terminateNotebookWithResourceConflictException() {
+ doThrow(new ResourceConflictException("Can not terminate notebook because its status is CREATING or STARTING"))
+ .when(environmentService).terminateExploratory(any(UserInfo.class), anyString(), anyString(), anyString());
+ final Response response = resources.getJerseyTest()
+ .target("/environment/terminate/projectName/explName")
+ .request()
+ .header("Authorization", "Bearer " + TOKEN)
+ .post(Entity.text(USER));
+
+ assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
+ assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+ verify(environmentService).terminateExploratory(new UserInfo(USER, TOKEN), USER, "projectName", "explName");
+ verifyNoMoreInteractions(environmentService);
+ }
+
+ @Test
+ public void terminateCluster() {
+ doNothing().when(environmentService).terminateComputational(any(UserInfo.class), anyString(), anyString(), anyString(), anyString());
+ final Response response = resources.getJerseyTest()
+ .target("/environment/terminate/projectName/explName/compName")
+ .request()
+ .header("Authorization", "Bearer " + TOKEN)
+ .post(Entity.text(USER));
+
+ assertEquals(HttpStatus.SC_OK, response.getStatus());
+ assertNull(response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+ verify(environmentService).terminateComputational(new UserInfo(USER, TOKEN), USER, "projectName", "explName", "compName");
+ verifyNoMoreInteractions(environmentService);
+ }
+
+ @Test
+ public void terminateClusterWithFailedAuth() throws AuthenticationException {
+ authFailSetup();
+ doNothing().when(environmentService).terminateComputational(any(UserInfo.class), anyString(), anyString(), anyString(), anyString());
+ final Response response = resources.getJerseyTest()
+ .target("/environment/terminate/projectName/explName/compName")
+ .request()
+ .header("Authorization", "Bearer " + TOKEN)
+ .post(Entity.text(USER));
+
+ assertEquals(HttpStatus.SC_FORBIDDEN, response.getStatus());
+ assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+ verifyZeroInteractions(environmentService);
+ }
+
+ @Test
+ public void terminateClusterWithResourceConflictException() {
+ doThrow(new ResourceConflictException("Can not terminate cluster because its status is CREATING or STARTING"))
+ .when(environmentService).terminateComputational(any(UserInfo.class), anyString(), anyString(), anyString(), anyString());
+ final Response response = resources.getJerseyTest()
+ .target("/environment/terminate/projectName/explName/compName")
+ .request()
+ .header("Authorization", "Bearer " + TOKEN)
+ .post(Entity.text(USER));
+
+ assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
+ assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+ verify(environmentService).terminateComputational(new UserInfo(USER, TOKEN), USER, "projectName", "explName", "compName");
+ verifyNoMoreInteractions(environmentService);
+ }
}
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/EnvironmentServiceImplTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/EnvironmentServiceImplTest.java
index 536454e..dca6e0f 100644
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/EnvironmentServiceImplTest.java
+++ b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/EnvironmentServiceImplTest.java
@@ -34,6 +34,7 @@ import com.epam.dlab.dto.UserInstanceDTO;
import com.epam.dlab.dto.UserInstanceStatus;
import com.epam.dlab.dto.base.edge.EdgeInfo;
import com.epam.dlab.exceptions.DlabException;
+import com.epam.dlab.exceptions.ResourceConflictException;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
@@ -53,6 +54,7 @@ import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.anySet;
import static org.mockito.Mockito.anyString;
+import static org.mockito.Mockito.anyVararg;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.doThrow;
@@ -146,6 +148,52 @@ public class EnvironmentServiceImplTest {
environmentService.getUserNames();
}
+
+ @Test
+ public void stopEnvironment() {
+ final UserInfo userInfo = getUserInfo();
+ when(exploratoryDAO.fetchRunningExploratoryFields(anyString())).thenReturn(getUserInstances());
+ when(exploratoryService.stop(any(UserInfo.class), anyString(), anyString())).thenReturn(UUID);
+
+ environmentService.stopEnvironment(userInfo, USER, PROJECT_NAME);
+
+ verify(exploratoryDAO).fetchRunningExploratoryFields(USER);
+ verify(exploratoryService).stop(refEq(userInfo), eq(PROJECT_NAME), eq(EXPLORATORY_NAME_1));
+ verify(exploratoryService).stop(refEq(userInfo), eq(PROJECT_NAME), eq(EXPLORATORY_NAME_2));
+ verify(exploratoryDAO).fetchUserExploratoriesWhereStatusIn(USER, Arrays.asList(UserInstanceStatus.CREATING,
+ UserInstanceStatus.STARTING, UserInstanceStatus.CREATING_IMAGE),
+ UserInstanceStatus.CREATING,
+ UserInstanceStatus.STARTING, UserInstanceStatus.CREATING_IMAGE);
+ verifyNoMoreInteractions(exploratoryDAO, exploratoryService);
+ }
+
+ @Test
+ @SuppressWarnings("unchecked")
+ public void stopEnvironmentWithWrongResourceState() {
+ when(exploratoryDAO.fetchUserExploratoriesWhereStatusIn(anyString(), any(List.class), anyVararg()))
+ .thenReturn(getUserInstances());
+ expectedException.expect(ResourceConflictException.class);
+
+ environmentService.stopEnvironment(getUserInfo(), USER, PROJECT_NAME);
+ }
+
+ @Test
+ public void stopEnvironmentWithoutEdge() {
+ final UserInfo userInfo = getUserInfo();
+ when(exploratoryDAO.fetchRunningExploratoryFields(anyString())).thenReturn(getUserInstances());
+ when(exploratoryService.stop(any(UserInfo.class), anyString(), anyString())).thenReturn(UUID);
+
+ environmentService.stopEnvironment(userInfo, USER, PROJECT_NAME);
+
+ verify(exploratoryDAO).fetchRunningExploratoryFields(USER);
+ verify(exploratoryService).stop(refEq(userInfo), eq(PROJECT_NAME), eq(EXPLORATORY_NAME_1));
+ verify(exploratoryService).stop(refEq(userInfo), eq(PROJECT_NAME), eq(EXPLORATORY_NAME_2));
+ verify(exploratoryDAO).fetchUserExploratoriesWhereStatusIn(USER, Arrays.asList(UserInstanceStatus.CREATING,
+ UserInstanceStatus.STARTING, UserInstanceStatus.CREATING_IMAGE),
+ UserInstanceStatus.CREATING, UserInstanceStatus.STARTING, UserInstanceStatus.CREATING_IMAGE);
+ verifyNoMoreInteractions(envDAO, exploratoryDAO, exploratoryService);
+ }
+
@Test
public void stopProjectEnvironment() {
final UserInfo userInfo = getUserInfo();
@@ -171,6 +219,52 @@ public class EnvironmentServiceImplTest {
verifyNoMoreInteractions(exploratoryDAO, exploratoryService, securityService, projectService);
}
+ @Test
+ public void stopExploratory() {
+ final UserInfo userInfo = getUserInfo();
+ when(exploratoryService.stop(any(UserInfo.class), anyString(), anyString())).thenReturn(UUID);
+
+ environmentService.stopExploratory(new UserInfo(USER, TOKEN), USER, PROJECT_NAME, EXPLORATORY_NAME_1);
+
+ verify(exploratoryService).stop(refEq(userInfo), eq(PROJECT_NAME), eq(EXPLORATORY_NAME_1));
+ verifyNoMoreInteractions(securityService, exploratoryService);
+ }
+
+ @Test
+ public void stopComputational() {
+ final UserInfo userInfo = getUserInfo();
+ doNothing().when(computationalService).stopSparkCluster(any(UserInfo.class), anyString(), anyString(), anyString());
+
+ environmentService.stopComputational(userInfo, USER, PROJECT_NAME, EXPLORATORY_NAME_1, "compName");
+
+ verify(computationalService).stopSparkCluster(refEq(userInfo), eq(PROJECT_NAME), eq(EXPLORATORY_NAME_1), eq("compName"));
+ verifyNoMoreInteractions(securityService, computationalService);
+ }
+
+ @Test
+ public void terminateExploratory() {
+ final UserInfo userInfo = getUserInfo();
+ when(exploratoryService.terminate(any(UserInfo.class), anyString(), anyString())).thenReturn(UUID);
+
+ environmentService.terminateExploratory(userInfo, USER, PROJECT_NAME, EXPLORATORY_NAME_1);
+
+ verify(exploratoryService).terminate(refEq(userInfo), eq(PROJECT_NAME), eq(EXPLORATORY_NAME_1));
+ verifyNoMoreInteractions(securityService, exploratoryService);
+ }
+
+ @Test
+ public void terminateComputational() {
+ final UserInfo userInfo = getUserInfo();
+ doNothing().when(computationalService)
+ .terminateComputational(any(UserInfo.class), anyString(), anyString(), anyString());
+
+ environmentService.terminateComputational(userInfo, USER, PROJECT_NAME, EXPLORATORY_NAME_1, "compName");
+
+ verify(computationalService)
+ .terminateComputational(refEq(userInfo), eq(PROJECT_NAME), eq(EXPLORATORY_NAME_1), eq("compName"));
+ verifyNoMoreInteractions(securityService, computationalService);
+ }
+
private UserInfo getUserInfo() {
return new UserInfo(USER, TOKEN);
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@dlab.apache.org
For additional commands, e-mail: commits-help@dlab.apache.org