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/07/06 14:38:49 UTC

[incubator-dlab] branch DLAB-1919 created (now 9d5dbc5)

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

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


      at 9d5dbc5  [DLAB-1919]First part of audit changes

This branch includes the following new commits:

     new 9d5dbc5  [DLAB-1919]First part of audit changes

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



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


[incubator-dlab] 01/01: [DLAB-1919]First part of audit changes

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

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

commit 9d5dbc55d61fa3eef8b2bcf86be0978ea4b3f106
Author: Oleh Fuks <ol...@gmail.com>
AuthorDate: Mon Jul 6 17:38:33 2020 +0300

    [DLAB-1919]First part of audit changes
---
 .../dlab/backendapi/domain/AuditActionEnum.java    |  2 +-
 .../dlab/backendapi/domain/AuditCreateDTO.java     |  2 +
 .../backendapi/domain/AuditResourceTypeEnum.java   |  2 +-
 .../backendapi/service/ExploratoryService.java     |  2 +
 .../backendapi/service/impl/AuditServiceImpl.java  |  3 +-
 .../service/impl/ComputationalServiceImpl.java     | 41 ++++++++---------
 .../service/impl/EndpointServiceImpl.java          |  8 ++--
 .../service/impl/ExploratoryServiceImpl.java       | 38 ++++++++++++----
 .../service/impl/ProjectServiceImpl.java           | 53 +++++++++++-----------
 .../resources/ImageExploratoryResourceTest.java    |  2 +-
 .../service/impl/ExploratoryServiceImplTest.java   | 30 ++++++------
 11 files changed, 102 insertions(+), 81 deletions(-)

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 e7bc9a1..cd5eb7b 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,5 +20,5 @@
 package com.epam.dlab.backendapi.domain;
 
 public enum AuditActionEnum {
-    CREATE, START, STOP, TERMINATE, UPDATE, UPLOAD, DOWNLOAD, DELETE, INSTALL, FOLLOW_LINK, LOG_IN
+    CREATE, START, STOP, TERMINATE, RECONFIGURE, UPDATE, CONNECT, DISCONNECT, UPLOAD, DOWNLOAD, DELETE, INSTALL, FOLLOW_LINK, LOG_IN
 }
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/AuditCreateDTO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/AuditCreateDTO.java
index 1deb5ae..22d939d 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/AuditCreateDTO.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/AuditCreateDTO.java
@@ -31,5 +31,7 @@ public class AuditCreateDTO {
     @NotBlank(message = "field cannot be empty")
     @JsonProperty("resource_name")
     private final String resourceName;
+    @NotBlank(message = "field cannot be empty")
     private final String info;
+    private final AuditResourceTypeEnum type;
 }
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/AuditResourceTypeEnum.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/AuditResourceTypeEnum.java
index cc9ebdf..dce8f06 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/AuditResourceTypeEnum.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/AuditResourceTypeEnum.java
@@ -20,6 +20,6 @@
 package com.epam.dlab.backendapi.domain;
 
 public enum AuditResourceTypeEnum {
-    PROJECT, EDGE_NODE, NOTEBOOK, NOTEBOOK_SCHEDULER, NOTEBOOK_CONFIG, COMPUTATIONAL, COMPUTATIONAL_LIBS, COMPUTATIONAL_SCHEDULER, COMPUTATIONAL_CONFIG,
+    PROJECT, EDGE_NODE, NOTEBOOK, NOTEBOOK_SCHEDULER, COMPUTE, COMPUTATIONAL_LIBS, COMPUTATIONAL_SCHEDULER,
     BUCKET, ENDPOINT, NOTEBOOK_LIBS, GROUP, IMAGE, GIT_ACCOUNT, LOG_IN
 }
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/ExploratoryService.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/ExploratoryService.java
index 6b54473..af49313 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/ExploratoryService.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/ExploratoryService.java
@@ -42,6 +42,8 @@ public interface ExploratoryService {
 
     String create(UserInfo userInfo, Exploratory exploratory, String project, String exploratoryName);
 
+    void updateProjectExploratoryStatuses(UserInfo userInfo, String project, String endpoint, UserInstanceStatus status);
+
     void updateProjectExploratoryStatuses(String project, String endpoint, UserInstanceStatus status);
 
     void updateClusterConfig(UserInfo userInfo, String project, String exploratoryName, List<ClusterConfig> config);
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 0e7aebc..94d6a82 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
@@ -29,7 +29,6 @@ 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;
@@ -50,7 +49,7 @@ public class AuditServiceImpl implements AuditService {
                 .user(user)
                 .resourceName(audit.getResourceName())
                 .action(FOLLOW_LINK)
-                .type(NOTEBOOK)
+                .type(audit.getType())
                 .info(audit.getInfo())
                 .build();
         auditDAO.save(auditDTO);
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 232883c..1bfd0b7 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
@@ -70,12 +70,11 @@ import java.util.Optional;
 import java.util.stream.Collectors;
 
 import static com.epam.dlab.backendapi.domain.AuditActionEnum.CREATE;
+import static com.epam.dlab.backendapi.domain.AuditActionEnum.RECONFIGURE;
 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.backendapi.domain.AuditResourceTypeEnum.COMPUTE;
 import static com.epam.dlab.dto.UserInstanceStatus.CREATING;
 import static com.epam.dlab.dto.UserInstanceStatus.FAILED;
 import static com.epam.dlab.dto.UserInstanceStatus.RECONFIGURING;
@@ -153,7 +152,7 @@ public class ComputationalServiceImpl implements ComputationalService {
 	}
 
 	@BudgetLimited
-	@Audit(action = CREATE, type = COMPUTATIONAL)
+	@Audit(action = CREATE, type = COMPUTE)
 	@Override
 	public boolean createSparkCluster(@User UserInfo userInfo, @ResourceName String resourceName, SparkStandaloneClusterCreateForm form, @Project String project,
                                       @Info String auditInfo) {
@@ -179,19 +178,19 @@ public class ComputationalServiceImpl implements ComputationalService {
 				} catch (DlabException d) {
 					log.error(COULD_NOT_UPDATE_THE_STATUS_MSG_FORMAT, form.getName(), userInfo.getName(), d);
 				}
-				throw e;
-			}
-		} else {
-			log.debug("Computational with name {} is already existing for user {}", form.getName(),
-					userInfo.getName());
-			return false;
-		}
+	            throw e;
+            }
+        } else {
+	        log.debug("Computational with name {} is already existing for user {}", form.getName(),
+			        userInfo.getName());
+	        return false;
+        }
 	}
 
