You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dlab.apache.org by of...@apache.org on 2020/03/29 19:58:17 UTC

[incubator-dlab] branch DLAB-1571 updated (435d3a1 -> d96075e)

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

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


    from 435d3a1  Remote billing
     add 5e03cd4  [DLAB-1647]: Action for notebook depend on edge node status. (#669)
     add 0e3d531  [DLAB-1648]: Conveyed all resources which will be terminated during edge deletion (#670)
     add bf0e539  [DLAB-1657]: added endpoint name to notebook image name
     add 0f5b520  [DLAB-1657]: formatted code
     add c5fb923  Merge pull request #671 from apache/DLAB-1657
     add 658dfef  [Dlab 1661]: Grouped Compute/Notebook shapes by clouds (#673)
     add 239eb05  [DLAB-1654]: Made modal windows static if user is not assigned to a project (#674)
     add b9dc738  [DLAB-1590] Admin per project
     add e7ab0d7  Merge branch 'DLAB-1590' of github.com:apache/incubator-dlab into DLAB-1590
     add 3befbd18 Deleted requests which was not used
     add 555a485  Admin per project
     add e4bcf7c  Admin per project
     add 8fed687  Admin per project
     add ca73d94  Admin per project
     add 9729f01  Admin per project
     add d753b18  [DLAB-1591]: Add parameters for admin per project
     add a6aa0d2  Merge remote-tracking branch 'origin/DLAB-1590' into DLAB-1590
     add bdaf53b  Admin per project refactoring
     add e266731  Admin per project refactoring
     new b190bca  Merge branch 'DLAB-1590' into DLAB-1571
     new d96075e  Admin per project

The 2 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.


Summary of changes:
 .../general/scripts/aws/common_prepare_notebook.py |   6 +-
 .../scripts/azure/common_prepare_notebook.py       |   6 +-
 .../dlab/backendapi/annotation/ProjectAdmin.java   |   7 +-
 .../com/epam/dlab/backendapi/annotation/User.java  |   7 +-
 .../java/com/epam/dlab/backendapi/dao/EnvDAO.java  |  19 --
 .../epam/dlab/backendapi/dao/ExploratoryDAO.java   |   4 +
 .../com/epam/dlab/backendapi/dao/ProjectDAO.java   |   2 -
 .../epam/dlab/backendapi/dao/ProjectDAOImpl.java   |  11 +-
 .../com/epam/dlab/backendapi/dao/UserGroupDao.java |   2 -
 .../epam/dlab/backendapi/dao/UserGroupDaoImpl.java |   5 -
 .../com/epam/dlab/backendapi/dao/UserRoleDao.java  |   4 +-
 .../epam/dlab/backendapi/dao/UserRoleDaoImpl.java  |  20 +-
 .../dlab/backendapi/domain/ProjectManagingDTO.java |  16 --
 .../interceptor/ProjectAdminInterceptor.java       |  74 ++++++++
 .../backendapi/modules/CloudProviderModule.java    |   5 +
 .../backendapi/resources/EnvironmentResource.java  |  20 +-
 .../resources/InfrastructureInfoResource.java      |   4 +-
 .../dlab/backendapi/resources/ProjectResource.java |  52 ++----
 .../backendapi/resources/UserGroupResource.java    |  67 ++-----
 .../backendapi/resources/UserRoleResource.java     |   8 +-
 .../resources/dto/HealthStatusPageDTO.java         | 129 +------------
 .../dlab/backendapi/resources/dto/UserRoleDto.java |   2 +
 .../com/epam/dlab/backendapi/roles/UserRole.java   |  13 +-
 .../com/epam/dlab/backendapi/roles/UserRoles.java  |  58 ++++--
 .../backendapi/service/EnvironmentService.java     |   8 +-
 .../backendapi/service/ExploratoryService.java     |   4 +
 .../service/InfrastructureInfoService.java         |   2 +-
 .../dlab/backendapi/service/ProjectService.java    |  13 +-
 .../dlab/backendapi/service/UserGroupService.java  |  12 +-
 .../dlab/backendapi/service/UserRoleService.java   |   3 +-
 .../backendapi/service/UserRoleServiceImpl.java    |  20 +-
 .../service/impl/BillingServiceImpl.java           |  64 ++++---
 .../service/impl/EnvironmentServiceImpl.java       |  81 ++++----
 .../service/impl/ExploratoryServiceImpl.java       |  10 +
 .../impl/InfrastructureInfoServiceImpl.java        |  22 ++-
 .../service/impl/ProjectServiceImpl.java           |  65 ++-----
 .../service/impl/UserGroupServiceImpl.java         |  86 +++++----
 .../src/main/resources/mongo/aws/mongo_roles.json  |  47 +++++
 .../main/resources/mongo/azure/mongo_roles.json    |  42 +++++
 .../src/main/resources/mongo/gcp/mongo_roles.json  |  46 +++++
 .../management/management.component.ts             |  73 ++++----
 .../administration/management/management.model.ts  |   1 +
 .../administration/project/project.component.html  |   5 +-
 .../administration/project/project.component.ts    |  37 +++-
 .../app/administration/roles/roles.component.ts    |   9 +-
 .../services/applicationServiceFacade.service.ts   |  16 --
 .../src/app/core/services/healthStatus.service.ts  |  11 +-
 .../src/app/core/services/project.service.ts       |  27 ---
 .../ami-create-dialog.component.html               |   4 +-
 .../resources-grid/resources-grid.component.html   |   6 +-
 .../resources-grid/resources-grid.component.ts     |  10 +-
 .../src/app/resources/resources.component.html     |   2 +-
 .../multi-level-select-dropdown.component.html     |  26 ++-
 .../multi-level-select-dropdown.component.scss     |   4 +-
 .../multi-level-select-dropdown.component.ts       |  39 +++-
 .../notification-dialog.component.ts               |  36 +++-
 .../src/app/shared/navbar/navbar.component.html    |   2 +-
 .../webapp/src/assets/styles/_dialogs.scss         |   1 +
 .../resources/EnvironmentResourceTest.java         |  97 +---------
 .../resources/InfrastructureInfoResourceTest.java  |  23 +--
 .../backendapi/resources/ProjectResourceTest.java  |  24 +--
 .../resources/UserGroupResourceTest.java           | 206 +++++----------------
 .../backendapi/resources/UserRoleResourceTest.java |  11 +-
 .../service/UserRoleServiceImplTest.java           |  42 ++---
 .../service/impl/EnvironmentServiceImplTest.java   |  71 -------
 .../service/impl/UserGroupServiceImplTest.java     | 156 +++++-----------
 66 files changed, 889 insertions(+), 1116 deletions(-)
 copy integration-tests/src/test/java/com/epam/dlab/automation/test/libs/TestDescription.java => services/self-service/src/main/java/com/epam/dlab/backendapi/annotation/ProjectAdmin.java (88%)
 copy integration-tests/src/test/java/com/epam/dlab/automation/test/libs/TestDescription.java => services/self-service/src/main/java/com/epam/dlab/backendapi/annotation/User.java (88%)
 delete mode 100644 services/self-service/src/main/java/com/epam/dlab/backendapi/domain/ProjectManagingDTO.java
 create mode 100644 services/self-service/src/main/java/com/epam/dlab/backendapi/interceptor/ProjectAdminInterceptor.java


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


[incubator-dlab] 01/02: Merge branch 'DLAB-1590' into DLAB-1571

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

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

commit b190bcaaa1de0b90c09720fdcfcb55df019ec047
Merge: 435d3a1 e266731
Author: Oleh Fuks <ol...@gmail.com>
AuthorDate: Sun Mar 29 16:30:15 2020 +0300

    Merge branch 'DLAB-1590' into DLAB-1571
    
    # Conflicts:
    #	services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/InfrastructureInfoServiceImpl.java
    #	services/self-service/src/main/resources/webapp/src/app/reporting/reporting.component.ts
    #	services/self-service/src/test/java/com/epam/dlab/backendapi/resources/InfrastructureInfoResourceTest.java

 .../general/scripts/aws/common_prepare_notebook.py |   6 +-
 .../scripts/azure/common_prepare_notebook.py       |   6 +-
 .../ProjectAdmin.java}                             |  20 ++-
 .../UserRoleService.java => annotation/User.java}  |  20 ++-
 .../java/com/epam/dlab/backendapi/dao/EnvDAO.java  |  19 ---
 .../com/epam/dlab/backendapi/dao/ProjectDAO.java   |   2 -
 .../epam/dlab/backendapi/dao/ProjectDAOImpl.java   |  11 +-
 .../com/epam/dlab/backendapi/dao/UserGroupDao.java |   2 -
 .../epam/dlab/backendapi/dao/UserGroupDaoImpl.java |   5 -
 .../com/epam/dlab/backendapi/dao/UserRoleDao.java  |   4 +-
 .../epam/dlab/backendapi/dao/UserRoleDaoImpl.java  |  20 +--
 .../dlab/backendapi/domain/ProjectManagingDTO.java |  16 ---
 .../interceptor/ProjectAdminInterceptor.java       |  74 ++++++++++
 .../backendapi/modules/CloudProviderModule.java    |   5 +
 .../backendapi/resources/EnvironmentResource.java  |  20 +--
 .../resources/InfrastructureInfoResource.java      |   4 +-
 .../dlab/backendapi/resources/ProjectResource.java |  52 +++----
 .../backendapi/resources/UserGroupResource.java    |  67 +++------
 .../backendapi/resources/UserRoleResource.java     |   8 +-
 .../resources/dto/HealthStatusPageDTO.java         | 129 +----------------
 .../dlab/backendapi/resources/dto/UserRoleDto.java |   2 +
 .../com/epam/dlab/backendapi/roles/UserRole.java   |  13 +-
 .../com/epam/dlab/backendapi/roles/UserRoles.java  |  58 ++++++--
 .../backendapi/service/EnvironmentService.java     |   8 +-
 .../service/InfrastructureInfoService.java         |   2 +-
 .../dlab/backendapi/service/ProjectService.java    |  13 +-
 .../dlab/backendapi/service/UserGroupService.java  |  12 +-
 .../dlab/backendapi/service/UserRoleService.java   |   3 +-
 .../backendapi/service/UserRoleServiceImpl.java    |  20 ++-
 .../service/impl/EnvironmentServiceImpl.java       |  81 +++++------
 .../impl/InfrastructureInfoServiceImpl.java        |  21 +--
 .../service/impl/ProjectServiceImpl.java           |  65 +++------
 .../service/impl/UserGroupServiceImpl.java         |  86 +++++++-----
 .../src/main/resources/mongo/aws/mongo_roles.json  |  47 +++++++
 .../main/resources/mongo/azure/mongo_roles.json    |  42 ++++++
 .../src/main/resources/mongo/gcp/mongo_roles.json  |  46 ++++++
 .../management/management.component.ts             |  73 +++++-----
 .../administration/management/management.model.ts  |   1 +
 .../administration/project/project.component.html  |   5 +-
 .../administration/project/project.component.ts    |  37 ++++-
 .../app/administration/roles/roles.component.ts    |   9 +-
 .../services/applicationServiceFacade.service.ts   |  16 ---
 .../src/app/core/services/healthStatus.service.ts  |  11 +-
 .../src/app/core/services/project.service.ts       |  27 ----
 .../ami-create-dialog.component.html               |   4 +-
 .../resources-grid/resources-grid.component.html   |   6 +-
 .../resources-grid/resources-grid.component.ts     |  10 +-
 .../src/app/resources/resources.component.html     |   2 +-
 .../multi-level-select-dropdown.component.html     |  26 +++-
 .../multi-level-select-dropdown.component.scss     |   4 +-
 .../multi-level-select-dropdown.component.ts       |  39 +++++-
 .../notification-dialog.component.ts               |  36 ++++-
 .../src/app/shared/navbar/navbar.component.html    |   2 +-
 .../webapp/src/assets/styles/_dialogs.scss         |   1 +
 .../resources/EnvironmentResourceTest.java         |  97 +------------
 .../resources/InfrastructureInfoResourceTest.java  |  23 +--
 .../backendapi/resources/ProjectResourceTest.java  |  24 +---
 .../resources/UserGroupResourceTest.java           | 155 +++++++--------------
 .../backendapi/resources/UserRoleResourceTest.java |  11 +-
 .../service/UserRoleServiceImplTest.java           |  42 ++----
 .../service/impl/EnvironmentServiceImplTest.java   |  71 ----------
 .../service/impl/UserGroupServiceImplTest.java     | 150 +++++++-------------
 62 files changed, 850 insertions(+), 1041 deletions(-)

diff --cc services/self-service/src/main/java/com/epam/dlab/backendapi/modules/CloudProviderModule.java
index f251b01,2884aa6..8b41baf
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/CloudProviderModule.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/CloudProviderModule.java
@@@ -21,8 -21,14 +21,10 @@@ package com.epam.dlab.backendapi.module
  
  import com.epam.dlab.backendapi.SelfServiceApplication;
  import com.epam.dlab.backendapi.annotation.BudgetLimited;
+ import com.epam.dlab.backendapi.annotation.ProjectAdmin;
  import com.epam.dlab.backendapi.conf.SelfServiceApplicationConfiguration;
 -import com.epam.dlab.backendapi.dao.BillingDAO;
 -import com.epam.dlab.backendapi.dao.aws.AwsBillingDAO;
 -import com.epam.dlab.backendapi.dao.azure.AzureBillingDAO;
 -import com.epam.dlab.backendapi.dao.gcp.GcpBillingDao;
  import com.epam.dlab.backendapi.interceptor.BudgetLimitInterceptor;
+ import com.epam.dlab.backendapi.interceptor.ProjectAdminInterceptor;
  import com.epam.dlab.backendapi.resources.BillingResource;
  import com.epam.dlab.backendapi.resources.aws.ComputationalResourceAws;
  import com.epam.dlab.backendapi.resources.azure.ComputationalResourceAzure;
diff --cc services/self-service/src/main/java/com/epam/dlab/backendapi/service/InfrastructureInfoService.java
index a385925,fc3bd9d..ffb3531
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/InfrastructureInfoService.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/InfrastructureInfoService.java
@@@ -27,9 -27,9 +27,9 @@@ import com.epam.dlab.dto.Infrastructure
  import java.util.List;
  
  public interface InfrastructureInfoService {
 -	List<ProjectInfrastructureInfo> getUserResources(String user);
 +	List<ProjectInfrastructureInfo> getUserResources(UserInfo user);
  
- 	HealthStatusPageDTO getHeathStatus(UserInfo user, boolean fullReport, boolean isAdmin);
+ 	HealthStatusPageDTO getHeathStatus(UserInfo user, boolean fullReport);
  
  	InfrastructureMetaInfoDTO getInfrastructureMetaInfo();
  }
diff --cc services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/InfrastructureInfoServiceImpl.java
index 3f86c29,cbb006b..16de358
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/InfrastructureInfoServiceImpl.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/InfrastructureInfoServiceImpl.java
@@@ -26,9 -26,10 +26,11 @@@ import com.epam.dlab.backendapi.dao.Env
  import com.epam.dlab.backendapi.dao.ExploratoryDAO;
  import com.epam.dlab.backendapi.domain.EndpointDTO;
  import com.epam.dlab.backendapi.domain.ProjectEndpointDTO;
+ import com.epam.dlab.backendapi.resources.dto.HealthStatusEnum;
  import com.epam.dlab.backendapi.resources.dto.HealthStatusPageDTO;
  import com.epam.dlab.backendapi.resources.dto.ProjectInfrastructureInfo;
 +import com.epam.dlab.backendapi.service.BillingService;
+ import com.epam.dlab.backendapi.roles.UserRoles;
  import com.epam.dlab.backendapi.service.EndpointService;
  import com.epam.dlab.backendapi.service.InfrastructureInfoService;
  import com.epam.dlab.backendapi.service.ProjectService;


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


[incubator-dlab] 02/02: Admin per project

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

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

commit d96075ee5d89cd918f606a0947f1bdfcefcfa23e
Author: Oleh Fuks <ol...@gmail.com>
AuthorDate: Sun Mar 29 22:57:49 2020 +0300

    Admin per project
---
 .../epam/dlab/backendapi/dao/ExploratoryDAO.java   |  4 ++
 .../backendapi/service/ExploratoryService.java     |  4 ++
 .../service/impl/BillingServiceImpl.java           | 64 +++++++++++++--------
 .../service/impl/ExploratoryServiceImpl.java       | 10 ++++
 .../impl/InfrastructureInfoServiceImpl.java        |  3 +-
 .../resources/UserGroupResourceTest.java           | 67 ----------------------
 .../service/impl/UserGroupServiceImplTest.java     | 10 ----
 7 files changed, 60 insertions(+), 102 deletions(-)

diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ExploratoryDAO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ExploratoryDAO.java
index cbe1c7f..b5ef6c2 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ExploratoryDAO.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ExploratoryDAO.java
@@ -140,6 +140,10 @@ public class ExploratoryDAO extends BaseDAO {
 		return getUserInstances(and(eq(PROJECT, project)), true);
 	}
 
+	public List<UserInstanceDTO> fetchExploratoryFieldsForProjectWithComp(List<String> projects) {
+		return getUserInstances(and(in(PROJECT, projects)), true);
+	}
+
 	public List<UserInstanceDTO> findExploratories(String project, String endpoint, String user) {
 		return getUserInstances(and(eq(PROJECT, project), eq(ENDPOINT, endpoint), eq(USER, user)), true);
 	}
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 f6bcb64..5a43fa6 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
@@ -21,6 +21,7 @@ package com.epam.dlab.backendapi.service;
 
 
 import com.epam.dlab.auth.UserInfo;
+import com.epam.dlab.backendapi.domain.ProjectDTO;
 import com.epam.dlab.backendapi.resources.dto.ExploratoryCreatePopUp;
 import com.epam.dlab.dto.UserInstanceDTO;
 import com.epam.dlab.dto.UserInstanceStatus;
@@ -29,6 +30,7 @@ import com.epam.dlab.model.exploratory.Exploratory;
 
 import java.util.List;
 import java.util.Optional;
+import java.util.Set;
 
 public interface ExploratoryService {
 
@@ -48,6 +50,8 @@ public interface ExploratoryService {
 
     List<UserInstanceDTO> findAll();
 
+    List<UserInstanceDTO> findAll(Set<ProjectDTO> projects);
+
     List<ClusterConfig> getClusterConfig(UserInfo user, String project, String exploratoryName);
 
     ExploratoryCreatePopUp getUserInstances(UserInfo user);
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/BillingServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/BillingServiceImpl.java
index c710a92..8e07202 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/BillingServiceImpl.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/BillingServiceImpl.java
@@ -56,9 +56,11 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Set;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
@@ -78,6 +80,7 @@ public class BillingServiceImpl implements BillingService {
     private final ExploratoryService exploratoryService;
     private final SelfServiceApplicationConfiguration configuration;
     private final RESTService provisioningService;
+    private final String sbn;
 
     @Inject
     public BillingServiceImpl(ProjectService projectService, EndpointService endpointService,
@@ -88,6 +91,7 @@ public class BillingServiceImpl implements BillingService {
         this.exploratoryService = exploratoryService;
         this.configuration = configuration;
         this.provisioningService = provisioningService;
+        sbn = configuration.getServiceBaseName();
     }
 
     @Override
@@ -98,7 +102,7 @@ public class BillingServiceImpl implements BillingService {
         double sum = billingReportLines.stream().mapToDouble(BillingReportLine::getCost).sum();
         String currency = billingReportLines.stream().map(BillingReportLine::getCurrency).distinct().count() == 1 ? billingReportLines.get(0).getCurrency() : null;
         return BillingReport.builder()
-                .sbn(configuration.getServiceBaseName())
+                .sbn(sbn)
                 .reportLines(billingReportLines)
                 .usageDateFrom(min)
                 .usageDateTo(max)
@@ -126,36 +130,52 @@ public class BillingServiceImpl implements BillingService {
     @Override
     public List<BillingReportLine> getBillingReportLines(UserInfo user, BillingFilter filter) {
         setUserFilter(user, filter);
-        final String serviceBaseName = configuration.getServiceBaseName();
-        final Stream<BillingReportLine> ssnBillingDataStream = BillingUtils.ssnBillingDataStream(serviceBaseName);
-        final Stream<BillingReportLine> billableUserInstances = exploratoryService.findAll()
+        Set<ProjectDTO> projects = new HashSet<>(projectService.getProjects(user));
+        projects.addAll(projectService.getUserProjects(user, false));
+
+        final Map<String, BillingReportLine> billableResources = getBillableResources(user, projects);
+
+        List<BillingReportLine> billingReport = getRemoteBillingData(user)
                 .stream()
-                .filter(userInstance -> Objects.nonNull(userInstance.getExploratoryId()))
-                .flatMap(ui -> BillingUtils.exploratoryBillingDataStream(ui, configuration.getMaxSparkInstanceCount()));
-        final Stream<BillingReportLine> billableEdges = projectService.getProjects()
+                .filter(getBillingDataFilter(filter))
+                .filter(bd -> billableResources.containsKey(bd.getTag()))
+                .map(bd -> toBillingData(bd, billableResources.get(bd.getTag())))
+                .filter(getBillingReportFilter(filter))
+                .collect(Collectors.toList());
+        log.debug("Billing report: {}", billingReport);
+
+        return billingReport;
+    }
+
+    private Map<String, BillingReportLine> getBillableResources(UserInfo user, Set<ProjectDTO> projects) {
+        Stream<BillingReportLine> billableAdminResources = Stream.empty();
+        final Stream<BillingReportLine> billableEdges = projects
                 .stream()
                 .collect(Collectors.toMap(ProjectDTO::getName, ProjectDTO::getEndpoints))
                 .entrySet()
                 .stream()
-                .flatMap(e -> projectEdges(serviceBaseName, e.getKey(), e.getValue()));
-        final Stream<BillingReportLine> billableSharedEndpoints = endpointService.getEndpoints()
+                .flatMap(e -> projectEdges(sbn, e.getKey(), e.getValue()));
+        final Stream<BillingReportLine> billableUserInstances = exploratoryService.findAll(projects)
                 .stream()
-                .flatMap(endpoint -> BillingUtils.sharedEndpointBillingDataStream(endpoint.getName(), serviceBaseName));
+                .filter(userInstance -> Objects.nonNull(userInstance.getExploratoryId()))
+                .flatMap(ui -> BillingUtils.exploratoryBillingDataStream(ui, configuration.getMaxSparkInstanceCount()));
 
-        final Map<String, BillingReportLine> billableResources = Stream.of(billableUserInstances, billableEdges, ssnBillingDataStream, billableSharedEndpoints)
+        if (UserRoles.isAdmin(user)) {
+            final Stream<BillingReportLine> ssnBillingDataStream = BillingUtils.ssnBillingDataStream(sbn);
+            final Stream<BillingReportLine> billableSharedEndpoints = endpointService.getEndpoints()
+                    .stream()
+                    .flatMap(endpoint -> BillingUtils.sharedEndpointBillingDataStream(endpoint.getName(), sbn));
+
+            billableAdminResources = Stream.of(ssnBillingDataStream, billableSharedEndpoints)
+                    .flatMap(s -> s);
+        }
+
+        final Map<String, BillingReportLine> billableResources = Stream.of(billableEdges, billableUserInstances, billableAdminResources)
                 .flatMap(s -> s)
                 .collect(Collectors.toMap(BillingReportLine::getDlabId, b -> b));
         log.debug("Billable resources are: {}", billableResources);
 
-        List<BillingReportLine> billingReport = getRemoteBillingData(user)
-                .stream()
-                .filter(getBillingDataFilter(filter))
-                .map(bd -> toBillingData(bd, getOrDefault(billableResources, bd.getTag())))
-                .filter(getBillingReportFilter(filter))
-                .collect(Collectors.toList());
-        log.debug("Billing report: {}", billingReport);
-
-        return billingReport;
+        return billableResources;
     }
 
     private Stream<BillingReportLine> projectEdges(String serviceBaseName, String projectName, List<ProjectEndpointDTO> endpoints) {
@@ -165,10 +185,6 @@ public class BillingServiceImpl implements BillingService {
                         endpoint.getStatus().toString()));
     }
 
-    private BillingReportLine getOrDefault(Map<String, BillingReportLine> billableResources, String tag) {
-        return billableResources.getOrDefault(tag, BillingReportLine.builder().dlabId(tag).build());
-    }
-
     public List<BillingData> getExploratoryRemoteBillingData(UserInfo user, String endpoint, List<UserInstanceDTO> userInstanceDTOS) {
         List<String> dlabIds = null;
         try {
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 ffa3a6b..6a2a615 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
@@ -61,6 +61,7 @@ import org.apache.commons.lang3.StringUtils;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 import static com.epam.dlab.dto.UserInstanceStatus.CREATING;
@@ -199,6 +200,15 @@ public class ExploratoryServiceImpl implements ExploratoryService {
 	}
 
 	@Override
+	public List<UserInstanceDTO> findAll(Set<ProjectDTO> projects) {
+		List<String> projectNames = projects
+				.stream()
+				.map(ProjectDTO::getName)
+				.collect(Collectors.toList());
+		return exploratoryDAO.fetchExploratoryFieldsForProjectWithComp(projectNames);
+	}
+
+	@Override
 	public List<ClusterConfig> getClusterConfig(UserInfo user, String project, String exploratoryName) {
 		return exploratoryDAO.getClusterConfig(user.getName(), project, exploratoryName);
 	}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/InfrastructureInfoServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/InfrastructureInfoServiceImpl.java
index 16de358..6d46d71 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/InfrastructureInfoServiceImpl.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/InfrastructureInfoServiceImpl.java
@@ -29,8 +29,8 @@ import com.epam.dlab.backendapi.domain.ProjectEndpointDTO;
 import com.epam.dlab.backendapi.resources.dto.HealthStatusEnum;
 import com.epam.dlab.backendapi.resources.dto.HealthStatusPageDTO;
 import com.epam.dlab.backendapi.resources.dto.ProjectInfrastructureInfo;
-import com.epam.dlab.backendapi.service.BillingService;
 import com.epam.dlab.backendapi.roles.UserRoles;
+import com.epam.dlab.backendapi.service.BillingService;
 import com.epam.dlab.backendapi.service.EndpointService;
 import com.epam.dlab.backendapi.service.InfrastructureInfoService;
 import com.epam.dlab.backendapi.service.ProjectService;
@@ -48,6 +48,7 @@ import org.bson.Document;
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/UserGroupResourceTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/UserGroupResourceTest.java
index ec2f73e..713eda9 100644
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/UserGroupResourceTest.java
+++ b/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/UserGroupResourceTest.java
@@ -21,15 +21,11 @@ package com.epam.dlab.backendapi.resources;
 
 import com.epam.dlab.auth.UserInfo;
 import com.epam.dlab.backendapi.dao.ProjectDAO;
-import com.epam.dlab.backendapi.domain.ProjectDTO;
 import com.epam.dlab.backendapi.resources.dto.GroupDTO;
-import com.epam.dlab.backendapi.resources.dto.UpdateRoleGroupDto;
-import com.epam.dlab.backendapi.resources.dto.UpdateUserGroupDto;
 import com.epam.dlab.backendapi.resources.dto.UserGroupDto;
 import com.epam.dlab.backendapi.service.UserGroupService;
 import io.dropwizard.auth.AuthenticationException;
 import io.dropwizard.testing.junit.ResourceTestRule;
-import org.apache.commons.lang3.StringUtils;
 import org.apache.http.HttpStatus;
 import org.junit.Before;
 import org.junit.Rule;
@@ -41,11 +37,9 @@ import javax.ws.rs.core.HttpHeaders;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import java.util.Collections;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
-import static java.util.Collections.singleton;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.any;
@@ -153,20 +147,6 @@ public class UserGroupResourceTest extends TestBase {
     }
 
 	@Test
-	public void addRolesToGroupWithValidationException() {
-
-		final Response response = resources.getJerseyTest()
-				.target("/group/role")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.put(Entity.json(new UpdateRoleGroupDto(singleton(ROLE_ID), StringUtils.EMPTY)));
-
-		assertEquals(HttpStatus.SC_UNPROCESSABLE_ENTITY, response.getStatus());
-
-		verifyZeroInteractions(userGroupService);
-	}
-
-	@Test
 	public void deleteGroup() {
 		final Response response = resources.getJerseyTest()
 				.target("/group/" + GROUP)
@@ -181,47 +161,6 @@ public class UserGroupResourceTest extends TestBase {
 		verifyNoMoreInteractions(userGroupService);
 	}
 
-	@Test
-	public void deleteGroupFromRoleWithValidationException() {
-		final Response response = resources.getJerseyTest()
-				.target("/group/role")
-				.queryParam("group", GROUP)
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.delete();
-
-		assertEquals(HttpStatus.SC_BAD_REQUEST, response.getStatus());
-
-		verifyZeroInteractions(userGroupService);
-	}
-
-	@Test
-	public void addUserToGroupWithValidationException() {
-		final Response response = resources.getJerseyTest()
-				.target("/group/user")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.put(Entity.json(new UpdateUserGroupDto(StringUtils.EMPTY, singleton(USER))));
-
-		assertEquals(HttpStatus.SC_UNPROCESSABLE_ENTITY, response.getStatus());
-
-		verifyZeroInteractions(userGroupService);
-	}
-
-	@Test
-	public void deleteUserFromGroupWithValidationException() {
-		final Response response = resources.getJerseyTest()
-				.target("/group/user")
-				.queryParam("group", GROUP)
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.delete();
-
-		assertEquals(HttpStatus.SC_BAD_REQUEST, response.getStatus());
-
-		verifyZeroInteractions(userGroupService);
-	}
-
 	private UserGroupDto getUserGroup() {
 		return new UserGroupDto(GROUP, Collections.emptyList(), Collections.emptySet());
     }
@@ -233,10 +172,4 @@ public class UserGroupResourceTest extends TestBase {
         dto.setUsers(Collections.singleton(USER));
         return dto;
     }
-
-    private List<ProjectDTO> getProjects() {
-        return Collections.singletonList(ProjectDTO.builder()
-                .groups(new HashSet<>(Collections.singletonList(GROUP)))
-                .build());
-    }
 }
\ No newline at end of file
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/UserGroupServiceImplTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/UserGroupServiceImplTest.java
index e6b0572..4fec7c6 100644
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/UserGroupServiceImplTest.java
+++ b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/UserGroupServiceImplTest.java
@@ -170,16 +170,6 @@ public class UserGroupServiceImplTest extends TestBase {
 		userGroupService.removeGroup(GROUP);
 	}
 
-	@Test
-	public void updateGroup() {
-		userGroupService.updateGroup(getUserInfo(), GROUP, Collections.singleton(ROLE_ID), Collections.singleton(USER));
-
-		verify(userGroupDao).updateUsers(GROUP, Collections.singleton(USER));
-		verify(userRoleDao).removeGroupWhenRoleNotIn(GROUP, Collections.singleton(ROLE_ID));
-		verify(userRoleDao).addGroupToRole(Collections.singleton(GROUP), Collections.singleton(ROLE_ID));
-		verifyNoMoreInteractions(userRoleDao, userGroupDao);
-	}
-
     private UserGroupDto getUserGroup() {
         return new UserGroupDto(GROUP, Collections.emptyList(), Collections.emptySet());
     }


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