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

Reply via email to