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 2020/03/18 14:26:55 UTC

[incubator-dlab] branch DLAB-1633 created (now 8f40493)

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

ofuks pushed a change to branch DLAB-1633
in repository https://gitbox.apache.org/repos/asf/incubator-dlab.git.


      at 8f40493  [DLAB-1633] Fixed issue with instance management fails via environment management on remote/local endpoints

This branch includes the following new commits:

     new 8f40493  [DLAB-1633] Fixed issue with instance management fails via environment management on remote/local endpoints

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



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


[incubator-dlab] 01/01: [DLAB-1633] Fixed issue with instance management fails via environment management on remote/local endpoints

Posted by of...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 8f404935c41020d0dc26bd7e43b7721a30565042
Author: Oleh Fuks <ol...@gmail.com>
AuthorDate: Wed Mar 18 16:22:22 2020 +0200

    [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 +++
 .../resources/EnvironmentResourceTest.java         | 253 +++++++++++++++++++++
 .../service/impl/EnvironmentServiceImplTest.java   |  94 ++++++++
 5 files changed, 454 insertions(+)

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/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