-	@Audit(action = TERMINATE, type = COMPUTATIONAL)
+	@Audit(action = TERMINATE, type = COMPUTE)
 	@Override
 	public void terminateComputational(@User UserInfo userInfo, String resourceCreator, @Project String project, String exploratoryName, @ResourceName String computationalName,
-									   @Info String auditInfo) {
+	                                   @Info String auditInfo) {
 		try {
 			updateComputationalStatus(resourceCreator, project, exploratoryName, computationalName, TERMINATING);
 
@@ -217,7 +216,7 @@ public class ComputationalServiceImpl implements ComputationalService {
 	}
 
 	@BudgetLimited
-	@Audit(action = CREATE, type = COMPUTATIONAL)
+	@Audit(action = CREATE, type = COMPUTE)
 	@Override
 	public boolean createDataEngineService(@User UserInfo userInfo, @ResourceName String resourceName, ComputationalCreateFormDTO formDTO,
 										   UserComputationalResource computationalResource, @Project String project, @Info String auditInfo) {
@@ -250,13 +249,13 @@ public class ComputationalServiceImpl implements ComputationalService {
 				throw new DlabException("Could not send request for creation the computational resource " + formDTO
 						.getName() + ": " + t.getLocalizedMessage(), t);
 			}
-		} else {
-			log.debug("Used existing computational resource {} for user {}", formDTO.getName(), userInfo.getName());
-			return false;
-		}
+        } else {
+	        log.debug("Used existing computational resource {} for user {}", formDTO.getName(), userInfo.getName());
+	        return false;
+        }
 	}
 
-	@Audit(action = STOP, type = COMPUTATIONAL)
+	@Audit(action = STOP, type = COMPUTE)
 	@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);
@@ -277,7 +276,7 @@ public class ComputationalServiceImpl implements ComputationalService {
 	}
 
 	@BudgetLimited
-	@Audit(action = START, type = COMPUTATIONAL)
+	@Audit(action = START, type = COMPUTE)
 	@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);
@@ -296,7 +295,7 @@ public class ComputationalServiceImpl implements ComputationalService {
 		}
 	}
 
-	@Audit(action = UPDATE, type = COMPUTATIONAL_CONFIG)
+	@Audit(action = RECONFIGURE, type = COMPUTE)
 	@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 a21fdd5..e3ad62c 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,8 @@ import java.util.List;
 import java.util.Objects;
 import java.util.stream.Collectors;
 
