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/07/23 12:38:44 UTC

[incubator-dlab] 01/03: [DLAB-1870] Intigration with sonar

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

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

commit 159eb9d63dfa147fc13bc28182d1b8c96080d9f8
Author: Oleh Fuks <ol...@gmail.com>
AuthorDate: Wed Jul 22 11:44:32 2020 +0300

    [DLAB-1870] Intigration with sonar
---
 pom.xml                                            |  37 ++++++-
 .../main/java/com/epam/dlab/BillingService.java    |   1 +
 .../billing/gcp/dao/impl/BigQueryBillingDAO.java   |  11 +-
 .../dlab/auth/conf/AzureLoginConfiguration.java    |  39 -------
 .../epam/dlab/auth/conf/GcpLoginConfiguration.java |  33 ------
 .../main/java/com/epam/dlab/model/StringList.java  |  35 ++++---
 .../main/java/com/epam/dlab/util/FileUtils.java    |   2 +-
 services/provisioning-service/pom.xml              |  14 +++
 .../core/response/folderlistener/WatchItem.java    |  20 ++--
 .../handlers/dao/FileSystemCallbackHandlerDao.java |   6 +-
 .../service/impl/CheckInactivityServiceImpl.java   |   2 +-
 .../dlab/backendapi/service/impl/KeyService.java   |   2 +-
 .../service/impl/ProjectServiceImpl.java           |  26 +++--
 .../service/impl/aws/BucketServiceAwsImpl.java     | 113 ++++++++++-----------
 .../service/impl/azure/BucketServiceAzureImpl.java |   8 +-
 .../service/impl/gcp/BucketServiceGcpImpl.java     |  10 +-
 .../dlab/process/builder/ProcessInfoBuilder.java   |  17 +++-
 services/self-service/pom.xml                      |  11 ++
 .../epam/dlab/backendapi/dao/UserRoleDaoImpl.java  |   3 +
 .../dropwizard/listeners/MongoStartupListener.java |   2 +-
 .../listeners/RestoreHandlerStartupListener.java   |   2 +-
 .../backendapi/healthcheck/MongoHealthCheck.java   |   2 +-
 .../interceptor/BudgetLimitInterceptor.java        |  11 --
 .../backendapi/resources/KeycloakResource.java     |   3 +
 .../schedulers/billing/BillingScheduler.java       |   2 +-
 .../endpoint/CheckEndpointStatusScheduler.java     |   2 +-
 .../service/impl/BillingServiceImpl.java           |  38 +++----
 .../backendapi/service/impl/BucketServiceImpl.java |  10 +-
 .../service/impl/ComputationalServiceImpl.java     |   3 +-
 .../service/impl/EndpointServiceImpl.java          |   2 +-
 .../service/impl/ExploratoryServiceImpl.java       |   4 +-
 .../service/impl/ProjectServiceImpl.java           |   5 +-
 .../servlet/guacamole/GuacamoleServlet.java        |  18 +++-
 .../epam/dlab/backendapi/util/KeycloakUtil.java    |   2 +-
 34 files changed, 251 insertions(+), 245 deletions(-)

diff --git a/pom.xml b/pom.xml
index e24bfd9..03edbec 100644
--- a/pom.xml
+++ b/pom.xml
@@ -52,6 +52,35 @@
                 <module>services/billing-gcp</module>
             </modules>
         </profile>
