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

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

commit 1f51bf71ebc7d0d7574f8525f23c4600e76c1529
Merge: 4e15862 cd374d8
Author: Oleh Fuks <olegfuk...@gmail.com>
AuthorDate: Wed Jun 24 15:06:40 2020 +0300

    Merge branch 'audit' into develop
    
    # Conflicts:
    #   
services/self-service/src/main/java/com/epam/dlab/backendapi/resources/BucketResource.java
    #   
services/self-service/src/main/java/com/epam/dlab/backendapi/service/BucketService.java
    #   
services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/BucketServiceImpl.java
    #   
services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ProjectServiceImpl.java
    #   
services/self-service/src/test/java/com/epam/dlab/backendapi/resources/ExploratoryResourceTest.java

 .../main/java/com/epam/dlab/model/StringList.java} |  34 +-
 .../java/com/epam/dlab/util/UsernameUtils.java     |   2 +-
 .../epam/dlab/rest/contracts/ComputationalAPI.java |   1 +
 .../azure/ComputationalResourceAzure.java          |   2 +-
 services/self-service/pom.xml                      |   6 +
 services/self-service/self-service.yml             |   4 +-
 .../dlab/backendapi/SelfServiceApplication.java    |  39 +-
 .../epam/dlab/backendapi/annotation/Audit.java}    |  24 +-
 .../UserGroupDao.java => annotation/Info.java}     |  18 +-
 .../ResourceName.java}                             |  18 +-
 .../conf/SelfServiceApplicationConfiguration.java  |   7 +
 .../dao/{UserGroupDao.java => AuditDAO.java}       |  15 +-
 .../com/epam/dlab/backendapi/dao/AuditDAOImpl.java | 162 ++++++
 .../java/com/epam/dlab/backendapi/dao/BaseDAO.java |   2 +
 .../epam/dlab/backendapi/dao/ExploratoryDAO.java   |  12 +-
 .../com/epam/dlab/backendapi/dao/UserGroupDao.java |   1 +
 .../epam/dlab/backendapi/dao/UserGroupDaoImpl.java |  28 +-
 .../dlab/backendapi/domain/AuditActionEnum.java}   |  10 +-
 .../dlab/backendapi/domain/AuditCreateDTO.java}    |  25 +-
 .../com/epam/dlab/backendapi/domain/AuditDTO.java} |  29 +-
 .../AuditPaginationDTO.java}                       |  40 +-
 .../AuditResourceTypeEnum.java}                    |  15 +-
 .../backendapi/interceptor/AuditInterceptor.java   | 122 +++++
 .../backendapi/modules/CloudProviderModule.java    |  11 +-
 .../epam/dlab/backendapi/modules/DevModule.java    |   6 +
 .../dlab/backendapi/modules/ProductionModule.java  |   6 +
 .../dlab/backendapi/resources/AuditResource.java   |  70 +++
 .../dlab/backendapi/resources/BucketResource.java  |   9 +-
 .../backendapi/resources/EndpointResource.java     |  16 +-
 .../backendapi/resources/ExploratoryResource.java  |   8 +-
 .../backendapi/resources/GitCredsResource.java     |  41 +-
 .../resources/ImageExploratoryResource.java        |   7 +-
 .../backendapi/resources/KeycloakResource.java     |  27 +-
 .../resources/LibExploratoryResource.java          |  22 +-
 .../dlab/backendapi/resources/ProjectResource.java |  11 +-
 .../backendapi/resources/SchedulerJobResource.java |   7 +-
 .../backendapi/resources/UserGroupResource.java    |   9 +-
 .../resources/aws/ComputationalResourceAws.java    |  83 ++--
 .../azure/ComputationalResourceAzure.java          |  73 +--
 .../resources/dto/HealthStatusPageDTO.java         |   2 +
 .../resources/dto/ProjectInfrastructureInfo.java   |   4 +-
 .../dto/UpdateGroupDTO.java}                       |  24 +-
 .../resources/gcp/ComputationalResourceGcp.java    | 103 ++--
 .../{UserGroupService.java => AuditService.java}   |  18 +-
 .../dlab/backendapi/service/BucketService.java     |   8 +-
 .../backendapi/service/ComputationalService.java   |  59 +--
 .../dlab/backendapi/service/EndpointService.java   |   6 +-
 .../backendapi/service/ExploratoryService.java     |   8 +-
 .../service/ImageExploratoryService.java           |   2 +-
 .../dlab/backendapi/service/LibraryService.java    |   4 +-
 .../dlab/backendapi/service/ProjectService.java    |  25 +-
 .../backendapi/service/SchedulerJobService.java    |   5 +-
 .../backendapi/service/SecurityServiceImpl.java    |  15 +-
 .../dlab/backendapi/service/UserGroupService.java  |   9 +-
 .../backendapi/service/impl/AuditServiceImpl.java  |  64 +++
 .../backendapi/service/impl/BucketServiceImpl.java |  17 +-
 .../service/impl/ComputationalServiceImpl.java     | 127 +++--
 .../service/impl/EndpointServiceImpl.java          |  83 ++--
 .../service/impl/EnvironmentServiceImpl.java       |  44 +-
 .../service/impl/ExploratoryServiceImpl.java       | 144 ++++--
 .../service/impl/GitCredentialServiceImpl.java     |  71 +--
 .../service/impl/ImageExploratoryServiceImpl.java  |  88 ++--
 .../impl/InfrastructureInfoServiceImpl.java        |  26 +-
 .../service/impl/LibraryServiceImpl.java           |  80 +--
 .../service/impl/ProjectServiceImpl.java           | 189 ++++---
 .../service/impl/SchedulerJobServiceImpl.java      | 207 ++++----
 .../service/impl/UserGroupServiceImpl.java         | 122 ++++-
 .../epam/dlab/backendapi/util/RequestBuilder.java  | 154 +++---
 .../management/endpoints/endpoints.component.ts    |   9 +-
 .../app/administration/roles/roles.component.ts    |  36 +-
 .../main/resources/webapp/src/app/app.module.ts    |  10 +-
 .../resources/webapp/src/app/app.routing.module.ts |  12 +-
 .../convert-action.pipe.ts}                        |  14 +-
 .../app/core/pipes/convert-action-pipe/index.ts}   |  20 +-
 .../resources/webapp/src/app/core/pipes/index.ts   |   1 +
 .../app/core/pipes/lib-sort-pipe/lib-sort.pipe.ts  |   6 +-
 .../services/applicationServiceFacade.service.ts   |  16 +
 .../webapp/src/app/core/services/audit.service.ts  |  47 ++
 .../audit/audit-grid/audit-grid.component.html     | 232 +++++++++
 .../audit/audit-grid/audit-grid.component.scss     | 276 +++++++++++
 .../audit/audit-grid/audit-grid.component.ts       | 208 ++++++++
 .../audit-toolbar/audit-toolbar.component.html}    |  14 +-
 .../audit-toolbar/audit-toolbar.component.scss}    |   0
 .../audit-toolbar/audit-toolbar.component.ts}      |  44 +-
 .../src/app/reports/audit/audit.component.ts       | 101 ++++
 .../audit/audit.module.ts}                         |  27 +-
 .../src/app/reports/audit/filter-audit.model.ts    |  27 +
 .../reporting-grid/reporting-grid.component.html   |   0
 .../reporting-grid/reporting-grid.component.scss   |   0
 .../reporting-grid/reporting-grid.component.ts     |   4 +-
 .../{ => reports}/reporting/reporting.component.ts |   8 +-
 .../{ => reports}/reporting/reporting.module.ts    |   6 +-
 .../reporting/toolbar/toolbar.component.html       |   4 +-
 .../reporting/toolbar/toolbar.component.scss       |   0
 .../reporting/toolbar/toolbar.component.ts         |   6 +-
 .../webapp/src/app/reports/reports.module.ts}      |  25 +-
 .../cluster-details/cluster-details.component.html |   2 +-
 .../cluster-details/cluster-details.component.ts   |   9 +-
 .../detail-dialog/detail-dialog.component.html     |   6 +-
 .../detail-dialog/detail-dialog.component.ts       |   6 +
 .../webapp/src/app/shared/form-controls/index.ts   |  17 +-
 .../multi-select-dropdown.component.html           |   6 +-
 .../notification-dialog.component.ts               |   7 +-
 .../src/app/shared/navbar/navbar.component.html    |  16 +-
 .../webapp/src/assets/styles/_dialogs.scss         |  10 +
 .../webapp/src/assets/styles/_general.scss         |   2 +
 .../resources/webapp/src/assets/styles/_theme.scss |  25 +-
 .../resources/ExploratoryResourceTest.java         | 229 ++++-----
 .../resources/ImageExploratoryResourceTest.java    |  14 +-
 .../resources/LibExploratoryResourceTest.java      |  46 +-
 .../resources/SchedulerJobResourceTest.java        |  25 +-
 .../resources/UserGroupResourceTest.java           |  39 +-
 .../service/impl/ComputationalServiceImplTest.java |  75 +--
 .../service/impl/EnvironmentServiceImplTest.java   | 110 ++--
 .../service/impl/ExploratoryServiceImplTest.java   | 132 ++---
 .../impl/ImageExploratoryServiceImplTest.java      |  10 +-
 .../service/impl/LibraryServiceImplTest.java       |  15 +-
 .../service/impl/SchedulerJobServiceImplTest.java  | 551 +++++++++++----------
 .../service/impl/UserGroupServiceImplTest.java     |  14 +-
 119 files changed, 3513 insertions(+), 1736 deletions(-)