-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.CONNECT;
+import static com.epam.dlab.backendapi.domain.AuditActionEnum.DISCONNECT;
 import static com.epam.dlab.backendapi.domain.AuditResourceTypeEnum.ENDPOINT;
 
 
@@ -92,7 +92,7 @@ public class EndpointServiceImpl implements EndpointService {
      * @param resourceName name of the endpoint
      * @param endpointDTO  object with endpoint fields
      */
-    @Audit(action = CREATE, type = ENDPOINT)
+    @Audit(action = CONNECT, type = ENDPOINT)
     @Override
     public void create(@User UserInfo userInfo, @ResourceName String resourceName, EndpointDTO endpointDTO) {
         if (endpointDAO.get(endpointDTO.getName()).isPresent()) {
@@ -124,7 +124,7 @@ public class EndpointServiceImpl implements EndpointService {
         removeEndpoint(userInfo, name, cloudProvider, projects);
     }
 
-    @Audit(action = DELETE, type = ENDPOINT)
+	@Audit(action = DISCONNECT, type = ENDPOINT)
     public void removeEndpoint(@User UserInfo userInfo, @ResourceName String name, CloudProvider cloudProvider, List<ProjectDTO> projects) {
         removeEndpointInAllProjects(userInfo, name, projects);
         endpointDAO.remove(name);
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 1c914bf..39f7ec0 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
@@ -67,7 +67,7 @@ import com.google.inject.name.Named;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 
-import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
@@ -75,13 +75,11 @@ import java.util.Set;
 import java.util.stream.Collectors;
 
 import static com.epam.dlab.backendapi.domain.AuditActionEnum.CREATE;
+import static com.epam.dlab.backendapi.domain.AuditActionEnum.RECONFIGURE;
 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;
@@ -183,12 +181,18 @@ public class ExploratoryServiceImpl implements ExploratoryService {
 	}
 
 	@Override
+	public void updateProjectExploratoryStatuses(UserInfo userInfo, String project, String endpoint, UserInstanceStatus status) {
+		exploratoryDAO.fetchProjectExploratoriesWhereStatusNotIn(project, endpoint, TERMINATED, FAILED)
+				.forEach(ui -> updateExploratoryStatus(userInfo, project, ui.getExploratoryName(), status, ui.getUser()));
+	}
+
+	@Override
 	public void updateProjectExploratoryStatuses(String project, String endpoint, UserInstanceStatus status) {
 		exploratoryDAO.fetchProjectExploratoriesWhereStatusNotIn(project, endpoint, TERMINATED, FAILED)
 				.forEach(ui -> updateExploratoryStatus(project, ui.getExploratoryName(), status, ui.getUser()));
 	}
 
-	@Audit(action = UPDATE, type = NOTEBOOK_CONFIG)
+	@Audit(action = RECONFIGURE, type = NOTEBOOK)
 	@Override
 	public void updateClusterConfig(@User UserInfo userInfo, @Project String project, @ResourceName String exploratoryName, List<ClusterConfig> config) {
 		final String userName = userInfo.getName();
@@ -303,17 +307,26 @@ public class ExploratoryServiceImpl implements ExploratoryService {
 		}
 	}
 
+	@Audit(action = TERMINATE, type = NOTEBOOK)
+	public void updateExploratoryStatus(@User UserInfo userInfo, @Project String project, @ResourceName String exploratoryName, UserInstanceStatus status, String user) {
+		updateExploratoryStatus(user, project, exploratoryName, status);
+		updateComputationalStatuses(project, exploratoryName, status, user);
+	}
+
 	private void updateExploratoryStatus(String project, String exploratoryName, UserInstanceStatus status, String user) {
 		updateExploratoryStatus(user, project, exploratoryName, status);
+		updateComputationalStatuses(project, exploratoryName, status, user);
+	}
 
+	private void updateComputationalStatuses(String project, String exploratoryName, UserInstanceStatus status, String user) {
 		if (status == STOPPING) {
 			if (configuration.isAuditEnabled()) {
-				saveAudit(project, exploratoryName, user, STOP, COMPUTATIONAL);
+				saveAudit(project, exploratoryName, user, STOP);
 			}
 			updateComputationalStatuses(user, project, exploratoryName, STOPPING, TERMINATING, FAILED, TERMINATED, STOPPED);
 		} else if (status == TERMINATING) {
 			if (configuration.isAuditEnabled()) {
-				saveAudit(project, exploratoryName, user, TERMINATE, COMPUTATIONAL);
+				saveAudit(project, exploratoryName, user, TERMINATE);
 			}
 			updateComputationalStatuses(user, project, exploratoryName, TERMINATING, TERMINATING, TERMINATED, FAILED);
 		} else if (status == TERMINATED) {
@@ -321,8 +334,13 @@ public class ExploratoryServiceImpl implements ExploratoryService {
 		}
 	}
 
-	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),
+	private void saveAudit(String project, String exploratoryName, String user, AuditActionEnum action) {
+		saveAuditForComputational(project, exploratoryName, user, action, DataEngineType.SPARK_STANDALONE);
+		saveAuditForComputational(project, exploratoryName, user, TERMINATE, DataEngineType.CLOUD_SERVICE);
+	}
+
+	private void saveAuditForComputational(String project, String exploratoryName, String user, AuditActionEnum action, DataEngineType cloudService) {
+		computationalDAO.getComputationalResourcesWhereStatusIn(user, project, Collections.singletonList(cloudService),
 				exploratoryName, RUNNING)
 				.forEach(comp -> auditService.save(
 						AuditDTO.builder()
@@ -330,7 +348,7 @@ public class ExploratoryServiceImpl implements ExploratoryService {
 								.resourceName(comp)
 								.project(project)
 								.action(action)
-								.type(type)
+								.type(AuditResourceTypeEnum.COMPUTE)
 								.build())
 				);
 	}
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 76fa48d..b4d635d 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
@@ -66,6 +66,7 @@ public class ProjectServiceImpl implements ProjectService {
 	private static final String AUDIT_ADD_GROUP = "Added group(s) %s";
 	private static final String AUDIT_REMOVE_GROUP = "Removed group(s) %s";
 	private static final String AUDIT_UPDATE_BUDGET = "Update budget %d->%d";
+	private static final String AUDIT_ADD_EDGE_NODE = "Create edge node for endpoint %s, requested in project %s";
 
 	private final ProjectDAO projectDAO;
 	private final ExploratoryService exploratoryService;
@@ -138,9 +139,9 @@ public class ProjectServiceImpl implements ProjectService {
     @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);
+	    projectActionOnCloud(userInfo, name, TERMINATE_PRJ_API, endpoint);
+	    projectDAO.updateEdgeStatus(name, endpoint, UserInstanceStatus.TERMINATING);
+	    exploratoryService.updateProjectExploratoryStatuses(userInfo, name, endpoint, UserInstanceStatus.TERMINATING);
     }
 
 	@ProjectAdmin
@@ -209,14 +210,14 @@ public class ProjectServiceImpl implements ProjectService {
     @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
-                .stream()
-                .map(e -> new ProjectEndpointDTO(e, UserInstanceStatus.CREATING, null))
-                .collect(Collectors.toList());
-        project.getEndpoints().addAll(endpointsToBeCreated);
-        projectDAO.update(new ProjectDTO(project.getName(), projectDTO.getGroups(), project.getKey(),
-                project.getTag(), project.getBudget(), project.getEndpoints(), projectDTO.isSharedImageEnabled()));
-        endpointsToBeCreated.forEach(e -> createEndpoint(userInfo, projectName, project, e.getName()));
+	    final List<ProjectEndpointDTO> endpointsToBeCreated = newEndpoints
+			    .stream()
+			    .map(e -> new ProjectEndpointDTO(e, UserInstanceStatus.CREATING, null))
+			    .collect(Collectors.toList());
+	    project.getEndpoints().addAll(endpointsToBeCreated);
+	    projectDAO.update(new ProjectDTO(project.getName(), projectDTO.getGroups(), project.getKey(),
+			    project.getTag(), project.getBudget(), project.getEndpoints(), projectDTO.isSharedImageEnabled()));
+	    endpointsToBeCreated.forEach(e -> createEndpoint(userInfo, projectName, project, e.getName(), String.format(AUDIT_ADD_EDGE_NODE, e.getName(), project.getName())));
     }
 
     @Override
@@ -254,22 +255,22 @@ public class ProjectServiceImpl implements ProjectService {
 				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 project) {
+		try {
+			project.getEndpoints().forEach(e -> createEndpoint(user, project.getName(), project, e.getName(), String.format(AUDIT_ADD_EDGE_NODE, e.getName(), project.getName())));
+		} catch (Exception e) {
+			log.error("Can not create project due to: {}", e.getMessage());
+			projectDAO.updateStatus(project.getName(), ProjectDTO.Status.FAILED);
+		}
+	}
 
-    @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);
-    }
+	@Audit(action = CREATE, type = EDGE_NODE)
+	public void createEndpoint(@User UserInfo user, @Project String projectName, ProjectDTO projectDTO, @ResourceName String endpointName, @Info String auditInfo) {
+		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 {
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/ImageExploratoryResourceTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/ImageExploratoryResourceTest.java
index 3eeb856..7c065dc 100644
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/ImageExploratoryResourceTest.java
+++ b/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/ImageExploratoryResourceTest.java
@@ -54,7 +54,7 @@ import static org.mockito.Mockito.verifyZeroInteractions;
 import static org.mockito.Mockito.when;
 
 public class ImageExploratoryResourceTest extends TestBase {
-	private final static String AUDIT_MESSAGE = "Image name: %s";
+	private final static String AUDIT_MESSAGE = "Create image: %s";
 	private static final String PROJECT = "projectName";
 	private ImageExploratoryService imageExploratoryService = mock(ImageExploratoryService.class);
 	private RequestId requestId = mock(RequestId.class);
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 a821e7c..04b4c01 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
@@ -392,24 +392,24 @@ public class ExploratoryServiceImplTest {
 
 	@Test
 	public void updateProjectExploratoryStatuses() {
-        when(exploratoryDAO.fetchProjectExploratoriesWhereStatusNotIn(anyString(), anyString(), anyVararg()))
-                .thenReturn(singletonList(userInstance));
-        when(exploratoryDAO.updateExploratoryStatus(any(StatusEnvBaseDTO.class))).thenReturn(mock(UpdateResult.class));
-        doNothing().when(computationalDAO).updateComputationalStatusesForExploratory(anyString(), anyString(),
-                anyString(), any(UserInstanceStatus.class), any(UserInstanceStatus.class), anyVararg());
+		when(exploratoryDAO.fetchProjectExploratoriesWhereStatusNotIn(anyString(), anyString(), anyVararg()))
+				.thenReturn(singletonList(userInstance));
+		when(exploratoryDAO.updateExploratoryStatus(any(StatusEnvBaseDTO.class))).thenReturn(mock(UpdateResult.class));
+		doNothing().when(computationalDAO).updateComputationalStatusesForExploratory(anyString(), anyString(),
+				anyString(), any(UserInstanceStatus.class), any(UserInstanceStatus.class), anyVararg());
 
-        exploratoryService.updateProjectExploratoryStatuses("project", "endpoint",
-                UserInstanceStatus.TERMINATED);
-        statusEnvBaseDTO = getStatusEnvBaseDTOWithStatus("terminated");
+		exploratoryService.updateProjectExploratoryStatuses(userInfo, "project",
+				"endpoint", UserInstanceStatus.TERMINATED);
+		statusEnvBaseDTO = getStatusEnvBaseDTOWithStatus("terminated");
 
-        verify(exploratoryDAO).fetchProjectExploratoriesWhereStatusNotIn("project", "endpoint",
-                UserInstanceStatus.TERMINATED, UserInstanceStatus.FAILED);
-        verify(exploratoryDAO).updateExploratoryStatus(refEq(statusEnvBaseDTO, "self"));
-        verify(computationalDAO).updateComputationalStatusesForExploratory(USER, PROJECT,
-                EXPLORATORY_NAME, UserInstanceStatus.TERMINATED, UserInstanceStatus.TERMINATED,
-                UserInstanceStatus.TERMINATED, UserInstanceStatus.FAILED);
+		verify(exploratoryDAO).fetchProjectExploratoriesWhereStatusNotIn("project", "endpoint",
+				UserInstanceStatus.TERMINATED, UserInstanceStatus.FAILED);
+		verify(exploratoryDAO).updateExploratoryStatus(refEq(statusEnvBaseDTO, "self"));
+		verify(computationalDAO).updateComputationalStatusesForExploratory(USER, PROJECT,
+				EXPLORATORY_NAME, UserInstanceStatus.TERMINATED, UserInstanceStatus.TERMINATED,
+				UserInstanceStatus.TERMINATED, UserInstanceStatus.FAILED);
 
-        verifyNoMoreInteractions(exploratoryDAO, computationalDAO);
+		verifyNoMoreInteractions(exploratoryDAO, computationalDAO);
     }
 
 	@Test


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