+        <profile>
+            <id>sonar</id>
+            <activation>
+                <activeByDefault>false</activeByDefault>
+            </activation>
+            <properties>
+                <sonar.host.url>
+                    http://localhost:9000/sonar
+                </sonar.host.url>
+                <sonar.coverage.exclusions>
+                    **/*Exception.java,
+                    src/main/java/com/epam/dlab/dto/**,
+                    src/main/java/com/epam/dlab/backendapi/auth/**,
+                    src/main/java/com/epam/dlab/backendapi/conf/**,
+                    src/main/java/com/epam/dlab/backendapi/domain/**,
+                    src/main/java/com/epam/dlab/backendapi/dropwizard/**,
+                    src/main/java/com/epam/dlab/backendapi/healthcheck/**,
+                    src/main/java/com/epam/dlab/backendapi/modules/**,
+                    src/main/java/com/epam/dlab/backendapi/resources/dto/**,
+                    src/main/java/com/epam/dlab/backendapi/roles/**,
+                    src/main/java/com/epam/dlab/backendapi/servlet/guacamole/**,
+                    src/main/java/com/epam/dlab/backendapi/util/**,
+                    src/main/java/com/epam/dlab/backendapi/validation/**,
+                    src/main/java/com/epam/dlab/process/**,
+                    src/main/java/com/epam/dlab/backendapi/modules/**,
+                    src/main/java/com/epam/dlab/backendapi/validation/**
+                </sonar.coverage.exclusions>
+            </properties>
+        </profile>
     </profiles>
 
     <modules>
@@ -88,6 +117,7 @@
         <logback.version>1.2.3</logback.version>
         <commons-fileupload.version>1.3.3</commons-fileupload.version>
     </properties>
+
     <dependencyManagement>
         <dependencies>
             <dependency>
@@ -130,8 +160,6 @@
                 <artifactId>dropwizard-util</artifactId>
                 <version>${io.dropwizard.version}</version>
             </dependency>
-
-
         </dependencies>
     </dependencyManagement>
 
@@ -174,6 +202,11 @@
                         </execution>
                     </executions>
                 </plugin>
+                <plugin>
+                    <groupId>org.sonarsource.scanner.maven</groupId>
+                    <artifactId>sonar-maven-plugin</artifactId>
+                    <version>3.7.0.1746</version>
+                </plugin>
             </plugins>
         </pluginManagement>
         <plugins>
diff --git a/services/billing-aws/src/main/java/com/epam/dlab/BillingService.java b/services/billing-aws/src/main/java/com/epam/dlab/BillingService.java
index 9b4d6db..15dcc32 100644
--- a/services/billing-aws/src/main/java/com/epam/dlab/BillingService.java
+++ b/services/billing-aws/src/main/java/com/epam/dlab/BillingService.java
@@ -23,6 +23,7 @@ import com.epam.dlab.dto.billing.BillingData;
 
 import java.util.List;
 
+@FunctionalInterface
 public interface BillingService {
     List<BillingData> getBillingData();
 }
diff --git a/services/billing-gcp/src/main/java/com/epam/dlab/billing/gcp/dao/impl/BigQueryBillingDAO.java b/services/billing-gcp/src/main/java/com/epam/dlab/billing/gcp/dao/impl/BigQueryBillingDAO.java
index 061283d..3a93429 100644
--- a/services/billing-gcp/src/main/java/com/epam/dlab/billing/gcp/dao/impl/BigQueryBillingDAO.java
+++ b/services/billing-gcp/src/main/java/com/epam/dlab/billing/gcp/dao/impl/BigQueryBillingDAO.java
@@ -24,6 +24,7 @@ import com.epam.dlab.billing.gcp.dao.BillingDAO;
 import com.epam.dlab.billing.gcp.model.BillingHistory;
 import com.epam.dlab.billing.gcp.repository.BillingHistoryRepository;
 import com.epam.dlab.dto.billing.BillingData;
+import com.epam.dlab.exceptions.DlabException;
 import com.google.cloud.bigquery.BigQuery;
 import com.google.cloud.bigquery.FieldValueList;
 import com.google.cloud.bigquery.QueryJobConfiguration;
@@ -32,7 +33,6 @@ import com.google.cloud.bigquery.Table;
 import com.google.cloud.bigquery.TableInfo;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.mongodb.core.MongoTemplate;
 import org.springframework.stereotype.Component;
 
 import java.time.Instant;
@@ -53,7 +53,6 @@ public class BigQueryBillingDAO implements BillingDAO {
 	private static final String DATASET_PARAM = "dataset";
 
 	private final BillingHistoryRepository billingHistoryRepo;
-	private final MongoTemplate mongoTemplate;
 	private final BigQuery service;
 	private final String dataset;
 	private final String sbn;
@@ -69,11 +68,10 @@ public class BigQueryBillingDAO implements BillingDAO {
 
 	@Autowired
 	public BigQueryBillingDAO(DlabConfiguration conf, BillingHistoryRepository billingHistoryRepo,
-							  BigQuery service, MongoTemplate mongoTemplate) {
+	                          BigQuery service) {
 		dataset = conf.getBigQueryDataset();
 		this.service = service;
 		this.billingHistoryRepo = billingHistoryRepo;
-		this.mongoTemplate = mongoTemplate;
 		sbn = conf.getSbn();
 	}
 
@@ -107,8 +105,9 @@ public class BigQueryBillingDAO implements BillingDAO {
 							.map(this::toGcpBillingData);
 			billingHistoryRepo.save(new BillingHistory(tableName, table.getLastModifiedTime()));
 			return gcpBillingDataStream;
-		} catch (InterruptedException e) {
-			throw new IllegalStateException("Can not get billing info from BigQuery due to: " + e.getMessage(), e);
+		} catch (Exception e) {
+			log.error("Can not get billing info from BigQuery due to {}", e.getMessage(), e);
+			throw new DlabException("Can not get billing info from BigQuery due to: " + e.getMessage(), e);
 		}
 	}
 
diff --git a/services/common/src/main/java/com/epam/dlab/auth/conf/AzureLoginConfiguration.java b/services/common/src/main/java/com/epam/dlab/auth/conf/AzureLoginConfiguration.java
deleted file mode 100644
index cf6331c..0000000
--- a/services/common/src/main/java/com/epam/dlab/auth/conf/AzureLoginConfiguration.java
+++ /dev/null
@@ -1,39 +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.auth.conf;
-
-import lombok.Getter;
-
-@Getter
-public class AzureLoginConfiguration {
-	private boolean useLdap;
-	private boolean silent;
-	private String tenant;
-	private String authority;
-	private String clientId;
-	private String redirectUrl;
-	private String responseMode;
-	private String prompt;
-	private String loginPage;
-	private boolean validatePermissionScope;
-	private String permissionScope;
-	private String managementApiAuthFile;
-	private long maxSessionDurabilityMilliseconds = 8L * 60L * 60L * 1000L;// 8 hours
-}
diff --git a/services/common/src/main/java/com/epam/dlab/auth/conf/GcpLoginConfiguration.java b/services/common/src/main/java/com/epam/dlab/auth/conf/GcpLoginConfiguration.java
deleted file mode 100644
index 6dbaf02..0000000
--- a/services/common/src/main/java/com/epam/dlab/auth/conf/GcpLoginConfiguration.java
+++ /dev/null
@@ -1,33 +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.auth.conf;
-
-import lombok.Data;
-
-@Data
-public class GcpLoginConfiguration {
-	private final boolean oauth2authenticationEnabled;
-	private final String redirectedUri;
-	private final String clientId;
-	private final String clientSecret;
-	private final String applicationName;
-	private final int userStateCacheSize;
-	private final long userStateCacheExpirationTime;
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/model/StringList.java b/services/dlab-model/src/main/java/com/epam/dlab/model/StringList.java
index d02ad3c..be4ea8e 100644
--- a/services/dlab-model/src/main/java/com/epam/dlab/model/StringList.java
+++ b/services/dlab-model/src/main/java/com/epam/dlab/model/StringList.java
@@ -19,26 +19,29 @@
 
 package com.epam.dlab.model;
 
+import lombok.extern.slf4j.Slf4j;
+
 import javax.ws.rs.WebApplicationException;
 import java.util.ArrayList;
 
+@Slf4j
 public class StringList extends ArrayList<String> {
-    public StringList(String s) {
-        super();
+	public StringList(String s) {
+		super();
 
-        for (String v : s.split(",")) {
-            try {
-                add(v.trim());
-            } catch (Exception ex) {
-                ex.printStackTrace();
-                throw new WebApplicationException(400);
-            }
-        }
-        if (isEmpty())
-            throw new WebApplicationException(400);
-    }
+		for (String v : s.split(",")) {
+			try {
+				add(v.trim());
+			} catch (Exception e) {
+				log.error("Something went wrong. Reason {}", e.getMessage(), e);
+				throw new WebApplicationException(400);
+			}
+		}
+		if (isEmpty())
+			throw new WebApplicationException(400);
+	}
 
-    public static String valueOf(String s) {
-        return s;
-    }
+	public static String valueOf(String s) {
+		return s;
+	}
 }
\ No newline at end of file
diff --git a/services/dlab-utils/src/main/java/com/epam/dlab/util/FileUtils.java b/services/dlab-utils/src/main/java/com/epam/dlab/util/FileUtils.java
index f48a5af..251902c 100644
--- a/services/dlab-utils/src/main/java/com/epam/dlab/util/FileUtils.java
+++ b/services/dlab-utils/src/main/java/com/epam/dlab/util/FileUtils.java
@@ -55,7 +55,7 @@ public class FileUtils {
 		try {
 			Files.deleteIfExists(Paths.get(absolutePath));
 		} catch (IOException e) {
-			log.error("Problems occured with deleting file {} due to: {}", absolutePath, e.getLocalizedMessage());
+			log.error("Problems occured with deleting file {} due to: {}", absolutePath, e.getLocalizedMessage(), e);
 		}
 	}
 }
diff --git a/services/provisioning-service/pom.xml b/services/provisioning-service/pom.xml
index 0cec6a5..1c21a6d 100644
--- a/services/provisioning-service/pom.xml
+++ b/services/provisioning-service/pom.xml
@@ -175,6 +175,20 @@
                     </execution>
                 </executions>
             </plugin>
+            <plugin>
+                <groupId>org.jacoco</groupId>
+                <artifactId>jacoco-maven-plugin</artifactId>
+                <configuration>
+                    <excludes>
+                        <exclude>**/*Configuration.*</exclude>
+                        <exclude>**/*Module.*</exclude>
+                        <exclude>**/*Form.*</exclude>
+                        <exclude>com/epam/dlab/process/**/*</exclude>
+                        <exclude>com/epam/dlab/backendapi/modules/**/*</exclude>
+                        <exclude>com/epam/dlab/backendapi/validation/**/*</exclude>
+                    </excludes>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
 </project>
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/folderlistener/WatchItem.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/folderlistener/WatchItem.java
index ba72555..bb8fc03 100644
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/folderlistener/WatchItem.java
+++ b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/folderlistener/WatchItem.java
@@ -20,18 +20,19 @@
 
 package com.epam.dlab.backendapi.core.response.folderlistener;
 
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ExecutionException;
-
 import com.epam.dlab.backendapi.core.FileHandlerCallback;
 import com.google.common.base.MoreObjects;
 import lombok.extern.slf4j.Slf4j;
 
