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/06/10 09:52:46 UTC

[incubator-dlab] 07/07: Added audit for computational resources

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

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

commit 6560b6c2adf1e43e0e3d598426aaa261a96c44fb
Author: Oleh Fuks <ol...@gmail.com>
AuthorDate: Wed Jun 10 12:52:19 2020 +0300

    Added audit for computational resources
---
 .../epam/dlab/rest/contracts/ComputationalAPI.java |  1 +
 .../azure/ComputationalResourceAzure.java          |  2 +-
 .../dlab/backendapi/domain/AuditActionEnum.java    |  1 +
 .../resources/aws/ComputationalResourceAws.java    | 10 ++--
 .../azure/ComputationalResourceAzure.java          | 10 ++--
 .../resources/gcp/ComputationalResourceGcp.java    | 40 +++++++-------
 .../backendapi/service/ComputationalService.java   | 19 ++++---
 .../service/impl/ComputationalServiceImpl.java     | 45 ++++++++--------
 .../service/impl/EnvironmentServiceImpl.java       |  8 +--
 .../service/impl/SchedulerJobServiceImpl.java      | 14 ++---
 .../epam/dlab/backendapi/util/RequestBuilder.java  | 60 ++++++++++-----------
 .../resources/ExploratoryResourceTest.java         | 16 ------
 .../service/impl/ComputationalServiceImplTest.java | 63 ++++++++++++----------
 .../service/impl/EnvironmentServiceImplTest.java   |  7 +--
 .../service/impl/SchedulerJobServiceImplTest.java  | 43 +++++++--------
 15 files changed, 172 insertions(+), 167 deletions(-)

