This is an automated email from the ASF dual-hosted git repository. bhliva pushed a commit to branch feature/projects in repository https://gitbox.apache.org/repos/asf/incubator-dlab.git
The following commit(s) were added to refs/heads/feature/projects by this push: new 9af7f10 DLAB-746 added API for checking whether used is assigned to project 9af7f10 is described below commit 9af7f103627317bb26530d4b289f5a9769d74086 Author: bhliva <bohdan_hl...@epam.com> AuthorDate: Wed Jun 5 14:53:57 2019 +0300 DLAB-746 added API for checking whether used is assigned to project --- .../java/com/epam/dlab/backendapi/dao/ProjectDAO.java | 2 +- .../com/epam/dlab/backendapi/dao/ProjectDAOImpl.java | 5 +++-- .../com/epam/dlab/backendapi/dao/UserGroupDao.java | 2 ++ .../epam/dlab/backendapi/dao/UserGroupDaoImpl.java | 9 +++++++++ .../resources/InfrastructureInfoResource.java | 2 +- .../backendapi/resources/dto/HealthStatusPageDTO.java | 11 +++++++++++ .../backendapi/service/InfrastructureInfoService.java | 3 ++- .../epam/dlab/backendapi/service/ProjectService.java | 3 +++ .../service/impl/InfrastructureInfoServiceBase.java | 9 ++++++++- .../backendapi/service/impl/ProjectServiceImpl.java | 19 ++++++++++++++++++- .../resources/InfrastructureInfoResourceTest.java | 17 +++++++++-------- .../impl/InfrastructureInfoServiceBaseTest.java | 9 +++++++-- 12 files changed, 74 insertions(+), 17 deletions(-) diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ProjectDAO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ProjectDAO.java index f7d4ce2..9939bc5 100644 --- a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ProjectDAO.java +++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ProjectDAO.java @@ -21,5 +21,5 @@ public interface ProjectDAO { void updateBudget(String project, Integer budget); - boolean anyProjectAssigned(Set<String> groups); + boolean isAnyProjectAssigned(Set<String> groups); } diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ProjectDAOImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ProjectDAOImpl.java index 3d2bc02..3fd5e6b 100644 --- a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ProjectDAOImpl.java +++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ProjectDAOImpl.java @@ -1,6 +1,7 @@ package com.epam.dlab.backendapi.dao; import com.epam.dlab.backendapi.domain.ProjectDTO; +import com.google.common.collect.Iterables; import org.bson.Document; import org.bson.conversions.Bson; @@ -53,8 +54,8 @@ public class ProjectDAOImpl extends BaseDAO implements ProjectDAO { } @Override - public boolean anyProjectAssigned(Set<String> groups) { - return false; + public boolean isAnyProjectAssigned(Set<String> groups) { + return !Iterables.isEmpty(find(PROJECTS_COLLECTION, in(GROUPS, groups))); } private Bson projectCondition(String name) { diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/UserGroupDao.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/UserGroupDao.java index d8fb8ec..0a4dde5 100644 --- a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/UserGroupDao.java +++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/UserGroupDao.java @@ -29,4 +29,6 @@ public interface UserGroupDao { void removeGroup(String groupId); + Set<String> getUserGroups(String user); + } diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/UserGroupDaoImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/UserGroupDaoImpl.java index a8e5a15..350f6a2 100644 --- a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/UserGroupDaoImpl.java +++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/UserGroupDaoImpl.java @@ -22,9 +22,11 @@ import com.google.inject.Singleton; import org.bson.Document; import java.util.Set; +import java.util.stream.Collectors; import static com.epam.dlab.backendapi.dao.MongoCollections.USER_GROUPS; import static com.mongodb.client.model.Filters.eq; +import static com.mongodb.client.model.Filters.in; @Singleton public class UserGroupDaoImpl extends BaseDAO implements UserGroupDao { @@ -50,4 +52,11 @@ public class UserGroupDaoImpl extends BaseDAO implements UserGroupDao { public void removeGroup(String groupId) { deleteOne(USER_GROUPS, eq(ID, groupId)); } + + @Override + public Set<String> getUserGroups(String user) { + return stream(find(USER_GROUPS, in(USERS_FIELD, user))) + .map(document -> document.getString(ID)) + .collect(Collectors.toSet()); + } } diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/InfrastructureInfoResource.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/InfrastructureInfoResource.java index 6b44c33..daec244 100644 --- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/InfrastructureInfoResource.java +++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/InfrastructureInfoResource.java @@ -73,7 +73,7 @@ public class InfrastructureInfoResource { @ApiParam(value = "Full version of report required", defaultValue = "0") @QueryParam("full") @DefaultValue("0") int fullReport) { return infrastructureInfoService - .getHeathStatus(userInfo.getName(), fullReport != 0, UserRoles.isAdmin(userInfo)); + .getHeathStatus(userInfo, fullReport != 0, UserRoles.isAdmin(userInfo)); } /** diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/HealthStatusPageDTO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/HealthStatusPageDTO.java index cdef1bb..b7f9362 100644 --- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/HealthStatusPageDTO.java +++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/HealthStatusPageDTO.java @@ -40,6 +40,8 @@ public class HealthStatusPageDTO { private int billingQuoteUsed; @JsonProperty private int billingUserQuoteUsed; + @JsonProperty + private boolean projectAssigned; /** * Return the status of environment. @@ -83,6 +85,11 @@ public class HealthStatusPageDTO { return this; } + public HealthStatusPageDTO withProjectAssinged(boolean isProjectAssigned) { + this.projectAssigned = isProjectAssigned; + return this; + } + /** * Return the list of resources. */ @@ -146,6 +153,10 @@ public class HealthStatusPageDTO { return admin; } + public boolean isProjectAssigned() { + return projectAssigned; + } + public int getBillingQuoteUsed() { return billingQuoteUsed; } diff --git 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 index b54edb9..64e45be 100644 --- 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 @@ -19,6 +19,7 @@ package com.epam.dlab.backendapi.service; +import com.epam.dlab.auth.UserInfo; import com.epam.dlab.backendapi.resources.dto.HealthStatusPageDTO; import com.epam.dlab.backendapi.resources.dto.InfrastructureInfo; import com.epam.dlab.dto.InfrastructureMetaInfoDTO; @@ -26,7 +27,7 @@ import com.epam.dlab.dto.InfrastructureMetaInfoDTO; public interface InfrastructureInfoService { InfrastructureInfo getUserResources(String user); - HealthStatusPageDTO getHeathStatus(String user, boolean fullReport, boolean isAdmin); + HealthStatusPageDTO getHeathStatus(UserInfo user, boolean fullReport, boolean isAdmin); InfrastructureMetaInfoDTO getInfrastructureMetaInfo(); } diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/ProjectService.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/ProjectService.java index 2e221e1..bde43b2 100644 --- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/ProjectService.java +++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/ProjectService.java @@ -1,5 +1,6 @@ package com.epam.dlab.backendapi.service; +import com.epam.dlab.auth.UserInfo; import com.epam.dlab.backendapi.domain.ProjectDTO; import java.util.List; @@ -16,4 +17,6 @@ public interface ProjectService { void update(ProjectDTO projectDTO); void updateBudget(String project, Integer budget); + + boolean isAnyProjectAssigned(UserInfo userInfo); } diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/InfrastructureInfoServiceBase.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/InfrastructureInfoServiceBase.java index a5d1465..919a5fc 100644 --- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/InfrastructureInfoServiceBase.java +++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/InfrastructureInfoServiceBase.java @@ -19,6 +19,7 @@ package com.epam.dlab.backendapi.service.impl; +import com.epam.dlab.auth.UserInfo; import com.epam.dlab.backendapi.SelfServiceApplicationConfiguration; import com.epam.dlab.backendapi.dao.BillingDAO; import com.epam.dlab.backendapi.dao.EnvDAO; @@ -27,6 +28,7 @@ import com.epam.dlab.backendapi.dao.KeyDAO; import com.epam.dlab.backendapi.resources.dto.HealthStatusPageDTO; import com.epam.dlab.backendapi.resources.dto.InfrastructureInfo; import com.epam.dlab.backendapi.service.InfrastructureInfoService; +import com.epam.dlab.backendapi.service.ProjectService; import com.epam.dlab.dto.InfrastructureMetaInfoDTO; import com.epam.dlab.dto.base.edge.EdgeInfo; import com.epam.dlab.exceptions.DlabException; @@ -52,6 +54,8 @@ public abstract class InfrastructureInfoServiceBase<T> implements Infrastructure private SelfServiceApplicationConfiguration configuration; @Inject private BillingDAO billingDAO; + @Inject + private ProjectService projectService; @SuppressWarnings("unchecked") @@ -73,12 +77,15 @@ public abstract class InfrastructureInfoServiceBase<T> implements Infrastructure } @Override - public HealthStatusPageDTO getHeathStatus(String user, boolean fullReport, boolean isAdmin) { + public HealthStatusPageDTO getHeathStatus(UserInfo userInfo, boolean fullReport, boolean isAdmin) { + final String user = userInfo.getName(); log.debug("Request the status of resources for user {}, report type {}", user, fullReport); try { + return envDAO.getHealthStatusPageDTO(user, fullReport) .withBillingEnabled(configuration.isBillingSchedulerEnabled()) .withAdmin(isAdmin) + .withProjectAssinged(projectService.isAnyProjectAssigned(userInfo)) .withBillingQuoteUsed(billingDAO.getBillingQuoteUsed()) .withBillingUserQuoteUsed(billingDAO.getBillingUserQuoteUsed(user)); } catch (Exception e) { 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 bceb5b9..d118844 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 @@ -1,6 +1,8 @@ package com.epam.dlab.backendapi.service.impl; +import com.epam.dlab.auth.UserInfo; import com.epam.dlab.backendapi.dao.ProjectDAO; +import com.epam.dlab.backendapi.dao.UserGroupDao; import com.epam.dlab.backendapi.domain.ProjectDTO; import com.epam.dlab.backendapi.service.EnvironmentService; import com.epam.dlab.backendapi.service.ProjectService; @@ -9,17 +11,24 @@ import com.epam.dlab.exceptions.ResourceNotFoundException; import com.google.inject.Inject; import java.util.List; +import java.util.Set; import java.util.function.Supplier; +import static java.util.stream.Collectors.toSet; +import static java.util.stream.Stream.concat; + public class ProjectServiceImpl implements ProjectService { private final ProjectDAO projectDAO; private final EnvironmentService environmentService; + private final UserGroupDao userGroupDao; @Inject - public ProjectServiceImpl(ProjectDAO projectDAO, EnvironmentService environmentService) { + public ProjectServiceImpl(ProjectDAO projectDAO, EnvironmentService environmentService, + UserGroupDao userGroupDao) { this.projectDAO = projectDAO; this.environmentService = environmentService; + this.userGroupDao = userGroupDao; } @Override @@ -60,6 +69,14 @@ public class ProjectServiceImpl implements ProjectService { projectDAO.updateBudget(project, 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); + } + private Supplier<ResourceNotFoundException> projectNotFound() { return () -> new ResourceNotFoundException("Project with passed name not found"); } diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/InfrastructureInfoResourceTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/InfrastructureInfoResourceTest.java index 30c69ff..e2ab690 100644 --- a/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/InfrastructureInfoResourceTest.java +++ b/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/InfrastructureInfoResourceTest.java @@ -19,6 +19,7 @@ package com.epam.dlab.backendapi.resources; +import com.epam.dlab.auth.UserInfo; import com.epam.dlab.backendapi.resources.dto.HealthStatusPageDTO; import com.epam.dlab.backendapi.resources.dto.InfrastructureInfo; import com.epam.dlab.backendapi.service.InfrastructureInfoService; @@ -85,7 +86,7 @@ public class InfrastructureInfoResourceTest extends TestBase { @Test public void healthStatus() { HealthStatusPageDTO hspDto = getHealthStatusPageDTO(); - when(infrastructureInfoService.getHeathStatus(anyString(), anyBoolean(), anyBoolean())).thenReturn(hspDto); + when(infrastructureInfoService.getHeathStatus(any(UserInfo.class), anyBoolean(), anyBoolean())).thenReturn(hspDto); final Response response = resources.getJerseyTest() .target("/infrastructure/status") .queryParam("full", "1") @@ -97,7 +98,7 @@ public class InfrastructureInfoResourceTest extends TestBase { assertEquals(hspDto.getStatus(), response.readEntity(HealthStatusPageDTO.class).getStatus()); assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE)); - verify(infrastructureInfoService).getHeathStatus(eq(USER.toLowerCase()), eq(true), anyBoolean()); + verify(infrastructureInfoService).getHeathStatus(refEq(getUserInfo()), eq(true), anyBoolean()); verifyNoMoreInteractions(infrastructureInfoService); } @@ -105,7 +106,7 @@ public class InfrastructureInfoResourceTest extends TestBase { public void healthStatusWithFailedAuth() throws AuthenticationException { authFailSetup(); HealthStatusPageDTO hspDto = getHealthStatusPageDTO(); - when(infrastructureInfoService.getHeathStatus(anyString(), anyBoolean(), anyBoolean())).thenReturn(hspDto); + when(infrastructureInfoService.getHeathStatus(any(UserInfo.class), anyBoolean(), anyBoolean())).thenReturn(hspDto); final Response response = resources.getJerseyTest() .target("/infrastructure/status") .queryParam("full", "1") @@ -117,14 +118,14 @@ public class InfrastructureInfoResourceTest extends TestBase { assertEquals(hspDto.getStatus(), response.readEntity(HealthStatusPageDTO.class).getStatus()); assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE)); - verify(infrastructureInfoService).getHeathStatus(eq(USER.toLowerCase()), eq(true), anyBoolean()); + verify(infrastructureInfoService).getHeathStatus(refEq(getUserInfo()), eq(true), anyBoolean()); verifyNoMoreInteractions(infrastructureInfoService); } @Test public void healthStatusWithDefaultQueryParam() { HealthStatusPageDTO hspDto = getHealthStatusPageDTO(); - when(infrastructureInfoService.getHeathStatus(anyString(), anyBoolean(), anyBoolean())).thenReturn(hspDto); + when(infrastructureInfoService.getHeathStatus(any(UserInfo.class), anyBoolean(), anyBoolean())).thenReturn(hspDto); final Response response = resources.getJerseyTest() .target("/infrastructure/status") .request() @@ -135,14 +136,14 @@ public class InfrastructureInfoResourceTest extends TestBase { assertEquals(hspDto.getStatus(), response.readEntity(HealthStatusPageDTO.class).getStatus()); assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE)); - verify(infrastructureInfoService).getHeathStatus(eq(USER.toLowerCase()), eq(false), anyBoolean()); + verify(infrastructureInfoService).getHeathStatus(refEq(getUserInfo()), eq(false), anyBoolean()); verifyNoMoreInteractions(infrastructureInfoService); } @Test public void healthStatusWithException() { doThrow(new DlabException("Could not return status of resources for user")) - .when(infrastructureInfoService).getHeathStatus(anyString(), anyBoolean(), anyBoolean()); + .when(infrastructureInfoService).getHeathStatus(any(UserInfo.class), anyBoolean(), anyBoolean()); final Response response = resources.getJerseyTest() .target("/infrastructure/status") .request() @@ -152,7 +153,7 @@ public class InfrastructureInfoResourceTest extends TestBase { assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus()); assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE)); - verify(infrastructureInfoService).getHeathStatus(eq(USER.toLowerCase()), eq(false), anyBoolean()); + verify(infrastructureInfoService).getHeathStatus(refEq(getUserInfo()), eq(false), anyBoolean()); verifyNoMoreInteractions(infrastructureInfoService); } diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/InfrastructureInfoServiceBaseTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/InfrastructureInfoServiceBaseTest.java index aad8094..2c7d127 100644 --- a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/InfrastructureInfoServiceBaseTest.java +++ b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/InfrastructureInfoServiceBaseTest.java @@ -19,6 +19,7 @@ package com.epam.dlab.backendapi.service.impl; +import com.epam.dlab.auth.UserInfo; import com.epam.dlab.backendapi.SelfServiceApplicationConfiguration; import com.epam.dlab.backendapi.dao.BillingDAO; import com.epam.dlab.backendapi.dao.EnvDAO; @@ -27,6 +28,7 @@ import com.epam.dlab.backendapi.dao.KeyDAO; import com.epam.dlab.backendapi.resources.dto.HealthStatusEnum; import com.epam.dlab.backendapi.resources.dto.HealthStatusPageDTO; import com.epam.dlab.backendapi.resources.dto.InfrastructureInfo; +import com.epam.dlab.backendapi.service.ProjectService; import com.epam.dlab.dto.base.edge.EdgeInfo; import com.epam.dlab.exceptions.DlabException; import org.bson.Document; @@ -57,6 +59,8 @@ public class InfrastructureInfoServiceBaseTest { private SelfServiceApplicationConfiguration configuration; @Mock private BillingDAO billingDAO; + @Mock + private ProjectService projectService; @InjectMocks private InfrastructureInfoServiceBase infrastructureInfoServiceBase = spy(InfrastructureInfoServiceBase.class); @@ -109,11 +113,12 @@ public class InfrastructureInfoServiceBaseTest { when(billingDAO.getBillingQuoteUsed()).thenReturn(10); HealthStatusPageDTO actualHealthStatusPageDTO = - infrastructureInfoServiceBase.getHeathStatus(USER, false, true); + infrastructureInfoServiceBase.getHeathStatus(new UserInfo(USER, "token"), false, true); assertNotNull(actualHealthStatusPageDTO); assertEquals(HealthStatusEnum.OK.toString(), actualHealthStatusPageDTO.getStatus()); assertFalse(actualHealthStatusPageDTO.isBillingEnabled()); assertTrue(actualHealthStatusPageDTO.isAdmin()); + assertFalse(actualHealthStatusPageDTO.isProjectAssigned()); assertEquals(10, actualHealthStatusPageDTO.getBillingQuoteUsed()); verify(envDAO).getHealthStatusPageDTO(USER, false); @@ -126,7 +131,7 @@ public class InfrastructureInfoServiceBaseTest { doThrow(new DlabException("Cannot fetch health status!")) .when(envDAO).getHealthStatusPageDTO(anyString(), anyBoolean()); try { - infrastructureInfoServiceBase.getHeathStatus(USER, false, false); + infrastructureInfoServiceBase.getHeathStatus(new UserInfo(USER, null), false, false); } catch (DlabException e) { assertEquals("Cannot fetch health status!", e.getMessage()); } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@dlab.apache.org For additional commands, e-mail: commits-h...@dlab.apache.org