-/** Class to store the file handler for processing.
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+
+/**
+ * Class to store the file handler for processing.
  */
 @Slf4j
 public class WatchItem implements Comparable<WatchItem> {
-	
+
 	/** Status of file processing.
 	 * <pre>
 	 * WAIT_FOR_FILE waiting for the file creation.
@@ -149,9 +150,10 @@ public class WatchItem implements Comparable<WatchItem> {
 			} catch (InterruptedException e) {
     			Thread.currentThread().interrupt();
 				return ItemStatus.IS_INTERRUPTED;
-			} catch (ExecutionException e) {
-				return ItemStatus.IS_FAILED;
-			}
+		    } catch (ExecutionException e) {
+			    log.error("Execution exception occurred", e);
+			    return ItemStatus.IS_FAILED;
+		    }
     	}
     	
     	return ItemStatus.INPROGRESS;
@@ -182,7 +184,7 @@ public class WatchItem implements Comparable<WatchItem> {
 			try {
 				futureResult = future.get();
 			} catch (Exception e) {
-				log.error("Exception occurred during getting result: {}", e.getMessage());
+				log.error("Exception occurred during getting result: {}", e.getMessage(), e);
 			}
 		}
 		return futureResult; 
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/dao/FileSystemCallbackHandlerDao.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/dao/FileSystemCallbackHandlerDao.java
index 846e0d7..268950a 100644
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/dao/FileSystemCallbackHandlerDao.java
+++ b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/dao/FileSystemCallbackHandlerDao.java
@@ -89,7 +89,7 @@ public class FileSystemCallbackHandlerDao implements CallbackHandlerDao {
 					.ifPresent(FileUtils::deleteFile);
 		} catch (IOException e) {
 			log.error("Problem occurred with accessing directory {} due to: {}", configuration.getHandlerDirectory(),
-					e.getLocalizedMessage());
+					e.getLocalizedMessage(), e);
 		}
 	}
 
@@ -102,7 +102,7 @@ public class FileSystemCallbackHandlerDao implements CallbackHandlerDao {
 			log.trace("Persisting callback handler to file {}", absolutePath);
 			Files.write(Paths.get(absolutePath), mapper.writeValueAsBytes(handlerCallback), StandardOpenOption.CREATE);
 		} catch (Exception e) {
-			log.warn("Can not persist file handler {} due to {}", fileName, e.getMessage());
+			log.warn("Can not persist file handler {} due to {}", fileName, e.getMessage(), e);
 		}
 	}
 
@@ -114,7 +114,7 @@ public class FileSystemCallbackHandlerDao implements CallbackHandlerDao {
 		try {
 			return Optional.of(mapper.readValue(path.toFile(), PersistentFileHandler.class));
 		} catch (Exception e) {
-			log.warn("Can not deserialize file handler from file: {}", path.toString());
+			log.warn("Can not deserialize file handler from file: {}", path.toString(), e);
 		}
 		return Optional.empty();
 	}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/CheckInactivityServiceImpl.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/CheckInactivityServiceImpl.java
index 3713589..59e67b4 100644
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/CheckInactivityServiceImpl.java
+++ b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/CheckInactivityServiceImpl.java
@@ -118,7 +118,7 @@ public class CheckInactivityServiceImpl extends DockerService implements CheckIn
 			commandExecutor.executeAsync(userName, uuid, command);
 		} catch (Exception e) {
 			log.error("Exception occured during reuploading key: {} for command {}", e.getLocalizedMessage(),
-					dockerCmd.toCMD());
+					dockerCmd.toCMD(), e);
 		}
 	}
 
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/KeyService.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/KeyService.java
index bbedc68..5d650da 100644
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/KeyService.java
+++ b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/KeyService.java
@@ -89,7 +89,7 @@ public class KeyService extends DockerService implements DockerCommands {
 			commandExecutor.executeAsync(userName, uuid, command);
 		} catch (Exception e) {
 			log.error("Exception occured during reuploading key: {} for command {}", e.getLocalizedMessage(),
-					runDockerCommand.toCMD());
+					runDockerCommand.toCMD(), e);
 		}
 	}
 
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/ProjectServiceImpl.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/ProjectServiceImpl.java
index 1daf93f..e84a7f3 100644
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/ProjectServiceImpl.java
+++ b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/ProjectServiceImpl.java
@@ -29,16 +29,22 @@ public class ProjectServiceImpl implements ProjectService {
 	private static final String PROJECT_IMAGE = "docker.dlab-project";
 	private static final String EDGE_IMAGE = "docker.dlab-edge";
 	private static final String CALLBACK_URI = "/api/project/status";
+
+	protected final RESTService selfService;
+	private final ProvisioningServiceApplicationConfiguration configuration;
+	private final FolderListenerExecutor folderListenerExecutor;
+	private final ICommandExecutor commandExecutor;
+	private final CommandBuilder commandBuilder;
+
 	@Inject
-	protected RESTService selfService;
-	@Inject
-	private ProvisioningServiceApplicationConfiguration configuration;
-	@Inject
-	private FolderListenerExecutor folderListenerExecutor;
-	@Inject
-	private ICommandExecutor commandExecutor;
-	@Inject
-	private CommandBuilder commandBuilder;
+	public ProjectServiceImpl(RESTService selfService, ProvisioningServiceApplicationConfiguration configuration,
+	                          FolderListenerExecutor folderListenerExecutor, ICommandExecutor commandExecutor, CommandBuilder commandBuilder) {
+		this.selfService = selfService;
+		this.configuration = configuration;
+		this.folderListenerExecutor = folderListenerExecutor;
+		this.commandExecutor = commandExecutor;
+		this.commandBuilder = commandBuilder;
+	}
 
 	@Override
 	public String create(UserInfo userInfo, ProjectCreateDTO dto) {
@@ -92,7 +98,7 @@ public class ProjectServiceImpl implements ProjectService {
 		try {
 			commandExecutor.executeAsync(userInfo.getName(), uuid, commandBuilder.buildCommand(runDockerCommand, dto));
 		} catch (JsonProcessingException e) {
-			e.printStackTrace();
+			log.error("Something went wrong. Reason {}", e.getMessage(), e);
 		}
 		return uuid;
 	}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/aws/BucketServiceAwsImpl.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/aws/BucketServiceAwsImpl.java
index 79831a4..6c5673d 100644
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/aws/BucketServiceAwsImpl.java
+++ b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/aws/BucketServiceAwsImpl.java
@@ -48,19 +48,18 @@ public class BucketServiceAwsImpl implements BucketService {
 
     @Override
     public List<BucketDTO> getObjects(String bucket) {
-        try {
-            S3Client s3 = S3Client.create();
-            ListObjectsRequest getRequest = ListObjectsRequest
-                    .builder()
-                    .bucket(bucket)
-                    .build();
+        try (S3Client s3 = S3Client.create()) {
+	        ListObjectsRequest getRequest = ListObjectsRequest
+			        .builder()
+			        .bucket(bucket)
+			        .build();
 
-            return s3.listObjects(getRequest).contents()
-                    .stream()
-                    .map(o -> toBucketDTO(bucket, o))
-                    .collect(Collectors.toList());
+	        return s3.listObjects(getRequest).contents()
+			        .stream()
+			        .map(o -> toBucketDTO(bucket, o))
+			        .collect(Collectors.toList());
         } catch (Exception e) {
-            log.error("Cannot retrieve objects from bucket {}. Reason: {}", bucket, e.getMessage());
+	        log.error("Cannot retrieve objects from bucket {}. Reason: {}", bucket, e.getMessage(), e);
             throw new DlabException(String.format("Cannot retrieve objects from bucket %s. Reason: %s", bucket, e.getMessage()));
         }
     }
@@ -68,18 +67,17 @@ public class BucketServiceAwsImpl implements BucketService {
     @Override
     public void uploadObject(String bucket, String object, InputStream stream, String contentType, long fileSize) {
         log.info("Uploading file {} to bucket {}", object, bucket);
-        try {
-            S3Client s3 = S3Client.create();
-            PutObjectRequest uploadRequest = PutObjectRequest
-                    .builder()
-                    .bucket(bucket)
-                    .key(object)
-                    .contentType(contentType)
-                    .build();
-            s3.putObject(uploadRequest, RequestBody.fromInputStream(stream, fileSize));
-        } catch (Exception e) {
-            log.error("Cannot upload object {} to bucket {}. Reason: {}", object, bucket, e.getMessage());
-            throw new DlabException(String.format("Cannot upload object %s to bucket %s. Reason: %s", object, bucket, e.getMessage()));
+	    try (S3Client s3 = S3Client.create()) {
+		    PutObjectRequest uploadRequest = PutObjectRequest
+				    .builder()
+				    .bucket(bucket)
+				    .key(object)
+				    .contentType(contentType)
+				    .build();
+		    s3.putObject(uploadRequest, RequestBody.fromInputStream(stream, fileSize));
+	    } catch (Exception e) {
+		    log.error("Cannot upload object {} to bucket {}. Reason: {}", object, bucket, e.getMessage(), e);
+		    throw new DlabException(String.format("Cannot upload object %s to bucket %s. Reason: %s", object, bucket, e.getMessage()));
         }
         log.info("Finished uploading file {} to bucket {}", object, bucket);
     }
@@ -87,60 +85,57 @@ public class BucketServiceAwsImpl implements BucketService {
     @Override
     public void uploadFolder(UserInfo userInfo, String bucket, String folder) {
         log.info("Uploading folder {} to bucket {}", folder, bucket);
-        try {
-            S3Client s3 = S3Client.create();
-            PutObjectRequest uploadRequest = PutObjectRequest
-                    .builder()
-                    .bucket(bucket)
-                    .key(folder)
-                    .build();
-            s3.putObject(uploadRequest, RequestBody.empty());
-        } catch (Exception e) {
-            log.error("Cannot upload folder {} to bucket {}. Reason: {}", folder, bucket, e.getMessage());
-            throw new DlabException(String.format("Cannot upload folder %s to bucket %s. Reason: %s", folder, bucket, e.getMessage()));
-        }
+	    try (S3Client s3 = S3Client.create()) {
+		    PutObjectRequest uploadRequest = PutObjectRequest
+				    .builder()
+				    .bucket(bucket)
+				    .key(folder)
+				    .build();
+		    s3.putObject(uploadRequest, RequestBody.empty());
+	    } catch (Exception e) {
+		    log.error("Cannot upload folder {} to bucket {}. Reason: {}", folder, bucket, e.getMessage(), e);
+		    throw new DlabException(String.format("Cannot upload folder %s to bucket %s. Reason: %s", folder, bucket, e.getMessage()));
+	    }
         log.info("Finished uploading folder {} to bucket {}", folder, bucket);
     }
 
     @Override
     public void downloadObject(String bucket, String object, HttpServletResponse resp) {
         log.info("Downloading file {} from bucket {}", object, bucket);
-        try (ServletOutputStream outputStream = resp.getOutputStream()) {
-            S3Client s3 = S3Client.create();
-            GetObjectRequest downloadRequest = GetObjectRequest
-                    .builder()
-                    .bucket(bucket)
-                    .key(object)
-                    .build();
-            s3.getObject(downloadRequest, ResponseTransformer.toOutputStream(outputStream));
-        } catch (Exception e) {
-            log.error("Cannot download object {} from bucket {}. Reason: {}", object, bucket, e.getMessage());
-            throw new DlabException(String.format("Cannot download object %s from bucket %s. Reason: %s", object, bucket, e.getMessage()));
-        }
+	    try (ServletOutputStream outputStream = resp.getOutputStream(); S3Client s3 = S3Client.create()) {
+		    GetObjectRequest downloadRequest = GetObjectRequest
+				    .builder()
+				    .bucket(bucket)
+				    .key(object)
+				    .build();
+		    s3.getObject(downloadRequest, ResponseTransformer.toOutputStream(outputStream));
+	    } catch (Exception e) {
+		    log.error("Cannot download object {} from bucket {}. Reason: {}", object, bucket, e.getMessage(), e);
+		    throw new DlabException(String.format("Cannot download object %s from bucket %s. Reason: %s", object, bucket, e.getMessage()));
+	    }
         log.info("Finished downloading file {} from bucket {}", object, bucket);
     }
 
     @Override
     public void deleteObjects(String bucket, List<String> objects) {
-        try {
-            S3Client s3 = S3Client.create();
-            List<ObjectIdentifier> objectsToDelete = objects
-                    .stream()
-                    .map(o -> ObjectIdentifier.builder()
-                            .key(o)
-                            .build())
-                    .collect(Collectors.toList());
+	    try (S3Client s3 = S3Client.create()) {
+		    List<ObjectIdentifier> objectsToDelete = objects
+				    .stream()
+				    .map(o -> ObjectIdentifier.builder()
+						    .key(o)
+						    .build())
+				    .collect(Collectors.toList());
 
-            DeleteObjectsRequest deleteObjectsRequests = DeleteObjectsRequest.builder()
-                    .bucket(bucket)
-                    .delete(Delete.builder()
+		    DeleteObjectsRequest deleteObjectsRequests = DeleteObjectsRequest.builder()
+				    .bucket(bucket)
+				    .delete(Delete.builder()
                             .objects(objectsToDelete)
                             .build())
                     .build();
 
             s3.deleteObjects(deleteObjectsRequests);
         } catch (Exception e) {
-            log.error("Cannot delete objects {} from bucket {}. Reason: {}", objects, bucket, e.getMessage());
+		    log.error("Cannot delete objects {} from bucket {}. Reason: {}", objects, bucket, e.getMessage(), e);
             throw new DlabException(String.format("Cannot delete objects %s from bucket %s. Reason: %s", objects, bucket, e.getMessage()));
         }
     }
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/azure/BucketServiceAzureImpl.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/azure/BucketServiceAzureImpl.java
index 1b55711..52163a1 100644
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/azure/BucketServiceAzureImpl.java
+++ b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/azure/BucketServiceAzureImpl.java
@@ -50,7 +50,7 @@ public class BucketServiceAzureImpl implements BucketService {
                     .map(blob -> toBucketDTO(bucket, blob))
                     .collect(Collectors.toList());
         } catch (Exception e) {
-            log.error("Cannot retrieve objects from bucket {}. Reason: {}", bucket, e.getMessage());
+            log.error("Cannot retrieve objects from bucket {}. Reason: {}", bucket, e.getMessage(), e);
             throw new DlabException(String.format("Cannot retrieve objects from bucket %s. Reason: %s", bucket, e.getMessage()));
         }
     }
@@ -64,7 +64,7 @@ public class BucketServiceAzureImpl implements BucketService {
             BlobClient blobClient = blobContainerClient.getBlobClient(object);
             blobClient.upload(stream, fileSize);
         } catch (Exception e) {
-            log.error("Cannot upload object {} to bucket {}. Reason: {}", object, bucket, e.getMessage());
+	        log.error("Cannot upload object {} to bucket {}. Reason: {}", object, bucket, e.getMessage(), e);
             throw new DlabException(String.format("Cannot upload object %s to bucket %s. Reason: %s", object, bucket, e.getMessage()));
         }
         log.info("Finished uploading file {} to bucket {}", object, bucket);
@@ -84,7 +84,7 @@ public class BucketServiceAzureImpl implements BucketService {
             BlobClient blobClient = blobContainerClient.getBlobClient(object);
             blobClient.download(outputStream);
         } catch (Exception e) {
-            log.error("Cannot download object {} from bucket {}. Reason: {}", object, bucket, e.getMessage());
+	        log.error("Cannot download object {} from bucket {}. Reason: {}", object, bucket, e.getMessage(), e);
             throw new DlabException(String.format("Cannot download object %s from bucket %s. Reason: %s", object, bucket, e.getMessage()));
         }
         log.info("Finished downloading file {} from bucket {}", object, bucket);
@@ -97,7 +97,7 @@ public class BucketServiceAzureImpl implements BucketService {
             BlobContainerClient blobContainerClient = blobServiceClient.getBlobContainerClient(bucket);
             objects.forEach(object -> blobContainerClient.getBlobClient(object).delete());
         } catch (Exception e) {
-            log.error("Cannot delete objects {} from bucket {}. Reason: {}", objects, bucket, e.getMessage());
+	        log.error("Cannot delete objects {} from bucket {}. Reason: {}", objects, bucket, e.getMessage(), e);
             throw new DlabException(String.format("Cannot delete objects %s from bucket %s. Reason: %s", objects, bucket, e.getMessage()));
         }
     }
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/gcp/BucketServiceGcpImpl.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/gcp/BucketServiceGcpImpl.java
index 2f0b15a..4a28bf6 100644
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/gcp/BucketServiceGcpImpl.java
+++ b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/gcp/BucketServiceGcpImpl.java
@@ -52,7 +52,7 @@ public class BucketServiceGcpImpl implements BucketService {
                     .map(this::toBucketDTO)
                     .collect(Collectors.toList());
         } catch (Exception e) {
-            log.error("Cannot retrieve objects from bucket {}. Reason: {}", bucket, e.getMessage());
+            log.error("Cannot retrieve objects from bucket {}. Reason: {}", bucket, e.getMessage(), e);
             throw new DlabException(String.format("Cannot retrieve objects from bucket %s. Reason: %s", bucket, e.getMessage()));
         }
     }
@@ -68,7 +68,7 @@ public class BucketServiceGcpImpl implements BucketService {
                     .build();
             storage.create(blobInfo, stream);
         } catch (Exception e) {
-            log.error("Cannot upload object {} to bucket {}. Reason: {}", object, bucket, e.getMessage());
+	        log.error("Cannot upload object {} to bucket {}. Reason: {}", object, bucket, e.getMessage(), e);
             throw new DlabException(String.format("Cannot upload object %s to bucket %s. Reason: %s", object, bucket, e.getMessage()));
         }
         log.info("Finished uploading file {} to bucket {}", object, bucket);
@@ -83,7 +83,7 @@ public class BucketServiceGcpImpl implements BucketService {
             BlobInfo blobInfo = BlobInfo.newBuilder(blobId).build();
             storage.create(blobInfo);
         } catch (Exception e) {
-            log.error("Cannot upload folder {} to bucket {}. Reason: {}", folder, bucket, e.getMessage());
+	        log.error("Cannot upload folder {} to bucket {}. Reason: {}", folder, bucket, e.getMessage(), e);
             throw new DlabException(String.format("Cannot upload folder %s to bucket %s. Reason: %s", folder, bucket, e.getMessage()));
         }
         log.info("Finished uploading folder {} to bucket {}", folder, bucket);
@@ -98,7 +98,7 @@ public class BucketServiceGcpImpl implements BucketService {
             blob.downloadTo(outputStream);
             log.info("Finished downloading file {} from bucket {}", object, bucket);
         } catch (Exception e) {
-            log.error("Cannot download object {} from bucket {}. Reason: {}", object, bucket, e.getMessage());
+	        log.error("Cannot download object {} from bucket {}. Reason: {}", object, bucket, e.getMessage(), e);
             throw new DlabException(String.format("Cannot download object %s from bucket %s. Reason: %s", object, bucket, e.getMessage()));
         }
         log.info("Finished downloading file {} from bucket {}", object, bucket);
@@ -114,7 +114,7 @@ public class BucketServiceGcpImpl implements BucketService {
                     .collect(Collectors.toList());
             storage.delete(blobIds);
         } catch (Exception e) {
-            log.error("Cannot delete objects {} from bucket {}. Reason: {}", objects, bucket, e.getMessage());
+	        log.error("Cannot delete objects {} from bucket {}. Reason: {}", objects, bucket, e.getMessage(), e);
             throw new DlabException(String.format("Cannot delete objects %s from bucket %s. Reason: %s", objects, bucket, e.getMessage()));
         }
     }
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/process/builder/ProcessInfoBuilder.java b/services/provisioning-service/src/main/java/com/epam/dlab/process/builder/ProcessInfoBuilder.java
index f790fea..15a0e1e 100644
--- a/services/provisioning-service/src/main/java/com/epam/dlab/process/builder/ProcessInfoBuilder.java
+++ b/services/provisioning-service/src/main/java/com/epam/dlab/process/builder/ProcessInfoBuilder.java
@@ -38,7 +38,16 @@ import java.util.concurrent.CompletableFuture;
 import java.util.function.Function;
 import java.util.function.Supplier;
 
-import static com.epam.dlab.process.model.ProcessStatus.*;
+import static com.epam.dlab.process.model.ProcessStatus.CREATED;
+import static com.epam.dlab.process.model.ProcessStatus.FAILED;
+import static com.epam.dlab.process.model.ProcessStatus.FINISHED;
+import static com.epam.dlab.process.model.ProcessStatus.KILLED;
+import static com.epam.dlab.process.model.ProcessStatus.LAUNCHING;
+import static com.epam.dlab.process.model.ProcessStatus.REJECTED;
+import static com.epam.dlab.process.model.ProcessStatus.RUNNING;
+import static com.epam.dlab.process.model.ProcessStatus.SCHEDULED;
+import static com.epam.dlab.process.model.ProcessStatus.STOPPED;
+import static com.epam.dlab.process.model.ProcessStatus.TIMEOUT;
 
 @Slf4j
 public class ProcessInfoBuilder implements Supplier<ProcessInfo>, Testing, TimeoutAction, Expireable {
@@ -168,7 +177,7 @@ public class ProcessInfoBuilder implements Supplier<ProcessInfo>, Testing, Timeo
 			try {
 				future.get();
 			} catch (Exception e) {
-				log.error("Exception occurred during getting future result: {}", e.getMessage());
+				log.error("Exception occurred during getting future result: {}", e.getMessage(), e);
 			}
 		});
 	}
@@ -267,14 +276,14 @@ public class ProcessInfoBuilder implements Supplier<ProcessInfo>, Testing, Timeo
 					try {
 						return fPid.getInt(p);
 					} catch (IllegalAccessException e) {
-						log.error("Unable to access PID. {}", e.getMessage());
+						log.error("Unable to access PID. {}", e.getMessage(), e);
 						return -1;
 					}
 				};
 			}
 			return pidSupplier.apply(process);
 		} catch (NoSuchFieldException e) {
-			log.debug("PID field not found");
+			log.debug("PID field not found", e);
 			pidSupplier = p -> -1;
 			return -1;
 		}
diff --git a/services/self-service/pom.xml b/services/self-service/pom.xml
index f21caf9..b5c075b 100644
--- a/services/self-service/pom.xml
+++ b/services/self-service/pom.xml
@@ -257,6 +257,17 @@
                         <exclude>**/*Module.*</exclude>
                         <exclude>**/*Form.*</exclude>
                         <exclude>com/epam/dlab/dto/**/*</exclude>
+                        <exclude>com/epam/dlab/backendapi/auth/**/*</exclude>
+                        <exclude>com/epam/dlab/backendapi/conf/**/*</exclude>
+                        <exclude>com/epam/dlab/backendapi/domain/**/*</exclude>
+                        <exclude>com/epam/dlab/backendapi/dropwizard/**/*</exclude>
+                        <exclude>com/epam/dlab/backendapi/healthcheck/**/*</exclude>
+                        <exclude>com/epam/dlab/backendapi/modules/**/*</exclude>
+                        <exclude>com/epam/dlab/backendapi/resources/dto/**/*</exclude>
+                        <exclude>com/epam/dlab/backendapi/roles/**/*</exclude>
+                        <exclude>com/epam/dlab/backendapi/servlet/guacamole/**/*</exclude>
+                        <exclude>com/epam/dlab/backendapi/util/**/*</exclude>
+                        <exclude>com/epam/dlab/backendapi/validation/**/*</exclude>
                     </excludes>
                 </configuration>
             </plugin>
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/UserRoleDaoImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/UserRoleDaoImpl.java
index e95a41b..c38b3e9 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/UserRoleDaoImpl.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/UserRoleDaoImpl.java
@@ -27,6 +27,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.inject.Singleton;
 import com.mongodb.client.model.BsonField;
 import com.mongodb.client.result.UpdateResult;
+import lombok.extern.slf4j.Slf4j;
 import org.bson.Document;
 import org.bson.conversions.Bson;
 
@@ -53,6 +54,7 @@ import static java.lang.String.format;
 import static java.util.stream.Collectors.toList;
 
 @Singleton
+@Slf4j
 public class UserRoleDaoImpl extends BaseDAO implements UserRoleDao {
 	private static final ObjectMapper MAPPER = new ObjectMapper();
 	private static final String[] DEFAULT_AWS_SHAPES = {"nbShapes_t2.medium_fetching", "compShapes_c4.xlarge_fetching"};
@@ -177,6 +179,7 @@ public class UserRoleDaoImpl extends BaseDAO implements UserRoleDao {
 			return MAPPER.readValue(is, new TypeReference<List<UserRoleDto>>() {
 			});
 		} catch (IOException e) {
+			log.error("Can not marshall dlab roles due to: {}", e.getMessage(), e);
 			throw new IllegalStateException("Can not marshall dlab roles due to: " + e.getMessage());
 		}
 	}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/dropwizard/listeners/MongoStartupListener.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/dropwizard/listeners/MongoStartupListener.java
index d25e2dd..b362acf 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/dropwizard/listeners/MongoStartupListener.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/dropwizard/listeners/MongoStartupListener.java
@@ -71,7 +71,7 @@ public class MongoStartupListener implements ServerLifecycleListener {
 			return MAPPER.readValue(is, new TypeReference<List<UserRoleDto>>() {
 			});
 		} catch (IOException e) {
-			log.error("Can not marshall dlab roles due to: {}", e.getMessage());
+			log.error("Can not marshall dlab roles due to: {}", e.getMessage(), e);
 			throw new IllegalStateException("Can not marshall dlab roles due to: " + e.getMessage());
 		}
 	}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/dropwizard/listeners/RestoreHandlerStartupListener.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/dropwizard/listeners/RestoreHandlerStartupListener.java