diff --cc 
services/self-service/src/main/java/com/epam/dlab/backendapi/resources/BucketResource.java
index 1cca27c,c4f7b6e..4ceb55e
--- 
a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/BucketResource.java
+++ 
b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/BucketResource.java
@@@ -143,7 -138,7 +146,7 @@@ public class BucketResource 
                              fileSize = 
Long.parseLong(Streams.asString(stream));
                          }
                      } else {
-                         bucketService.uploadObject(userInfo, bucket, object, 
endpoint, stream, item.getContentType(), fileSize);
 -                        bucketService.uploadObjects(userInfo, bucket, object, 
endpoint, stream, fileSize, String.format(AUDIT_UPLOAD_MESSAGE, object, 
fileSize));
++                        bucketService.uploadObject(userInfo, bucket, object, 
endpoint, stream, item.getContentType(), fileSize, 
String.format(AUDIT_UPLOAD_MESSAGE, object, fileSize));
                      }
                  } catch (Exception e) {
                      log.error("Cannot upload object {} to bucket {}. {}", 
object, bucket, e.getMessage(), e);
diff --cc 
services/self-service/src/main/java/com/epam/dlab/backendapi/service/BucketService.java
index cd22ddc,1cb0769..8cf09dd
--- 
a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/BucketService.java
+++ 
b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/BucketService.java
@@@ -29,11 -29,9 +29,9 @@@ import java.util.List
  public interface BucketService {
      List<BucketDTO> getObjects(UserInfo userInfo, String bucket, String 
endpoint);
  
-     void uploadObject(UserInfo userInfo, String bucket, String object, String 
endpoint, InputStream inputStream, String contentType, long fileSize);
 -    void uploadObjects(UserInfo userInfo, String bucket, String object, 
String endpoint, InputStream inputStream, long fileSize, String auditInfo);
++    void uploadObject(UserInfo userInfo, String bucket, String object, String 
endpoint, InputStream inputStream, String contentType, long fileSize, String 
auditInfo);
  
-     void uploadFolder(UserInfo userInfo, String bucket, String folder, String 
endpoint);
+     void downloadObject(UserInfo userInfo, String bucket, String object, 
String endpoint, HttpServletResponse resp, String auditInfo);
  
-     void downloadObject(UserInfo userInfo, String bucket, String object, 
String endpoint, HttpServletResponse resp);
- 
-     void deleteObjects(UserInfo userInfo, String bucket, List<String> 
objects, String endpoint);
+     void deleteObjects(UserInfo userInfo, String bucket, List<String> 
objects, String endpoint, String auditInfo);
  }
diff --cc 
services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/BucketServiceImpl.java
index 489c3e0,93fc12b..c2f9617
--- 
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
@@@ -80,8 -86,9 +88,9 @@@ public class BucketServiceImpl implemen
          }
      }
  
