This is an automated email from the ASF dual-hosted git repository. ofuks pushed a commit to branch DLAB-1590 in repository https://gitbox.apache.org/repos/asf/incubator-dlab.git
commit b9dc738fdfe689a41d7b381c0d22251924f093c4 Author: Oleh Fuks <olegfuk...@gmail.com> AuthorDate: Tue Mar 24 18:58:57 2020 +0200 [DLAB-1590] Admin per project --- .../ProjectAdmin.java} | 21 ++-- .../User.java} | 21 ++-- .../java/com/epam/dlab/backendapi/dao/EnvDAO.java | 19 --- .../com/epam/dlab/backendapi/dao/ProjectDAO.java | 2 - .../epam/dlab/backendapi/dao/ProjectDAOImpl.java | 11 +- .../dlab/backendapi/domain/ProjectManagingDTO.java | 16 --- .../interceptor/ProjectAdminInterceptor.java | 74 ++++++++++++ .../backendapi/modules/AwsSelfServiceModule.java | 83 ------------- .../backendapi/modules/AzureSelfServiceModule.java | 81 ------------- .../backendapi/modules/CloudProviderModule.java | 5 + .../backendapi/modules/GcpSelfServiceModule.java | 84 -------------- .../dlab/backendapi/modules/ModuleFactory.java | 13 --- .../backendapi/resources/EnvironmentResource.java | 2 +- .../resources/InfrastructureInfoResource.java | 11 +- .../dlab/backendapi/resources/ProjectResource.java | 52 +++------ .../resources/dto/HealthStatusPageDTO.java | 129 +-------------------- .../com/epam/dlab/backendapi/roles/UserRole.java | 13 +-- .../com/epam/dlab/backendapi/roles/UserRoles.java | 58 ++++++--- .../backendapi/service/EnvironmentService.java | 6 +- .../service/InfrastructureInfoService.java | 2 +- .../dlab/backendapi/service/ProjectService.java | 13 +-- .../service/impl/EnvironmentServiceImpl.java | 13 +-- .../impl/InfrastructureInfoServiceImpl.java | 22 ++-- .../service/impl/ProjectServiceImpl.java | 65 +++-------- .../service/impl/UserGroupServiceImpl.java | 6 +- .../src/main/resources/mongo/gcp/mongo_roles.json | 17 +++ .../resources/EnvironmentResourceTest.java | 8 +- .../resources/InfrastructureInfoResourceTest.java | 34 ++++-- .../backendapi/resources/ProjectResourceTest.java | 24 ++-- .../service/impl/EnvironmentServiceImplTest.java | 24 ---- .../service/impl/UserGroupServiceImplTest.java | 13 ++- 31 files changed, 284 insertions(+), 658 deletions(-) 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/annotation/ProjectAdmin.java similarity index 59% copy from services/self-service/src/main/java/com/epam/dlab/backendapi/service/InfrastructureInfoService.java copy to services/self-service/src/main/java/com/epam/dlab/backendapi/annotation/ProjectAdmin.java index aa23d1d..2fca3cd 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/annotation/ProjectAdmin.java @@ -17,19 +17,14 @@ * under the License. */ -package com.epam.dlab.backendapi.service; +package com.epam.dlab.backendapi.annotation; -import com.epam.dlab.auth.UserInfo; -import com.epam.dlab.backendapi.resources.dto.HealthStatusPageDTO; -import com.epam.dlab.backendapi.resources.dto.ProjectInfrastructureInfo; -import com.epam.dlab.dto.InfrastructureMetaInfoDTO; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; -import java.util.List; - -public interface InfrastructureInfoService { - List<ProjectInfrastructureInfo> getUserResources(String user); - - HealthStatusPageDTO getHeathStatus(UserInfo user, boolean fullReport, boolean isAdmin); - - InfrastructureMetaInfoDTO getInfrastructureMetaInfo(); +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface ProjectAdmin { } 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/annotation/User.java similarity index 59% copy from services/self-service/src/main/java/com/epam/dlab/backendapi/service/InfrastructureInfoService.java copy to services/self-service/src/main/java/com/epam/dlab/backendapi/annotation/User.java index aa23d1d..b56dd20 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/annotation/User.java @@ -17,19 +17,14 @@ * under the License. */ -package com.epam.dlab.backendapi.service; +package com.epam.dlab.backendapi.annotation; -import com.epam.dlab.auth.UserInfo; -import com.epam.dlab.backendapi.resources.dto.HealthStatusPageDTO; -import com.epam.dlab.backendapi.resources.dto.ProjectInfrastructureInfo; -import com.epam.dlab.dto.InfrastructureMetaInfoDTO; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; -import java.util.List; - -public interface InfrastructureInfoService { - List<ProjectInfrastructureInfo> getUserResources(String user); - - HealthStatusPageDTO getHeathStatus(UserInfo user, boolean fullReport, boolean isAdmin); - - InfrastructureMetaInfoDTO getInfrastructureMetaInfo(); +@Target(ElementType.PARAMETER) +@Retention(RetentionPolicy.RUNTIME) +public @interface User { } diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/EnvDAO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/EnvDAO.java index ebacc51..f554873 100644 --- a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/EnvDAO.java +++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/EnvDAO.java @@ -23,8 +23,6 @@ import com.epam.dlab.auth.UserInfo; import com.epam.dlab.backendapi.SelfServiceApplication; import com.epam.dlab.backendapi.conf.SelfServiceApplicationConfiguration; import com.epam.dlab.backendapi.resources.aws.ComputationalResourceAws; -import com.epam.dlab.backendapi.resources.dto.HealthStatusEnum; -import com.epam.dlab.backendapi.resources.dto.HealthStatusPageDTO; import com.epam.dlab.dto.UserInstanceDTO; import com.epam.dlab.dto.UserInstanceStatus; import com.epam.dlab.dto.base.DataEngineType; @@ -166,18 +164,6 @@ public class EnvDAO extends BaseDAO { } /** - * @param user the name of user. - * @param fullReport return full report if <b>true</b> otherwise common status only. - * @throws DlabException in case of any exception - */ - public HealthStatusPageDTO getHealthStatusPageDTO(String user, boolean fullReport) { - return new HealthStatusPageDTO() - .withStatus(HealthStatusEnum.OK) - .withListResources(Collections.emptyList()); - } - - - /** * Updates the status of exploratory and computational for user. * * @param user the name of user. @@ -211,11 +197,6 @@ public class EnvDAO extends BaseDAO { .collect(Collectors.toSet()); } - public Set<String> fetchAllUsers() { - return stream(find(USER_EDGE)).map(d -> d.getString(ID)) - .collect(Collectors.toSet()); - } - @SuppressWarnings("unchecked") private void updateUserResourceStatuses(String user, String project, EnvResourceList list, Document exp) { final String exploratoryName = exp.getString(EXPLORATORY_NAME); 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 245df5b..bce53c3 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 @@ -12,8 +12,6 @@ import java.util.Set; public interface ProjectDAO { List<ProjectDTO> getProjects(); - List<ProjectDTO> getProjectsWithStatus(ProjectDTO.Status status); - List<ProjectDTO> getProjectsWithEndpointStatusNotIn(UserInstanceStatus... statuses); List<ProjectDTO> getUserProjects(UserInfo userInfo, boolean active); 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 7128c51..ac3cfa3 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 @@ -18,7 +18,11 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.stream.Stream; -import static com.mongodb.client.model.Filters.*; +import static com.mongodb.client.model.Filters.and; +import static com.mongodb.client.model.Filters.elemMatch; +import static com.mongodb.client.model.Filters.eq; +import static com.mongodb.client.model.Filters.in; +import static com.mongodb.client.model.Filters.not; public class ProjectDAOImpl extends BaseDAO implements ProjectDAO { @@ -46,11 +50,6 @@ public class ProjectDAOImpl extends BaseDAO implements ProjectDAO { } @Override - public List<ProjectDTO> getProjectsWithStatus(ProjectDTO.Status status) { - return find(PROJECTS_COLLECTION, eq(STATUS_FIELD, status.toString()), ProjectDTO.class); - } - - @Override public List<ProjectDTO> getProjectsWithEndpointStatusNotIn(UserInstanceStatus... statuses) { final List<String> statusList = Arrays.stream(statuses).map(UserInstanceStatus::name).collect(Collectors.toList()); diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/ProjectManagingDTO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/ProjectManagingDTO.java deleted file mode 100644 index 167128e..0000000 --- a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/ProjectManagingDTO.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.epam.dlab.backendapi.domain; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import lombok.AllArgsConstructor; -import lombok.Data; - - -@Data -@JsonIgnoreProperties(ignoreUnknown = true) -@AllArgsConstructor -public class ProjectManagingDTO { - private String name; - private final Integer budget; - private boolean canBeStopped; - private boolean canBeTerminated; -} \ No newline at end of file diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/interceptor/ProjectAdminInterceptor.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/interceptor/ProjectAdminInterceptor.java new file mode 100644 index 0000000..a536dab --- /dev/null +++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/interceptor/ProjectAdminInterceptor.java @@ -0,0 +1,74 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package com.epam.dlab.backendapi.interceptor; + +import com.epam.dlab.auth.UserInfo; +import com.epam.dlab.backendapi.annotation.Project; +import com.epam.dlab.backendapi.annotation.User; +import com.epam.dlab.backendapi.roles.UserRoles; +import com.epam.dlab.backendapi.service.ProjectService; +import com.epam.dlab.exceptions.DlabException; +import com.epam.dlab.exceptions.ResourceQuoteReachedException; +import com.google.inject.Inject; +import lombok.extern.slf4j.Slf4j; +import org.aopalliance.intercept.MethodInterceptor; +import org.aopalliance.intercept.MethodInvocation; + +import java.lang.reflect.Method; +import java.lang.reflect.Parameter; +import java.util.Objects; +import java.util.stream.IntStream; + +@Slf4j +public class ProjectAdminInterceptor implements MethodInterceptor { + @Inject + private ProjectService projectService; + + @Override + public Object invoke(MethodInvocation mi) throws Throwable { + if (grantAccess(mi)) { + return mi.proceed(); + } else { + final Method method = mi.getMethod(); + log.warn("Execution of method {} failed because user doesn't have appropriate permission", method.getName()); + throw new ResourceQuoteReachedException("Operation can not be finished. User doesn't have appropriate permission"); + } + } + + private boolean grantAccess(MethodInvocation mi) { + final Parameter[] parameters = mi.getMethod().getParameters(); + String project = IntStream.range(0, parameters.length) + .filter(i -> Objects.nonNull(parameters[i].getAnnotation(Project.class))) + .mapToObj(i -> (String) mi.getArguments()[i]) + .findAny() + .orElseThrow(() -> new DlabException("Project parameter wanted!")); + UserInfo userInfo = IntStream.range(0, parameters.length) + .filter(i -> Objects.nonNull(parameters[i].getAnnotation(User.class))) + .mapToObj(i -> (UserInfo) mi.getArguments()[i]) + .findAny() + .orElseThrow(() -> new DlabException("UserInfo parameter wanted!")); + + return checkPermission(userInfo, project); + } + + private boolean checkPermission(UserInfo userInfo, String project) { + return UserRoles.isAdmin(userInfo) || UserRoles.isProjectAdmin(userInfo, projectService.get(project).getGroups()); + } +} diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/AwsSelfServiceModule.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/AwsSelfServiceModule.java deleted file mode 100644 index 0fd45de..0000000 --- a/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/AwsSelfServiceModule.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package com.epam.dlab.backendapi.modules; - -import com.epam.dlab.backendapi.SelfServiceApplication; -import com.epam.dlab.backendapi.annotation.BudgetLimited; -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.interceptor.BudgetLimitInterceptor; -import com.epam.dlab.backendapi.resources.aws.ComputationalResourceAws; -import com.epam.dlab.backendapi.service.BillingService; -import com.epam.dlab.backendapi.service.aws.AwsBillingService; -import com.epam.dlab.cloud.CloudModule; -import com.epam.dlab.mongo.MongoServiceFactory; -import com.fiestacabin.dropwizard.quartz.SchedulerConfiguration; -import com.google.inject.Injector; -import com.google.inject.Provides; -import com.google.inject.Singleton; -import io.dropwizard.setup.Environment; -import org.quartz.Scheduler; -import org.quartz.SchedulerException; -import org.quartz.impl.StdSchedulerFactory; - -import static com.google.inject.matcher.Matchers.annotatedWith; -import static com.google.inject.matcher.Matchers.any; - -public class AwsSelfServiceModule extends CloudModule { - - private static final String MONGO_URI_FORMAT = "mongodb://%s:%s@%s:%d/%s"; - private static final String QUARTZ_MONGO_URI_PROPERTY = "org.quartz.jobStore.mongoUri"; - private static final String QUARTZ_DB_NAME = "org.quartz.jobStore.dbName"; - - @Override - protected void configure() { - bind(BillingService.class).to(AwsBillingService.class); - bind(SchedulerConfiguration.class).toInstance( - new SchedulerConfiguration(SelfServiceApplication.class.getPackage().getName())); - bind(BillingDAO.class).to(AwsBillingDAO.class); - final BudgetLimitInterceptor budgetLimitInterceptor = new BudgetLimitInterceptor(); - requestInjection(budgetLimitInterceptor); - bindInterceptor(any(), annotatedWith(BudgetLimited.class), budgetLimitInterceptor); - } - - @Override - public void init(Environment environment, Injector injector) { - environment.jersey().register(injector.getInstance(ComputationalResourceAws.class)); -// - - /*injector.getInstance(SecurityFactory.class).configure(injector, environment, - SelfServiceSecurityAuthenticator.class, injector.getInstance(Authorizer.class));*/ - } - - - @Provides - @Singleton - Scheduler provideScheduler(SelfServiceApplicationConfiguration configuration) throws SchedulerException { - final MongoServiceFactory mongoFactory = configuration.getMongoFactory(); - final String database = mongoFactory.getDatabase(); - final String mongoUri = String.format(MONGO_URI_FORMAT, mongoFactory.getUsername(), mongoFactory.getPassword(), - mongoFactory.getHost(), mongoFactory.getPort(), database); - System.setProperty(QUARTZ_MONGO_URI_PROPERTY, mongoUri); - System.setProperty(QUARTZ_DB_NAME, database); - return StdSchedulerFactory.getDefaultScheduler(); - } -} diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/AzureSelfServiceModule.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/AzureSelfServiceModule.java deleted file mode 100644 index ee04041..0000000 --- a/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/AzureSelfServiceModule.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package com.epam.dlab.backendapi.modules; - -import com.epam.dlab.backendapi.SelfServiceApplication; -import com.epam.dlab.backendapi.annotation.BudgetLimited; -import com.epam.dlab.backendapi.conf.SelfServiceApplicationConfiguration; -import com.epam.dlab.backendapi.dao.BillingDAO; -import com.epam.dlab.backendapi.dao.azure.AzureBillingDAO; -import com.epam.dlab.backendapi.interceptor.BudgetLimitInterceptor; -import com.epam.dlab.backendapi.resources.azure.ComputationalResourceAzure; -import com.epam.dlab.backendapi.service.BillingService; -import com.epam.dlab.backendapi.service.azure.AzureBillingService; -import com.epam.dlab.cloud.CloudModule; -import com.epam.dlab.mongo.MongoServiceFactory; -import com.fiestacabin.dropwizard.quartz.SchedulerConfiguration; -import com.google.inject.Injector; -import com.google.inject.Provides; -import com.google.inject.Singleton; -import io.dropwizard.setup.Environment; -import lombok.extern.slf4j.Slf4j; -import org.quartz.Scheduler; -import org.quartz.SchedulerException; -import org.quartz.impl.StdSchedulerFactory; - -import static com.google.inject.matcher.Matchers.annotatedWith; -import static com.google.inject.matcher.Matchers.any; - -@Slf4j -public class AzureSelfServiceModule extends CloudModule { - - private static final String MONGO_URI_FORMAT = "mongodb://%s:%s@%s:%d/%s"; - private static final String QUARTZ_MONGO_URI_PROPERTY = "org.quartz.jobStore.mongoUri"; - private static final String QUARTZ_DB_NAME = "org.quartz.jobStore.dbName"; - - @Override - protected void configure() { - bind(BillingService.class).to(AzureBillingService.class); - bind(SchedulerConfiguration.class).toInstance( - new SchedulerConfiguration(SelfServiceApplication.class.getPackage().getName())); - bind(BillingDAO.class).to(AzureBillingDAO.class); - final BudgetLimitInterceptor budgetLimitInterceptor = new BudgetLimitInterceptor(); - requestInjection(budgetLimitInterceptor); - bindInterceptor(any(), annotatedWith(BudgetLimited.class), budgetLimitInterceptor); - } - - @Override - public void init(Environment environment, Injector injector) { - environment.jersey().register(injector.getInstance(ComputationalResourceAzure.class)); - - } - - @Provides - @Singleton - Scheduler provideScheduler(SelfServiceApplicationConfiguration configuration) throws SchedulerException { - final MongoServiceFactory mongoFactory = configuration.getMongoFactory(); - final String database = mongoFactory.getDatabase(); - final String mongoUri = String.format(MONGO_URI_FORMAT, mongoFactory.getUsername(), mongoFactory.getPassword(), - mongoFactory.getHost(), mongoFactory.getPort(), database); - System.setProperty(QUARTZ_MONGO_URI_PROPERTY, mongoUri); - System.setProperty(QUARTZ_DB_NAME, database); - return StdSchedulerFactory.getDefaultScheduler(); - } -} diff --git 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 index 7ea2739..2884aa6 100644 --- 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,12 +21,14 @@ package com.epam.dlab.backendapi.modules; 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; @@ -75,8 +77,11 @@ public class CloudProviderModule extends CloudModule { new SchedulerConfiguration(SelfServiceApplication.class.getPackage().getName())); final BudgetLimitInterceptor budgetLimitInterceptor = new BudgetLimitInterceptor(); + final ProjectAdminInterceptor projectAdminInterceptor = new ProjectAdminInterceptor(); requestInjection(budgetLimitInterceptor); + requestInjection(projectAdminInterceptor); bindInterceptor(any(), annotatedWith(BudgetLimited.class), budgetLimitInterceptor); + bindInterceptor(any(), annotatedWith(ProjectAdmin.class), projectAdminInterceptor); } @Override diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/GcpSelfServiceModule.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/GcpSelfServiceModule.java deleted file mode 100644 index 276238e..0000000 --- a/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/GcpSelfServiceModule.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package com.epam.dlab.backendapi.modules; - -import com.epam.dlab.backendapi.SelfServiceApplication; -import com.epam.dlab.backendapi.annotation.BudgetLimited; -import com.epam.dlab.backendapi.conf.SelfServiceApplicationConfiguration; -import com.epam.dlab.backendapi.dao.BillingDAO; -import com.epam.dlab.backendapi.dao.gcp.GcpBillingDao; -import com.epam.dlab.backendapi.interceptor.BudgetLimitInterceptor; -import com.epam.dlab.backendapi.resources.gcp.ComputationalResourceGcp; -import com.epam.dlab.backendapi.resources.gcp.GcpOauthResource; -import com.epam.dlab.backendapi.service.BillingService; -import com.epam.dlab.backendapi.service.gcp.GcpBillingService; -import com.epam.dlab.cloud.CloudModule; -import com.epam.dlab.mongo.MongoServiceFactory; -import com.fiestacabin.dropwizard.quartz.SchedulerConfiguration; -import com.google.inject.Injector; -import com.google.inject.Provides; -import com.google.inject.Singleton; -import io.dropwizard.setup.Environment; -import org.quartz.Scheduler; -import org.quartz.SchedulerException; -import org.quartz.impl.StdSchedulerFactory; - -import static com.google.inject.matcher.Matchers.annotatedWith; -import static com.google.inject.matcher.Matchers.any; - -public class GcpSelfServiceModule extends CloudModule { - - private static final String MONGO_URI_FORMAT = "mongodb://%s:%s@%s:%d/%s"; - private static final String QUARTZ_MONGO_URI_PROPERTY = "org.quartz.jobStore.mongoUri"; - private static final String QUARTZ_DB_NAME = "org.quartz.jobStore.dbName"; - - @Override - @SuppressWarnings("unchecked") - public void init(Environment environment, Injector injector) { - environment.jersey().register(injector.getInstance(ComputationalResourceGcp.class)); - if (injector.getInstance(SelfServiceApplicationConfiguration.class).isGcpOuauth2AuthenticationEnabled()) { - environment.jersey().register(injector.getInstance(GcpOauthResource.class)); - } - - } - - @Override - protected void configure() { - bind(BillingService.class).to(GcpBillingService.class); - bind(BillingDAO.class).to(GcpBillingDao.class); - bind(SchedulerConfiguration.class).toInstance( - new SchedulerConfiguration(SelfServiceApplication.class.getPackage().getName())); - final BudgetLimitInterceptor budgetLimitInterceptor = new BudgetLimitInterceptor(); - requestInjection(budgetLimitInterceptor); - bindInterceptor(any(), annotatedWith(BudgetLimited.class), budgetLimitInterceptor); - } - - @Provides - @Singleton - Scheduler provideScheduler(SelfServiceApplicationConfiguration configuration) throws SchedulerException { - final MongoServiceFactory mongoFactory = configuration.getMongoFactory(); - final String database = mongoFactory.getDatabase(); - final String mongoUri = String.format(MONGO_URI_FORMAT, mongoFactory.getUsername(), mongoFactory.getPassword(), - mongoFactory.getHost(), mongoFactory.getPort(), database); - System.setProperty(QUARTZ_MONGO_URI_PROPERTY, mongoUri); - System.setProperty(QUARTZ_DB_NAME, database); - return StdSchedulerFactory.getDefaultScheduler(); - } -} diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/ModuleFactory.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/ModuleFactory.java index 1480fe7..eb8d3bc 100644 --- a/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/ModuleFactory.java +++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/ModuleFactory.java @@ -48,17 +48,4 @@ public class ModuleFactory { public static CloudModule getCloudProviderModule(SelfServiceApplicationConfiguration configuration) { return new CloudProviderModule(configuration); } - - private static CloudModule getCloudModule(SelfServiceApplicationConfiguration configuration) { - switch (configuration.getCloudProvider()) { - case AWS: - return new AwsSelfServiceModule(); - case AZURE: - return new AzureSelfServiceModule(); - case GCP: - return new GcpSelfServiceModule(); - default: - throw new UnsupportedOperationException("Unsupported cloud provider " + configuration.getCloudProvider()); - } - } } diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/EnvironmentResource.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/EnvironmentResource.java index ae60e39..c92162f 100644 --- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/EnvironmentResource.java +++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/EnvironmentResource.java @@ -61,7 +61,7 @@ public class EnvironmentResource { @Produces(MediaType.APPLICATION_JSON) public Response getAllEnv(@Auth UserInfo userInfo) { log.debug("Admin {} requested information about all user's environment", userInfo.getName()); - return Response.ok(environmentService.getAllEnv()).build(); + return Response.ok(environmentService.getAllEnv(userInfo)).build(); } @POST 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 db8197f..0d41d8f 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 @@ -22,13 +22,17 @@ 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.ProjectInfrastructureInfo; -import com.epam.dlab.backendapi.roles.UserRoles; import com.epam.dlab.backendapi.service.InfrastructureInfoService; import com.google.inject.Inject; import io.dropwizard.auth.Auth; import lombok.extern.slf4j.Slf4j; -import javax.ws.rs.*; +import javax.ws.rs.Consumes; +import javax.ws.rs.DefaultValue; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import java.util.List; @@ -66,8 +70,7 @@ public class InfrastructureInfoResource { @Path("/status") public HealthStatusPageDTO status(@Auth UserInfo userInfo, @QueryParam("full") @DefaultValue("0") int fullReport) { - return infrastructureInfoService - .getHeathStatus(userInfo, fullReport != 0, UserRoles.isAdmin(userInfo)); + return infrastructureInfoService.getHeathStatus(userInfo, fullReport != 0); } /** diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/ProjectResource.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/ProjectResource.java index 93e42bb..7b26d73 100644 --- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/ProjectResource.java +++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/ProjectResource.java @@ -1,7 +1,11 @@ package com.epam.dlab.backendapi.resources; import com.epam.dlab.auth.UserInfo; -import com.epam.dlab.backendapi.domain.*; +import com.epam.dlab.backendapi.domain.CreateProjectDTO; +import com.epam.dlab.backendapi.domain.ProjectDTO; +import com.epam.dlab.backendapi.domain.ProjectEndpointDTO; +import com.epam.dlab.backendapi.domain.UpdateProjectBudgetDTO; +import com.epam.dlab.backendapi.domain.UpdateProjectDTO; import com.epam.dlab.backendapi.resources.dto.ProjectActionFormDTO; import com.epam.dlab.backendapi.service.AccessKeyService; import com.epam.dlab.backendapi.service.ProjectService; @@ -20,7 +24,15 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses; import javax.annotation.security.RolesAllowed; import javax.validation.Valid; import javax.validation.constraints.NotNull; -import javax.ws.rs.*; +import javax.ws.rs.Consumes; +import javax.ws.rs.DefaultValue; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.PUT; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; @@ -58,7 +70,7 @@ public class ProjectResource { }) @POST @Consumes(MediaType.APPLICATION_JSON) - @RolesAllowed("/api/project") + @RolesAllowed("/api/project/create") public Response createProject(@Parameter(hidden = true) @Auth UserInfo userInfo, @Valid CreateProjectDTO projectDTO) { projectService.create(userInfo, new ProjectDTO(projectDTO.getName(), projectDTO.getGroups(), @@ -140,27 +152,9 @@ public class ProjectResource { @GET @Produces(MediaType.APPLICATION_JSON) @RolesAllowed("/api/project") - public Response getProjects(@Parameter(hidden = true) @Auth UserInfo userInfo, - @Parameter(description = "Project name") - @PathParam("name") String name) { - return Response - .ok(projectService.getProjects()) - .build(); - } - - @Operation(summary = "Get available projects for managing", tags = "project") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Return information about projects", - content = @Content(mediaType = MediaType.APPLICATION_JSON, schema = - @Schema(implementation = ProjectManagingDTO.class))), - }) - @GET - @Path("managing") - @Produces(MediaType.APPLICATION_JSON) - @RolesAllowed("/api/project") - public Response getProjectsForManaging(@Parameter(hidden = true) @Auth UserInfo userInfo) { + public Response getProjects(@Parameter(hidden = true) @Auth UserInfo userInfo) { return Response - .ok(projectService.getProjectsForManaging()) + .ok(projectService.getProjects(userInfo)) .build(); } @@ -193,7 +187,7 @@ public class ProjectResource { @PUT @RolesAllowed("/api/project") public Response updateProject(@Parameter(hidden = true) @Auth UserInfo userInfo, UpdateProjectDTO projectDTO) { - projectService.update(userInfo, projectDTO); + projectService.update(userInfo, projectDTO, projectDTO.getName()); return Response.ok().build(); } @@ -213,16 +207,6 @@ public class ProjectResource { return Response.ok().build(); } - @DELETE - @Path("{name}") - @RolesAllowed("/api/project") - public Response removeProject( - @Parameter(hidden = true) @Auth UserInfo userInfo, - @PathParam("name") String name) { - projectService.terminateProject(userInfo, name); - return Response.ok().build(); - } - @Operation(summary = "Updates project budget", tags = "project") @ApiResponses({ @ApiResponse(responseCode = "200", description = "Project budget is successfully updated"), 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 b7f9362..17e7b91 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 @@ -20,13 +20,16 @@ package com.epam.dlab.backendapi.resources.dto; import com.fasterxml.jackson.annotation.JsonProperty; -import com.google.common.base.MoreObjects; +import lombok.Builder; +import lombok.Data; import java.util.List; /** * Stores the health statuses for environment resources. */ +@Data +@Builder public class HealthStatusPageDTO { @JsonProperty private String status; @@ -37,131 +40,11 @@ public class HealthStatusPageDTO { @JsonProperty private boolean admin; @JsonProperty + private boolean projectAdmin; + @JsonProperty private int billingQuoteUsed; @JsonProperty private int billingUserQuoteUsed; @JsonProperty private boolean projectAssigned; - - /** - * Return the status of environment. - */ - public String getStatus() { - return status; - } - - /** - * Set the status of environment. - */ - public void setStatus(HealthStatusEnum status) { - this.status = status == null ? null : status.toString(); - } - - /** - * Set the status of environment. - */ - public void setStatus(String status) { - this.status = status; - } - - public void setBillingEnabled(boolean billingEnabled) { - this.billingEnabled = billingEnabled; - } - - - /** - * Set the status of environment. - */ - public HealthStatusPageDTO withStatus(String status) { - setStatus(status); - return this; - } - - /** - * Set the status of environment. - */ - public HealthStatusPageDTO withStatus(HealthStatusEnum status) { - setStatus(status); - return this; - } - - public HealthStatusPageDTO withProjectAssinged(boolean isProjectAssigned) { - this.projectAssigned = isProjectAssigned; - return this; - } - - /** - * Return the list of resources. - */ - public List<HealthStatusResource> getListResources() { - return listResources; - } - - /** - * Set the list of resources. - */ - public void setListResources(List<HealthStatusResource> listResources) { - this.listResources = listResources; - } - - /** - * Set the list of resources. - */ - public HealthStatusPageDTO withListResources(List<HealthStatusResource> listResources) { - setListResources(listResources); - return this; - } - - /** - * Set billing enabled flag - */ - public HealthStatusPageDTO withBillingEnabled(boolean billingEnabled) { - setBillingEnabled(billingEnabled); - return this; - } - - @Override - public String toString() { - return MoreObjects.toStringHelper(this) - .add("status", status) - .add("listResources", listResources) - .add("billingEnabled", billingEnabled) - .add("admin", admin) - .toString(); - } - - public HealthStatusPageDTO withAdmin(boolean isAdmin) { - this.admin = isAdmin; - return this; - } - - public HealthStatusPageDTO withBillingQuoteUsed(int billingQuoteUsedPct) { - this.billingQuoteUsed = billingQuoteUsedPct; - return this; - } - - public HealthStatusPageDTO withBillingUserQuoteUsed(int billingUserQuoteUsed) { - this.billingUserQuoteUsed = billingUserQuoteUsed; - return this; - } - - public boolean isBillingEnabled() { - return billingEnabled; - } - - public boolean isAdmin() { - return admin; - } - - public boolean isProjectAssigned() { - return projectAssigned; - } - - public int getBillingQuoteUsed() { - return billingQuoteUsed; - } - - public int getBillingUserQuoteUsed() { - return billingUserQuoteUsed; - } } \ No newline at end of file diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/roles/UserRole.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/roles/UserRole.java index 206b143..e5343dd 100644 --- a/services/self-service/src/main/java/com/epam/dlab/backendapi/roles/UserRole.java +++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/roles/UserRole.java @@ -23,6 +23,7 @@ import com.google.common.base.MoreObjects; import com.google.common.base.MoreObjects.ToStringHelper; import javax.annotation.Nonnull; +import java.util.Comparator; import java.util.Objects; import java.util.Set; @@ -69,10 +70,6 @@ public class UserRole implements Comparable<UserRole> { this.users = users; } - UserRole(RoleType type, String name, Set<String> groups, Set<String> users) { - this(null, type, name, groups, users); - } - /** * Return the type of role. */ @@ -107,8 +104,10 @@ public class UserRole implements Comparable<UserRole> { @Override public int compareTo(@Nonnull UserRole o) { - int result = type.compareTo(o.type); - return (result == 0 ? name.compareTo(o.name) : result); + return Comparator.comparing(UserRole::getType) + .thenComparing(UserRole::getName) + .thenComparing(UserRole::getId, Comparator.nullsLast(String::compareToIgnoreCase)) + .compare(this, o); } private ToStringHelper toStringHelper(Object self) { @@ -124,7 +123,7 @@ public class UserRole implements Comparable<UserRole> { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; UserRole userRole = (UserRole) o; - return this.type.equals(userRole.getType()) && this.name.equals(userRole.getName()); + return this.id.equals(userRole.getId()) && this.type.equals(userRole.getType()) && this.name.equals(userRole.getName()); } @Override diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/roles/UserRoles.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/roles/UserRoles.java index 411f798..621f2dd 100644 --- a/services/self-service/src/main/java/com/epam/dlab/backendapi/roles/UserRoles.java +++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/roles/UserRoles.java @@ -28,7 +28,15 @@ import org.bson.Document; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; /** * Provides user roles access to features. @@ -45,6 +53,7 @@ public class UserRoles { * Node name of user. */ private static final String USERS = "users"; + private static final String PROJECT_ADMIN_ROLE_NAME = "projectAdmin"; private static final String ADMIN_ROLE_NAME = "admin"; /** * Single instance of the user roles. @@ -95,10 +104,22 @@ public class UserRoles { return checkAccess(userInfo, type, name, true, roles); } + public static boolean isProjectAdmin(UserInfo userInfo) { + final List<UserRole> roles = UserRoles.getRoles(); + return roles == null || roles.stream().anyMatch(r -> PROJECT_ADMIN_ROLE_NAME.equalsIgnoreCase(r.getId()) && + (userRoles.hasAccessByGroup(userInfo, userInfo.getRoles(), r.getGroups()) || userRoles.hasAccessByUserName(userInfo, r))); + } + + public static boolean isProjectAdmin(UserInfo userInfo, Set<String> groups) { + final List<UserRole> roles = UserRoles.getRoles(); + return roles == null || roles.stream().anyMatch(r -> PROJECT_ADMIN_ROLE_NAME.equalsIgnoreCase(r.getId()) && + (userRoles.hasAccessByGroup(userInfo, userInfo.getRoles(), retainGroups(r.getGroups(), groups)) || userRoles.hasAccessByUserName(userInfo, r))); + } + public static boolean isAdmin(UserInfo userInfo) { final List<UserRole> roles = UserRoles.getRoles(); return roles == null || roles.stream().anyMatch(r -> ADMIN_ROLE_NAME.equalsIgnoreCase(r.getId()) && - (userRoles.hasAccessByGroup(userInfo, r, userInfo.getRoles()) || userRoles.hasAccessByUserName(userInfo, r))); + (userRoles.hasAccessByGroup(userInfo, userInfo.getRoles(), r.getGroups()) || userRoles.hasAccessByUserName(userInfo, r))); } /** @@ -181,12 +202,16 @@ public class UserRoles { * * @param type type of role. * @param name the name of role. + * @return list of UserRole */ - private UserRole get(RoleType type, String name) { - UserRole item = new UserRole(type, name, null, null); + private Set<String> getGroups(RoleType type, String name) { synchronized (roles) { - int i = Collections.binarySearch(roles, item); - return (i < 0 ? null : roles.get(i)); + return roles + .stream() + .filter(r -> type == r.getType() && name.equalsIgnoreCase(r.getName())) + .map(UserRole::getGroups) + .flatMap(Collection::stream) + .collect(Collectors.toSet()); } } @@ -233,17 +258,18 @@ public class UserRoles { } LOGGER.trace("Check access for user {} with groups {} to {}/{}", userInfo.getName(), userInfo.getRoles(), type, name); - UserRole role = get(type, name); - if (role == null) { + Set<String> groups = getGroups(type, name); + if (groups == null || groups.isEmpty()) { return checkDefault(useDefault); } - if (hasAccessByGroup(userInfo, role, roles)) return true; + if (hasAccessByGroup(userInfo, roles, groups)) { + return true; + } LOGGER.trace("Access denied for user {} to {}/{}", userInfo.getName(), type, name); return false; } - private boolean hasAccessByGroup(UserInfo userInfo, UserRole role, Collection<String> userRoles) { - Set<String> groups = role.getGroups(); + private boolean hasAccessByGroup(UserInfo userInfo, Collection<String> userRoles, Collection<String> groups) { if (groups != null) { if (groups.contains(ANY_USER)) { return true; @@ -255,7 +281,7 @@ public class UserRoles { } } - final Optional<String> group = role.getGroups() + final Optional<String> group = groups .stream() .filter(g -> userGroups.getOrDefault(g, Collections.emptySet()).contains(userInfo.getName().toLowerCase())) .findAny(); @@ -287,12 +313,16 @@ public class UserRoles { } } + private static Set<String> retainGroups(Set<String> groups1, Set<String> groups2) { + HashSet<String> result = new HashSet<>(groups1); + result.retainAll(groups2); + return result; + } + @Override public String toString() { return MoreObjects.toStringHelper(roles) .addValue(roles) .toString(); } - - } diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/EnvironmentService.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/EnvironmentService.java index f765aa4..e342f76 100644 --- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/EnvironmentService.java +++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/EnvironmentService.java @@ -24,15 +24,11 @@ import com.epam.dlab.backendapi.resources.dto.UserDTO; import com.epam.dlab.backendapi.resources.dto.UserResourceInfo; import java.util.List; -import java.util.Set; public interface EnvironmentService { - - Set<String> getUserNames(); - List<UserDTO> getUsers(); - List<UserResourceInfo> getAllEnv(); + List<UserResourceInfo> getAllEnv(UserInfo user); void stopAll(); 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 aa23d1d..fc3bd9d 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 @@ -29,7 +29,7 @@ import java.util.List; public interface InfrastructureInfoService { List<ProjectInfrastructureInfo> getUserResources(String user); - HealthStatusPageDTO getHeathStatus(UserInfo user, boolean fullReport, boolean isAdmin); + HealthStatusPageDTO getHeathStatus(UserInfo user, boolean fullReport); 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 1fd394b..fa0aedc 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 @@ -2,7 +2,6 @@ package com.epam.dlab.backendapi.service; import com.epam.dlab.auth.UserInfo; import com.epam.dlab.backendapi.domain.ProjectDTO; -import com.epam.dlab.backendapi.domain.ProjectManagingDTO; import com.epam.dlab.backendapi.domain.UpdateProjectDTO; import java.util.List; @@ -10,12 +9,10 @@ import java.util.List; public interface ProjectService { List<ProjectDTO> getProjects(); - List<ProjectManagingDTO> getProjectsForManaging(); + List<ProjectDTO> getProjects(UserInfo user); List<ProjectDTO> getUserProjects(UserInfo userInfo, boolean active); - List<ProjectDTO> getProjectsWithStatus(ProjectDTO.Status status); - List<ProjectDTO> getProjectsByEndpoint(String endpointName); void create(UserInfo userInfo, ProjectDTO projectDTO); @@ -26,21 +23,15 @@ public interface ProjectService { void terminateEndpoint(UserInfo userInfo, List<String> endpoints, String name); - void terminateProject(UserInfo userInfo, String name); - void start(UserInfo userInfo, String endpoint, String name); void start(UserInfo userInfo, List<String> endpoints, String name); void stop(UserInfo userInfo, String endpoint, String name); - void stop(UserInfo userInfo, List<String> endpoints, String name); - void stopWithResources(UserInfo userInfo, List<String> endpoints, String projectName); - void update(UserInfo userInfo, UpdateProjectDTO projectDTO); - - void updateBudget(String project, Integer budget); + void update(UserInfo userInfo, UpdateProjectDTO projectDTO, String projectName); void updateBudget(List<ProjectDTO> projects); diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/EnvironmentServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/EnvironmentServiceImpl.java index 3dfaaae..15607d3 100644 --- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/EnvironmentServiceImpl.java +++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/EnvironmentServiceImpl.java @@ -87,18 +87,13 @@ public class EnvironmentServiceImpl implements EnvironmentService { } @Override - public Set<String> getUserNames() { - log.debug("Getting all users..."); - return envDAO.fetchAllUsers(); - } - - @Override - public List<UserResourceInfo> getAllEnv() { + public List<UserResourceInfo> getAllEnv(UserInfo user) { log.debug("Getting all user's environment..."); List<UserInstanceDTO> expList = exploratoryDAO.getInstances(); - return projectService.getProjects() + return projectService.getProjects(user) .stream() - .map(projectDTO -> getProjectEnv(projectDTO, expList)).flatMap(Collection::stream) + .map(projectDTO -> getProjectEnv(projectDTO, expList)) + .flatMap(Collection::stream) .collect(toList()); } 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 ecfe6cf..cbb006b 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 @@ -26,8 +26,10 @@ import com.epam.dlab.backendapi.dao.EnvDAO; 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.roles.UserRoles; import com.epam.dlab.backendapi.service.EndpointService; import com.epam.dlab.backendapi.service.InfrastructureInfoService; import com.epam.dlab.backendapi.service.ProjectService; @@ -42,6 +44,7 @@ import com.jcabi.manifests.Manifests; import lombok.extern.slf4j.Slf4j; import org.bson.Document; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -100,17 +103,20 @@ public class InfrastructureInfoServiceImpl implements InfrastructureInfoService } @Override - public HealthStatusPageDTO getHeathStatus(UserInfo userInfo, boolean fullReport, boolean isAdmin) { + public HealthStatusPageDTO getHeathStatus(UserInfo userInfo, boolean fullReport) { 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)); + return HealthStatusPageDTO.builder() + .status(HealthStatusEnum.OK.toString()) + .listResources(Collections.emptyList()) + .billingEnabled(configuration.isBillingSchedulerEnabled()) + .projectAdmin(UserRoles.isProjectAdmin(userInfo)) + .admin(UserRoles.isAdmin(userInfo)) + .projectAssigned(projectService.isAnyProjectAssigned(userInfo)) + .billingQuoteUsed(billingDAO.getBillingQuoteUsed()) + .billingUserQuoteUsed(billingDAO.getBillingUserQuoteUsed(user)) + .build(); } catch (Exception e) { log.warn("Could not return status of resources for user {}: {}", user, e.getLocalizedMessage(), e); throw new DlabException(e.getMessage(), 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 99836f4..f33f9e2 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 @@ -3,15 +3,17 @@ package com.epam.dlab.backendapi.service.impl; import com.epam.dlab.auth.UserInfo; import com.epam.dlab.backendapi.annotation.BudgetLimited; import com.epam.dlab.backendapi.annotation.Project; +import com.epam.dlab.backendapi.annotation.ProjectAdmin; +import com.epam.dlab.backendapi.annotation.User; import com.epam.dlab.backendapi.dao.ExploratoryDAO; import com.epam.dlab.backendapi.dao.ProjectDAO; import com.epam.dlab.backendapi.dao.UserGroupDao; import com.epam.dlab.backendapi.domain.EndpointDTO; import com.epam.dlab.backendapi.domain.ProjectDTO; import com.epam.dlab.backendapi.domain.ProjectEndpointDTO; -import com.epam.dlab.backendapi.domain.ProjectManagingDTO; import com.epam.dlab.backendapi.domain.RequestId; import com.epam.dlab.backendapi.domain.UpdateProjectDTO; +import com.epam.dlab.backendapi.roles.UserRoles; import com.epam.dlab.backendapi.service.EndpointService; import com.epam.dlab.backendapi.service.ExploratoryService; import com.epam.dlab.backendapi.service.ProjectService; @@ -29,7 +31,6 @@ import lombok.extern.slf4j.Slf4j; import java.util.Arrays; import java.util.HashSet; import java.util.List; -import java.util.Objects; import java.util.Set; import java.util.function.Supplier; import java.util.stream.Collectors; @@ -80,10 +81,10 @@ public class ProjectServiceImpl implements ProjectService { } @Override - public List<ProjectManagingDTO> getProjectsForManaging() { - return projectDAO.getProjects().stream().map(p -> new ProjectManagingDTO( - p.getName(), p.getBudget(), isCanBeStopped(p), isCanBeTerminated(p))) - .filter(projectManagingDTO -> projectManagingDTO.isCanBeTerminated()) + public List<ProjectDTO> getProjects(UserInfo user) { + return projectDAO.getProjects() + .stream() + .filter(project -> UserRoles.isProjectAdmin(user, project.getGroups()) || UserRoles.isAdmin(user)) .collect(Collectors.toList()); } @@ -93,11 +94,6 @@ public class ProjectServiceImpl implements ProjectService { } @Override - public List<ProjectDTO> getProjectsWithStatus(ProjectDTO.Status status) { - return projectDAO.getProjectsWithStatus(status); - } - - @Override public List<ProjectDTO> getProjectsByEndpoint(String endpointName) { return projectDAO.getProjectsByEndpoint(endpointName); } @@ -126,21 +122,13 @@ public class ProjectServiceImpl implements ProjectService { exploratoryService.updateProjectExploratoryStatuses(name, endpoint, UserInstanceStatus.TERMINATING); } + @ProjectAdmin @Override - public void terminateEndpoint(UserInfo userInfo, List<String> endpoints, String name) { + public void terminateEndpoint(@User UserInfo userInfo, List<String> endpoints, @Project String name) { + System.out.println("sd"); endpoints.forEach(endpoint -> terminateEndpoint(userInfo, endpoint, name)); } - @Override - public void terminateProject(UserInfo userInfo, String name) { - List<ProjectEndpointDTO> endpoints = get(name).getEndpoints(); - checkProjectRelatedResourcesInProgress(name, endpoints, TERMINATE_ACTION); - - endpoints.stream() - .map(ProjectEndpointDTO::getName) - .forEach(endpoint -> terminateEndpoint(userInfo, endpoint, name)); - } - @BudgetLimited @Override public void start(UserInfo userInfo, String endpoint, @Project String name) { @@ -148,8 +136,9 @@ public class ProjectServiceImpl implements ProjectService { projectDAO.updateEdgeStatus(name, endpoint, UserInstanceStatus.STARTING); } + @ProjectAdmin @Override - public void start(UserInfo userInfo, List<String> endpoints, String name) { + public void start(@User UserInfo userInfo, List<String> endpoints, @Project String name) { endpoints.forEach(endpoint -> start(userInfo, endpoint, name)); } @@ -159,13 +148,9 @@ public class ProjectServiceImpl implements ProjectService { projectDAO.updateEdgeStatus(name, endpoint, UserInstanceStatus.STOPPING); } + @ProjectAdmin @Override - public void stop(UserInfo userInfo, List<String> endpoints, String name) { - endpoints.forEach(endpoint -> stop(userInfo, endpoint, name)); - } - - @Override - public void stopWithResources(UserInfo userInfo, List<String> endpoints, String projectName) { + public void stopWithResources(@User UserInfo userInfo, List<String> endpoints, @Project String projectName) { List<ProjectEndpointDTO> endpointDTOs = get(projectName) .getEndpoints() .stream() @@ -181,8 +166,9 @@ public class ProjectServiceImpl implements ProjectService { .forEach(e -> stop(userInfo, e.getName(), projectName)); } + @ProjectAdmin @Override - public void update(UserInfo userInfo, UpdateProjectDTO projectDTO) { + 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() @@ -200,11 +186,6 @@ public class ProjectServiceImpl implements ProjectService { } @Override - public void updateBudget(String project, Integer budget) { - projectDAO.updateBudget(project, budget); - } - - @Override public void updateBudget(List<ProjectDTO> projects) { projects.forEach(p -> projectDAO.updateBudget(p.getName(), p.getBudget())); } @@ -269,20 +250,6 @@ public class ProjectServiceImpl implements ProjectService { } } - private boolean isCanBeStopped(ProjectDTO projectDTO) { - List<ProjectEndpointDTO> endpoints = projectDTO.getEndpoints(); - return !endpoints.stream().allMatch(e -> exploratoryDAO.fetchProjectExploratoriesWhereStatusNotIn( - projectDTO.getName(), e.getName(), UserInstanceStatus.STOPPED, UserInstanceStatus.TERMINATED, - UserInstanceStatus.TERMINATING).isEmpty()) || - endpoints.stream().anyMatch(e -> Arrays.asList(UserInstanceStatus.RUNNING, UserInstanceStatus.STARTING) - .contains(e.getStatus())); - } - - private boolean isCanBeTerminated(ProjectDTO projectDTO) { - return !projectDTO.getEndpoints().stream().allMatch(e -> Objects.equals(UserInstanceStatus.TERMINATED, - e.getStatus())); - } - private Supplier<ResourceNotFoundException> projectNotFound() { return () -> new ResourceNotFoundException("Project with passed name not found"); } diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/UserGroupServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/UserGroupServiceImpl.java index 0a71587..a1c8854 100644 --- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/UserGroupServiceImpl.java +++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/UserGroupServiceImpl.java @@ -50,10 +50,8 @@ public class UserGroupServiceImpl implements UserGroupService { @Override public void createGroup(String group, Set<String> roleIds, Set<String> users) { checkAnyRoleFound(roleIds, userRoleDao.addGroupToRole(Collections.singleton(group), roleIds)); - if (!users.isEmpty()) { - log.debug("Adding users {} to group {}", users, group); - userGroupDao.addUsers(group, users); - } + log.debug("Adding users {} to group {}", users, group); + userGroupDao.addUsers(group, users); } @Override diff --git a/services/self-service/src/main/resources/mongo/gcp/mongo_roles.json b/services/self-service/src/main/resources/mongo/gcp/mongo_roles.json index d3c22ba..8aeb89f 100644 --- a/services/self-service/src/main/resources/mongo/gcp/mongo_roles.json +++ b/services/self-service/src/main/resources/mongo/gcp/mongo_roles.json @@ -275,6 +275,22 @@ ] }, { + "_id": "projectAdmin", + "description": "Allow to execute administration operation per project", + "type": "ADMINISTRATION", + "pages": [ + "environment/*", + "/roleManagement", + "/api/settings", + "/user/settings", + "/api/project", + "/api/endpoint" + ], + "groups": [ + "$anyuser" + ] + }, + { "_id": "admin", "description": "Allow to execute administration operation", "type": "ADMINISTRATION", @@ -285,6 +301,7 @@ "/api/settings", "/user/settings", "/api/project", + "/api/project/create", "/api/endpoint" ], "groups": [ diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/EnvironmentResourceTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/EnvironmentResourceTest.java index c257995..dad779b 100644 --- a/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/EnvironmentResourceTest.java +++ b/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/EnvironmentResourceTest.java @@ -41,6 +41,7 @@ import java.util.List; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.mockito.Matchers.anyString; +import static org.mockito.Matchers.eq; import static org.mockito.Mockito.any; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doThrow; @@ -101,7 +102,8 @@ public class EnvironmentResourceTest extends TestBase { @Test public void getAllEnv() { - when(environmentService.getAllEnv()).thenReturn(Collections.emptyList()); + UserInfo userInfo = getUserInfo(); + when(environmentService.getAllEnv(userInfo)).thenReturn(Collections.emptyList()); final Response response = resources.getJerseyTest() .target("/environment/all") .request() @@ -111,14 +113,14 @@ public class EnvironmentResourceTest extends TestBase { assertEquals(HttpStatus.SC_OK, response.getStatus()); assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE)); - verify(environmentService).getAllEnv(); + verify(environmentService).getAllEnv(eq(userInfo)); verifyNoMoreInteractions(environmentService); } @Test public void getAllEnvWithFailedAuth() throws AuthenticationException { authFailSetup(); - when(environmentService.getAllEnv()).thenReturn(Collections.emptyList()); + when(environmentService.getAllEnv(getUserInfo())).thenReturn(Collections.emptyList()); final Response response = resources.getJerseyTest() .target("/environment/all") .request() 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 b92335e..67ddd2c 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 @@ -37,7 +37,17 @@ import javax.ws.rs.core.Response; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; -import static org.mockito.Mockito.*; +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.anyBoolean; +import static org.mockito.Mockito.anyString; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.refEq; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; +import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.when; public class InfrastructureInfoResourceTest extends TestBase { @@ -84,7 +94,7 @@ public class InfrastructureInfoResourceTest extends TestBase { @Test public void healthStatus() { HealthStatusPageDTO hspDto = getHealthStatusPageDTO(); - when(infrastructureInfoService.getHeathStatus(any(UserInfo.class), anyBoolean(), anyBoolean())).thenReturn(hspDto); + when(infrastructureInfoService.getHeathStatus(any(UserInfo.class), anyBoolean())).thenReturn(hspDto); final Response response = resources.getJerseyTest() .target("/infrastructure/status") .queryParam("full", "1") @@ -96,7 +106,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(refEq(getUserInfo()), eq(true), anyBoolean()); + verify(infrastructureInfoService).getHeathStatus(refEq(getUserInfo()), eq(true)); verifyNoMoreInteractions(infrastructureInfoService); } @@ -104,7 +114,7 @@ public class InfrastructureInfoResourceTest extends TestBase { public void healthStatusWithFailedAuth() throws AuthenticationException { authFailSetup(); HealthStatusPageDTO hspDto = getHealthStatusPageDTO(); - when(infrastructureInfoService.getHeathStatus(any(UserInfo.class), anyBoolean(), anyBoolean())).thenReturn(hspDto); + when(infrastructureInfoService.getHeathStatus(any(UserInfo.class), anyBoolean())).thenReturn(hspDto); final Response response = resources.getJerseyTest() .target("/infrastructure/status") .queryParam("full", "1") @@ -116,14 +126,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(refEq(getUserInfo()), eq(true), anyBoolean()); + verify(infrastructureInfoService).getHeathStatus(refEq(getUserInfo()), eq(true)); verifyNoMoreInteractions(infrastructureInfoService); } @Test public void healthStatusWithDefaultQueryParam() { HealthStatusPageDTO hspDto = getHealthStatusPageDTO(); - when(infrastructureInfoService.getHeathStatus(any(UserInfo.class), anyBoolean(), anyBoolean())).thenReturn(hspDto); + when(infrastructureInfoService.getHeathStatus(any(UserInfo.class), anyBoolean())).thenReturn(hspDto); final Response response = resources.getJerseyTest() .target("/infrastructure/status") .request() @@ -134,14 +144,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(refEq(getUserInfo()), eq(false), anyBoolean()); + verify(infrastructureInfoService).getHeathStatus(refEq(getUserInfo()), eq(false)); verifyNoMoreInteractions(infrastructureInfoService); } @Test public void healthStatusWithException() { doThrow(new DlabException("Could not return status of resources for user")) - .when(infrastructureInfoService).getHeathStatus(any(UserInfo.class), anyBoolean(), anyBoolean()); + .when(infrastructureInfoService).getHeathStatus(any(UserInfo.class), anyBoolean()); final Response response = resources.getJerseyTest() .target("/infrastructure/status") .request() @@ -151,7 +161,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(refEq(getUserInfo()), eq(false), anyBoolean()); + verify(infrastructureInfoService).getHeathStatus(refEq(getUserInfo()), eq(false)); verifyNoMoreInteractions(infrastructureInfoService); } @@ -191,8 +201,8 @@ public class InfrastructureInfoResourceTest extends TestBase { } private HealthStatusPageDTO getHealthStatusPageDTO() { - HealthStatusPageDTO hspdto = new HealthStatusPageDTO(); - hspdto.setStatus("someStatus"); - return hspdto; + return HealthStatusPageDTO.builder() + .status("someStatus") + .build(); } } diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/ProjectResourceTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/ProjectResourceTest.java index b85f631..7c78fed 100644 --- a/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/ProjectResourceTest.java +++ b/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/ProjectResourceTest.java @@ -17,13 +17,17 @@ import javax.ws.rs.client.Entity; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; - import java.util.Collections; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; import static org.mockito.Matchers.any; -import static org.mockito.Mockito.*; +import static org.mockito.Mockito.anyList; +import static org.mockito.Mockito.anyString; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; +import static org.mockito.Mockito.when; public class ProjectResourceTest extends TestBase { @@ -40,20 +44,6 @@ public class ProjectResourceTest extends TestBase { } @Test - public void getProjectsForManaging() { - final Response response = resources.getJerseyTest() - .target("project/managing") - .request() - .header("Authorization", "Bearer " + TOKEN) - .get(); - - assertEquals(HttpStatus.SC_OK, response.getStatus()); - assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE)); - verify(projectService, times(1)).getProjectsForManaging(); - verifyNoMoreInteractions(projectService); - } - - @Test public void stopProject() { final Response response = resources.getJerseyTest() .target("project/stop") diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/EnvironmentServiceImplTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/EnvironmentServiceImplTest.java index dca6e0f..fc1c2a2 100644 --- a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/EnvironmentServiceImplTest.java +++ b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/EnvironmentServiceImplTest.java @@ -47,10 +47,8 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Optional; -import java.util.Set; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.any; import static org.mockito.Mockito.anySet; import static org.mockito.Mockito.anyString; @@ -126,28 +124,6 @@ public class EnvironmentServiceImplTest { environmentService.getUsers(); } - @Test - public void getAllUsers() { - doReturn(Collections.singleton(USER)).when(envDAO).fetchAllUsers(); - final Set<String> users = environmentService.getUserNames(); - - assertEquals(1, users.size()); - assertTrue(users.contains(USER)); - - verify(envDAO).fetchAllUsers(); - verifyNoMoreInteractions(envDAO); - } - - @Test - public void getAllUsersWithException() { - doThrow(new DlabException("Users not found")).when(envDAO).fetchAllUsers(); - - expectedException.expect(DlabException.class); - expectedException.expectMessage("Users not found"); - - environmentService.getUserNames(); - } - @Test public void stopEnvironment() { 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 305e852..53d2f6b 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 @@ -40,7 +40,16 @@ import java.util.List; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -import static org.mockito.Mockito.*; +import static org.mockito.Mockito.anySet; +import static org.mockito.Mockito.anySetOf; +import static org.mockito.Mockito.anyString; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.eq; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.refEq; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; +import static org.mockito.Mockito.when; @RunWith(MockitoJUnitRunner.class) public class UserGroupServiceImplTest { @@ -77,7 +86,7 @@ public class UserGroupServiceImplTest { userGroupService.createGroup(GROUP, Collections.singleton(ROLE_ID), Collections.emptySet()); verify(userRoleDao).addGroupToRole(Collections.singleton(GROUP), Collections.singleton(ROLE_ID)); - verify(userGroupDao, never()).addUsers(anyString(), anySet()); + verify(userGroupDao).addUsers(anyString(), anySet()); } @Test --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@dlab.apache.org For additional commands, e-mail: commits-h...@dlab.apache.org