index 0de166c..a92cae5 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/dropwizard/listeners/RestoreHandlerStartupListener.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/dropwizard/listeners/RestoreHandlerStartupListener.java
@@ -44,7 +44,7 @@ public class RestoreHandlerStartupListener implements ServerLifecycleListener {
 			endpointService.getEndpointsWithStatus(EndpointDTO.EndpointStatus.ACTIVE)
 					.forEach(e -> provisioningService.post(e.getUrl() + "/handler/restore", StringUtils.EMPTY, Object.class));
 		} catch (Exception e) {
-			log.error("Exception occurred during restore handler request: {}", e.getMessage());
+			log.error("Exception occurred during restore handler request: {}", e.getMessage(), e);
 		}
 	}
 }
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/healthcheck/MongoHealthCheck.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/healthcheck/MongoHealthCheck.java
index 262671c..5ce1b28 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/healthcheck/MongoHealthCheck.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/healthcheck/MongoHealthCheck.java
@@ -38,7 +38,7 @@ public class MongoHealthCheck extends HealthCheck {
 		try {
 			mongoService.ping();
 		} catch (Exception e) {
-			log.error("Mongo is unavailable {}", e.getMessage());
+			log.error("Mongo is unavailable {}", e.getMessage(), e);
 			return Result.unhealthy(e.getMessage());
 		}
 		return Result.healthy();
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/interceptor/BudgetLimitInterceptor.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/interceptor/BudgetLimitInterceptor.java
index ce32e10..a9058bd 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/interceptor/BudgetLimitInterceptor.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/interceptor/BudgetLimitInterceptor.java
@@ -19,7 +19,6 @@
 
 package com.epam.dlab.backendapi.interceptor;
 
-import com.epam.dlab.auth.UserInfo;
 import com.epam.dlab.backendapi.annotation.Project;
 import com.epam.dlab.backendapi.dao.BillingDAO;
 import com.epam.dlab.backendapi.service.BillingService;
@@ -31,7 +30,6 @@ import org.aopalliance.intercept.MethodInvocation;
 
 import java.lang.reflect.Method;
 import java.lang.reflect.Parameter;
-import java.util.Arrays;
 import java.util.Objects;
 import java.util.stream.IntStream;
 
@@ -53,15 +51,6 @@ public class BudgetLimitInterceptor implements MethodInterceptor {
 		}
 	}
 