+     @Audit(action = UPLOAD, type = BUCKET)
      @Override
-     public void uploadObject(UserInfo userInfo, String bucket, String object, 
String endpoint, InputStream inputStream, String contentType, long fileSize) {
 -    public void uploadObjects(@User UserInfo userInfo, @ResourceName String 
bucket, String object, String endpoint, InputStream inputStream, long fileSize, 
@Info String auditInfo) {
++    public void uploadObject(@User UserInfo userInfo, @ResourceName String 
bucket, String object, String endpoint, InputStream inputStream,String 
contentType, long fileSize, @Info String auditInfo) {
          log.info("Uploading file {} for user {} to bucket {}", object, 
userInfo.getName(), bucket);
          try {
              EndpointDTO endpointDTO = endpointService.get(endpoint);
@@@ -97,28 -104,9 +106,29 @@@
          log.info("Finished uploading file {} for user {} to bucket {}", 
object, userInfo.getName(), bucket);
      }
  
 +    @Override
 +    public void uploadFolder(UserInfo userInfo, String bucket, String folder, 
String endpoint) {
 +        log.info("Uploading folder {} for user {} to bucket {}", folder, 
userInfo.getName(), bucket);
 +        try {
 +            if (!folder.endsWith("/")) {
 +                throw new DlabException("Folder doesn't end with '/'");
 +            }
 +            EndpointDTO endpointDTO = endpointService.get(endpoint);
 +            FolderUploadDTO dto = new FolderUploadDTO(bucket, folder);
 +            Response response = 
provisioningService.post(String.format(BUCKET_UPLOAD_FOLDER, 
endpointDTO.getUrl()), userInfo.getAccessToken(), dto, Response.class);
 +            if (response.getStatus() != HttpStatus.SC_OK) {
 +                throw new DlabException(String.format("Something went wrong. 
Response status is %s ", response.getStatus()));
 +            }
 +        } catch (Exception e) {
 +            log.error("Cannot upload folder {} to bucket {} for user {}, 
endpoint {}. Reason {}", folder, bucket, userInfo.getName(), endpoint, 
e.getMessage());
 +            throw new DlabException(String.format("Cannot upload object %s to 
bucket %s for user %s, endpoint %s. Reason %s", folder, bucket, 
userInfo.getName(), endpoint, e.getMessage()));
 +        }
 +        log.info("Finished uploading folder {} for user {} to bucket {}", 
folder, userInfo.getName(), bucket);
 +    }
 +
+     @Audit(action = DOWNLOAD, type = BUCKET)
      @Override
-     public void downloadObject(UserInfo userInfo, String bucket, String 
object, String endpoint, HttpServletResponse resp) {
+     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);
          EndpointDTO endpointDTO = endpointService.get(endpoint);
          try (InputStream inputStream = 
provisioningService.getWithMediaTypes(String.format(BUCKET_DOWNLOAD_OBJECT, 
endpointDTO.getUrl(), bucket, encodeObject(object)), userInfo.getAccessToken(),
diff --cc 
services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ProjectServiceImpl.java
index 34f2424,282106a..2c6154e
--- 
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
@@@ -99,172 -116,212 +116,222 @@@ public class ProjectServiceImpl impleme
        }
  
        @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) {
 +              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());
 +      }
  
-       @Override
-       public void terminateEndpoint(UserInfo userInfo, String endpoint, 
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, @Project String name) {
 +              List<ProjectEndpointDTO> endpointDTOs = 
getProjectEndpointDTOS(endpoints, name);
 +              checkProjectRelatedResourcesInProgress(name, endpointDTOs, 
TERMINATE_ACTION);
 +              endpoints.forEach(endpoint -> terminateEndpoint(userInfo, 
endpoint, name));
 +      }
  
 -    @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);
 -    }
 +      @BudgetLimited
++      @Audit(action = START, type = EDGE_NODE)
 +      @Override
-       public void start(UserInfo userInfo, String endpoint, @Project String 
name) {
++      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, 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);
 -    }
++      @Audit(action = STOP, type = EDGE_NODE)
 +      @Override
-       public void stop(UserInfo userInfo, String endpoint, String name) {
++      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, @Project String projectName) {
++      public void stopWithResources(@User UserInfo userInfo, List<String> 
endpoints, @ResourceName @Project String projectName) {
 +              List<ProjectEndpointDTO> endpointDTOs = 
getProjectEndpointDTOS(endpoints, projectName);
 +              checkProjectRelatedResourcesInProgress(projectName, 
endpointDTOs, STOP_ACTION);
  
-               
exploratoryDAO.fetchRunningExploratoryFieldsForProject(projectName,
-                               endpointDTOs
-                                               .stream()
+         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()
                                                
.map(ProjectEndpointDTO::getName)
                                                .collect(Collectors.toList()))
-                               .forEach(e -> exploratoryService.stop(new 
UserInfo(e.getUser(), userInfo.getAccessToken()), projectName, 
e.getExploratoryName()));
- 
-               endpointDTOs.stream().filter(e -> 
!Arrays.asList(UserInstanceStatus.TERMINATED,
-                               UserInstanceStatus.TERMINATING, 
UserInstanceStatus.STOPPED, UserInstanceStatus.FAILED).contains(e.getStatus()))
-                               .forEach(e -> stop(userInfo, e.getName(), 
projectName));
+                               .forEach(e -> exploratoryService.stop(userInfo, 
e.getUser(), projectName, e.getExploratoryName(), null));
        }
  
        @ProjectAdmin
        @Override
        public void update(@User UserInfo userInfo, UpdateProjectDTO 
projectDTO, @Project String projectName) {
-               final ProjectDTO project = 
projectDAO.get(projectDTO.getName()).orElseThrow(projectNotFound());
-               final Set<String> endpoints = project.getEndpoints()
-                               .stream()
-                               .map(ProjectEndpointDTO::getName)
-                               .collect(toSet());
-               final HashSet<String> newEndpoints = new 
HashSet<>(projectDTO.getEndpoints());
-               newEndpoints.removeAll(endpoints);
-               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, 
project, e.getName()));
-       }
- 
-       @Override
-       public void updateBudget(List<ProjectDTO> projects) {
-               projects.forEach(p -> projectDAO.updateBudget(p.getName(), 
p.getBudget()));
-       }
+         final ProjectDTO project = 
projectDAO.get(projectDTO.getName()).orElseThrow(projectNotFound());
+         final Set<String> endpoints = project.getEndpoints()
+                 .stream()
+                 .map(ProjectEndpointDTO::getName)
+                 .collect(toSet());
+         final Set<String> newEndpoints = new 
HashSet<>(projectDTO.getEndpoints());
+         newEndpoints.removeAll(endpoints);
+         final String projectUpdateAudit = updateProjectAudit(projectDTO, 
project, newEndpoints);
+         updateProject(userInfo, projectName, projectDTO, project, 
newEndpoints, projectUpdateAudit);
+     }
+ 
+     @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()));
+     }
+ 
+     @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)));
+     }
+ 
+     @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,
-                                       endpoint.getName()));
-               } catch (Exception e) {
-                       log.error("Can not create project due to: {}", 
e.getMessage());
-                       projectDAO.updateStatus(projectDTO.getName(), 
ProjectDTO.Status.FAILED);
-               }
-       }
- 
-       private void createEndpoint(UserInfo user, ProjectDTO projectDTO, 
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 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, 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) {
 -              boolean edgeProgress = endpoints
 -                              .stream().anyMatch(e ->
 -                        Arrays.asList(UserInstanceStatus.CREATING, 
UserInstanceStatus.STARTING, UserInstanceStatus.STOPPING,
 -                                
UserInstanceStatus.TERMINATING).contains(e.getStatus()));
 +      private void checkProjectRelatedResourcesInProgress(String projectName, 
List<ProjectEndpointDTO> endpoints, String action) {
-               boolean edgeProgress = endpoints
++        boolean edgeProgress = endpoints
 +                              .stream()
 +                              .anyMatch(e ->
-                                               
Arrays.asList(UserInstanceStatus.CREATING, UserInstanceStatus.STARTING, 
UserInstanceStatus.STOPPING,
-                                                               
UserInstanceStatus.TERMINATING).contains(e.getStatus()));
++                Arrays.asList(UserInstanceStatus.CREATING, 
UserInstanceStatus.STARTING, UserInstanceStatus.STOPPING,
++                        
UserInstanceStatus.TERMINATING).contains(e.getStatus()));
  
 -        List<String> endpointsName = 
endpoints.stream().map(ProjectEndpointDTO::getName).collect(Collectors.toList());
 -        if (edgeProgress || 
!checkExploratoriesAndComputationalProgress(projectName, endpointsName)) {
 -            throw new ResourceConflictException((String.format("Can not %s 
environment because one of project " +
 -                    "resource is in processing stage", action)));
 -        }
 -    }
 +              List<String> endpointNames = endpoints
 +                              .stream()
 +                              .map(ProjectEndpointDTO::getName)
 +                              .collect(Collectors.toList());
 +              if (edgeProgress || 
!checkExploratoriesAndComputationalProgress(projectName, endpointNames)) {
 +                      throw new ResourceConflictException((String.format("Can 
not %s environment because one of project " +
 +                                      "resource is in processing stage", 
action)));
 +              }
 +      }
  
 -    private String updateProjectAudit(UpdateProjectDTO projectDTO, ProjectDTO 
project, Set<String> newEndpoints) {
 -        if (configuration.isAuditEnabled()) {
 -            return null;
 -        }
 -        StringBuilder audit = new StringBuilder();
 -        final Set<String> newGroups = new HashSet<>(projectDTO.getGroups());
 -        newGroups.removeAll(project.getGroups());
 -        final Set<String> removedGroups = new HashSet<>(project.getGroups());
 -        removedGroups.removeAll(projectDTO.getGroups());
 -
 -        if (!newEndpoints.isEmpty()) {
 -            audit.append(String.format(AUDIT_ADD_ENDPOINT, String.join(", ", 
newEndpoints)));
 -        }
 -        if (!newGroups.isEmpty()) {
 -            audit.append(String.format(AUDIT_ADD_GROUP, String.join(", ", 
newGroups)));
 -        }
 -        if (!removedGroups.isEmpty()) {
 -            audit.append(String.format(AUDIT_REMOVE_GROUP, String.join(", ", 
removedGroups)));
 -        }
 -        return audit.toString();
 -    }
