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/23 12:24:34 UTC

[incubator-dlab] branch audit updated: [DLAB-1888] Divide action one two columns

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


The following commit(s) were added to refs/heads/audit by this push:
     new 84ba176  [DLAB-1888] Divide action one two columns
84ba176 is described below

commit 84ba176da1804a905ae8d510c2300397407e8c33
Author: Oleh Fuks <ol...@gmail.com>
AuthorDate: Tue Jun 23 15:24:16 2020 +0300

    [DLAB-1888] Divide action one two columns
---
 .../com/epam/dlab/backendapi/annotation/Audit.java |   3 +
 .../dlab/backendapi/domain/AuditActionEnum.java    |  12 +-
 .../com/epam/dlab/backendapi/domain/AuditDTO.java  |   1 +
 .../AuditResourceTypeEnum.java}                    |  16 +-
 .../backendapi/interceptor/AuditInterceptor.java   |  16 +-
 .../backendapi/service/impl/AuditServiceImpl.java  |   8 +-
 .../backendapi/service/impl/BucketServiceImpl.java |  11 +-
 .../service/impl/ComputationalServiceImpl.java     | 121 +++++------
 .../service/impl/EndpointServiceImpl.java          |  85 ++++----
 .../service/impl/ExploratoryServiceImpl.java       |  72 ++++---
 .../service/impl/GitCredentialServiceImpl.java     |  71 ++++---
 .../service/impl/ImageExploratoryServiceImpl.java  |  83 ++++----
 .../service/impl/LibraryServiceImpl.java           |   9 +-
 .../service/impl/ProjectServiceImpl.java           | 234 +++++++++++----------
 .../service/impl/SchedulerJobServiceImpl.java      | 102 ++++-----
 .../service/impl/UserGroupServiceImpl.java         |  14 +-
 .../service/impl/EnvironmentServiceImplTest.java   |  22 +-
 .../service/impl/ExploratoryServiceImplTest.java   |  48 +++--
 18 files changed, 475 insertions(+), 453 deletions(-)

diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/annotation/Audit.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/annotation/Audit.java
index d6bd5e9..946fabc 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/annotation/Audit.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/annotation/Audit.java
@@ -20,6 +20,7 @@
 package com.epam.dlab.backendapi.annotation;
 
 import com.epam.dlab.backendapi.domain.AuditActionEnum;