-	private Boolean userQuoteReached(MethodInvocation mi) {
-		return Arrays.stream(mi.getArguments())
-				.filter(arg -> arg.getClass().equals(UserInfo.class))
-				.findAny()
-				.map(u -> ((UserInfo) u).getName())
-				.map(billingDAO::isUserQuoteReached)
-				.orElse(Boolean.FALSE);
-	}
-
 	private Boolean projectQuoteReached(MethodInvocation mi) {
 
 		final Parameter[] parameters = mi.getMethod().getParameters();
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/KeycloakResource.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/KeycloakResource.java
index e7f8836..142e953 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/KeycloakResource.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/KeycloakResource.java
@@ -11,6 +11,7 @@ import com.epam.dlab.exceptions.DlabException;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.google.inject.Inject;
 import io.dropwizard.auth.Auth;
+import lombok.extern.slf4j.Slf4j;
 import org.keycloak.representations.AccessTokenResponse;
 
 import javax.ws.rs.GET;
@@ -27,6 +28,7 @@ import java.net.URISyntaxException;
 import static java.lang.String.format;
 
 @Path("/oauth")
+@Slf4j
 public class KeycloakResource {
 	private static final String LOGIN_URI_FORMAT = "%s/realms/%s/protocol/openid-connect/auth?client_id=%s" +
 			"&redirect_uri=%s&response_type=code";
@@ -97,6 +99,7 @@ public class KeycloakResource {
 		try {
 			tokenResponse = keycloakService.generateAccessToken(refreshToken);
 		} catch (DlabException e) {
+			log.error("Cannot refresh token due to: {}", e.getMessage(), e);
 			return Response.status(Response.Status.BAD_REQUEST)
 					.location(new URI(logoutUri))
 					.build();
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/schedulers/billing/BillingScheduler.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/schedulers/billing/BillingScheduler.java
index 45563a2..ad3ffcc 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/schedulers/billing/BillingScheduler.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/schedulers/billing/BillingScheduler.java
@@ -46,7 +46,7 @@ public class BillingScheduler implements Job {
         try {
             billingService.updateRemoteBillingData(securityService.getServiceAccountInfo("admin"));
         } catch (Exception e) {
-            log.error("Something went wrong {}", e.getMessage());
+            log.error("Something went wrong {}", e.getMessage(), e);
         }
     }
 }
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/schedulers/endpoint/CheckEndpointStatusScheduler.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/schedulers/endpoint/CheckEndpointStatusScheduler.java
index 5707553..02d109d 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/schedulers/endpoint/CheckEndpointStatusScheduler.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/schedulers/endpoint/CheckEndpointStatusScheduler.java
@@ -50,7 +50,7 @@ public class CheckEndpointStatusScheduler implements Job {
         try {
             endpointService.checkUrl(serviceUser, endpoint.getUrl());
         } catch (Exception e) {
-            log.warn("Failed connecting to endpoint {}, url: '{}'. {}", endpoint.getName(), endpoint.getUrl(), e.getMessage());
+            log.warn("Failed connecting to endpoint {}, url: '{}'. {}", endpoint.getName(), endpoint.getUrl(), e.getMessage(), e);
             return endpoint.getStatus() == EndpointDTO.EndpointStatus.ACTIVE;
         }
         return endpoint.getStatus() == EndpointDTO.EndpointStatus.INACTIVE;
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/BillingServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/BillingServiceImpl.java
index 2bcf644..1b3c208 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/BillingServiceImpl.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/BillingServiceImpl.java
@@ -116,12 +116,12 @@ public class BillingServiceImpl implements BillingService {
         final double sum = billingReportLines.stream().mapToDouble(BillingReportLine::getCost).sum();
         final String currency = billingReportLines.stream().map(BillingReportLine::getCurrency).distinct().count() == 1 ? billingReportLines.get(0).getCurrency() : null;
         return BillingReport.builder()
-                .name("Billing report")
-                .sbn(sbn)
-                .reportLines(billingReportLines)
-                .usageDateFrom(min)
-                .usageDateTo(max)
-                .totalCost(new BigDecimal(sum).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue())
+		        .name("Billing report")
+		        .sbn(sbn)
+		        .reportLines(billingReportLines)
+		        .usageDateFrom(min)
+		        .usageDateTo(max)
+		        .totalCost(BigDecimal.valueOf(sum).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue())
                 .currency(currency)
                 .isReportHeaderCompletable(hasUserBillingRole(user))
                 .build();
@@ -155,9 +155,9 @@ public class BillingServiceImpl implements BillingService {
                 .collect(Collectors.toList());;
         final String currency = billingData.stream().map(BillingReportLine::getCurrency).distinct().count() == 1 ? billingData.get(0).getCurrency() : null;
         return BillingReport.builder()
-                .name(exploratoryName)
-                .reportLines(billingData)
-                .totalCost(new BigDecimal(sum).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue())
+		        .name(exploratoryName)
+		        .reportLines(billingData)
+		        .totalCost(BigDecimal.valueOf(sum).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue())
                 .currency(currency)
                 .build();
     }
@@ -297,16 +297,16 @@ public class BillingServiceImpl implements BillingService {
         billingDAO.save(billingReportLines);
     }
 
-    private List<BillingData> getBillingData(UserInfo userInfo, EndpointDTO e) {
-        try {
-            return provisioningService.get(getBillingUrl(e.getUrl(), BILLING_PATH), userInfo.getAccessToken(),
-                    new GenericType<List<BillingData>>() {
-                    });
-        } catch (Exception ex) {
-            log.error("Cannot retrieve billing information for {}. {}", e.getName(), ex.getMessage());
-            return Collections.emptyList();
-        }
-    }
+	private List<BillingData> getBillingData(UserInfo userInfo, EndpointDTO endpointDTO) {
+		try {
+			return provisioningService.get(getBillingUrl(endpointDTO.getUrl(), BILLING_PATH), userInfo.getAccessToken(),
+					new GenericType<List<BillingData>>() {
+					});
+		} catch (Exception e) {
+			log.error("Cannot retrieve billing information for {} . Reason {}.", endpointDTO.getName(), e.getMessage(), e);
+			return Collections.emptyList();
+		}
+	}
 
     private String getBillingUrl(String endpointUrl, String path) {
         URI uri;
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/BucketServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/BucketServiceImpl.java
index 0d27a86..a8487ba 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/BucketServiceImpl.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/BucketServiceImpl.java
@@ -83,7 +83,7 @@ public class BucketServiceImpl implements BucketService {
             return provisioningService.get(String.format(BUCKET_GET_OBJECTS, endpointDTO.getUrl(), bucket), userInfo.getAccessToken(), new GenericType<List<BucketDTO>>() {
             });
         } catch (Exception e) {
-            log.error("Cannot get objects from bucket {} for user {}, endpoint {}. Reason {}", bucket, userInfo.getName(), endpoint, e.getMessage());
+            log.error("Cannot get objects from bucket {} for user {}, endpoint {}. Reason {}", bucket, userInfo.getName(), endpoint, e.getMessage(), e);
             throw new DlabException(String.format("Cannot get objects from bucket %s for user %s, endpoint %s. Reason %s", bucket, userInfo.getName(), endpoint, e.getMessage()));
         }
     }
@@ -100,7 +100,7 @@ public class BucketServiceImpl implements BucketService {
                 throw new DlabException(String.format("Something went wrong. Response status is %s ", response.getStatus()));
             }
         } catch (Exception e) {
-            log.error("Cannot upload object {} to bucket {} for user {}, endpoint {}. Reason {}", object, bucket, userInfo.getName(), endpoint, e.getMessage());
+	        log.error("Cannot upload object {} to bucket {} for user {}, endpoint {}. Reason {}", object, bucket, userInfo.getName(), endpoint, e.getMessage(), e);
             throw new DlabException(String.format("Cannot upload object %s to bucket %s for user %s, endpoint %s. Reason %s", object, bucket, userInfo.getName(), endpoint, e.getMessage()));
         }
         log.info("Finished uploading file {} for user {} to bucket {}", object, userInfo.getName(), bucket);
@@ -121,7 +121,7 @@ public class BucketServiceImpl implements BucketService {
                 throw new DlabException(String.format("Something went wrong. Response status is %s ", response.getStatus()));
             }
         } catch (Exception e) {
-            log.error("Cannot upload folder {} to bucket {} for user {}, endpoint {}. Reason {}", folder, bucket, userInfo.getName(), endpoint, e.getMessage());
+	        log.error("Cannot upload folder {} to bucket {} for user {}, endpoint {}. Reason {}", folder, bucket, userInfo.getName(), endpoint, e.getMessage(), e);
             throw new DlabException(String.format("Cannot upload object %s to bucket %s for user %s, endpoint %s. Reason %s", folder, bucket, userInfo.getName(), endpoint, e.getMessage()));
         }
         log.info("Finished uploading folder {} for user {} to bucket {}", folder, userInfo.getName(), bucket);
@@ -137,7 +137,7 @@ public class BucketServiceImpl implements BucketService {
             IOUtils.copyLarge(inputStream, outputStream);
             log.info("Finished downloading file {} for user {} from bucket {}", object, userInfo.getName(), bucket);
         } catch (Exception e) {
-            log.error("Cannot upload object {} from bucket {} for user {}, endpoint {}. Reason {}", object, bucket, userInfo.getName(), endpoint, e.getMessage());
+	        log.error("Cannot upload object {} from bucket {} for user {}, endpoint {}. Reason {}", object, bucket, userInfo.getName(), endpoint, e.getMessage(), e);
             throw new DlabException(String.format("Cannot download object %s from bucket %s for user %s, endpoint %s. Reason %s", object, bucket, userInfo.getName(), endpoint, e.getMessage()));
         }
     }
@@ -153,7 +153,7 @@ public class BucketServiceImpl implements BucketService {
                 throw new DlabException(String.format("Something went wrong. Response status is %s ", response.getStatus()));
             }
         } catch (Exception e) {
-            log.error("Cannot delete objects {} from bucket {} for user {}, endpoint {}. Reason {}", objects, bucket, userInfo.getName(), endpoint, e.getMessage());
+	        log.error("Cannot delete objects {} from bucket {} for user {}, endpoint {}. Reason {}", objects, bucket, userInfo.getName(), endpoint, e.getMessage(), e);
             throw new DlabException(String.format("Cannot delete objects %s from bucket %s for user %s, endpoint %s. Reason %s", objects, bucket, userInfo.getName(), endpoint, e.getMessage()));
         }
     }
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ComputationalServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ComputationalServiceImpl.java
index 1bfd0b7..0a87667 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ComputationalServiceImpl.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ComputationalServiceImpl.java
@@ -340,8 +340,7 @@ public class ComputationalServiceImpl implements ComputationalService {
 		try {
 			return Optional.of(computationalDAO.fetchComputationalFields(user, project, exploratoryName, computationalName));
 		} catch (DlabException e) {
-			log.warn("Computational resource {} affiliated with exploratory {} for user {} not found.",
-					computationalName, exploratoryName, user);
+			log.warn("Computational resource {} affiliated with exploratory {} for user {} not found.", computationalName, exploratoryName, user, e);
 		}
 		return Optional.empty();
 	}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/EndpointServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/EndpointServiceImpl.java