++      private String updateProjectAudit(UpdateProjectDTO projectDTO, 
ProjectDTO project, Set<String> newEndpoints) {
++              if (configuration.isAuditEnabled()) {
++                      return null;
++              }
++              StringBuilder audit = new StringBuilder();
++              final Set<String> newGroups = new 
HashSet<>(projectDTO.getGroups());
++              newGroups.removeAll(project.getGroups());
++              final Set<String> removedGroups = new 
HashSet<>(project.getGroups());
++              removedGroups.removeAll(projectDTO.getGroups());
++
++              if (!newEndpoints.isEmpty()) {
++                      audit.append(String.format(AUDIT_ADD_ENDPOINT, 
String.join(", ", newEndpoints)));
++              }
++              if (!newGroups.isEmpty()) {
++                      audit.append(String.format(AUDIT_ADD_GROUP, 
String.join(", ", newGroups)));
++              }
++              if (!removedGroups.isEmpty()) {
++                      audit.append(String.format(AUDIT_REMOVE_GROUP, 
String.join(", ", removedGroups)));
++              }
++              return audit.toString();
++      }
+ 
 -    private String getUpdateBudgetAudit(ProjectDTO p) {
 -        return String.format(AUDIT_UPDATE_BUDGET, 
get(p.getName()).getBudget(), p.getBudget());
 -    }
++      private String getUpdateBudgetAudit(ProjectDTO p) {
++              return String.format(AUDIT_UPDATE_BUDGET, 
get(p.getName()).getBudget(), p.getBudget());
++      }
+ 
 -    private Supplier<ResourceNotFoundException> projectNotFound() {
 -        return () -> new ResourceNotFoundException("Project with passed name 
not found");
 -    }
 +      private List<ProjectEndpointDTO> getProjectEndpointDTOS(List<String> 
endpoints, @Project String name) {
 +              return get(name)
 +                              .getEndpoints()
 +                              .stream()
 +                              .filter(projectEndpointDTO -> 
endpoints.contains(projectEndpointDTO.getName()))
 +                              .collect(Collectors.toList());
 +      }
 +
 +      private Supplier<ResourceNotFoundException> projectNotFound() {
 +              return () -> new ResourceNotFoundException("Project with passed 
name not found");
 +      }
  }


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

Reply via email to