+import com.epam.dlab.backendapi.domain.AuditResourceTypeEnum;
 
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
@@ -30,4 +31,6 @@ import java.lang.annotation.Target;
 @Retention(RetentionPolicy.RUNTIME)
 public @interface Audit {
     AuditActionEnum action();
+
+    AuditResourceTypeEnum type();
 }
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 37cfbee..e7bc9a1 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
@@ -20,15 +20,5 @@
 package com.epam.dlab.backendapi.domain;
 
 public enum AuditActionEnum {
-    CREATE_EDGE_NODE, START_EDGE_NODE, STOP_EDGE_NODE, TERMINATE_EDGE_NODE, UPDATE_PROJECT,
-    CREATE_NOTEBOOK, START_NOTEBOOK, STOP_NOTEBOOK, TERMINATE_NOTEBOOK, UPDATE_CLUSTER_CONFIG, CREATE_NOTEBOOK_SCHEDULER,
-    CREATE_DATA_ENGINE, CREATE_DATA_ENGINE_SERVICE, START_COMPUTATIONAL, STOP_COMPUTATIONAL, TERMINATE_COMPUTATIONAL, UPDATE_DATA_ENGINE_CONFIG, CREATE_COMPUTATIONAL_SCHEDULER,
-    BUCKET_UPLOAD_OBJECT, BUCKET_DOWNLOAD_OBJECT, BUCKET_DELETE_OBJECT,
-    CREATE_ENDPOINT, DELETE_ENDPOINT,
-    INSTALL_NOTEBOOK_LIBS, INSTALL_COMPUTATIONAL_LIBS,
-    CREATE_GROUP, UPDATE_GROUP, DELETE_GROUP,
-    CREATE_IMAGE,
-    MANAGE_GIT_ACCOUNT,
-    FOLLOW_NOTEBOOK_LINK,
-    LOG_IN
+    CREATE, START, STOP, TERMINATE, UPDATE, UPLOAD, DOWNLOAD, DELETE, INSTALL, FOLLOW_LINK, LOG_IN
 }
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/AuditDTO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/AuditDTO.java
index d7a2d98..442522f 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/AuditDTO.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/AuditDTO.java
@@ -31,6 +31,7 @@ import java.util.Date;
 public class AuditDTO {
     private final String user;
     private final AuditActionEnum action;
+    private final AuditResourceTypeEnum type;
     private final String project;
     private final String resourceName;
     private final String info;
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/annotation/Audit.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/AuditResourceTypeEnum.java
similarity index 67%
copy from services/self-service/src/main/java/com/epam/dlab/backendapi/annotation/Audit.java
copy to services/self-service/src/main/java/com/epam/dlab/backendapi/domain/AuditResourceTypeEnum.java
index d6bd5e9..cc9ebdf 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/annotation/Audit.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/AuditResourceTypeEnum.java
@@ -17,17 +17,9 @@
  * under the License.
  */
 
-package com.epam.dlab.backendapi.annotation;
+package com.epam.dlab.backendapi.domain;
 
-import com.epam.dlab.backendapi.domain.AuditActionEnum;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Target(ElementType.METHOD)
-@Retention(RetentionPolicy.RUNTIME)
-public @interface Audit {
-    AuditActionEnum action();
+public enum AuditResourceTypeEnum {
+    PROJECT, EDGE_NODE, NOTEBOOK, NOTEBOOK_SCHEDULER, NOTEBOOK_CONFIG, COMPUTATIONAL, COMPUTATIONAL_LIBS, COMPUTATIONAL_SCHEDULER, COMPUTATIONAL_CONFIG,
+    BUCKET, ENDPOINT, NOTEBOOK_LIBS, GROUP, IMAGE, GIT_ACCOUNT, LOG_IN
 }
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/interceptor/AuditInterceptor.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/interceptor/AuditInterceptor.java
index fc04335..4b1b0ca 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/interceptor/AuditInterceptor.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/interceptor/AuditInterceptor.java
@@ -27,6 +27,7 @@ import com.epam.dlab.backendapi.annotation.ResourceName;
 import com.epam.dlab.backendapi.annotation.User;
 import com.epam.dlab.backendapi.domain.AuditActionEnum;
 import com.epam.dlab.backendapi.domain.AuditDTO;
+import com.epam.dlab.backendapi.domain.AuditResourceTypeEnum;
 import com.epam.dlab.backendapi.service.AuditService;
 import com.epam.dlab.exceptions.DlabException;
 import com.google.inject.Inject;
@@ -51,7 +52,8 @@ public class AuditInterceptor implements MethodInterceptor {
         Method method = mi.getMethod();
         final Parameter[] parameters = mi.getMethod().getParameters();
         final String user = getUserInfo(mi, parameters);
-        final AuditActionEnum action = getAuditActionEnum(method);
+        final AuditActionEnum action = getAuditAction(method);
+        final AuditResourceTypeEnum resourceType = getResourceType(method);
         final String project = getProject(mi, parameters);
         final String resourceName = getResourceName(mi, parameters);
         final String auditInfo = getInfo(mi, parameters);
@@ -59,6 +61,7 @@ public class AuditInterceptor implements MethodInterceptor {
         AuditDTO auditCreateDTO = AuditDTO.builder()
                 .user(user)
                 .action(action)
+                .type(resourceType)
                 .project(project)
                 .resourceName(resourceName)
                 .info(auditInfo)
@@ -75,7 +78,7 @@ public class AuditInterceptor implements MethodInterceptor {
                 .orElseThrow(() -> new DlabException("UserInfo parameter wanted!"));
     }
 
-    private AuditActionEnum getAuditActionEnum(Method method) {
+    private AuditActionEnum getAuditAction(Method method) {
         Annotation[] declaredAnnotations = method.getDeclaredAnnotations();
         return IntStream.range(0, method.getDeclaredAnnotations().length)
                 .filter(i -> declaredAnnotations[i] instanceof Audit)
@@ -84,6 +87,15 @@ public class AuditInterceptor implements MethodInterceptor {
                 .orElseThrow(() -> new DlabException("'Audit' annotation wanted!"));
     }
 
+    private AuditResourceTypeEnum getResourceType(Method method) {
+        Annotation[] declaredAnnotations = method.getDeclaredAnnotations();
+        return IntStream.range(0, method.getDeclaredAnnotations().length)
+                .filter(i -> declaredAnnotations[i] instanceof Audit)
+                .mapToObj(i -> ((Audit) declaredAnnotations[i]).type())
+                .findAny()
+                .orElseThrow(() -> new DlabException("'Audit' annotation wanted!"));
+    }
+
     private String getProject(MethodInvocation mi, Parameter[] parameters) {
         return IntStream.range(0, parameters.length)
                 .filter(i -> Objects.nonNull(parameters[i].getAnnotation(Project.class)))
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/AuditServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/AuditServiceImpl.java
index 9db06da..6c86411 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/AuditServiceImpl.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/AuditServiceImpl.java
@@ -20,7 +20,6 @@
 package com.epam.dlab.backendapi.service.impl;
 
 import com.epam.dlab.backendapi.dao.AuditDAO;
-import com.epam.dlab.backendapi.domain.AuditActionEnum;
 import com.epam.dlab.backendapi.domain.AuditCreateDTO;
 import com.epam.dlab.backendapi.domain.AuditDTO;
 import com.epam.dlab.backendapi.domain.AuditPaginationDTO;
@@ -29,6 +28,9 @@ import com.google.inject.Inject;
 
 import java.util.List;
 
+import static com.epam.dlab.backendapi.domain.AuditActionEnum.FOLLOW_LINK;
+import static com.epam.dlab.backendapi.domain.AuditResourceTypeEnum.NOTEBOOK;
+
 public class AuditServiceImpl implements AuditService {
     private final AuditDAO auditDAO;
 
@@ -47,10 +49,10 @@ public class AuditServiceImpl implements AuditService {
         AuditDTO auditDTO = AuditDTO.builder()
                 .user(user)
                 .resourceName(audit.getResourceName())
-                .action(AuditActionEnum.FOLLOW_NOTEBOOK_LINK)
+                .action(FOLLOW_LINK)
+                .type(NOTEBOOK)
                 .info(audit.getInfo())
                 .build();
-
         auditDAO.save(auditDTO);
     }
 
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/BucketServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/BucketServiceImpl.java
index eecd939..93fc12b 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/BucketServiceImpl.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/BucketServiceImpl.java
@@ -24,7 +24,6 @@ import com.epam.dlab.backendapi.annotation.Audit;
 import com.epam.dlab.backendapi.annotation.Info;
 import com.epam.dlab.backendapi.annotation.ResourceName;
 import com.epam.dlab.backendapi.annotation.User;
-import com.epam.dlab.backendapi.domain.AuditActionEnum;
 import com.epam.dlab.backendapi.domain.EndpointDTO;
 import com.epam.dlab.backendapi.service.BucketService;
 import com.epam.dlab.backendapi.service.EndpointService;
@@ -52,6 +51,10 @@ import java.net.URLEncoder;
 import java.nio.charset.StandardCharsets;
 import java.util.List;
 
+import static com.epam.dlab.backendapi.domain.AuditActionEnum.DELETE;
+import static com.epam.dlab.backendapi.domain.AuditActionEnum.DOWNLOAD;
+import static com.epam.dlab.backendapi.domain.AuditActionEnum.UPLOAD;
+import static com.epam.dlab.backendapi.domain.AuditResourceTypeEnum.BUCKET;
 import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
 import static javax.ws.rs.core.MediaType.APPLICATION_OCTET_STREAM;
 
@@ -83,7 +86,7 @@ public class BucketServiceImpl implements BucketService {
         }
     }
 
-    @Audit(action = AuditActionEnum.BUCKET_UPLOAD_OBJECT)
+    @Audit(action = UPLOAD, type = BUCKET)
     @Override
     public void uploadObjects(@User UserInfo userInfo, @ResourceName String bucket, String object, String endpoint, InputStream inputStream, long fileSize, @Info String auditInfo) {
         log.info("Uploading file {} for user {} to bucket {}", object, userInfo.getName(), bucket);
@@ -101,7 +104,7 @@ public class BucketServiceImpl implements BucketService {
         log.info("Finished uploading file {} for user {} to bucket {}", object, userInfo.getName(), bucket);
     }
 
-    @Audit(action = AuditActionEnum.BUCKET_DOWNLOAD_OBJECT)
+    @Audit(action = DOWNLOAD, type = BUCKET)
     @Override
     public void downloadObject(@User UserInfo userInfo, @ResourceName String bucket, String object, String endpoint, HttpServletResponse resp, @Info String auditInfo) {
         log.info("Downloading file {} for user {} from bucket {}", object, userInfo.getName(), bucket);
@@ -116,7 +119,7 @@ public class BucketServiceImpl implements BucketService {
         }
     }
 
-    @Audit(action = AuditActionEnum.BUCKET_DELETE_OBJECT)
+    @Audit(action = DELETE, type = BUCKET)
     @Override
     public void deleteObjects(@User UserInfo userInfo, @ResourceName String bucket, List<String> objects, String endpoint, @Info String auditInfo) {
         try {
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 0f24936..232883c 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
@@ -69,12 +69,13 @@ 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.START_COMPUTATIONAL;
-import static com.epam.dlab.backendapi.domain.AuditActionEnum.STOP_COMPUTATIONAL;
-import static com.epam.dlab.backendapi.domain.AuditActionEnum.TERMINATE_COMPUTATIONAL;
-import static com.epam.dlab.backendapi.domain.AuditActionEnum.UPDATE_DATA_ENGINE_CONFIG;
+import static com.epam.dlab.backendapi.domain.AuditActionEnum.CREATE;
+import static com.epam.dlab.backendapi.domain.AuditActionEnum.START;
+import static com.epam.dlab.backendapi.domain.AuditActionEnum.STOP;
+import static com.epam.dlab.backendapi.domain.AuditActionEnum.TERMINATE;
+import static com.epam.dlab.backendapi.domain.AuditActionEnum.UPDATE;
+import static com.epam.dlab.backendapi.domain.AuditResourceTypeEnum.COMPUTATIONAL;
+import static com.epam.dlab.backendapi.domain.AuditResourceTypeEnum.COMPUTATIONAL_CONFIG;
 import static com.epam.dlab.dto.UserInstanceStatus.CREATING;
 import static com.epam.dlab.dto.UserInstanceStatus.FAILED;
 import static com.epam.dlab.dto.UserInstanceStatus.RECONFIGURING;
@@ -152,9 +153,9 @@ public class ComputationalServiceImpl implements ComputationalService {
 	}
 
 	@BudgetLimited
-    @Audit(action = CREATE_DATA_ENGINE)
-    @Override
-    public boolean createSparkCluster(@User UserInfo userInfo, @ResourceName String resourceName, SparkStandaloneClusterCreateForm form, @Project String project,
+	@Audit(action = CREATE, type = COMPUTATIONAL)
+	@Override
+	public boolean createSparkCluster(@User UserInfo userInfo, @ResourceName String resourceName, SparkStandaloneClusterCreateForm form, @Project String project,
                                       @Info String auditInfo) {
         final ProjectDTO projectDTO = projectService.get(project);
         final UserInstanceDTO instance =
@@ -187,18 +188,18 @@ public class ComputationalServiceImpl implements ComputationalService {
 		}
 	}
 
-    @Audit(action = TERMINATE_COMPUTATIONAL)
-    @Override
-    public void terminateComputational(@User UserInfo userInfo, String resourceCreator, @Project String project, String exploratoryName, @ResourceName String computationalName,
-                                       @Info String auditInfo) {
-        try {
-            updateComputationalStatus(resourceCreator, project, exploratoryName, computationalName, TERMINATING);
+	@Audit(action = TERMINATE, type = COMPUTATIONAL)
+	@Override
+	public void terminateComputational(@User UserInfo userInfo, String resourceCreator, @Project String project, String exploratoryName, @ResourceName String computationalName,
+									   @Info String auditInfo) {
+		try {
+			updateComputationalStatus(resourceCreator, project, exploratoryName, computationalName, TERMINATING);
 
-            final UserInstanceDTO userInstanceDTO = exploratoryDAO.fetchExploratoryFields(resourceCreator, project, exploratoryName);
-            UserComputationalResource compResource = computationalDAO.fetchComputationalFields(resourceCreator, 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());
+			final DataEngineType dataEngineType = compResource.getDataEngineType();
+			EndpointDTO endpointDTO = endpointService.get(userInstanceDTO.getEndpoint());
             ComputationalTerminateDTO dto = requestBuilder.newComputationalTerminate(resourceCreator, userInstanceDTO, compResource, endpointDTO);
 
 			final String provisioningUrl = Optional.ofNullable(DATA_ENGINE_TYPE_TERMINATE_URLS.get(dataEngineType))
@@ -215,19 +216,19 @@ public class ComputationalServiceImpl implements ComputationalService {
 		}
 	}
 
-    @BudgetLimited
-    @Audit(action = CREATE_DATA_ENGINE_SERVICE)
-    @Override
-    public boolean createDataEngineService(@User UserInfo userInfo, @ResourceName String resourceName, ComputationalCreateFormDTO formDTO,
-                                           UserComputationalResource computationalResource, @Project String project, @Info String auditInfo) {
-        final ProjectDTO projectDTO = projectService.get(project);
-        final UserInstanceDTO instance = exploratoryDAO.fetchExploratoryFields(userInfo.getName(), project, formDTO
-                .getNotebookName());
-        final Map<String, String> tags = tagService.getResourceTags(userInfo, instance.getEndpoint(), project,
-                formDTO.getCustomTag());
-        computationalResource.setTags(tags);
-        boolean isAdded = computationalDAO.addComputational(userInfo.getName(), formDTO.getNotebookName(), project,
-                computationalResource);
+	@BudgetLimited
+	@Audit(action = CREATE, type = COMPUTATIONAL)
+	@Override
+	public boolean createDataEngineService(@User UserInfo userInfo, @ResourceName String resourceName, ComputationalCreateFormDTO formDTO,
+										   UserComputationalResource computationalResource, @Project String project, @Info String auditInfo) {
+		final ProjectDTO projectDTO = projectService.get(project);
+		final UserInstanceDTO instance = exploratoryDAO.fetchExploratoryFields(userInfo.getName(), project, formDTO
+				.getNotebookName());
+		final Map<String, String> tags = tagService.getResourceTags(userInfo, instance.getEndpoint(), project,
+				formDTO.getCustomTag());
+		computationalResource.setTags(tags);
+		boolean isAdded = computationalDAO.addComputational(userInfo.getName(), formDTO.getNotebookName(), project,
+				computationalResource);
 
         if (isAdded) {
 			try {
@@ -255,19 +256,19 @@ public class ComputationalServiceImpl implements ComputationalService {
 		}
 	}
 
-    @Audit(action = STOP_COMPUTATIONAL)
-    @Override
-    public void stopSparkCluster(@User UserInfo userInfo, String resourceCreator, @Project String project, String expName, @ResourceName String compName, @Info String auditInfo) {
-        final UserInstanceDTO userInstance = exploratoryDAO.fetchExploratoryFields(resourceCreator, project, expName, true);
-        final UserInstanceStatus requiredStatus = UserInstanceStatus.RUNNING;
-        if (computationalWithStatusResourceExist(compName, userInstance, requiredStatus)) {
-            log.debug("{} spark cluster {} for userInstance {}", STOPPING.toString(), compName, expName);
-            updateComputationalStatus(resourceCreator, project, expName, compName, STOPPING);
-            EndpointDTO endpointDTO = endpointService.get(userInstance.getEndpoint());
-            final String uuid = provisioningService.post(endpointDTO.getUrl() + ComputationalAPI.COMPUTATIONAL_STOP_SPARK,
-                    userInfo.getAccessToken(),
-                    requestBuilder.newComputationalStop(resourceCreator, userInstance, compName, endpointDTO),
-                    String.class);
+	@Audit(action = STOP, type = COMPUTATIONAL)
+	@Override
+	public void stopSparkCluster(@User UserInfo userInfo, String resourceCreator, @Project String project, String expName, @ResourceName String compName, @Info String auditInfo) {
+		final UserInstanceDTO userInstance = exploratoryDAO.fetchExploratoryFields(resourceCreator, project, expName, true);
+		final UserInstanceStatus requiredStatus = UserInstanceStatus.RUNNING;
+		if (computationalWithStatusResourceExist(compName, userInstance, requiredStatus)) {
+			log.debug("{} spark cluster {} for userInstance {}", STOPPING.toString(), compName, expName);
+			updateComputationalStatus(resourceCreator, project, expName, compName, STOPPING);
+			EndpointDTO endpointDTO = endpointService.get(userInstance.getEndpoint());
+			final String uuid = provisioningService.post(endpointDTO.getUrl() + ComputationalAPI.COMPUTATIONAL_STOP_SPARK,
+					userInfo.getAccessToken(),
+					requestBuilder.newComputationalStop(resourceCreator, userInstance, compName, endpointDTO),
+					String.class);
 			requestId.put(resourceCreator, uuid);
 		} else {
 			throw new IllegalStateException(String.format(DATAENGINE_NOT_PRESENT_FORMAT, requiredStatus.toString(), compName, expName));
@@ -275,27 +276,27 @@ public class ComputationalServiceImpl implements ComputationalService {
 
 	}
 
-    @BudgetLimited
-    @Audit(action = START_COMPUTATIONAL)
-    @Override
-    public void startSparkCluster(@User UserInfo userInfo, String expName, @ResourceName String compName, @Project String project, @Info String auditInfo) {
-        final UserInstanceDTO userInstance = exploratoryDAO.fetchExploratoryFields(userInfo.getName(), project, expName, true);
-        final UserInstanceStatus requiredStatus = UserInstanceStatus.STOPPED;
-        if (computationalWithStatusResourceExist(compName, userInstance, requiredStatus)) {
-            log.debug("{} spark cluster {} for userInstance {}", STARTING.toString(), compName, expName);
-            updateComputationalStatus(userInfo.getName(), project, expName, compName, STARTING);
-            EndpointDTO endpointDTO = endpointService.get(userInstance.getEndpoint());
-            final String uuid = provisioningService.post(endpointDTO.getUrl() + ComputationalAPI.COMPUTATIONAL_START_SPARK,
-                    userInfo.getAccessToken(),
-                    requestBuilder.newComputationalStart(userInfo, userInstance, compName, endpointDTO),
-                    String.class);
+	@BudgetLimited
+	@Audit(action = START, type = COMPUTATIONAL)
+	@Override
+	public void startSparkCluster(@User UserInfo userInfo, String expName, @ResourceName String compName, @Project String project, @Info String auditInfo) {
+		final UserInstanceDTO userInstance = exploratoryDAO.fetchExploratoryFields(userInfo.getName(), project, expName, true);
+		final UserInstanceStatus requiredStatus = UserInstanceStatus.STOPPED;
+		if (computationalWithStatusResourceExist(compName, userInstance, requiredStatus)) {
+			log.debug("{} spark cluster {} for userInstance {}", STARTING.toString(), compName, expName);
+			updateComputationalStatus(userInfo.getName(), project, expName, compName, STARTING);
+			EndpointDTO endpointDTO = endpointService.get(userInstance.getEndpoint());
+			final String uuid = provisioningService.post(endpointDTO.getUrl() + ComputationalAPI.COMPUTATIONAL_START_SPARK,
+					userInfo.getAccessToken(),
+					requestBuilder.newComputationalStart(userInfo, userInstance, compName, endpointDTO),
+					String.class);
 			requestId.put(userInfo.getName(), uuid);
 		} else {
 			throw new IllegalStateException(String.format(DATAENGINE_NOT_PRESENT_FORMAT, requiredStatus.toString(), compName, expName));
 		}
 	}
 
-	@Audit(action = UPDATE_DATA_ENGINE_CONFIG)
+	@Audit(action = UPDATE, type = COMPUTATIONAL_CONFIG)
 	@Override
 	public void updateSparkClusterConfig(@User UserInfo userInfo, @Project String project, String exploratoryName, @ResourceName String computationalName, List<ClusterConfig> config) {
 		final String userName = userInfo.getName();
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/EndpointServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/EndpointServiceImpl.java
index 40ed5ea..a21fdd5 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/EndpointServiceImpl.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/EndpointServiceImpl.java
@@ -31,8 +31,9 @@ import java.util.List;
 import java.util.Objects;
 import java.util.stream.Collectors;
 
-import static com.epam.dlab.backendapi.domain.AuditActionEnum.CREATE_ENDPOINT;
-import static com.epam.dlab.backendapi.domain.AuditActionEnum.DELETE_ENDPOINT;
+import static com.epam.dlab.backendapi.domain.AuditActionEnum.CREATE;
+import static com.epam.dlab.backendapi.domain.AuditActionEnum.DELETE;
+import static com.epam.dlab.backendapi.domain.AuditResourceTypeEnum.ENDPOINT;
 
 
 @Slf4j
@@ -82,26 +83,26 @@ public class EndpointServiceImpl implements EndpointService {
 				.orElseThrow(() -> new ResourceNotFoundException("Endpoint with name " + name + " not found"));
 	}
 
-	/**
-	 * Create new endpoint object in the System.
-	 * The Endpoint objects should contain Unique values of the 'url' and 'name' fields,
-	 * i.e two objects with same URLs should not be created in the system.
-	 *
-	 * @param userInfo     user properties
-	 * @param resourceName name of the endpoint
-	 * @param endpointDTO  object with endpoint fields
-	 */
-	@Audit(action = CREATE_ENDPOINT)
-	@Override
-	public void create(@User UserInfo userInfo, @ResourceName String resourceName, EndpointDTO endpointDTO) {
-		if (endpointDAO.get(endpointDTO.getName()).isPresent()) {
-			throw new ResourceConflictException("The Endpoint with this name exists in system");
-		}
-		if (endpointDAO.getEndpointWithUrl(endpointDTO.getUrl()).isPresent()) {
-			throw new ResourceConflictException("The Endpoint URL with this address exists in system");
-		}
-		CloudProvider cloudProvider = checkUrl(userInfo, endpointDTO.getUrl());
-		if (Objects.isNull(cloudProvider)) {
+    /**
+     * Create new endpoint object in the System.
+     * The Endpoint objects should contain Unique values of the 'url' and 'name' fields,
+     * i.e two objects with same URLs should not be created in the system.
+     *
+     * @param userInfo     user properties
+     * @param resourceName name of the endpoint
+     * @param endpointDTO  object with endpoint fields
+     */
+    @Audit(action = CREATE, type = ENDPOINT)
+    @Override
+    public void create(@User UserInfo userInfo, @ResourceName String resourceName, EndpointDTO endpointDTO) {
+        if (endpointDAO.get(endpointDTO.getName()).isPresent()) {
+            throw new ResourceConflictException("The Endpoint with this name exists in system");
+        }
+        if (endpointDAO.getEndpointWithUrl(endpointDTO.getUrl()).isPresent()) {
+            throw new ResourceConflictException("The Endpoint URL with this address exists in system");
+        }
+        CloudProvider cloudProvider = checkUrl(userInfo, endpointDTO.getUrl());
+        if (Objects.isNull(cloudProvider)) {
 			throw new DlabException("CloudProvider cannot be null");
 		}
 		endpointDAO.create(new EndpointDTO(endpointDTO.getName(), endpointDTO.getUrl(), endpointDTO.getAccount(),
@@ -112,26 +113,26 @@ public class EndpointServiceImpl implements EndpointService {
 	@Override
 	public void updateEndpointStatus(String name, EndpointDTO.EndpointStatus status) {
 		endpointDAO.updateEndpointStatus(name, status.name());
-	}
-
-	@Override
-	public void remove(UserInfo userInfo, String name) {
-		EndpointDTO endpointDTO = endpointDAO.get(name).orElseThrow(() -> new ResourceNotFoundException(String.format("Endpoint %s does not exist", name)));
-		List<ProjectDTO> projects = projectService.getProjectsByEndpoint(name);
-		checkProjectEndpointResourcesStatuses(projects, name);
-		CloudProvider cloudProvider = endpointDTO.getCloudProvider();
-		removeEndpoint(userInfo, name, cloudProvider, projects);
-	}
-
-	@Audit(action = DELETE_ENDPOINT)
-	public void removeEndpoint(@User UserInfo userInfo, @ResourceName String name, CloudProvider cloudProvider, List<ProjectDTO> projects) {
-		removeEndpointInAllProjects(userInfo, name, projects);
-		endpointDAO.remove(name);
-		List<CloudProvider> remainingProviders = endpointDAO.getEndpoints()
-				.stream()
-				.map(EndpointDTO::getCloudProvider)
-				.collect(Collectors.toList());
-		userRoleDao.removeUnnecessaryRoles(cloudProvider, remainingProviders);
+    }
+
+    @Override
+    public void remove(UserInfo userInfo, String name) {
+        EndpointDTO endpointDTO = endpointDAO.get(name).orElseThrow(() -> new ResourceNotFoundException(String.format("Endpoint %s does not exist", name)));
+        List<ProjectDTO> projects = projectService.getProjectsByEndpoint(name);
+        checkProjectEndpointResourcesStatuses(projects, name);
+        CloudProvider cloudProvider = endpointDTO.getCloudProvider();
+        removeEndpoint(userInfo, name, cloudProvider, projects);
+    }
+
+    @Audit(action = DELETE, type = ENDPOINT)
+    public void removeEndpoint(@User UserInfo userInfo, @ResourceName String name, CloudProvider cloudProvider, List<ProjectDTO> projects) {
+        removeEndpointInAllProjects(userInfo, name, projects);
+        endpointDAO.remove(name);
+        List<CloudProvider> remainingProviders = endpointDAO.getEndpoints()
+                .stream()
+                .map(EndpointDTO::getCloudProvider)
+                .collect(Collectors.toList());
+        userRoleDao.removeUnnecessaryRoles(cloudProvider, remainingProviders);
 	}
 
 	@Override
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ExploratoryServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ExploratoryServiceImpl.java
index 449b461..1c914bf 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ExploratoryServiceImpl.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ExploratoryServiceImpl.java
@@ -33,6 +33,7 @@ import com.epam.dlab.backendapi.dao.GitCredsDAO;
 import com.epam.dlab.backendapi.dao.ImageExploratoryDao;
 import com.epam.dlab.backendapi.domain.AuditActionEnum;
 import com.epam.dlab.backendapi.domain.AuditDTO;
+import com.epam.dlab.backendapi.domain.AuditResourceTypeEnum;
 import com.epam.dlab.backendapi.domain.EndpointDTO;
 import com.epam.dlab.backendapi.domain.ProjectDTO;
 import com.epam.dlab.backendapi.domain.RequestId;
@@ -73,11 +74,14 @@ import java.util.Optional;
 import java.util.Set;
 import java.util.stream.Collectors;
 
-import static com.epam.dlab.backendapi.domain.AuditActionEnum.CREATE_NOTEBOOK;
-import static com.epam.dlab.backendapi.domain.AuditActionEnum.START_NOTEBOOK;
-import static com.epam.dlab.backendapi.domain.AuditActionEnum.STOP_NOTEBOOK;
-import static com.epam.dlab.backendapi.domain.AuditActionEnum.TERMINATE_NOTEBOOK;
-import static com.epam.dlab.backendapi.domain.AuditActionEnum.UPDATE_CLUSTER_CONFIG;
+import static com.epam.dlab.backendapi.domain.AuditActionEnum.CREATE;
+import static com.epam.dlab.backendapi.domain.AuditActionEnum.START;
+import static com.epam.dlab.backendapi.domain.AuditActionEnum.STOP;
+import static com.epam.dlab.backendapi.domain.AuditActionEnum.TERMINATE;
+import static com.epam.dlab.backendapi.domain.AuditActionEnum.UPDATE;
+import static com.epam.dlab.backendapi.domain.AuditResourceTypeEnum.COMPUTATIONAL;
+import static com.epam.dlab.backendapi.domain.AuditResourceTypeEnum.NOTEBOOK;
+import static com.epam.dlab.backendapi.domain.AuditResourceTypeEnum.NOTEBOOK_CONFIG;
 import static com.epam.dlab.dto.UserInstanceStatus.CREATING;
 import static com.epam.dlab.dto.UserInstanceStatus.FAILED;
 import static com.epam.dlab.dto.UserInstanceStatus.RUNNING;
@@ -128,26 +132,26 @@ public class ExploratoryServiceImpl implements ExploratoryService {
 	}
 
 	@BudgetLimited
-    @Audit(action = START_NOTEBOOK)
-    @Override
-    public String start(@User UserInfo userInfo, @ResourceName String exploratoryName, @Project String project, @Info String auditInfo) {
-        return action(userInfo, userInfo.getName(), project, exploratoryName, EXPLORATORY_START, STARTING);
-    }
-
-    @Audit(action = STOP_NOTEBOOK)
-    @Override
-    public String stop(@User UserInfo userInfo, String resourceCreator, @Project String project, @ResourceName String exploratoryName, @Info String auditInfo) {
-        return action(userInfo, resourceCreator, project, exploratoryName, EXPLORATORY_STOP, STOPPING);
-    }
-
-    @Audit(action = TERMINATE_NOTEBOOK)
-    @Override
-    public String terminate(@User UserInfo userInfo, String resourceCreator, @Project String project, @ResourceName String exploratoryName, @Info String auditInfo) {
-        return action(userInfo, resourceCreator, project, exploratoryName, EXPLORATORY_TERMINATE, TERMINATING);
-    }
+	@Audit(action = START, type = NOTEBOOK)
+	@Override
+	public String start(@User UserInfo userInfo, @ResourceName String exploratoryName, @Project String project, @Info String auditInfo) {
+		return action(userInfo, userInfo.getName(), project, exploratoryName, EXPLORATORY_START, STARTING);
+	}
+
+	@Audit(action = STOP, type = NOTEBOOK)
+	@Override
+	public String stop(@User UserInfo userInfo, String resourceCreator, @Project String project, @ResourceName String exploratoryName, @Info String auditInfo) {
+		return action(userInfo, resourceCreator, project, exploratoryName, EXPLORATORY_STOP, STOPPING);
+	}
+
+	@Audit(action = TERMINATE, type = NOTEBOOK)
+	@Override
+	public String terminate(@User UserInfo userInfo, String resourceCreator, @Project String project, @ResourceName String exploratoryName, @Info String auditInfo) {
+		return action(userInfo, resourceCreator, project, exploratoryName, EXPLORATORY_TERMINATE, TERMINATING);
+	}
 
 	@BudgetLimited
-	@Audit(action = CREATE_NOTEBOOK)
+	@Audit(action = CREATE, type = NOTEBOOK)
 	@Override
 	public String create(@User UserInfo userInfo, Exploratory exploratory, @Project String project, @ResourceName String exploratoryName) {
 		boolean isAdded = false;
@@ -184,7 +188,7 @@ public class ExploratoryServiceImpl implements ExploratoryService {
 				.forEach(ui -> updateExploratoryStatus(project, ui.getExploratoryName(), status, ui.getUser()));
 	}
 
-	@Audit(action = UPDATE_CLUSTER_CONFIG)
+	@Audit(action = UPDATE, type = NOTEBOOK_CONFIG)
 	@Override
 	public void updateClusterConfig(@User UserInfo userInfo, @Project String project, @ResourceName String exploratoryName, List<ClusterConfig> config) {
 		final String userName = userInfo.getName();
@@ -304,12 +308,12 @@ public class ExploratoryServiceImpl implements ExploratoryService {
 
 		if (status == STOPPING) {
 			if (configuration.isAuditEnabled()) {
-				saveAudit(project, exploratoryName, user, AuditActionEnum.STOP_COMPUTATIONAL);
+				saveAudit(project, exploratoryName, user, STOP, COMPUTATIONAL);
 			}
 			updateComputationalStatuses(user, project, exploratoryName, STOPPING, TERMINATING, FAILED, TERMINATED, STOPPED);
 		} else if (status == TERMINATING) {
 			if (configuration.isAuditEnabled()) {
-				saveAudit(project, exploratoryName, user, AuditActionEnum.TERMINATE_COMPUTATIONAL);
+				saveAudit(project, exploratoryName, user, TERMINATE, COMPUTATIONAL);
 			}
 			updateComputationalStatuses(user, project, exploratoryName, TERMINATING, TERMINATING, TERMINATED, FAILED);
 		} else if (status == TERMINATED) {
@@ -317,15 +321,17 @@ public class ExploratoryServiceImpl implements ExploratoryService {
 		}
 	}
 
-	private void saveAudit(String project, String exploratoryName, String user, AuditActionEnum action) {
+	private void saveAudit(String project, String exploratoryName, String user, AuditActionEnum action, AuditResourceTypeEnum type) {
 		computationalDAO.getComputationalResourcesWhereStatusIn(user, project, Arrays.asList(DataEngineType.SPARK_STANDALONE, DataEngineType.CLOUD_SERVICE),
 				exploratoryName, RUNNING)
-				.forEach(comp -> auditService.save(AuditDTO.builder()
-						.user(user)
-						.resourceName(comp)
-						.project(project)
-						.action(action)
-						.build())
+				.forEach(comp -> auditService.save(
+						AuditDTO.builder()
+								.user(user)
+								.resourceName(comp)
+								.project(project)
+								.action(action)
+								.type(type)
+								.build())
 				);
 	}
 
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/GitCredentialServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/GitCredentialServiceImpl.java
index 0d715d0..4b8b604 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/GitCredentialServiceImpl.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/GitCredentialServiceImpl.java
@@ -43,49 +43,50 @@ import org.apache.commons.lang3.StringUtils;
 
 import java.util.stream.Collectors;
 
-import static com.epam.dlab.backendapi.domain.AuditActionEnum.MANAGE_GIT_ACCOUNT;
+import static com.epam.dlab.backendapi.domain.AuditActionEnum.UPDATE;
+import static com.epam.dlab.backendapi.domain.AuditResourceTypeEnum.GIT_ACCOUNT;
 import static com.epam.dlab.rest.contracts.ExploratoryAPI.EXPLORATORY_GIT_CREDS;
 
 @Slf4j
 @Singleton
 public class GitCredentialServiceImpl implements GitCredentialService {
 
-	private static final boolean CLEAR_USER_PASSWORD = true;
-	@Inject
-	private GitCredsDAO gitCredsDAO;
-	@Inject
-	private ExploratoryDAO exploratoryDAO;
-	@Inject
-	@Named(ServiceConsts.PROVISIONING_SERVICE_NAME)
-	private RESTService provisioningService;
-	@Inject
-	private RequestBuilder requestBuilder;
-	@Inject
-	private RequestId requestId;
-	@Inject
-	private EndpointService endpointService;
+    private static final boolean CLEAR_USER_PASSWORD = true;
+    @Inject
+    private GitCredsDAO gitCredsDAO;
+    @Inject
+    private ExploratoryDAO exploratoryDAO;
+    @Inject
+    @Named(ServiceConsts.PROVISIONING_SERVICE_NAME)
+    private RESTService provisioningService;
+    @Inject
+    private RequestBuilder requestBuilder;
+    @Inject
+    private RequestId requestId;
+    @Inject
+    private EndpointService endpointService;
 
-	@Audit(action = MANAGE_GIT_ACCOUNT)
-	@Override
-	public void updateGitCredentials(@User UserInfo userInfo, ExploratoryGitCredsDTO formDTO) {
-		log.debug("Updating GIT creds for user {} to {}", userInfo.getName(), formDTO);
-		try {
-			gitCredsDAO.updateGitCreds(userInfo.getName(), formDTO);
-			final String failedNotebooks = exploratoryDAO.fetchRunningExploratoryFields(userInfo.getName())
-					.stream()
-					.filter(ui -> !updateNotebookGitCredentials(userInfo, formDTO, ui))
-					.map(UserInstanceDTO::getExploratoryName)
-					.collect(Collectors.joining(","));
-			if (StringUtils.isNotEmpty(failedNotebooks)) {
-				throw new DlabException("Requests for notebooks failed: " + failedNotebooks);
-			}
-		} catch (Exception t) {
-			log.error("Cannot update the GIT creds for user {}", userInfo.getName(), t);
-			throw new DlabException("Cannot update the GIT credentials: " + t.getLocalizedMessage(), t);
-		}
-	}
+    @Audit(action = UPDATE, type = GIT_ACCOUNT)
+    @Override
+    public void updateGitCredentials(@User UserInfo userInfo, ExploratoryGitCredsDTO formDTO) {
+        log.debug("Updating GIT creds for user {} to {}", userInfo.getName(), formDTO);
+        try {
+            gitCredsDAO.updateGitCreds(userInfo.getName(), formDTO);
+            final String failedNotebooks = exploratoryDAO.fetchRunningExploratoryFields(userInfo.getName())
+                    .stream()
+                    .filter(ui -> !updateNotebookGitCredentials(userInfo, formDTO, ui))
+                    .map(UserInstanceDTO::getExploratoryName)
+                    .collect(Collectors.joining(","));
+            if (StringUtils.isNotEmpty(failedNotebooks)) {
+                throw new DlabException("Requests for notebooks failed: " + failedNotebooks);
+            }
+        } catch (Exception t) {
+            log.error("Cannot update the GIT creds for user {}", userInfo.getName(), t);
+            throw new DlabException("Cannot update the GIT credentials: " + t.getLocalizedMessage(), t);
+        }
+    }
 
-	@Override
+    @Override
 	public ExploratoryGitCredsDTO getGitCredentials(String user) {
 		log.debug("Loading GIT creds for user {}", user);
 		try {
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ImageExploratoryServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ImageExploratoryServiceImpl.java
index 9d12621..10e5126 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ImageExploratoryServiceImpl.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ImageExploratoryServiceImpl.java
@@ -58,51 +58,52 @@ import java.util.Map;
 import java.util.function.Predicate;
 import java.util.stream.Collectors;
 
-import static com.epam.dlab.backendapi.domain.AuditActionEnum.CREATE_IMAGE;
+import static com.epam.dlab.backendapi.domain.AuditActionEnum.CREATE;
+import static com.epam.dlab.backendapi.domain.AuditResourceTypeEnum.IMAGE;
 
 @Singleton
 @Slf4j
 public class ImageExploratoryServiceImpl implements ImageExploratoryService {
-	private static final String IMAGE_EXISTS_MSG = "Image with name %s is already exist in project %s";
-	private static final String IMAGE_NOT_FOUND_MSG = "Image with name %s was not found for user %s";
-
-	@Inject
-	private ExploratoryDAO exploratoryDAO;
-	@Inject
-	private ImageExploratoryDao imageExploratoryDao;
-	@Inject
-	private ExploratoryLibDAO libDAO;
-	@Inject
-	@Named(ServiceConsts.PROVISIONING_SERVICE_NAME)
-	private RESTService provisioningService;
-	@Inject
-	private RequestBuilder requestBuilder;
-	@Inject
-	private EndpointService endpointService;
-	@Inject
-	private ProjectService projectService;
-
-	@Audit(action = CREATE_IMAGE)
-	@Override
-	public String createImage(@User UserInfo user, @Project String project, @ResourceName String exploratoryName, String imageName, String imageDescription, @Info String info) {
-		ProjectDTO projectDTO = projectService.get(project);
-		UserInstanceDTO userInstance = exploratoryDAO.fetchRunningExploratoryFields(user.getName(), project, exploratoryName);
-
-		if (imageExploratoryDao.exist(imageName, userInstance.getProject())) {
-			log.error(String.format(IMAGE_EXISTS_MSG, imageName, userInstance.getProject()));
-			throw new ResourceAlreadyExistException(String.format(IMAGE_EXISTS_MSG, imageName, userInstance.getProject()));
-		}
-		final List<Library> libraries = libDAO.getLibraries(user.getName(), project, exploratoryName);
-
-		imageExploratoryDao.save(Image.builder()
-				.name(imageName)
-				.description(imageDescription)
-				.status(ImageStatus.CREATING)
-				.user(user.getName())
-				.libraries(fetchExploratoryLibs(libraries))
-				.computationalLibraries(fetchComputationalLibs(libraries))
-				.dockerImage(userInstance.getImageName())
-				.exploratoryId(userInstance.getId())
+    private static final String IMAGE_EXISTS_MSG = "Image with name %s is already exist in project %s";
+    private static final String IMAGE_NOT_FOUND_MSG = "Image with name %s was not found for user %s";
+
+    @Inject
+    private ExploratoryDAO exploratoryDAO;
+    @Inject
+    private ImageExploratoryDao imageExploratoryDao;
+    @Inject
+    private ExploratoryLibDAO libDAO;
+    @Inject
+    @Named(ServiceConsts.PROVISIONING_SERVICE_NAME)
+    private RESTService provisioningService;
+    @Inject
+    private RequestBuilder requestBuilder;
+    @Inject
+    private EndpointService endpointService;
+    @Inject
+    private ProjectService projectService;
+
+    @Audit(action = CREATE, type = IMAGE)
+    @Override
+    public String createImage(@User UserInfo user, @Project String project, @ResourceName String exploratoryName, String imageName, String imageDescription, @Info String info) {
+        ProjectDTO projectDTO = projectService.get(project);
+        UserInstanceDTO userInstance = exploratoryDAO.fetchRunningExploratoryFields(user.getName(), project, exploratoryName);
+
+        if (imageExploratoryDao.exist(imageName, userInstance.getProject())) {
+            log.error(String.format(IMAGE_EXISTS_MSG, imageName, userInstance.getProject()));
+            throw new ResourceAlreadyExistException(String.format(IMAGE_EXISTS_MSG, imageName, userInstance.getProject()));
+        }
+        final List<Library> libraries = libDAO.getLibraries(user.getName(), project, exploratoryName);
+
+        imageExploratoryDao.save(Image.builder()
+                .name(imageName)
+                .description(imageDescription)
+                .status(ImageStatus.CREATING)
+                .user(user.getName())
+                .libraries(fetchExploratoryLibs(libraries))
+                .computationalLibraries(fetchComputationalLibs(libraries))
+                .dockerImage(userInstance.getImageName())
+                .exploratoryId(userInstance.getId())
 				.project(userInstance.getProject())
 				.endpoint(userInstance.getEndpoint())
 				.build());
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/LibraryServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/LibraryServiceImpl.java
index e8ca45a..87bd5d4 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/LibraryServiceImpl.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/LibraryServiceImpl.java
@@ -64,8 +64,9 @@ import java.util.Set;
 import java.util.TreeMap;
 import java.util.stream.Collectors;
 
-import static com.epam.dlab.backendapi.domain.AuditActionEnum.INSTALL_COMPUTATIONAL_LIBS;
-import static com.epam.dlab.backendapi.domain.AuditActionEnum.INSTALL_NOTEBOOK_LIBS;
+import static com.epam.dlab.backendapi.domain.AuditActionEnum.INSTALL;
+import static com.epam.dlab.backendapi.domain.AuditResourceTypeEnum.COMPUTATIONAL_LIBS;
+import static com.epam.dlab.backendapi.domain.AuditResourceTypeEnum.NOTEBOOK_LIBS;
 
 @Slf4j
 @Singleton
@@ -138,7 +139,7 @@ public class LibraryServiceImpl implements LibraryService {
         return libInfoRecords;
     }
 
-    @Audit(action = INSTALL_COMPUTATIONAL_LIBS)
+    @Audit(action = INSTALL, type = COMPUTATIONAL_LIBS)
     @Override
     public String installComputationalLibs(@User UserInfo ui, @Project String project, String expName, @ResourceName String compName, List<LibInstallDTO> libs, @Info String auditInfo) {
         final UserInstanceDTO userInstance = exploratoryDAO.fetchExploratoryFields(ui.getName(), project, expName, compName);
@@ -151,7 +152,7 @@ public class LibraryServiceImpl implements LibraryService {
         return uuid;
     }
 
-    @Audit(action = INSTALL_NOTEBOOK_LIBS)
+    @Audit(action = INSTALL, type = NOTEBOOK_LIBS)
     @Override
     public String installExploratoryLibs(@User UserInfo ui, @Project String project, @ResourceName String expName, List<LibInstallDTO> libs, @Info String auditInfo) {
         final UserInstanceDTO userInstance = exploratoryDAO.fetchRunningExploratoryFields(ui.getName(), project, expName);
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ProjectServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ProjectServiceImpl.java
index 634022c..282106a 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ProjectServiceImpl.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ProjectServiceImpl.java
@@ -40,11 +40,13 @@ import java.util.Set;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
 
-import static com.epam.dlab.backendapi.domain.AuditActionEnum.CREATE_EDGE_NODE;
-import static com.epam.dlab.backendapi.domain.AuditActionEnum.START_EDGE_NODE;
-import static com.epam.dlab.backendapi.domain.AuditActionEnum.STOP_EDGE_NODE;
-import static com.epam.dlab.backendapi.domain.AuditActionEnum.TERMINATE_EDGE_NODE;
-import static com.epam.dlab.backendapi.domain.AuditActionEnum.UPDATE_PROJECT;
+import static com.epam.dlab.backendapi.domain.AuditActionEnum.CREATE;
+import static com.epam.dlab.backendapi.domain.AuditActionEnum.START;
+import static com.epam.dlab.backendapi.domain.AuditActionEnum.STOP;
+import static com.epam.dlab.backendapi.domain.AuditActionEnum.TERMINATE;
+import static com.epam.dlab.backendapi.domain.AuditActionEnum.UPDATE;
+import static com.epam.dlab.backendapi.domain.AuditResourceTypeEnum.EDGE_NODE;
+import static com.epam.dlab.backendapi.domain.AuditResourceTypeEnum.PROJECT;
 import static java.util.stream.Collectors.toSet;
 import static java.util.stream.Stream.concat;
 
@@ -114,76 +116,76 @@ public class ProjectServiceImpl implements ProjectService {
 	}
 
 	@BudgetLimited
-	@Override
-	public void create(UserInfo user, ProjectDTO projectDTO, @Project String resourceName) {
-		if (!projectDAO.get(projectDTO.getName()).isPresent()) {
-			projectDAO.create(projectDTO);
-			createProjectOnCloud(user, projectDTO);
-		} else {
-			throw new ResourceConflictException("Project with passed name already exist in system");
-		}
-	}
+    @Override
+    public void create(UserInfo user, ProjectDTO projectDTO, @Project String resourceName) {
+        if (!projectDAO.get(projectDTO.getName()).isPresent()) {
+            projectDAO.create(projectDTO);
+            createProjectOnCloud(user, projectDTO);
+        } else {
+            throw new ResourceConflictException("Project with passed name already exist in system");
+        }
+    }
 
-	@Override
-	public ProjectDTO get(String name) {
-		return projectDAO.get(name)
-				.orElseThrow(projectNotFound());
-	}
+    @Override
+    public ProjectDTO get(String name) {
+        return projectDAO.get(name)
+                .orElseThrow(projectNotFound());
+    }
 
-	@Audit(action = TERMINATE_EDGE_NODE)
-	@Override
-	public void terminateEndpoint(@User UserInfo userInfo, @ResourceName String endpoint, @Project String name) {
-		projectActionOnCloud(userInfo, name, TERMINATE_PRJ_API, endpoint);
-		projectDAO.updateEdgeStatus(name, endpoint, UserInstanceStatus.TERMINATING);
-		exploratoryService.updateProjectExploratoryStatuses(name, endpoint, UserInstanceStatus.TERMINATING);
-	}
+    @Audit(action = TERMINATE, type = EDGE_NODE)
+    @Override
+    public void terminateEndpoint(@User UserInfo userInfo, @ResourceName String endpoint, @Project String name) {
+        projectActionOnCloud(userInfo, name, TERMINATE_PRJ_API, endpoint);
+        projectDAO.updateEdgeStatus(name, endpoint, UserInstanceStatus.TERMINATING);
+        exploratoryService.updateProjectExploratoryStatuses(name, endpoint, UserInstanceStatus.TERMINATING);
+    }
 
-	@ProjectAdmin
-	@Override
-	public void terminateEndpoint(@User UserInfo userInfo, List<String> endpoints, @ResourceName @Project String name) {
-		endpoints.forEach(endpoint -> terminateEndpoint(userInfo, endpoint, name));
-	}
+    @ProjectAdmin
+    @Override
+    public void terminateEndpoint(@User UserInfo userInfo, List<String> endpoints, @ResourceName @Project String name) {
+        endpoints.forEach(endpoint -> terminateEndpoint(userInfo, endpoint, name));
+    }
 
-	@BudgetLimited
-	@Audit(action = START_EDGE_NODE)
-	@Override
-	public void start(@User UserInfo userInfo, @ResourceName String endpoint, @Project String name) {
-		projectActionOnCloud(userInfo, name, START_PRJ_API, endpoint);
-		projectDAO.updateEdgeStatus(name, endpoint, UserInstanceStatus.STARTING);
-	}
+    @BudgetLimited
+    @Audit(action = START, type = EDGE_NODE)
+    @Override
+    public void start(@User UserInfo userInfo, @ResourceName String endpoint, @Project String name) {
+        projectActionOnCloud(userInfo, name, START_PRJ_API, endpoint);
+        projectDAO.updateEdgeStatus(name, endpoint, UserInstanceStatus.STARTING);
+    }
 
-	@ProjectAdmin
-	@Override
-	public void start(@User UserInfo userInfo, List<String> endpoints, @Project String name) {
-		endpoints.forEach(endpoint -> start(userInfo, endpoint, name));
-	}
+    @ProjectAdmin
+    @Override
+    public void start(@User UserInfo userInfo, List<String> endpoints, @Project String name) {
+        endpoints.forEach(endpoint -> start(userInfo, endpoint, name));
+    }
 
-	@Audit(action = STOP_EDGE_NODE)
+    @Audit(action = STOP, type = EDGE_NODE)
     @Override
     public void stop(@User UserInfo userInfo, @ResourceName String endpoint, @Project String name, @Info String auditInfo) {
         projectActionOnCloud(userInfo, name, STOP_PRJ_API, endpoint);
         projectDAO.updateEdgeStatus(name, endpoint, UserInstanceStatus.STOPPING);
     }
 
-	@ProjectAdmin
-	@Override
-	public void stopWithResources(@User UserInfo userInfo, List<String> endpoints, @ResourceName @Project String projectName) {
-		List<ProjectEndpointDTO> endpointDTOs = get(projectName)
-				.getEndpoints()
-				.stream()
-				.filter(projectEndpointDTO -> endpoints.contains(projectEndpointDTO.getName()))
-				.collect(Collectors.toList());
-		checkProjectRelatedResourcesInProgress(projectName, endpointDTOs, STOP_ACTION);
+    @ProjectAdmin
+    @Override
+    public void stopWithResources(@User UserInfo userInfo, List<String> endpoints, @ResourceName @Project String projectName) {
+        List<ProjectEndpointDTO> endpointDTOs = get(projectName)
+                .getEndpoints()
+                .stream()
+                .filter(projectEndpointDTO -> endpoints.contains(projectEndpointDTO.getName()))
+                .collect(Collectors.toList());
+        checkProjectRelatedResourcesInProgress(projectName, endpointDTOs, STOP_ACTION);
 
-		endpointDTOs
-				.stream()
-				.filter(e -> !Arrays.asList(UserInstanceStatus.TERMINATED, UserInstanceStatus.TERMINATING, UserInstanceStatus.STOPPED,
-						UserInstanceStatus.FAILED).contains(e.getStatus()))
-				.forEach(e -> stop(userInfo, e.getName(), projectName, null));
+        endpointDTOs
+                .stream()
+                .filter(e -> !Arrays.asList(UserInstanceStatus.TERMINATED, UserInstanceStatus.TERMINATING, UserInstanceStatus.STOPPED,
+                        UserInstanceStatus.FAILED).contains(e.getStatus()))
+                .forEach(e -> stop(userInfo, e.getName(), projectName, null));
 
-		exploratoryDAO.fetchRunningExploratoryFieldsForProject(projectName,
-				endpointDTOs
-						.stream()
+        exploratoryDAO.fetchRunningExploratoryFieldsForProject(projectName,
+                endpointDTOs
+                        .stream()
 						.map(ProjectEndpointDTO::getName)
 						.collect(Collectors.toList()))
 				.forEach(e -> exploratoryService.stop(userInfo, e.getUser(), projectName, e.getExploratoryName(), null));
@@ -203,7 +205,7 @@ public class ProjectServiceImpl implements ProjectService {
         updateProject(userInfo, projectName, projectDTO, project, newEndpoints, projectUpdateAudit);
     }
 
-    @Audit(action = UPDATE_PROJECT)
+    @Audit(action = UPDATE, type = PROJECT)
     public void updateProject(@User UserInfo userInfo, @Project @ResourceName String projectName, UpdateProjectDTO projectDTO, ProjectDTO project, Set<String> newEndpoints,
                               @Info String projectAudit) {
         final List<ProjectEndpointDTO> endpointsToBeCreated = newEndpoints
@@ -216,71 +218,71 @@ public class ProjectServiceImpl implements ProjectService {
         endpointsToBeCreated.forEach(e -> createEndpoint(userInfo, projectName, project, e.getName()));
     }
 
-	@Override
-	public void updateBudget(UserInfo userInfo, List<UpdateProjectBudgetDTO> dtos) {
-		final List<ProjectDTO> projects = dtos
-				.stream()
-				.filter(dto -> Objects.nonNull(dto.getBudget()))
-				.map(dto -> ProjectDTO.builder().name(dto.getProject()).budget(dto.getBudget()).build())
-				.collect(Collectors.toList());
+    @Override
+    public void updateBudget(UserInfo userInfo, List<UpdateProjectBudgetDTO> dtos) {
+        final List<ProjectDTO> projects = dtos
+                .stream()
+                .filter(dto -> Objects.nonNull(dto.getBudget()))
+                .map(dto -> ProjectDTO.builder().name(dto.getProject()).budget(dto.getBudget()).build())
+                .collect(Collectors.toList());
 
-		projects.forEach(p -> updateBudget(userInfo, p.getName(), p.getBudget(), getUpdateBudgetAudit(p)));
-	}
+        projects.forEach(p -> updateBudget(userInfo, p.getName(), p.getBudget(), getUpdateBudgetAudit(p)));
+    }
 
-    @Audit(action = UPDATE_PROJECT)
+    @Audit(action = UPDATE, type = PROJECT)
     public void updateBudget(@User UserInfo userInfo, @Project @ResourceName String name, Integer budget, @Info String updateBudgetAudit) {
         projectDAO.updateBudget(name, budget);
     }
 
-	@Override
-	public boolean isAnyProjectAssigned(UserInfo userInfo) {
-		final Set<String> userGroups = concat(userInfo.getRoles().stream(),
-				userGroupDao.getUserGroups(userInfo.getName()).stream())
-				.collect(toSet());
-		return projectDAO.isAnyProjectAssigned(userGroups);
-	}
+    @Override
+    public boolean isAnyProjectAssigned(UserInfo userInfo) {
+        final Set<String> userGroups = concat(userInfo.getRoles().stream(),
+                userGroupDao.getUserGroups(userInfo.getName()).stream())
+                .collect(toSet());
+        return projectDAO.isAnyProjectAssigned(userGroups);
+    }
 
-	@Override
-	public boolean checkExploratoriesAndComputationalProgress(String projectName, List<String> endpoints) {
-		return exploratoryDAO.fetchProjectEndpointExploratoriesWhereStatusIn(projectName, endpoints, Arrays.asList(
-				UserInstanceStatus.CREATING, UserInstanceStatus.STARTING, UserInstanceStatus.CREATING_IMAGE,
-				UserInstanceStatus.CONFIGURING, UserInstanceStatus.RECONFIGURING, UserInstanceStatus.STOPPING,
-				UserInstanceStatus.TERMINATING),
-				UserInstanceStatus.CREATING, UserInstanceStatus.CONFIGURING, UserInstanceStatus.STARTING,
-				UserInstanceStatus.RECONFIGURING, UserInstanceStatus.CREATING_IMAGE, UserInstanceStatus.STOPPING,
-				UserInstanceStatus.TERMINATING).isEmpty();
-	}
+    @Override
+    public boolean checkExploratoriesAndComputationalProgress(String projectName, List<String> endpoints) {
+        return exploratoryDAO.fetchProjectEndpointExploratoriesWhereStatusIn(projectName, endpoints, Arrays.asList(
+                UserInstanceStatus.CREATING, UserInstanceStatus.STARTING, UserInstanceStatus.CREATING_IMAGE,
+                UserInstanceStatus.CONFIGURING, UserInstanceStatus.RECONFIGURING, UserInstanceStatus.STOPPING,
+                UserInstanceStatus.TERMINATING),
+                UserInstanceStatus.CREATING, UserInstanceStatus.CONFIGURING, UserInstanceStatus.STARTING,
+                UserInstanceStatus.RECONFIGURING, UserInstanceStatus.CREATING_IMAGE, UserInstanceStatus.STOPPING,
+                UserInstanceStatus.TERMINATING).isEmpty();
+    }
 
-	private void createProjectOnCloud(UserInfo user, ProjectDTO projectDTO) {
-		try {
-			projectDTO.getEndpoints().forEach(endpoint -> createEndpoint(user, projectDTO.getName(), projectDTO, endpoint.getName()));
-		} catch (Exception e) {
-			log.error("Can not create project due to: {}", e.getMessage());
-			projectDAO.updateStatus(projectDTO.getName(), ProjectDTO.Status.FAILED);
-		}
-	}
+    private void createProjectOnCloud(UserInfo user, ProjectDTO projectDTO) {
+        try {
+            projectDTO.getEndpoints().forEach(endpoint -> createEndpoint(user, projectDTO.getName(), projectDTO, endpoint.getName()));
+        } catch (Exception e) {
+            log.error("Can not create project due to: {}", e.getMessage());
+            projectDAO.updateStatus(projectDTO.getName(), ProjectDTO.Status.FAILED);
+        }
+    }
 
-	@Audit(action = CREATE_EDGE_NODE)
-	public void createEndpoint(@User UserInfo user, @Project String projectName, ProjectDTO projectDTO, @ResourceName String endpointName) {
-		EndpointDTO endpointDTO = endpointService.get(endpointName);
-		String uuid = provisioningService.post(endpointDTO.getUrl() + CREATE_PRJ_API, user.getAccessToken(),
-				requestBuilder.newProjectCreate(user, projectDTO, endpointDTO), String.class);
-		requestId.put(user.getName(), uuid);
-	}
+    @Audit(action = CREATE, type = EDGE_NODE)
+    public void createEndpoint(@User UserInfo user, @Project String projectName, ProjectDTO projectDTO, @ResourceName String endpointName) {
+        EndpointDTO endpointDTO = endpointService.get(endpointName);
+        String uuid = provisioningService.post(endpointDTO.getUrl() + CREATE_PRJ_API, user.getAccessToken(),
+                requestBuilder.newProjectCreate(user, projectDTO, endpointDTO), String.class);
+        requestId.put(user.getName(), uuid);
+    }
 
-	private void projectActionOnCloud(UserInfo user, String projectName, String provisioningApiUri, String endpoint) {
-		try {
-			EndpointDTO endpointDTO = endpointService.get(endpoint);
-			String uuid = provisioningService.post(endpointDTO.getUrl() + provisioningApiUri, user.getAccessToken(),
-					requestBuilder.newProjectAction(user, projectName, endpointDTO), String.class);
-			requestId.put(user.getName(), uuid);
-		} catch (Exception e) {
-			log.error("Can not terminate project due to: {}", e.getMessage());
-			projectDAO.updateStatus(projectName, ProjectDTO.Status.FAILED);
-		}
-	}
+    private void projectActionOnCloud(UserInfo user, String projectName, String provisioningApiUri, String endpoint) {
+        try {
+            EndpointDTO endpointDTO = endpointService.get(endpoint);
+            String uuid = provisioningService.post(endpointDTO.getUrl() + provisioningApiUri, user.getAccessToken(),
+                    requestBuilder.newProjectAction(user, projectName, endpointDTO), String.class);
+            requestId.put(user.getName(), uuid);
+        } catch (Exception e) {
+            log.error("Can not terminate project due to: {}", e.getMessage());
+            projectDAO.updateStatus(projectName, ProjectDTO.Status.FAILED);
+        }
+    }
 
-	private void checkProjectRelatedResourcesInProgress(String projectName, List<ProjectEndpointDTO> endpoints, String action) {
+    private void checkProjectRelatedResourcesInProgress(String projectName, List<ProjectEndpointDTO> endpoints, String action) {
 		boolean edgeProgress = endpoints
 				.stream().anyMatch(e ->
                         Arrays.asList(UserInstanceStatus.CREATING, UserInstanceStatus.STARTING, UserInstanceStatus.STOPPING,
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 5b465f6..e822090 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
@@ -28,7 +28,6 @@ import com.epam.dlab.backendapi.dao.ComputationalDAO;
 import com.epam.dlab.backendapi.dao.EnvDAO;
 import com.epam.dlab.backendapi.dao.ExploratoryDAO;
 import com.epam.dlab.backendapi.dao.SchedulerJobDAO;
-import com.epam.dlab.backendapi.domain.AuditActionEnum;
 import com.epam.dlab.backendapi.domain.RequestId;
 import com.epam.dlab.backendapi.service.ComputationalService;
 import com.epam.dlab.backendapi.service.ExploratoryService;
@@ -64,6 +63,9 @@ import java.util.function.Predicate;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import static com.epam.dlab.backendapi.domain.AuditActionEnum.CREATE;
+import static com.epam.dlab.backendapi.domain.AuditResourceTypeEnum.COMPUTATIONAL_SCHEDULER;
+import static com.epam.dlab.backendapi.domain.AuditResourceTypeEnum.NOTEBOOK_SCHEDULER;
 import static com.epam.dlab.constants.ServiceConsts.PROVISIONING_SERVICE_NAME;
 import static com.epam.dlab.dto.UserInstanceStatus.CONFIGURING;
 import static com.epam.dlab.dto.UserInstanceStatus.CREATING;
@@ -109,60 +111,60 @@ public class SchedulerJobServiceImpl implements SchedulerJobService {
 	private RequestId requestId;
 
 	@Inject
-	@Named(PROVISIONING_SERVICE_NAME)
-	private RESTService provisioningService;
-
-	@Override
-	public SchedulerJobDTO fetchSchedulerJobForUserAndExploratory(String user, String project, String exploratoryName) {
-		return schedulerJobDAO.fetchSingleSchedulerJobByUserAndExploratory(user, project, exploratoryName)
-				.orElseThrow(() -> new ResourceNotFoundException(String.format(SCHEDULER_NOT_FOUND_MSG, user,
-						exploratoryName)));
-	}
+    @Named(PROVISIONING_SERVICE_NAME)
+    private RESTService provisioningService;
+
+    @Override
+    public SchedulerJobDTO fetchSchedulerJobForUserAndExploratory(String user, String project, String exploratoryName) {
+        return schedulerJobDAO.fetchSingleSchedulerJobByUserAndExploratory(user, project, exploratoryName)
+                .orElseThrow(() -> new ResourceNotFoundException(String.format(SCHEDULER_NOT_FOUND_MSG, user,
+                        exploratoryName)));
+    }
 
-	@Override
-	public SchedulerJobDTO fetchSchedulerJobForComputationalResource(String user, String project, String exploratoryName,
-																	 String computationalName) {
-		return schedulerJobDAO.fetchSingleSchedulerJobForCluster(user, project, exploratoryName, computationalName)
-				.orElseThrow(() -> new ResourceNotFoundException(String.format(SCHEDULER_NOT_FOUND_MSG, user,
-						exploratoryName) + " with computational resource " + computationalName));
-	}
+    @Override
+    public SchedulerJobDTO fetchSchedulerJobForComputationalResource(String user, String project, String exploratoryName,
+                                                                     String computationalName) {
+        return schedulerJobDAO.fetchSingleSchedulerJobForCluster(user, project, exploratoryName, computationalName)
+                .orElseThrow(() -> new ResourceNotFoundException(String.format(SCHEDULER_NOT_FOUND_MSG, user,
+                        exploratoryName) + " with computational resource " + computationalName));
+    }
 
-	@Audit(action = AuditActionEnum.CREATE_NOTEBOOK_SCHEDULER)
-	@Override
-	public void updateExploratorySchedulerData(@User UserInfo user, @Project String project, @ResourceName String exploratoryName, SchedulerJobDTO dto) {
-		validateExploratoryStatus(user.getName(), project, exploratoryName);
-		populateDefaultSchedulerValues(dto);
-		log.debug("Updating exploratory {} for user {} with new scheduler job data: {}...", exploratoryName, user,
-				dto);
-		exploratoryDAO.updateSchedulerDataForUserAndExploratory(user.getName(), project, exploratoryName, dto);
-
-		if (!dto.inactivityScheduler() && dto.isSyncStartRequired()) {
-			shareSchedulerJobDataToSparkClusters(user.getName(), project, exploratoryName, dto);
-		} else if (!dto.inactivityScheduler()) {
-			computationalDAO.updateSchedulerSyncFlag(user.getName(), project, exploratoryName, dto.isSyncStartRequired());
-		}
-	}
+    @Audit(action = CREATE, type = NOTEBOOK_SCHEDULER)
+    @Override
+    public void updateExploratorySchedulerData(@User UserInfo user, @Project String project, @ResourceName String exploratoryName, SchedulerJobDTO dto) {
+        validateExploratoryStatus(user.getName(), project, exploratoryName);
+        populateDefaultSchedulerValues(dto);
+        log.debug("Updating exploratory {} for user {} with new scheduler job data: {}...", exploratoryName, user,
+                dto);
+        exploratoryDAO.updateSchedulerDataForUserAndExploratory(user.getName(), project, exploratoryName, dto);
+
+        if (!dto.inactivityScheduler() && dto.isSyncStartRequired()) {
+            shareSchedulerJobDataToSparkClusters(user.getName(), project, exploratoryName, dto);
+        } else if (!dto.inactivityScheduler()) {
+            computationalDAO.updateSchedulerSyncFlag(user.getName(), project, exploratoryName, dto.isSyncStartRequired());
+        }
+    }
 
-	@Audit(action = AuditActionEnum.CREATE_COMPUTATIONAL_SCHEDULER)
-	@Override
-	public void updateComputationalSchedulerData(@User UserInfo user, @Project String project, String exploratoryName, @ResourceName String computationalName, SchedulerJobDTO dto) {
-		validateExploratoryStatus(user.getName(), project, exploratoryName);
-		validateComputationalStatus(user.getName(), project, exploratoryName, computationalName);
-		populateDefaultSchedulerValues(dto);
-		log.debug("Updating computational resource {} affiliated with exploratory {} for user {} with new scheduler " +
-				"job data {}...", computationalName, exploratoryName, user, dto);
-		computationalDAO.updateSchedulerDataForComputationalResource(user.getName(), project, exploratoryName, computationalName, dto);
-	}
+    @Audit(action = CREATE, type = COMPUTATIONAL_SCHEDULER)
+    @Override
+    public void updateComputationalSchedulerData(@User UserInfo user, @Project String project, String exploratoryName, @ResourceName String computationalName, SchedulerJobDTO dto) {
+        validateExploratoryStatus(user.getName(), project, exploratoryName);
+        validateComputationalStatus(user.getName(), project, exploratoryName, computationalName);
+        populateDefaultSchedulerValues(dto);
+        log.debug("Updating computational resource {} affiliated with exploratory {} for user {} with new scheduler " +
+                "job data {}...", computationalName, exploratoryName, user, dto);
+        computationalDAO.updateSchedulerDataForComputationalResource(user.getName(), project, exploratoryName, computationalName, dto);
+    }
 
-	@Override
-	public void stopComputationalByScheduler() {
-		getComputationalSchedulersForStopping(OffsetDateTime.now(), true)
-				.forEach(this::stopComputational);
-	}
+    @Override
+    public void stopComputationalByScheduler() {
+        getComputationalSchedulersForStopping(OffsetDateTime.now(), true)
+                .forEach(this::stopComputational);
+    }
 
-	@Override
-	public void stopExploratoryByScheduler() {
-		getExploratorySchedulersForStopping(OffsetDateTime.now(), true)
+    @Override
+    public void stopExploratoryByScheduler() {
+        getExploratorySchedulersForStopping(OffsetDateTime.now(), true)
 				.forEach(this::stopExploratory);
 	}
 
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/UserGroupServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/UserGroupServiceImpl.java
index 9069d35..f4d7c5c 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/UserGroupServiceImpl.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/UserGroupServiceImpl.java
@@ -50,9 +50,10 @@ import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
 
-import static com.epam.dlab.backendapi.domain.AuditActionEnum.CREATE_GROUP;
-import static com.epam.dlab.backendapi.domain.AuditActionEnum.DELETE_GROUP;
-import static com.epam.dlab.backendapi.domain.AuditActionEnum.UPDATE_GROUP;
+import static com.epam.dlab.backendapi.domain.AuditActionEnum.CREATE;
+import static com.epam.dlab.backendapi.domain.AuditActionEnum.DELETE;
+import static com.epam.dlab.backendapi.domain.AuditActionEnum.UPDATE;
+import static com.epam.dlab.backendapi.domain.AuditResourceTypeEnum.GROUP;
 
 @Singleton
 @Slf4j
@@ -83,7 +84,7 @@ public class UserGroupServiceImpl implements UserGroupService {
 		this.configuration = configuration;
 	}
 
-	@Audit(action = CREATE_GROUP)
+	@Audit(action = CREATE, type = GROUP)
 	@Override
 	public void createGroup(@User UserInfo userInfo, @ResourceName String group, Set<String> roleIds, Set<String> users) {
 		checkAnyRoleFound(roleIds, userRoleDao.addGroupToRole(Collections.singleton(group), roleIds));
@@ -109,7 +110,7 @@ public class UserGroupServiceImpl implements UserGroupService {
 		}
 	}
 
-	@Audit(action = DELETE_GROUP)
+	@Audit(action = DELETE, type = GROUP)
 	@Override
 	public void removeGroup(@User UserInfo userInfo, @ResourceName String groupId) {
 		if (projectDAO.getProjectsWithEndpointStatusNotIn(UserInstanceStatus.TERMINATED,
@@ -169,7 +170,8 @@ public class UserGroupServiceImpl implements UserGroupService {
 		AuditDTO auditDTO = AuditDTO.builder()
 				.user(user)
 				.resourceName(group)
-				.action(UPDATE_GROUP)
+				.action(UPDATE)
+				.type(GROUP)
 				.info(auditInfo)
 				.build();
 		auditService.save(auditDTO);
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 fc619d2..749a1ef 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
@@ -63,17 +63,17 @@ 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";
-	private static final String EXPLORATORY_NAME_2 = "expName2";
-	private static final String TOKEN = "token";
-	private static final String UUID = "213-12312-321";
-	private static final String PROJECT_NAME = "projectName";
-	private static final String ENDPOINT_NAME = "endpointName";
-	private static final String ADMIN = "admin";
+    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";
+    private static final String EXPLORATORY_NAME_2 = "expName2";
+    private static final String TOKEN = "token";
+    private static final String UUID = "213-12312-321";
+    private static final String PROJECT_NAME = "projectName";
+    private static final String ENDPOINT_NAME = "endpointName";
+    private static final String ADMIN = "admin";
 
 	@Mock
 	private EnvDAO envDAO;
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/ExploratoryServiceImplTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/ExploratoryServiceImplTest.java
index eee6d0c..a821e7c 100644
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/ExploratoryServiceImplTest.java
+++ b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/ExploratoryServiceImplTest.java
@@ -20,6 +20,7 @@
 package com.epam.dlab.backendapi.service.impl;
 
 import com.epam.dlab.auth.UserInfo;
+import com.epam.dlab.backendapi.conf.SelfServiceApplicationConfiguration;
 import com.epam.dlab.backendapi.dao.ComputationalDAO;
 import com.epam.dlab.backendapi.dao.ExploratoryDAO;
 import com.epam.dlab.backendapi.dao.GitCredsDAO;
@@ -104,31 +105,32 @@ public class ExploratoryServiceImplTest {
     private ComputationalDAO computationalDAO;
     @Mock
     private GitCredsDAO gitCredsDAO;
+    @Rule
+    public ExpectedException expectedException = ExpectedException.none();
     @Mock
-	private RESTService provisioningService;
-	@Mock
-	private RequestBuilder requestBuilder;
-	@Mock
-	private RequestId requestId;
-	@Mock
-	private TagService tagService;
-	@Mock
-	private EndpointService endpointService;
-
-	@InjectMocks
-	private ExploratoryServiceImpl exploratoryService;
-
-	@Rule
-	public ExpectedException expectedException = ExpectedException.none();
-
-	@Before
-	public void setUp() {
-		userInfo = getUserInfo();
-		userInstance = getUserInstanceDto();
-	}
+    private RESTService provisioningService;
+    @Mock
+    private RequestBuilder requestBuilder;
+    @Mock
+    private RequestId requestId;
+    @Mock
+    private TagService tagService;
+    @Mock
+    private EndpointService endpointService;
+    @Mock
+    private SelfServiceApplicationConfiguration configuration;
+    @InjectMocks
+    private ExploratoryServiceImpl exploratoryService;
+
+    @Before
+    public void setUp() {
+        when(configuration.isAuditEnabled()).thenReturn(false);
+        userInfo = getUserInfo();
+        userInstance = getUserInstanceDto();
+    }
 
-	@Test
-	public void start() {
+    @Test
+    public void start() {
         when(endpointService.get(anyString())).thenReturn(endpointDTO());
         when(exploratoryDAO.updateExploratoryStatus(any(StatusEnvBaseDTO.class))).thenReturn(mock(UpdateResult.class));
         when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString())).thenReturn(userInstance);


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