index e3ad62c..b92671c 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/EndpointServiceImpl.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/EndpointServiceImpl.java
@@ -148,7 +148,7 @@ public class EndpointServiceImpl implements EndpointService {
 			response = provisioningService.get(url + HEALTH_CHECK, userInfo.getAccessToken(), Response.class);
 			cloudProvider = response.readEntity(CloudProvider.class);
 		} catch (Exception e) {
-            log.error("Cannot connect to url '{}'. {}", url, e.getMessage());
+            log.error("Cannot connect to url '{}'. {}", url, e.getMessage(), e);
             throw new DlabException(String.format("Cannot connect to url '%s'.", url));
         }
 		if (response.getStatus() != 200) {
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ExploratoryServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ExploratoryServiceImpl.java
index e89eda3..a775e74 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ExploratoryServiceImpl.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ExploratoryServiceImpl.java
@@ -229,7 +229,7 @@ public class ExploratoryServiceImpl implements ExploratoryService {
 		try {
 			return Optional.of(exploratoryDAO.fetchExploratoryFields(user, project, exploratoryName));
 		} catch (DlabException e) {
-			log.warn("User instance with exploratory {}, project {} for user {} not found.", exploratoryName, project, user);
+			log.warn("User instance with exploratory {}, project {} for user {} not found.", exploratoryName, project, user, e);
 		}
 		return Optional.empty();
 	}
@@ -239,7 +239,7 @@ public class ExploratoryServiceImpl implements ExploratoryService {
 		try {
 			return Optional.of(exploratoryDAO.fetchExploratoryFields(user, project, exploratoryName, includeCompResources));
 		} catch (DlabException e) {
-			log.warn("User instance with exploratory {}, project {} for user {} not found.", exploratoryName, project, user);
+			log.warn("User instance with exploratory {}, project {} for user {} not found.", exploratoryName, project, user, e);
 		}
 		return Optional.empty();
 	}
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 a6a51bf..d9d8a0d 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
@@ -36,7 +36,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.Optional;
 import java.util.Set;
 import java.util.function.Supplier;
@@ -258,7 +257,7 @@ public class ProjectServiceImpl implements ProjectService {
 		try {
 			project.getEndpoints().forEach(e -> createEndpoint(user, project.getName(), project, e.getName(), String.format(AUDIT_ADD_EDGE_NODE, e.getName(), project.getName())));
 		} catch (Exception e) {
-			log.error("Can not create project due to: {}", e.getMessage());
+			log.error("Can not create project due to: {}", e.getMessage(), e);
 			projectDAO.updateStatus(project.getName(), ProjectDTO.Status.FAILED);
 		}
 	}
@@ -278,7 +277,7 @@ public class ProjectServiceImpl implements ProjectService {
 					requestBuilder.newProjectAction(user, projectName, endpointDTO), String.class);
 			requestId.put(user.getName(), uuid);
 		} catch (Exception e) {
-			log.error("Can not terminate project due to: {}", e.getMessage());
+			log.error("Can not terminate project due to: {}", e.getMessage(), e);
 			projectDAO.updateStatus(projectName, ProjectDTO.Status.FAILED);
 		}
 	}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/servlet/guacamole/GuacamoleServlet.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/servlet/guacamole/GuacamoleServlet.java