diff --git a/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/contracts/ComputationalAPI.java b/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/contracts/ComputationalAPI.java
index a909635..1586c0b 100644
--- a/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/contracts/ComputationalAPI.java
+++ b/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/contracts/ComputationalAPI.java
@@ -20,6 +20,7 @@
 package com.epam.dlab.rest.contracts;
 
 public interface ComputationalAPI {
+	String AUDIT_MESSAGE = "Notebook name: %s";
 	String LIBRARY = "library/";
 	String COMPUTATIONAL = "computational";
 	String COMPUTATIONAL_CREATE = COMPUTATIONAL + "/create";
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/azure/ComputationalResourceAzure.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/azure/ComputationalResourceAzure.java
index 59b5f27..2ca5c42 100644
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/azure/ComputationalResourceAzure.java
+++ b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/azure/ComputationalResourceAzure.java
@@ -41,7 +41,7 @@ import javax.ws.rs.core.MediaType;
 @Consumes(MediaType.APPLICATION_JSON)
 @Produces(MediaType.APPLICATION_JSON)
 @Slf4j
-public class ComputationalResourceAzure {
+public class ComputationalResourceAzure implements ComputationalAPI {
 
 	@Inject
 	private SparkClusterService sparkClusterService;
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/AuditActionEnum.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/AuditActionEnum.java
index eb49aa1..315925c 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/AuditActionEnum.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/AuditActionEnum.java
@@ -22,5 +22,6 @@ package com.epam.dlab.backendapi.domain;
 public enum AuditActionEnum {
     CREATE_PROJECT, START_PROJECT, STOP_PROJECT, TERMINATE_PROJECT, UPDATE_PROJECT,
     CREATE_NOTEBOOK, START_NOTEBOOK, STOP_NOTEBOOK, TERMINATE_NOTEBOOK, UPDATE_CLUSTER_CONFIG,
+    CREATE_DATA_ENGINE, CREATE_DATA_ENGINE_SERVICE, TERMINATE_COMPUTATIONAL,
     FOLLOW_NOTEBOOK_LINK
 }
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/aws/ComputationalResourceAws.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/aws/ComputationalResourceAws.java
index 87f99bd..d6ab4f4 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/aws/ComputationalResourceAws.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/aws/ComputationalResourceAws.java
@@ -48,6 +48,7 @@ import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
+import java.util.Collections;
 import java.util.List;
 
 import static com.epam.dlab.dto.UserInstanceStatus.CREATING;
@@ -106,8 +107,8 @@ public class ComputationalResourceAws implements ComputationalAPI {
 					.config(form.getConfig())
 					.version(form.getVersion())
 					.build();
-			boolean resourceAdded = computationalService.createDataEngineService(userInfo, form,
-					awsComputationalResource, form.getProject());
+			boolean resourceAdded = computationalService.createDataEngineService(userInfo, form.getName(), form, awsComputationalResource,
+					form.getProject(), Collections.singletonList(String.format(AUDIT_MESSAGE, form.getNotebookName())));
 			return resourceAdded ? Response.ok().build() : Response.status(Response.Status.FOUND).build();
 		}
 
@@ -129,7 +130,7 @@ public class ComputationalResourceAws implements ComputationalAPI {
 		log.debug("Create computational resources for {} | form is {}", userInfo.getName(), form);
 
 		validate(form);
-		return computationalService.createSparkCluster(userInfo, form, form.getProject())
+		return computationalService.createSparkCluster(userInfo, form.getName(), form, form.getProject(), Collections.singletonList(String.format(AUDIT_MESSAGE, form.getNotebookName())))
 				? Response.ok().build()
 				: Response.status(Response.Status.FOUND).build();
 	}
@@ -150,7 +151,8 @@ public class ComputationalResourceAws implements ComputationalAPI {
 							  @PathParam("computationalName") String computationalName) {
 		log.debug("Terminating computational resource {} for user {}", computationalName, userInfo.getName());
 
-		computationalService.terminateComputational(userInfo, projectName, exploratoryName, computationalName);
+		computationalService.terminateComputational(userInfo, userInfo.getName(), projectName, exploratoryName,
+				computationalName, Collections.singletonList(String.format(AUDIT_MESSAGE, exploratoryName)));
 
 		return Response.ok().build();
 	}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/azure/ComputationalResourceAzure.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/azure/ComputationalResourceAzure.java
index ca18d14..922260b 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/azure/ComputationalResourceAzure.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/azure/ComputationalResourceAzure.java
@@ -42,8 +42,11 @@ import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
+import java.util.Collections;
 import java.util.List;
 
+import static com.epam.dlab.rest.contracts.ComputationalAPI.AUDIT_MESSAGE;
+
 /**
  * Provides the REST API for the computational resource on Azure.
  */
@@ -79,16 +82,14 @@ public class ComputationalResourceAzure {
 	public Response createDataEngine(@Auth UserInfo userInfo,
 									 @Valid @NotNull SparkStandaloneClusterCreateForm form) {
 		log.debug("Create computational resources for {} | form is {}", userInfo.getName(), form);
-
 		if (!UserRoles.checkAccess(userInfo, RoleType.COMPUTATIONAL, form.getImage(), userInfo.getRoles())) {
 			log.warn("Unauthorized attempt to create a {} by user {}", form.getImage(), userInfo.getName());
 			throw new DlabException("You do not have the privileges to create a " + form.getTemplateName());
 		}
 
-		return computationalService.createSparkCluster(userInfo, form, form.getProject())
+		return computationalService.createSparkCluster(userInfo, form.getName(), form, form.getProject(), Collections.singletonList(String.format(AUDIT_MESSAGE, form.getNotebookName())))
 				? Response.ok().build()
 				: Response.status(Response.Status.FOUND).build();
-
 	}
 
 	/**
@@ -108,7 +109,8 @@ public class ComputationalResourceAzure {
 
 		log.debug("Terminating computational resource {} for user {}", computationalName, userInfo.getName());
 
-		computationalService.terminateComputational(userInfo, projectName, exploratoryName, computationalName);
+		computationalService.terminateComputational(userInfo, userInfo.getName(), projectName, exploratoryName,
+				computationalName, Collections.singletonList(String.format(AUDIT_MESSAGE, exploratoryName)));
 
 		return Response.ok().build();
 	}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/gcp/ComputationalResourceGcp.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/gcp/ComputationalResourceGcp.java
index 087330a..71eaf35 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/gcp/ComputationalResourceGcp.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/gcp/ComputationalResourceGcp.java
@@ -48,6 +48,7 @@ import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
+import java.util.Collections;
 import java.util.List;
 
 import static com.epam.dlab.dto.UserInstanceStatus.CREATING;
@@ -82,7 +83,7 @@ public class ComputationalResourceGcp implements ComputationalAPI {
 	 * Asynchronously creates Dataproc cluster
 	 *
 	 * @param userInfo user info.
-	 * @param formDTO  DTO info about creation of the computational resource.
+	 * @param form     DTO info about creation of the computational resource.
 	 * @return 200 OK - if request success, 302 Found - for duplicates.
 	 * @throws IllegalArgumentException if docker image name is malformed
 	 */
@@ -90,30 +91,30 @@ public class ComputationalResourceGcp implements ComputationalAPI {
 	@Path("dataengine-service")
 	@Operation(tags = "computational", summary = "Create dataproc cluster")
 	public Response createDataEngineService(@Auth @Parameter(hidden = true) UserInfo userInfo,
-											@Valid @NotNull @Parameter GcpComputationalCreateForm formDTO) {
+											@Valid @NotNull @Parameter GcpComputationalCreateForm form) {
 
-		log.debug("Create computational resources for {} | form is {}", userInfo.getName(), formDTO);
+		log.debug("Create computational resources for {} | form is {}", userInfo.getName(), form);
 
-		if (DataEngineType.CLOUD_SERVICE == DataEngineType.fromDockerImageName(formDTO.getImage())) {
-			validate(userInfo, formDTO);
+		if (DataEngineType.CLOUD_SERVICE == DataEngineType.fromDockerImageName(form.getImage())) {
+			validate(userInfo, form);
 			GcpComputationalResource gcpComputationalResource = GcpComputationalResource.builder().computationalName
-					(formDTO.getName())
-					.imageName(formDTO.getImage())
-					.templateName(formDTO.getTemplateName())
+					(form.getName())
+					.imageName(form.getImage())
+					.templateName(form.getTemplateName())
 					.status(CREATING.toString())
-					.masterShape(formDTO.getMasterInstanceType())
-					.slaveShape(formDTO.getSlaveInstanceType())
-					.slaveNumber(formDTO.getSlaveInstanceCount())
-					.masterNumber(formDTO.getMasterInstanceCount())
-					.preemptibleNumber(formDTO.getPreemptibleCount())
-					.version(formDTO.getVersion())
+					.masterShape(form.getMasterInstanceType())
+					.slaveShape(form.getSlaveInstanceType())
+					.slaveNumber(form.getSlaveInstanceCount())
+					.masterNumber(form.getMasterInstanceCount())
+					.preemptibleNumber(form.getPreemptibleCount())
+					.version(form.getVersion())
 					.build();
-			boolean resourceAdded = computationalService.createDataEngineService(userInfo, formDTO,
-					gcpComputationalResource, formDTO.getProject());
+			boolean resourceAdded = computationalService.createDataEngineService(userInfo, form.getName(), form, gcpComputationalResource,
+					form.getProject(), Collections.singletonList(String.format(AUDIT_MESSAGE, form.getNotebookName())));
 			return resourceAdded ? Response.ok().build() : Response.status(Response.Status.FOUND).build();
 		}
 
-		throw new IllegalArgumentException("Malformed image " + formDTO.getImage());
+		throw new IllegalArgumentException("Malformed image " + form.getImage());
 	}
 
 
@@ -135,7 +136,7 @@ public class ComputationalResourceGcp implements ComputationalAPI {
 			throw new DlabException("You do not have the privileges to create a " + form.getTemplateName());
 		}
 
-		return computationalService.createSparkCluster(userInfo, form, form.getProject())
+		return computationalService.createSparkCluster(userInfo, form.getName(), form, form.getProject(), Collections.singletonList(String.format(AUDIT_MESSAGE, form.getNotebookName())))
 				? Response.ok().build()
 				: Response.status(Response.Status.FOUND).build();
 	}
@@ -157,7 +158,8 @@ public class ComputationalResourceGcp implements ComputationalAPI {
 							  @PathParam("computationalName") String computationalName) {
 		log.debug("Terminating computational resource {} for user {}", computationalName, userInfo.getName());
 
-		computationalService.terminateComputational(userInfo, projectName, exploratoryName, computationalName);
+		computationalService.terminateComputational(userInfo, userInfo.getName(), projectName, exploratoryName,
+				computationalName, Collections.singletonList(String.format(AUDIT_MESSAGE, exploratoryName)));
 
 		return Response.ok().build();
 	}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/ComputationalService.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/ComputationalService.java
index 4a6f392..135657f 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/ComputationalService.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/ComputationalService.java
@@ -35,27 +35,30 @@ public interface ComputationalService {
 	/**
 	 * Asynchronously triggers creation of Spark cluster
 	 *
-	 * @param userInfo user authentication info
-	 * @param form     input cluster parameters
+	 * @param userInfo     user authentication info
+	 * @param resourceName name of computational resource
+	 * @param form         input cluster parameters
+	 * @param auditInfo    additional info for audit
 	 * @return <code>true</code> if action is successfully triggered, <code>false</code>false if cluster with the same
 	 * name already exists
 	 * @throws IllegalArgumentException if input parameters exceed limits or docker image name is malformed
 	 */
-	boolean createSparkCluster(UserInfo userInfo, SparkStandaloneClusterCreateForm form, String project);
+	boolean createSparkCluster(UserInfo userInfo, String resourceName, SparkStandaloneClusterCreateForm form, String project, List<String> auditInfo);
 
 	/**
 	 * Asynchronously triggers termination of computational resources
 	 *
 	 * @param userInfo          user info of authenticated user
+	 * @param resourceCreator   username of resource creator
 	 * @param project           project name
-	 * @param exploratoryName   name of exploratory where to terminate computational resources with
-	 *                          <code>computationalName</code>
+	 * @param exploratoryName   name of exploratory where to terminate computational resources with <code>computationalName</code>
 	 * @param computationalName computational name
+	 * @param auditInfo         additional info for audit
 	 */
-	void terminateComputational(UserInfo userInfo, String project, String exploratoryName, String computationalName);
+	void terminateComputational(UserInfo userInfo, String resourceCreator, String project, String exploratoryName, String computationalName, List<String> auditInfo);
 
-	boolean createDataEngineService(UserInfo userInfo, ComputationalCreateFormDTO formDTO, UserComputationalResource
-			computationalResource, String project);
+	boolean createDataEngineService(UserInfo userInfo, String resourceName, ComputationalCreateFormDTO formDTO, UserComputationalResource
+			computationalResource, String project, List<String> auditInfo);
 
 	void stopSparkCluster(UserInfo userInfo, String project, String exploratoryName, String computationalName);
 
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ComputationalServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ComputationalServiceImpl.java
index 722ee4d..d13fd6a 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ComputationalServiceImpl.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ComputationalServiceImpl.java
@@ -21,8 +21,12 @@ package com.epam.dlab.backendapi.service.impl;
 
 
 import com.epam.dlab.auth.UserInfo;
+import com.epam.dlab.backendapi.annotation.Audit;
 import com.epam.dlab.backendapi.annotation.BudgetLimited;
+import com.epam.dlab.backendapi.annotation.Info;
 import com.epam.dlab.backendapi.annotation.Project;
+import com.epam.dlab.backendapi.annotation.ResourceName;
+import com.epam.dlab.backendapi.annotation.User;
 import com.epam.dlab.backendapi.dao.ComputationalDAO;
 import com.epam.dlab.backendapi.dao.ExploratoryDAO;
 import com.epam.dlab.backendapi.domain.EndpointDTO;
@@ -65,6 +69,9 @@ import java.util.Map;
 import java.util.Optional;
 import java.util.stream.Collectors;
 
+import static com.epam.dlab.backendapi.domain.AuditActionEnum.CREATE_DATA_ENGINE;
+import static com.epam.dlab.backendapi.domain.AuditActionEnum.CREATE_DATA_ENGINE_SERVICE;
+import static com.epam.dlab.backendapi.domain.AuditActionEnum.TERMINATE_COMPUTATIONAL;
 import static com.epam.dlab.dto.UserInstanceStatus.CREATING;
 import static com.epam.dlab.dto.UserInstanceStatus.FAILED;
 import static com.epam.dlab.dto.UserInstanceStatus.RECONFIGURING;
@@ -142,9 +149,10 @@ public class ComputationalServiceImpl implements ComputationalService {
 	}
 
 	@BudgetLimited
+	@Audit(action = CREATE_DATA_ENGINE)
 	@Override
-	public boolean createSparkCluster(UserInfo userInfo, SparkStandaloneClusterCreateForm form, @Project String project) {
-
+	public boolean createSparkCluster(@User UserInfo userInfo, @ResourceName String resourceName, SparkStandaloneClusterCreateForm form, @Project String project,
+									  @Info List<String> auditInfo) {
 		final ProjectDTO projectDTO = projectService.get(project);
 		final UserInstanceDTO instance =
 				exploratoryDAO.fetchExploratoryFields(userInfo.getName(), project, form.getNotebookName());
@@ -176,44 +184,39 @@ public class ComputationalServiceImpl implements ComputationalService {
 		}
 	}
 
+	@Audit(action = TERMINATE_COMPUTATIONAL)
 	@Override
-	public void terminateComputational(UserInfo userInfo, String project, String exploratoryName, String computationalName) {
+	public void terminateComputational(@User UserInfo userInfo, String resourceCreator, String project, String exploratoryName, @ResourceName String computationalName,
+									   @Info List<String> auditInfo) {
 		try {
+			updateComputationalStatus(resourceCreator, project, exploratoryName, computationalName, TERMINATING);
 
-			updateComputationalStatus(userInfo.getName(), project, exploratoryName, computationalName, TERMINATING);
-
-			final UserInstanceDTO userInstanceDTO = exploratoryDAO.fetchExploratoryFields(userInfo.getName(), project,
-					exploratoryName);
-			UserComputationalResource compResource = computationalDAO.fetchComputationalFields(userInfo.getName(), project,
-					exploratoryName, computationalName);
+			final UserInstanceDTO userInstanceDTO = exploratoryDAO.fetchExploratoryFields(resourceCreator, project, exploratoryName);
+			UserComputationalResource compResource = computationalDAO.fetchComputationalFields(resourceCreator, project, exploratoryName, computationalName);
 
 			final DataEngineType dataEngineType = compResource.getDataEngineType();
 			EndpointDTO endpointDTO = endpointService.get(userInstanceDTO.getEndpoint());
-			ComputationalTerminateDTO dto = requestBuilder.newComputationalTerminate(userInfo, userInstanceDTO, compResource, endpointDTO);
+			ComputationalTerminateDTO dto = requestBuilder.newComputationalTerminate(resourceCreator, userInstanceDTO, compResource, endpointDTO);
 
 			final String provisioningUrl = Optional.ofNullable(DATA_ENGINE_TYPE_TERMINATE_URLS.get(dataEngineType))
 					.orElseThrow(UnsupportedOperationException::new);
-			String uuid =
-					provisioningService.post(endpointDTO.getUrl() + provisioningUrl,
-							userInfo.getAccessToken(), dto, String.class);
-			requestId.put(userInfo.getName(), uuid);
+			final String uuid = provisioningService.post(endpointDTO.getUrl() + provisioningUrl, userInfo.getAccessToken(), dto, String.class);
+			requestId.put(resourceCreator, uuid);
 		} catch (RuntimeException re) {
-
 			try {
-				updateComputationalStatus(userInfo.getName(), project, exploratoryName, computationalName, FAILED);
+				updateComputationalStatus(resourceCreator, project, exploratoryName, computationalName, FAILED);
 			} catch (DlabException e) {
-				log.error(COULD_NOT_UPDATE_THE_STATUS_MSG_FORMAT, computationalName, userInfo.getName(), e);
+				log.error(COULD_NOT_UPDATE_THE_STATUS_MSG_FORMAT, computationalName, resourceCreator, e);
 			}
-
 			throw re;
 		}
 	}
 
 	@BudgetLimited
+	@Audit(action = CREATE_DATA_ENGINE_SERVICE)
 	@Override
-	public boolean createDataEngineService(UserInfo userInfo, ComputationalCreateFormDTO formDTO,
-										   UserComputationalResource computationalResource, @Project String project) {
-
+	public boolean createDataEngineService(@User UserInfo userInfo, @ResourceName String resourceName, ComputationalCreateFormDTO formDTO,
+										   UserComputationalResource computationalResource, @Project String project, @Info List<String> auditInfo) {
 		final ProjectDTO projectDTO = projectService.get(project);
 		final UserInstanceDTO instance = exploratoryDAO.fetchExploratoryFields(userInfo.getName(), project, formDTO
 				.getNotebookName());
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 eb04e55..a396859 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
@@ -51,6 +51,7 @@ import java.util.stream.Stream;
 
 import static com.epam.dlab.backendapi.resources.dto.UserDTO.Status.ACTIVE;
 import static com.epam.dlab.backendapi.resources.dto.UserDTO.Status.NOT_ACTIVE;
+import static com.epam.dlab.rest.contracts.ComputationalAPI.AUDIT_MESSAGE;
 import static java.util.stream.Collectors.toList;
 
 @Singleton
@@ -161,10 +162,9 @@ public class EnvironmentServiceImpl implements EnvironmentService {
 
 	@ProjectAdmin
 	@Override
-	public void terminateComputational(@User UserInfo userInfo, String user, @Project String project,
-									   String exploratoryName, String computationalName) {
-		computationalService.terminateComputational(new UserInfo(user, userInfo.getAccessToken()), project, exploratoryName,
-				computationalName);
+	public void terminateComputational(@User UserInfo userInfo, String user, @Project String project, String exploratoryName, String computationalName) {
+		computationalService.terminateComputational(userInfo, user, project, exploratoryName, computationalName,
+				Collections.singletonList(String.format(AUDIT_MESSAGE, exploratoryName)));
 	}
 
 	private UserDTO toUserDTO(String u, UserDTO.Status status) {
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/SchedulerJobServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/SchedulerJobServiceImpl.java
index e00a288..37deea6 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/SchedulerJobServiceImpl.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/SchedulerJobServiceImpl.java
@@ -223,13 +223,13 @@ public class SchedulerJobServiceImpl implements SchedulerJobService {
 	}
 
 	private void terminateComputational(SchedulerJobData job) {
-		final String user = job.getUser();
-		final String expName = job.getExploratoryName();
-		final String compName = job.getComputationalName();
-		final UserInfo userInfo = securityService.getServiceAccountInfo(user);
-		log.debug("Terminating exploratory {} computational {} for user {} by scheduler", expName, compName, user);
-		computationalService.terminateComputational(userInfo, job.getProject(), expName, compName);
-	}
+        final String user = job.getUser();
+        final String expName = job.getExploratoryName();
+        final String compName = job.getComputationalName();
+        final UserInfo userInfo = securityService.getServiceAccountInfo(user);
+        log.debug("Terminating exploratory {} computational {} for user {} by scheduler", expName, compName, user);
+        computationalService.terminateComputational(userInfo, user, job.getProject(), expName, compName, Collections.singletonList(AUDIT_MESSAGE));
+    }
 
 	private void stopExploratory(SchedulerJobData job) {
 		final String expName = job.getExploratoryName();
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/util/RequestBuilder.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/util/RequestBuilder.java
index 32bea28..a72db8d 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/util/RequestBuilder.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/util/RequestBuilder.java
@@ -444,36 +444,36 @@ public class RequestBuilder {
 	}
 
 	@SuppressWarnings("unchecked")
-	public <T extends ComputationalBase<T>> T newComputationalTerminate(UserInfo userInfo,
-																		UserInstanceDTO userInstanceDTO,
-																		UserComputationalResource computationalResource,
-																		EndpointDTO endpointDTO) {
-		T computationalTerminate;
-		CloudProvider cloudProvider = endpointDTO.getCloudProvider();
-		switch (cloudProvider) {
-			case AWS:
-				AwsComputationalTerminateDTO terminateDTO = newResourceSysBaseDTO(userInfo.getName(), cloudProvider,
-						AwsComputationalTerminateDTO.class);
-				if (computationalResource.getDataEngineType() == DataEngineType.CLOUD_SERVICE) {
-					terminateDTO.setClusterName(computationalResource.getComputationalId());
-				}
-				computationalTerminate = (T) terminateDTO;
-				break;
-			case AZURE:
-				computationalTerminate = (T) newResourceSysBaseDTO(userInfo.getName(), cloudProvider, ComputationalTerminateDTO.class);
-				break;
-			case GCP:
-				GcpComputationalTerminateDTO gcpTerminateDTO = newResourceSysBaseDTO(userInfo.getName(), cloudProvider,
-						GcpComputationalTerminateDTO.class);
-				if (computationalResource.getDataEngineType() == DataEngineType.CLOUD_SERVICE) {
-					gcpTerminateDTO.setClusterName(computationalResource.getComputationalId());
-				}
-				computationalTerminate = (T) gcpTerminateDTO;
-				break;
-
-			default:
-				throw new IllegalArgumentException(UNSUPPORTED_CLOUD_PROVIDER_MESSAGE + cloudProvider);
-		}
+    public <T extends ComputationalBase<T>> T newComputationalTerminate(String resourceCreator,
+                                                                        UserInstanceDTO userInstanceDTO,
+                                                                        UserComputationalResource computationalResource,
+                                                                        EndpointDTO endpointDTO) {
+        T computationalTerminate;
+        CloudProvider cloudProvider = endpointDTO.getCloudProvider();
+        switch (cloudProvider) {
+            case AWS:
+                AwsComputationalTerminateDTO terminateDTO = newResourceSysBaseDTO(resourceCreator, cloudProvider,
+                        AwsComputationalTerminateDTO.class);
+                if (computationalResource.getDataEngineType() == DataEngineType.CLOUD_SERVICE) {
+                    terminateDTO.setClusterName(computationalResource.getComputationalId());
+                }
+                computationalTerminate = (T) terminateDTO;
+                break;
+            case AZURE:
+                computationalTerminate = (T) newResourceSysBaseDTO(resourceCreator, cloudProvider, ComputationalTerminateDTO.class);
+                break;
+            case GCP:
+                GcpComputationalTerminateDTO gcpTerminateDTO = newResourceSysBaseDTO(resourceCreator, cloudProvider,
+                        GcpComputationalTerminateDTO.class);
+                if (computationalResource.getDataEngineType() == DataEngineType.CLOUD_SERVICE) {
+                    gcpTerminateDTO.setClusterName(computationalResource.getComputationalId());
+                }
+                computationalTerminate = (T) gcpTerminateDTO;
+                break;
+
+            default:
+                throw new IllegalArgumentException(UNSUPPORTED_CLOUD_PROVIDER_MESSAGE + cloudProvider);
+        }
 
 		return computationalTerminate
 				.withExploratoryName(userInstanceDTO.getExploratoryName())
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/ExploratoryResourceTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/ExploratoryResourceTest.java
index a3e1dbd..a9ab5f2 100644
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/ExploratoryResourceTest.java
+++ b/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/ExploratoryResourceTest.java
@@ -144,22 +144,6 @@ public class ExploratoryResourceTest extends TestBase {
 	}
 
 	@Test
-	public void startWithFailedAuth() throws AuthenticationException {
-        authFailSetup();
-        when(exploratoryService.start(any(UserInfo.class), anyString(), anyString(), anyList())).thenReturn("someUuid");
-        final Response response = resources.getJerseyTest()
-                .target("/infrastructure_provision/exploratory_environment")
-                .request()
-                .header("Authorization", "Bearer " + TOKEN)
-                .post(Entity.json(getEmptyExploratoryActionFormDTO()));
-
-        assertEquals(HttpStatus.SC_FORBIDDEN, response.getStatus());
-        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-        verifyZeroInteractions(exploratoryService);
-	}
-
-	@Test
 	public void stop() {
 		when(exploratoryService.stop(any(UserInfo.class), anyString(), anyString(), anyString(), anyList())).thenReturn("someUuid");
 		final Response response = resources.getJerseyTest()
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/ComputationalServiceImplTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/ComputationalServiceImplTest.java
index 74fc7f0..1238e51 100644
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/ComputationalServiceImplTest.java
+++ b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/ComputationalServiceImplTest.java
@@ -70,6 +70,7 @@ import java.util.Optional;
 import static com.epam.dlab.dto.UserInstanceStatus.CREATING;
 import static com.epam.dlab.dto.UserInstanceStatus.RUNNING;
 import static com.epam.dlab.dto.UserInstanceStatus.STOPPED;
+import static com.epam.dlab.rest.contracts.ComputationalAPI.AUDIT_MESSAGE;
 import static java.util.Collections.singletonList;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -169,9 +170,9 @@ public class ComputationalServiceImplTest {
         when(provisioningService.post(anyString(), anyString(), any(ComputationalBase.class), any())).thenReturn(UUID);
         when(requestId.put(anyString(), anyString())).thenReturn(UUID);
 
-        SparkStandaloneClusterCreateForm sparkClusterCreateForm = (SparkStandaloneClusterCreateForm) formList.get(0);
-        boolean creationResult =
-                computationalService.createSparkCluster(userInfo, sparkClusterCreateForm, PROJECT);
+        SparkStandaloneClusterCreateForm form = (SparkStandaloneClusterCreateForm) formList.get(0);
+        boolean creationResult = computationalService.createSparkCluster(userInfo, form.getName(), form, PROJECT,
+                Collections.singletonList(String.format(AUDIT_MESSAGE, form.getNotebookName())));
         assertTrue(creationResult);
 
         verify(projectService).get(PROJECT);
@@ -179,7 +180,7 @@ public class ComputationalServiceImplTest {
 
         verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
         verify(requestBuilder).newComputationalCreate(
-                refEq(userInfo), refEq(projectDTO), refEq(userInstance), refEq(sparkClusterCreateForm), refEq(endpointDTO()));
+                refEq(userInfo), refEq(projectDTO), refEq(userInstance), refEq(form), refEq(endpointDTO()));
 
         verify(provisioningService)
                 .post(endpointDTO().getUrl() + ComputationalAPI.COMPUTATIONAL_CREATE_SPARK, TOKEN, compBaseMocked,
@@ -195,11 +196,10 @@ public class ComputationalServiceImplTest {
                 any(SparkStandaloneClusterResource.class))).thenReturn(false);
         when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString())).thenReturn(userInstance);
 
-
-        boolean creationResult = computationalService.createSparkCluster(userInfo, (SparkStandaloneClusterCreateForm) formList.get(0),
-                PROJECT);
+        SparkStandaloneClusterCreateForm form = (SparkStandaloneClusterCreateForm) formList.get(0);
+        boolean creationResult = computationalService.createSparkCluster(userInfo, form.getName(), form, PROJECT,
+                Collections.singletonList(String.format(AUDIT_MESSAGE, form.getNotebookName())));
         assertFalse(creationResult);
-
         verify(computationalDAO).addComputational(eq(USER), eq(EXPLORATORY_NAME), eq(PROJECT), refEq(sparkClusterResource));
         verifyNoMoreInteractions(configuration, computationalDAO);
     }
@@ -214,9 +214,9 @@ public class ComputationalServiceImplTest {
         when(computationalDAO.updateComputationalStatus(any(ComputationalStatusDTO.class)))
                 .thenReturn(mock(UpdateResult.class));
 
-        SparkStandaloneClusterCreateForm sparkClusterCreateForm = (SparkStandaloneClusterCreateForm) formList.get(0);
+        SparkStandaloneClusterCreateForm form = (SparkStandaloneClusterCreateForm) formList.get(0);
         try {
-            computationalService.createSparkCluster(userInfo, sparkClusterCreateForm, PROJECT);
+            computationalService.createSparkCluster(userInfo, form.getName(), form, PROJECT, Collections.singletonList(String.format(AUDIT_MESSAGE, form.getNotebookName())));
         } catch (ResourceNotFoundException e) {
             assertEquals("Exploratory for user with name not found", e.getMessage());
         }
@@ -244,9 +244,9 @@ public class ComputationalServiceImplTest {
         when(computationalDAO.updateComputationalStatus(any(ComputationalStatusDTO.class)))
                 .thenReturn(mock(UpdateResult.class));
 
-        SparkStandaloneClusterCreateForm sparkClusterCreateForm = (SparkStandaloneClusterCreateForm) formList.get(0);
+        SparkStandaloneClusterCreateForm form = (SparkStandaloneClusterCreateForm) formList.get(0);
         try {
-            computationalService.createSparkCluster(userInfo, sparkClusterCreateForm, PROJECT);
+            computationalService.createSparkCluster(userInfo, form.getName(), form, PROJECT, Collections.singletonList(String.format(AUDIT_MESSAGE, form.getNotebookName())));
         } catch (DlabException e) {
             assertEquals("Cannot create instance of resource class ", e.getMessage());
         }
@@ -254,7 +254,7 @@ public class ComputationalServiceImplTest {
         verify(computationalDAO).addComputational(USER, EXPLORATORY_NAME, PROJECT, sparkClusterResource);
         verify(computationalDAO).updateComputationalStatus(refEq(computationalStatusDTOWithStatusFailed, "self"));
         verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
-        verify(requestBuilder).newComputationalCreate(userInfo, projectDTO, userInstance, sparkClusterCreateForm, endpointDTO());
+        verify(requestBuilder).newComputationalCreate(userInfo, projectDTO, userInstance, form, endpointDTO());
         verifyNoMoreInteractions(projectService, configuration, computationalDAO, exploratoryDAO, requestBuilder);
     }
 
@@ -276,19 +276,19 @@ public class ComputationalServiceImplTest {
         ComputationalTerminateDTO ctDto = new ComputationalTerminateDTO();
         ctDto.setComputationalName(COMP_NAME);
         ctDto.setExploratoryName(EXPLORATORY_NAME);
-        when(requestBuilder.newComputationalTerminate(any(UserInfo.class), any(UserInstanceDTO.class),
+        when(requestBuilder.newComputationalTerminate(anyString(), any(UserInstanceDTO.class),
                 any(UserComputationalResource.class), any(EndpointDTO.class))).thenReturn(ctDto);
 
         when(provisioningService.post(anyString(), anyString(), any(ComputationalTerminateDTO.class), any()))
                 .thenReturn(UUID);
         when(requestId.put(anyString(), anyString())).thenReturn(UUID);
 
-        computationalService.terminateComputational(userInfo, PROJECT, EXPLORATORY_NAME, COMP_NAME);
+        computationalService.terminateComputational(userInfo, userInfo.getName(), PROJECT, EXPLORATORY_NAME, COMP_NAME, Collections.singletonList(AUDIT_MESSAGE));
 
         verify(computationalDAO).updateComputationalStatus(refEq(computationalStatusDTOWithStatusTerminating, "self"));
         verify(computationalDAO).fetchComputationalFields(USER, PROJECT, EXPLORATORY_NAME, COMP_NAME);
 
-        verify(requestBuilder).newComputationalTerminate(userInfo, userInstance, ucResource, endpointDTO());
+        verify(requestBuilder).newComputationalTerminate(userInfo.getName(), userInstance, ucResource, endpointDTO());
 
         verify(provisioningService).post(endpointDTO().getUrl() + ComputationalAPI.COMPUTATIONAL_TERMINATE_CLOUD_SPECIFIC, TOKEN, ctDto,
                 String.class);
@@ -308,7 +308,7 @@ public class ComputationalServiceImplTest {
 				.thenReturn(mock(UpdateResult.class));
 
         try {
-            computationalService.terminateComputational(userInfo, PROJECT, EXPLORATORY_NAME, COMP_NAME);
+            computationalService.terminateComputational(userInfo, userInfo.getName(), PROJECT, EXPLORATORY_NAME, COMP_NAME, Collections.singletonList(AUDIT_MESSAGE));
         } catch (DlabException e) {
             assertEquals("Could not update computational resource status", e.getMessage());
         }
@@ -329,7 +329,7 @@ public class ComputationalServiceImplTest {
                 .thenReturn(mock(UpdateResult.class));
 
         try {
-            computationalService.terminateComputational(userInfo, PROJECT, EXPLORATORY_NAME, COMP_NAME);
+            computationalService.terminateComputational(userInfo, userInfo.getName(), PROJECT, EXPLORATORY_NAME, COMP_NAME, Collections.singletonList(AUDIT_MESSAGE));
         } catch (DlabException e) {
             assertEquals("Computational resource for user with exploratory name not found.", e.getMessage());
         }
@@ -356,14 +356,14 @@ public class ComputationalServiceImplTest {
         when(computationalDAO.fetchComputationalFields(anyString(), anyString(), anyString(), anyString())).thenReturn(ucResource);
 
         doThrow(new DlabException("Cannot create instance of resource class "))
-                .when(requestBuilder).newComputationalTerminate(any(UserInfo.class), any(UserInstanceDTO.class),
+                .when(requestBuilder).newComputationalTerminate(anyString(), any(UserInstanceDTO.class),
                 any(UserComputationalResource.class), any(EndpointDTO.class));
 
         when(computationalDAO.updateComputationalStatus(any(ComputationalStatusDTO.class)))
                 .thenReturn(mock(UpdateResult.class));
 
         try {
-            computationalService.terminateComputational(userInfo, PROJECT, EXPLORATORY_NAME, COMP_NAME);
+            computationalService.terminateComputational(userInfo, userInfo.getName(), PROJECT, EXPLORATORY_NAME, COMP_NAME, Collections.singletonList(AUDIT_MESSAGE));
         } catch (DlabException e) {
             assertEquals("Cannot create instance of resource class ", e.getMessage());
         }
@@ -373,7 +373,7 @@ public class ComputationalServiceImplTest {
 
         verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
 
-        verify(requestBuilder).newComputationalTerminate(userInfo, userInstance, ucResource, endpointDTO());
+        verify(requestBuilder).newComputationalTerminate(userInfo.getName(), userInstance, ucResource, endpointDTO());
         verify(computationalDAO).updateComputationalStatus(refEq(computationalStatusDTOWithStatusFailed, "self"));
         verifyNoMoreInteractions(computationalDAO, exploratoryDAO, requestBuilder);
     }
@@ -395,8 +395,9 @@ public class ComputationalServiceImplTest {
         when(provisioningService.post(anyString(), anyString(), any(ComputationalBase.class), any())).thenReturn(UUID);
         when(requestId.put(anyString(), anyString())).thenReturn(UUID);
 
-        boolean creationResult =
-                computationalService.createDataEngineService(userInfo, formList.get(1), ucResource, PROJECT);
+        ComputationalCreateFormDTO form = formList.get(1);
+        boolean creationResult = computationalService.createDataEngineService(userInfo, form.getName(), form, ucResource, PROJECT,
+                Collections.singletonList(String.format(AUDIT_MESSAGE, form.getNotebookName())));
         assertTrue(creationResult);
 
         verify(projectService).get(PROJECT);
@@ -422,8 +423,9 @@ public class ComputationalServiceImplTest {
         when(computationalDAO.addComputational(anyString(), anyString(), any(), any(UserComputationalResource.class)))
                 .thenReturn(false);
 
-        boolean creationResult = computationalService.createDataEngineService(userInfo, formList.get(1), ucResource,
-                PROJECT);
+        ComputationalCreateFormDTO form = formList.get(1);
+        boolean creationResult = computationalService.createDataEngineService(userInfo, form.getName(), form, ucResource, PROJECT,
+                Collections.singletonList(String.format(AUDIT_MESSAGE, form.getNotebookName())));
         assertFalse(creationResult);
 
         verify(computationalDAO).addComputational(eq(USER), eq(EXPLORATORY_NAME), eq(PROJECT), refEq(ucResource));
@@ -440,8 +442,10 @@ public class ComputationalServiceImplTest {
         when(computationalDAO.updateComputationalStatus(any(ComputationalStatusDTO.class)))
                 .thenReturn(mock(UpdateResult.class));
 
+        ComputationalCreateFormDTO form = formList.get(1);
         try {
-            computationalService.createDataEngineService(userInfo, formList.get(1), ucResource, PROJECT);
+            computationalService.createDataEngineService(userInfo, form.getName(), form, ucResource, PROJECT,
+                    Collections.singletonList(String.format(AUDIT_MESSAGE, form.getNotebookName())));
         } catch (DlabException e) {
             assertEquals("Exploratory for user with name not found", e.getMessage());
         }
@@ -472,9 +476,10 @@ public class ComputationalServiceImplTest {
         when(computationalDAO.updateComputationalStatus(any(ComputationalStatusDTO.class)))
                 .thenReturn(mock(UpdateResult.class));
 
-        ComputationalCreateFormDTO computationalCreateFormDTO = formList.get(1);
+        ComputationalCreateFormDTO form = formList.get(1);
         try {
-            computationalService.createDataEngineService(userInfo, computationalCreateFormDTO, ucResource, PROJECT);
+            computationalService.createDataEngineService(userInfo, form.getName(), form, ucResource, PROJECT,
+                    Collections.singletonList(String.format(AUDIT_MESSAGE, form.getNotebookName())));
         } catch (DlabException e) {
             assertEquals("Could not send request for creation the computational resource compName: " +
                     "Cannot create instance of resource class ", e.getMessage());
@@ -484,7 +489,7 @@ public class ComputationalServiceImplTest {
         verify(computationalDAO).addComputational(eq(USER), eq(EXPLORATORY_NAME), eq(PROJECT), refEq(ucResource));
         verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
         verify(requestBuilder).newComputationalCreate(
-                refEq(userInfo), refEq(projectDTO), refEq(userInstance), refEq(computationalCreateFormDTO), refEq(endpointDTO()));
+                refEq(userInfo), refEq(projectDTO), refEq(userInstance), refEq(form), refEq(endpointDTO()));
         verify(computationalDAO).updateComputationalStatus(refEq(computationalStatusDTOWithStatusFailed, "self"));
 
         verifyNoMoreInteractions(projectService, computationalDAO, exploratoryDAO, requestBuilder);
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 7bde7a6..ce80c08 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
@@ -65,6 +65,7 @@ import static org.mockito.Mockito.when;
 @RunWith(MockitoJUnitRunner.class)
 public class EnvironmentServiceImplTest {
 	private static final String AUDIT_QUOTA_MESSAGE = "Billing quota reached";
+	private static final String AUDIT_MESSAGE = "Notebook name: %s";
 	private static final String DLAB_SYSTEM_USER = "DLab system user";
 	private static final String USER = "test";
 	private static final String EXPLORATORY_NAME_1 = "expName1";
@@ -187,12 +188,12 @@ public class EnvironmentServiceImplTest {
 	public void terminateComputational() {
 		final UserInfo userInfo = getUserInfo();
 		doNothing().when(computationalService)
-				.terminateComputational(any(UserInfo.class), anyString(), anyString(), anyString());
+				.terminateComputational(any(UserInfo.class), anyString(), anyString(), anyString(), anyString(), anyList());
 
 		environmentService.terminateComputational(userInfo, USER, PROJECT_NAME, EXPLORATORY_NAME_1, "compName");
 
-		verify(computationalService)
-				.terminateComputational(refEq(userInfo), eq(PROJECT_NAME), eq(EXPLORATORY_NAME_1), eq("compName"));
+		verify(computationalService).terminateComputational(refEq(userInfo), eq(userInfo.getName()), eq(PROJECT_NAME), eq(EXPLORATORY_NAME_1), eq("compName"),
+				eq(Collections.singletonList(String.format(AUDIT_MESSAGE, EXPLORATORY_NAME_1))));
 		verifyNoMoreInteractions(securityService, computationalService);
 	}
 
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/SchedulerJobServiceImplTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/SchedulerJobServiceImplTest.java
index 2b535fe..5b9b738 100644
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/SchedulerJobServiceImplTest.java
+++ b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/SchedulerJobServiceImplTest.java
@@ -866,27 +866,28 @@ public class SchedulerJobServiceImplTest {
 
 	@Test
 	public void testTerminateComputationalByScheduler() {
-		final List<DayOfWeek> stopDays = Arrays.asList(DayOfWeek.values());
-		final List<DayOfWeek> startDays = Arrays.asList(DayOfWeek.values());
-		final LocalDateTime terminateDateTime = LocalDateTime.of(LocalDate.now(),
-				LocalTime.now().truncatedTo(ChronoUnit.MINUTES));
-		final LocalDate finishDate = LocalDate.now().plusDays(1);
-		final SchedulerJobData schedulerJobData = getSchedulerJobData(LocalDate.now(), finishDate, startDays, stopDays
-				, terminateDateTime, false, USER, LocalTime.now().truncatedTo(ChronoUnit.MINUTES)
-		);
-		when(schedulerJobDAO.getComputationalSchedulerDataWithOneOfStatus(any(UserInstanceStatus.class),
-				anyVararg())).thenReturn(singletonList(schedulerJobData));
-		when(securityService.getServiceAccountInfo(anyString())).thenReturn(getUserInfo());
-
-		schedulerJobService.terminateComputationalByScheduler();
-
-		verify(securityService).getServiceAccountInfo(USER);
-		verify(schedulerJobDAO)
-				.getComputationalSchedulerDataWithOneOfStatus(RUNNING, STOPPED, RUNNING);
-		verify(computationalService).terminateComputational(refEq(getUserInfo()), eq(PROJECT),
-				eq(EXPLORATORY_NAME), eq(COMPUTATIONAL_NAME));
-		verifyNoMoreInteractions(securityService, schedulerJobDAO, computationalService);
-	}
+        final List<DayOfWeek> stopDays = Arrays.asList(DayOfWeek.values());
+        final List<DayOfWeek> startDays = Arrays.asList(DayOfWeek.values());
+        final LocalDateTime terminateDateTime = LocalDateTime.of(LocalDate.now(),
+                LocalTime.now().truncatedTo(ChronoUnit.MINUTES));
+        final LocalDate finishDate = LocalDate.now().plusDays(1);
+        final SchedulerJobData schedulerJobData = getSchedulerJobData(LocalDate.now(), finishDate, startDays, stopDays
+                , terminateDateTime, false, USER, LocalTime.now().truncatedTo(ChronoUnit.MINUTES)
+        );
+        when(schedulerJobDAO.getComputationalSchedulerDataWithOneOfStatus(any(UserInstanceStatus.class),
+                anyVararg())).thenReturn(singletonList(schedulerJobData));
+        UserInfo userInfo = getUserInfo();
+        when(securityService.getServiceAccountInfo(anyString())).thenReturn(userInfo);
+
+        schedulerJobService.terminateComputationalByScheduler();
+
+        verify(securityService).getServiceAccountInfo(USER);
+        verify(schedulerJobDAO)
+                .getComputationalSchedulerDataWithOneOfStatus(RUNNING, STOPPED, RUNNING);
+        verify(computationalService).terminateComputational(refEq(userInfo), eq(userInfo.getName()), eq(PROJECT), eq(EXPLORATORY_NAME), eq(COMPUTATIONAL_NAME),
+                eq(Collections.singletonList(AUDIT_MESSAGE)));
+        verifyNoMoreInteractions(securityService, schedulerJobDAO, computationalService);
+    }
 
 	@Test
 	public void testTerminateComputationalBySchedulerWhenSchedulerIsNotConfigured() {


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