You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dlab.apache.org by of...@apache.org on 2020/03/25 11:38:58 UTC
[incubator-dlab] 01/01: [DLAB-1590] Admin per project
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 <ol...@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-unsubscribe@dlab.apache.org
For additional commands, e-mail: commits-help@dlab.apache.org