index d74c68d..4c1be1e 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/servlet/guacamole/GuacamoleServlet.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/servlet/guacamole/GuacamoleServlet.java
@@ -8,6 +8,7 @@ import com.epam.dlab.exceptions.DlabException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.inject.Inject;
 import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.guacamole.net.GuacamoleTunnel;
 import org.apache.guacamole.servlet.GuacamoleHTTPTunnelServlet;
@@ -19,6 +20,7 @@ import javax.servlet.http.HttpServletResponse;
 import javax.ws.rs.core.HttpHeaders;
 import java.io.IOException;
 
+@Slf4j
 public class GuacamoleServlet extends GuacamoleHTTPTunnelServlet {
 	private static final String UNAUTHORIZED_MSG = "User is not authenticated";
 	private static final String DLAB_PREFIX = "DLab-";
@@ -39,12 +41,11 @@ public class GuacamoleServlet extends GuacamoleHTTPTunnelServlet {
 		try {
 			final String authorization = request.getHeader(DLAB_PREFIX + HttpHeaders.AUTHORIZATION);
 			final String credentials = StringUtils.substringAfter(authorization, AUTH_HEADER_PREFIX);
-			final UserInfo userInfo =
-					securityDAO.getUser(credentials)
-							.orElseThrow(() -> new DlabAuthenticationException(UNAUTHORIZED_MSG));
+			final UserInfo userInfo = getUserInfo(credentials);
 			final CreateTerminalDTO createTerminalDTO = mapper.readValue(request.getReader(), CreateTerminalDTO.class);
 			return guacamoleService.getTunnel(userInfo, createTerminalDTO.getHost(), createTerminalDTO.getEndpoint());
 		} catch (IOException e) {
+			log.error("Cannot read request body. Reason {}", e.getMessage(), e);
 			throw new DlabException("Can not read request body: " + e.getMessage(), e);
 		}
 	}
@@ -54,10 +55,21 @@ public class GuacamoleServlet extends GuacamoleHTTPTunnelServlet {
 		try {
 			super.handleTunnelRequest(request, response);
 		} catch (DlabAuthenticationException e) {
+			log.error(UNAUTHORIZED_MSG, e);
 			sendError(response, HttpStatus.SC_UNAUTHORIZED, HttpStatus.SC_UNAUTHORIZED, UNAUTHORIZED_MSG);
 		}
 	}
 
+	private UserInfo getUserInfo(String credentials) {
+		try {
+			return securityDAO.getUser(credentials)
+					.orElseThrow(() -> new DlabAuthenticationException(UNAUTHORIZED_MSG));
+		} catch (DlabAuthenticationException e) {
+			log.error(UNAUTHORIZED_MSG, e);
+			throw new DlabException(UNAUTHORIZED_MSG);
+		}
+	}
+
 	@Data
 	private static class CreateTerminalDTO {
 		private String host;
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/util/KeycloakUtil.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/util/KeycloakUtil.java
index 63fc62c..25f7a5a 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/util/KeycloakUtil.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/util/KeycloakUtil.java
@@ -16,7 +16,7 @@ public class KeycloakUtil {
             byte[] bytes = Base64Url.decode(parts[1]);
             return JsonSerialization.readValue(bytes, IDToken.class);
         } catch (Exception e) {
-            throw new DlabException("Can not parse token due to: " + e.getMessage());
+            throw new DlabException("Can not parse token due to: " + e.getMessage(), e);
         }
     }
 }


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