Merge branch 'develop' into DATALAB-new-jars-sufix-in-dockerfiles
diff --git a/build.properties b/build.properties
index 275dfaa..622c600 100644
--- a/build.properties
+++ b/build.properties
@@ -16,4 +16,4 @@
 # specific language governing permissions and limitations
 # under the License.
 #
-datalab.version=2.4
\ No newline at end of file
+datalab.version=2.5
\ No newline at end of file
diff --git a/infrastructure-provisioning/src/general/lib/os/fab.py b/infrastructure-provisioning/src/general/lib/os/fab.py
index bb89cd5..844d0a7 100644
--- a/infrastructure-provisioning/src/general/lib/os/fab.py
+++ b/infrastructure-provisioning/src/general/lib/os/fab.py
@@ -1139,7 +1139,8 @@
         attempt = 0
         while attempt < 15:
             print('connection attempt {}'.format(attempt))
-            conn = Connection(host = hostname, user = username, connect_kwargs={'key_filename': keyfile})
+            conn = Connection(host = hostname, user = username, connect_kwargs={'banner_timeout': 200,
+                                                                                'key_filename': keyfile})
             conn.config.run.echo = True
             try:
                 conn.run('ls')
diff --git a/services/datalab-webapp-common/src/main/java/com/epam/datalab/properties/ChangePropertiesConst.java b/services/datalab-webapp-common/src/main/java/com/epam/datalab/properties/ChangePropertiesConst.java
index d4a2c51..ea71207 100644
--- a/services/datalab-webapp-common/src/main/java/com/epam/datalab/properties/ChangePropertiesConst.java
+++ b/services/datalab-webapp-common/src/main/java/com/epam/datalab/properties/ChangePropertiesConst.java
@@ -23,15 +23,15 @@
     String GKE_SELF_SERVICE_PATH = "/root/self-service.yaml";
     String GKE_SELF_SERVICE = "self-service.yaml";
     String SELF_SERVICE = "self-service.yml";
-    //        String SELF_SERVICE_PROP_PATH = "services/self-service/self-service.yml";
     String SELF_SERVICE_PROP_PATH = "/opt/datalab/conf/self-service.yml";
+    //            String SELF_SERVICE_PROP_PATH = "services/self-service/self-service.yml";
     String PROVISIONING_SERVICE = "provisioning.yml";
-    //        String PROVISIONING_SERVICE_PROP_PATH = "services/provisioning-service/provisioning.yml";
     String PROVISIONING_SERVICE_PROP_PATH = "/opt/datalab/conf/provisioning.yml";
+//            String PROVISIONING_SERVICE_PROP_PATH = "services/provisioning-service/provisioning.yml";
 
     String BILLING_SERVICE = "billing.yml";
     String BILLING_SERVICE_PROP_PATH = "/opt/datalab/conf/billing.yml";
-    //    String BILLING_SERVICE_PROP_PATH = "services/billing-gcp/billing.yml";
+    //        String BILLING_SERVICE_PROP_PATH = "services/billing-gcp/billing.yml";
     //      String BILLING_SERVICE_PROP_PATH = "services/billing-azure/billing.yml";
 //    String BILLING_SERVICE_PROP_PATH = "services/billing-aws/billing.yml";
     String GKE_BILLING_PATH = "/root/billing.yaml";
@@ -43,7 +43,7 @@
     String SELF_SERVICE_SUPERVISORCTL_RUN_NAME = " ui ";
     String PROVISIONING_SERVICE_SUPERVISORCTL_RUN_NAME = " provserv ";
     String BILLING_SERVICE_SUPERVISORCTL_RUN_NAME = " billing ";
-    String SECRET_REGEX = "((.*)[sS]ecret(.*)|password): (.*)";
+    String SECRET_REGEX = "((.*)[sS]ecret(.*)|(p|P)assword): (.*)";
     String USER_REGEX = " *(user|username): (.*)";
     String SECRET_REPLACEMENT_FORMAT = " ***********";
     String SUPERVISORCTL_RESTART_SH_COMMAND = "sudo supervisorctl restart";
diff --git a/services/datalab-webapp-common/src/main/java/com/epam/datalab/properties/ChangePropertiesService.java b/services/datalab-webapp-common/src/main/java/com/epam/datalab/properties/ChangePropertiesService.java
index 67f75b4..095b78c 100644
--- a/services/datalab-webapp-common/src/main/java/com/epam/datalab/properties/ChangePropertiesService.java
+++ b/services/datalab-webapp-common/src/main/java/com/epam/datalab/properties/ChangePropertiesService.java
@@ -28,13 +28,13 @@
 import java.io.FileWriter;
 import java.io.IOException;
 import java.nio.charset.Charset;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import static com.epam.datalab.properties.ChangePropertiesConst.DEFAULT_NAME_PLACE;
+import static com.epam.datalab.properties.ChangePropertiesConst.DEFAULT_VALUE_PLACE;
+
 @Slf4j
 public class ChangePropertiesService {
 
@@ -51,21 +51,16 @@
 
 
     public void writeFileFromString(String newPropFile, String serviceName, String servicePath) {
-        String oldFile = readFile(serviceName, servicePath);
-        try (BufferedWriter writer = new BufferedWriter(new FileWriter(servicePath))) {
-            try {
-                changeCHMODE(serviceName, servicePath, ChangePropertiesConst.DEFAULT_CHMOD, ChangePropertiesConst.WRITE_CHMOD);
-                log.info("Trying to overwrite {}, file for path {} :", serviceName, servicePath);
-                writer.write(addLicence());
-                writer.write(checkAndReplaceSecretIfEmpty(newPropFile, oldFile));
-                log.info("{} overwritten successfully", serviceName);
-                writer.close();
-                changeCHMODE(serviceName, servicePath, ChangePropertiesConst.WRITE_CHMOD, ChangePropertiesConst.DEFAULT_CHMOD);
-            } catch (Exception e) {
-                log.error("Failed during overwriting {}", serviceName);
-                writer.write(oldFile);
-                throw new DynamicChangePropertiesException(String.format("Failed during overwriting %s", serviceName));
-            }
+        try {
+            changeCHMODE(serviceName, servicePath, ChangePropertiesConst.DEFAULT_CHMOD, ChangePropertiesConst.WRITE_CHMOD);
+            String oldFile = readFile(serviceName, servicePath);
+            BufferedWriter writer = new BufferedWriter(new FileWriter(servicePath));
+            log.info("Trying to overwrite {}, file for path {} :", serviceName, servicePath);
+            writer.write(addLicence());
+            writer.write(checkAndReplaceSecretIfEmpty(newPropFile, oldFile));
+            log.info("{} overwritten successfully", serviceName);
+            writer.close();
+            changeCHMODE(serviceName, servicePath, ChangePropertiesConst.WRITE_CHMOD, ChangePropertiesConst.DEFAULT_CHMOD);
         } catch (IOException e) {
             log.error("Failed to create writer with path {}", servicePath);
             throw new DynamicChangePropertiesException(String.format("Failed during overwriting %s", serviceName));
@@ -112,31 +107,27 @@
         Matcher passMatcher = Pattern.compile(ChangePropertiesConst.SECRET_REGEX).matcher(currentConf);
         Matcher userMatcher = Pattern.compile(ChangePropertiesConst.USER_REGEX).matcher(currentConf);
         List<String> secretsAndUsers = new ArrayList<>();
-        String confWithReplacedSecretConf = removeLicence(currentConf);
+        final String[] confWithReplacedSecretConf = {removeLicence(currentConf)};
         while (passMatcher.find()) {
-            String secret = passMatcher.group().split(":")[ChangePropertiesConst.DEFAULT_VALUE_PLACE];
-            if (!(secret.isEmpty() || secret.trim().isEmpty()))
-                secretsAndUsers.add(secret);
+            String[] secret = passMatcher.group().split(":");
+            if (!(secret[DEFAULT_VALUE_PLACE].isEmpty() ||
+                    secret[DEFAULT_VALUE_PLACE].trim().isEmpty())) {
+
+                secretsAndUsers.add(secret[DEFAULT_NAME_PLACE] + ":" + secret[DEFAULT_VALUE_PLACE]);
+            }
         }
         while (userMatcher.find()) {
-            String user = userMatcher.group().split(":")[ChangePropertiesConst.DEFAULT_VALUE_PLACE];
-            if (!(user.isEmpty() || user.trim().isEmpty()))
-                secretsAndUsers.add(user);
+            String[] user = userMatcher.group().split(":");
+            if (!(user[DEFAULT_VALUE_PLACE].isEmpty() ||
+                    user[DEFAULT_VALUE_PLACE].trim().isEmpty()))
+                secretsAndUsers.add(user[DEFAULT_NAME_PLACE] + ":" + user[DEFAULT_VALUE_PLACE]);
+
         }
-        for (String secretOrUser : secretsAndUsers) {
-            int start = confWithReplacedSecretConf.indexOf(secretOrUser);
-            int end = confWithReplacedSecretConf.indexOf("\n", start) - 1;
-            boolean isTure;
-            try {
-                String s = confWithReplacedSecretConf.substring(start, end);
-                isTure = s.equals(secretOrUser);
-            } catch (StringIndexOutOfBoundsException e) {
-                isTure = true;
-            }
-            if (isTure)
-                confWithReplacedSecretConf = confWithReplacedSecretConf.replace(secretOrUser, ChangePropertiesConst.SECRET_REPLACEMENT_FORMAT);
-        }
-        return confWithReplacedSecretConf;
+        secretsAndUsers.forEach(x -> {
+            String toReplace = x.split(":")[DEFAULT_NAME_PLACE] + ":" + ChangePropertiesConst.SECRET_REPLACEMENT_FORMAT;
+            confWithReplacedSecretConf[0] = confWithReplacedSecretConf[0].replace(x, toReplace);
+        });
+        return confWithReplacedSecretConf[0];
     }
 
     private String removeLicence(String conf) {
@@ -160,11 +151,11 @@
     }
 
     private String checkAndReplaceSecretIfEmpty(String newPropFile, String oldProf) {
-        Map<String, String> emptySecretsAndUserNames = findEmptySecretAndNames(newPropFile);
-        return emptySecretsAndUserNames.isEmpty() ? newPropFile : replaceEmptySecret(newPropFile, oldProf, emptySecretsAndUserNames);
+        Map<String, Queue<String>> emptySecretsAndUserNames = findEmptySecretAndNames(newPropFile);
+        return emptySecretsAndUserNames.isEmpty() ? newPropFile : replaceOldSecret(newPropFile, oldProf, emptySecretsAndUserNames);
     }
 
-    private String replaceEmptySecret(String newPropFile, String oldProf, Map<String, String> emptySecrets) {
+    private String replaceOldSecret(String newPropFile, String oldProf, Map<String, Queue<String>> emptySecrets) {
         String fileWithReplacedEmptySecrets = newPropFile;
         Matcher oldPassMatcher = Pattern.compile(ChangePropertiesConst.SECRET_REGEX).matcher(oldProf);
         Matcher oldUserMatcher = Pattern.compile(ChangePropertiesConst.USER_REGEX).matcher(oldProf);
@@ -172,33 +163,64 @@
         while (oldPassMatcher.find()) {
             String[] s = oldPassMatcher.group().split(":");
             if (emptySecrets.containsKey(s[ChangePropertiesConst.DEFAULT_NAME_PLACE])) {
-                fileWithReplacedEmptySecrets = fileWithReplacedEmptySecrets.replace(emptySecrets.get(s[ChangePropertiesConst.DEFAULT_NAME_PLACE]), oldPassMatcher.group());
+
+                String poll = emptySecrets.get(s[DEFAULT_NAME_PLACE]).poll();
+                if (poll != null) {
+                    poll = poll.replace("*", "\\*");
+                    String old = oldPassMatcher.group();
+                    old = old.replace("$", "\\$");
+                    old = old.replace("{", "\\}");
+                    old = old.replace("}", "\\}");
+                    fileWithReplacedEmptySecrets = fileWithReplacedEmptySecrets.replaceFirst(poll, old);
+                }
             }
         }
         while (oldUserMatcher.find()) {
             String[] s = oldUserMatcher.group().split(":");
             if (emptySecrets.containsKey(s[ChangePropertiesConst.DEFAULT_NAME_PLACE])) {
-                fileWithReplacedEmptySecrets = fileWithReplacedEmptySecrets.replace(emptySecrets.get(s[ChangePropertiesConst.DEFAULT_NAME_PLACE]), oldUserMatcher.group());
+                String poll = emptySecrets.get(s[DEFAULT_NAME_PLACE]).poll();
+                if (poll != null) {
+                    poll = poll.replace("*", "\\*");
+                    String old = oldUserMatcher.group();
+                    old = old.replace("$", "\\$");
+                    old = old.replace("{", "\\}");
+                    old = old.replace("}", "\\}");
+                    fileWithReplacedEmptySecrets = fileWithReplacedEmptySecrets.replaceFirst(poll, old);
+                }
             }
         }
         return fileWithReplacedEmptySecrets;
     }
 
-    private Map<String, String> findEmptySecretAndNames(String newPropFile) {
+    private Map<String, Queue<String>> findEmptySecretAndNames(String newPropFile) {
         Matcher passMatcher = Pattern.compile(ChangePropertiesConst.SECRET_REGEX).matcher(newPropFile);
         Matcher userNameMatcher = Pattern.compile(ChangePropertiesConst.USER_REGEX).matcher(newPropFile);
-        Map<String, String> emptySecrets = new HashMap<>();
+        Map<String, Queue<String>> emptySecrets = new HashMap<>();
         while (passMatcher.find()) {
             String[] s = passMatcher.group().split(":");
-            if (s[ChangePropertiesConst.DEFAULT_VALUE_PLACE].equals(ChangePropertiesConst.SECRET_REPLACEMENT_FORMAT)) {
-                emptySecrets.put(s[ChangePropertiesConst.DEFAULT_NAME_PLACE], passMatcher.group());
+            if (s[DEFAULT_VALUE_PLACE].equals(ChangePropertiesConst.SECRET_REPLACEMENT_FORMAT)) {
+                if (emptySecrets.get(s[DEFAULT_NAME_PLACE]) == null) {
+                    Queue<String> values = new ArrayDeque<>();
+                    values.add(passMatcher.group());
+                    emptySecrets.put(s[ChangePropertiesConst.DEFAULT_NAME_PLACE], values);
+                } else {
+                    Queue<String> values = emptySecrets.get(s[DEFAULT_NAME_PLACE]);
+                    values.add(passMatcher.group());
+                }
             }
         }
 
         while (userNameMatcher.find()) {
             String[] s = userNameMatcher.group().split(":");
-            if (s[ChangePropertiesConst.DEFAULT_VALUE_PLACE].equals(ChangePropertiesConst.SECRET_REPLACEMENT_FORMAT)) {
-                emptySecrets.put(s[ChangePropertiesConst.DEFAULT_NAME_PLACE], userNameMatcher.group());
+            if (s[DEFAULT_VALUE_PLACE].equals(ChangePropertiesConst.SECRET_REPLACEMENT_FORMAT)) {
+                if (emptySecrets.get(s[DEFAULT_NAME_PLACE]) == null) {
+                    Queue<String> values = new ArrayDeque<>();
+                    values.add(userNameMatcher.group());
+                    emptySecrets.put(s[ChangePropertiesConst.DEFAULT_NAME_PLACE], values);
+                } else {
+                    Queue<String> values = emptySecrets.get(s[DEFAULT_NAME_PLACE]);
+                    values.add(userNameMatcher.group());
+                }
             }
         }
         return emptySecrets;
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ComputationalCallbackHandler.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ComputationalCallbackHandler.java
index 99b5f0e..416eda7 100644
--- a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ComputationalCallbackHandler.java
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ComputationalCallbackHandler.java
@@ -75,15 +75,12 @@
 
     @Override
     protected ComputationalStatusDTO parseOutResponse(JsonNode resultNode, ComputationalStatusDTO baseStatus) {
-        log.info("TEST LOG!!!: parseOutResponse :\n resultNode: {}", resultNode);
 
         if (resultNode == null) {
             return baseStatus;
         }
         baseStatus.withComputationalUrl(extractUrl(resultNode));
         baseStatus.withLastActivity(Date.from(Instant.now()));
-        log.info("TEST LOG!!!: base status: {}", baseStatus);
-        log.info("TEST LOG!!!: getAction: {}", getAction());
 
         if (DockerAction.CREATE == getAction()) {
             baseStatus
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/EdgeCallbackHandler.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/EdgeCallbackHandler.java
index af218c1..22ffa31 100644
--- a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/EdgeCallbackHandler.java
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/EdgeCallbackHandler.java
@@ -59,7 +59,6 @@
     }
 
     protected T parseOutResponse(JsonNode resultNode, T baseStatus) {
-        log.info("TEST LOG!!!: edge callback: resultNode: {}, baseStatus: {}", resultNode, baseStatus);
         if (resultNode != null && (getAction() == DockerAction.CREATE || getAction() == DockerAction.START)
                 && UserInstanceStatus.of(baseStatus.getStatus()) != UserInstanceStatus.FAILED) {
             try {
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ProjectCallbackHandler.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ProjectCallbackHandler.java
index 1fd151a..a0c699e 100644
--- a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ProjectCallbackHandler.java
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ProjectCallbackHandler.java
@@ -57,20 +57,15 @@
 
     @Override
     protected ProjectResult parseOutResponse(JsonNode resultNode, ProjectResult baseStatus) {
-        log.info("TEST LOG!!!: resultNoe: {}, projectResult: {} , projectName: {}, endpointName: {}"
-                , resultNode, baseStatus, projectName, endpointName);
 
         baseStatus.setProjectName(projectName);
         baseStatus.setEndpointName(endpointName);
         if (resultNode != null &&
                 Arrays.asList(DockerAction.CREATE, DockerAction.RECREATE, DockerAction.START).contains(getAction()) &&
                 UserInstanceStatus.of(baseStatus.getStatus()) != UserInstanceStatus.FAILED) {
-            log.info("TEST LOG!!!: result!=null, dockerAction = create,recreate");
             try {
                 final EdgeInfo projectEdgeInfo = mapper.readValue(resultNode.toString(), clazz);
-                log.info("TEST LOG!!!: edgeInfo:{}", projectEdgeInfo);
                 baseStatus.setEdgeInfo(projectEdgeInfo);
-                log.info("TEST LOG!!!: baseStatus:{}", baseStatus);
             } catch (IOException e) {
                 throw new DatalabException("Cannot parse the EDGE info in JSON: " + e.getLocalizedMessage(), e);
             }
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ResourceCallbackHandler.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ResourceCallbackHandler.java
index 94909be..677a658 100644
--- a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ResourceCallbackHandler.java
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ResourceCallbackHandler.java
@@ -104,8 +104,6 @@
         debugMessage("Send post request to self service {} for UUID {}, object is {}",
                 getCallbackURI(), uuid, object);
         try {
-            log.info("TEST LOG!!!: post to ss. SS: {}, uri: {}, obj: {}, resultType: {}"
-                    , selfService, getCallbackURI(), object, resultType);
             selfService.post(getCallbackURI(), object, resultType);
         } catch (Exception e) {
             log.error("{} Send request or response error for UUID {}: {}", this.getClass().toString(), uuid, e.getLocalizedMessage(), e);
@@ -131,7 +129,6 @@
             result.setErrorMessage(getTextValue(resultNode.get(ERROR_NODE)));
         }
         result = parseOutResponse(resultNode, result);
-        log.info("TEST LOG!!!: send to ss: {}", result);
         selfServicePost(result);
         return !UserInstanceStatus.FAILED.equals(status);
     }
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/dao/FileSystemCallbackHandlerDao.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/dao/FileSystemCallbackHandlerDao.java
index 002b498..6e39555 100644
--- a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/dao/FileSystemCallbackHandlerDao.java
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/dao/FileSystemCallbackHandlerDao.java
@@ -111,7 +111,6 @@
     }
 
     private Optional<PersistentFileHandler> toPersistentFileHandler(Path path) {
-        log.info("TEST LOG!!!: path: {}",path);
         try {
             return Optional.of(mapper.readValue(path.toFile(), PersistentFileHandler.class));
         } catch (Exception e) {
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/base/ExploratoryService.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/base/ExploratoryService.java
index 58aa0db..1399579 100644
--- a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/base/ExploratoryService.java
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/base/ExploratoryService.java
@@ -43,8 +43,6 @@
                 configuration.getResourceStatusPollTimeout(),
                 getFileHandlerCallback(action, uuid, dto));
 
-        log.info("TEST LOG!!!: dto: {}", dto);
-
         RunDockerCommand runDockerCommand = new RunDockerCommand()
                 .withInteractive()
                 .withName(nameContainer(dto.getEdgeUserName(), action, dto.getExploratoryName()))
@@ -56,7 +54,6 @@
                 .withConfKeyName(configuration.getAdminKey())
                 .withImage(dto.getNotebookImage())
                 .withAction(action);
-        log.info("TEST LOG!!!: command: {}", runDockerCommand);
 
         if (configuration.getCloudProvider() == CloudProvider.AZURE &&
                 Objects.nonNull(configuration.getCloudConfiguration().getAzureAuthFile()) &&
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/ChangePropertiesResource.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/ChangePropertiesResource.java
index 0e6d032..048b099 100644
--- a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/ChangePropertiesResource.java
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/ChangePropertiesResource.java
@@ -59,7 +59,6 @@
     public Response getAllPropertiesForEndpoint(@Auth UserInfo userInfo, @QueryParam("endpoint") String endpoint) {
         if (UserRoles.isAdmin(userInfo)) {
             String url = findEndpointDTOUrl(endpoint) + ChangePropertiesConst.BASE_CONFIG_URL;
-            log.info("TEST LOG: on /multiple method, url for the next step: {}", url);
             return Response
                     .ok(externalChangeProperties.getPropertiesWithExternal(endpoint, userInfo, url))
                     .build();
@@ -94,7 +93,6 @@
     public Response overwriteExternalProvisioningServiceProperties(@Auth UserInfo userInfo, YmlDTO ymlDTO) {
         if (UserRoles.isAdmin(userInfo)) {
             String url = findEndpointDTOUrl(ymlDTO.getEndpointName()) + BASE_CONFIG_URL;
-            log.info("TEST LOG: on /multiple method, url for the next step: {}", url);
             externalChangeProperties.overwritePropertiesWithExternal(PROVISIONING_SERVICE_PROP_PATH, PROVISIONING_SERVICE,
                     ymlDTO, userInfo, url);
             return Response.status(Response.Status.OK).build();
@@ -110,7 +108,6 @@
     public Response overwriteExternalBillingProperties(@Auth UserInfo userInfo, YmlDTO ymlDTO) {
         if (UserRoles.isAdmin(userInfo)) {
             String url = findEndpointDTOUrl(ymlDTO.getEndpointName()) + BASE_CONFIG_URL;
-            log.info("TEST LOG: on /multiple method, url for the next step: {}", url);
             externalChangeProperties.overwritePropertiesWithExternal(BILLING_SERVICE_PROP_PATH, BILLING_SERVICE,
                     ymlDTO, userInfo, url);
             return Response.status(Response.Status.OK).build();
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/callback/ComputationalCallback.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/callback/ComputationalCallback.java
index cb7e1a7..74c5910 100644
--- a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/callback/ComputationalCallback.java
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/callback/ComputationalCallback.java
@@ -66,7 +66,6 @@
     @POST
     @Path(ApiCallbacks.STATUS_URI)
     public Response status(ComputationalStatusDTO dto) {
-        log.info("TEST LOG!!!: status: {}", dto);
 
         log.debug("Updating status for computational resource {} for user {}: {}",
                 dto.getComputationalName(), dto.getUser(), dto);
@@ -80,7 +79,6 @@
                                         "project %s for user %s doesn't exist", dto.getComputationalName(),
                                 dto.getExploratoryName(), dto.getProject(), dto.getUser())));
 
-        log.info("TEST LOG!!!: compResource: {}", compResource);
 
         log.info("Current status for computational resource {} of exploratory environment {} for user {} is {}",
                 dto.getComputationalName(), dto.getExploratoryName(), dto.getUser(),
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/callback/ProjectCallback.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/callback/ProjectCallback.java
index be8f076..d8c70d9 100644
--- a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/callback/ProjectCallback.java
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/callback/ProjectCallback.java
@@ -65,9 +65,6 @@
     @POST
     public Response updateProjectStatus(ProjectResult projectResult) {
         try {
-
-            log.info("TEST LOG!!!: projectResult: {}", projectResult);
-
             requestId.checkAndRemove(projectResult.getRequestId());
             final String projectName = projectResult.getProjectName();
             final UserInstanceStatus status = UserInstanceStatus.of(projectResult.getStatus());
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/ComputationalServiceImpl.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/ComputationalServiceImpl.java
index 2da87a3..2595c21 100644
--- a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/ComputationalServiceImpl.java
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/ComputationalServiceImpl.java
@@ -175,7 +175,6 @@
             final DataEngineType dataEngineType = compResource.getDataEngineType();
             EndpointDTO endpointDTO = endpointService.get(userInstanceDTO.getEndpoint());
             ComputationalTerminateDTO dto = requestBuilder.newComputationalTerminate(resourceCreator, userInstanceDTO, compResource, endpointDTO);
-            log.info("!!!TEST LOG!!!: terminate dto: {}", dto);
 
             final String provisioningUrl = Optional.ofNullable(DATA_ENGINE_TYPE_TERMINATE_URLS.get(dataEngineType))
                     .orElseThrow(UnsupportedOperationException::new);
@@ -205,13 +204,9 @@
         boolean isAdded = computationalDAO.addComputational(userInfo.getName(), formDTO.getNotebookName(), project,
                 computationalResource);
 
-        log.info("TEST LOG!!!: isAdded: {}", isAdded);
-
         if (isAdded) {
             try {
                 EndpointDTO endpointDTO = endpointService.get(instance.getEndpoint());
-                log.info("TEST LOG!!!: send to prov");
-
                 String uuid =
                         provisioningService.post(endpointDTO.getUrl() + COMPUTATIONAL_CREATE_CLOUD_SPECIFIC,
                                 userInfo.getAccessToken(),
@@ -353,8 +348,6 @@
                 .withStatus(status);
 
         UpdateResult updateResult = computationalDAO.updateComputationalStatus(computationalStatus);
-        log.info("!!!TEST LOG!!!: after update: {}", updateResult);
-
     }
 
     private SparkStandaloneClusterResource createInitialComputationalResource(SparkStandaloneClusterCreateForm form) {
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/ExploratoryServiceImpl.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/ExploratoryServiceImpl.java
index 073e49c..f5e148d 100644
--- a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/ExploratoryServiceImpl.java
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/ExploratoryServiceImpl.java
@@ -124,7 +124,6 @@
             isAdded = true;
             final ExploratoryGitCredsDTO gitCreds = gitCredsDAO.findGitCreds(userInfo.getName());
             log.debug("Created exploratory environment {} for user {}", exploratory.getName(), userInfo.getName());
-            log.info("TEST LOG!!!: send to provserv: {}", exploratory);
             final String uuid =
                     provisioningService.post(endpointDTO.getUrl() + EXPLORATORY_CREATE,
                             userInfo.getAccessToken(),
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/InfrastructureInfoServiceImpl.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/InfrastructureInfoServiceImpl.java
index 09d05b9..fe2f340 100644
--- a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/InfrastructureInfoServiceImpl.java
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/InfrastructureInfoServiceImpl.java
@@ -130,11 +130,6 @@
     @Override
     public InfrastructureMetaInfoDTO getInfrastructureMetaInfo() {
         final String branch = Manifests.read("GIT-Branch");
-        log.info("TEST LOG!!!: Mainfests: {}, branch: {}", Manifests.DEFAULT, branch);
-        log.info("TEST LOG!!!: Git-Commit: {} ", Manifests.read("GIT-Commit"));
-        log.info("TEST LOG!!!: Datalab-Version: {}", Manifests.read("DataLab-Version"));
-        log.info("TEST LOG!!!: RELEASE_NOTES_FORMAT: {}", RELEASE_NOTES_FORMAT);
-
         return InfrastructureMetaInfoDTO.builder()
                 .branch(branch)
                 .commit(Manifests.read("GIT-Commit"))
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/util/RequestBuilder.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/util/RequestBuilder.java
index 0dc1a2a..ad50429 100644
--- a/services/self-service/src/main/java/com/epam/datalab/backendapi/util/RequestBuilder.java
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/util/RequestBuilder.java
@@ -184,7 +184,6 @@
                 .withGPUCount(exploratory.getGpuCount())
                 .withGPUType(exploratory.getGpuType())
                 .withEnabledGPU(exploratory.getEnabledGPU());
-        System.out.println("TEST LOG!!!! send to prov: + " + t.toString());
         return t;
     }
 
@@ -337,8 +336,6 @@
                                                                      UserInstanceDTO userInstance,
                                                                      ComputationalCreateFormDTO form,
                                                                      EndpointDTO endpointDTO) {
-        log.info("TEST LOG!!!: newComputationalCreate: \n form: {}", form);
-
         T computationalCreate;
         CloudProvider cloudProvider = endpointDTO.getCloudProvider();
         switch (cloudProvider) {
@@ -355,8 +352,6 @@
                         .withVersion(awsForm.getVersion())
                         .withConfig((awsForm.getConfig()))
                         .withSharedImageEnabled(String.valueOf(projectDTO.isSharedImageEnabled()));
-                log.info("TEST LOG!!!: computationalCreate: {}", computationalCreate);
-
                 break;
             case GCP:
                 GcpComputationalCreateForm gcpForm = (GcpComputationalCreateForm) form;
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/BillingServiceImplTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/BillingServiceImplTest.java
index c32cd4c..672bc2e 100644
--- a/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/BillingServiceImplTest.java
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/BillingServiceImplTest.java
@@ -66,6 +66,7 @@
 import java.util.StringJoiner;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.anyBoolean;
 import static org.mockito.Matchers.anyListOf;
@@ -82,7 +83,7 @@
     private static final String PROJECT_2 = "project2";
     private static final String ENDPOINT = "endpoint";
     private static final String USAGE_DATE = "2020-06-00";
-    private static final String USAGE_DATE_FORMATTED = "2020-06";
+    private static final String USAGE_DATE_FORMATTED = "2020-06-00";
     private static final String SERVICE_BASE_NAME = "sbn";
     private static final String IMAGE_NAME = "image_name";
     private static final String IMAGE_DESCRIPTION = "imageDescription";
@@ -178,6 +179,13 @@
         when(exploratoryService.getUserInstance(anyString(), anyString(), anyString(), anyBoolean())).thenReturn(Optional.of(getUserInstanceDTOWithCompute()));
 
 	    String actualBillingReport = billingService.downloadReport(getUserInfo(), new ExportBillingFilter(), "en-US");
+String get = getDownloadReport();
+        char[] chars1 = getDownloadReport().toCharArray();
+        char[] chars2 = actualBillingReport.toCharArray();
+        for (int i = 0; i < getDownloadReport().length(); i++) {
+            if (chars1[i] != chars2[i])
+                System.out.println(chars1[i] + " = " + chars2[i] + "  i = " + i);
+        }
 
 	    assertEquals("reports should be equal", getDownloadReport(), actualBillingReport);
 	    verify(billingDAO).aggregateBillingData(new ExportBillingFilter());
@@ -679,16 +687,16 @@
     private String getDownloadReport() {
 	    StringBuilder sb = new StringBuilder();
 	    sb.append("\"Service base name: ").append(SERVICE_BASE_NAME).append(". Available reporting period from: ").append("Jan 1, 2020")
-			    .append(" to: ").append("May 1, 2020").append("\"\n");
+			    .append(" to: ").append("May 1, 2020").append("\"\r\n");
 
 	    sb.append(new StringJoiner(",").add("DataLab ID").add("User").add("Project").add("DataLab Resource Type").add("Status").add("Shape").add("Product")
-			    .add("Cost\n").toString());
+			    .add("Cost\r\n").toString());
 
-	    sb.append(new StringJoiner(",").add(EDGE_ID_1).add(USER).add(PROJECT).add("Edge").add("running").add(SHAPE).add(PRODUCT).add(1.999 + "\n"));
-	    sb.append(new StringJoiner(",").add(EXPLORATORY_ID).add(USER).add(PROJECT).add("Exploratory").add("failed").add(SHAPE).add(PRODUCT).add(1.0 + "\n"));
-	    sb.append(new StringJoiner(",").add(COMPUTE_ID).add(USER).add(PROJECT).add("Computational").add("creating").add(SHAPE).add(PRODUCT).add(1.0 + "\n"));
+	    sb.append(new StringJoiner(",").add(EDGE_ID_1).add(USER).add(PROJECT).add("Edge").add("running").add(SHAPE).add(PRODUCT).add(1.999 + "\r\n"));
+	    sb.append(new StringJoiner(",").add(EXPLORATORY_ID).add(USER).add(PROJECT).add("Exploratory").add("failed").add(SHAPE).add(PRODUCT).add(1.0 + "\r\n"));
+	    sb.append(new StringJoiner(",").add(COMPUTE_ID).add(USER).add(PROJECT).add("Computational").add("creating").add(SHAPE).add(PRODUCT).add(1.0 + "\r\n"));
 
-	    sb.append(",,,,,,,Total: 4.0 currency\n");
+	    sb.append(",,,,,,,Total: 4.0 currency\r\n");
 
         return sb.toString();
     }
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/ComputationalServiceImplTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/ComputationalServiceImplTest.java
index 0452841..fe74a7a 100644
--- a/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/ComputationalServiceImplTest.java
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/ComputationalServiceImplTest.java
@@ -248,7 +248,8 @@
 
         SparkStandaloneClusterCreateForm form = (SparkStandaloneClusterCreateForm) formList.get(0);
         try {
-            computationalService.createSparkCluster(userInfo, form.getName(), form, PROJECT, String.format(AUDIT_MESSAGE, form.getNotebookName()));
+            computationalService.createSparkCluster(userInfo, form.getName(),
+                    form, PROJECT, String.format(AUDIT_MESSAGE, form.getNotebookName()));
         } catch (DatalabException e) {
             assertEquals("Cannot create instance of resource class ", e.getMessage());
         }
@@ -729,6 +730,7 @@
         sparkClusterForm.setProject(PROJECT);
         sparkClusterForm.setDataEngineInstanceCount(String.valueOf(2));
         sparkClusterForm.setImage("dataengine");
+        sparkClusterForm.setEnabledGPU(Boolean.FALSE);
         ComputationalCreateFormDTO desClusterForm = new ComputationalCreateFormDTO();
         desClusterForm.setNotebookName(EXPLORATORY_NAME);
         desClusterForm.setName(COMP_NAME);
@@ -751,7 +753,9 @@
                 .imageName("dataengine")
                 .status(CREATING.toString())
                 .dataEngineInstanceCount(String.valueOf(2))
+                .totalInstanceCount(2)
                 .tags(Collections.emptyMap())
+                .enabledGPU(Boolean.FALSE)
                 .build();
     }
 
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/EnvironmentServiceImplTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/EnvironmentServiceImplTest.java
index 9b68de7..c7d0795 100644
--- a/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/EnvironmentServiceImplTest.java
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/EnvironmentServiceImplTest.java
@@ -327,9 +327,9 @@
     public void updateEnvironmentStatuses() {
         environmentService.updateEnvironmentStatuses(getEnvResourceList());
 
-        verify(projectService).updateAfterStatusCheck(getSystemUser(), PROJECT, ENDPOINT, INSTANCE_ID, UserInstanceStatus.of(STATUS), AUDIT_UPDATE_STATUS);
-        verify(exploratoryService).updateAfterStatusCheck(getSystemUser(), PROJECT, ENDPOINT, NAME, INSTANCE_ID, UserInstanceStatus.of(STATUS), AUDIT_UPDATE_STATUS);
-        verify(computationalService).updateAfterStatusCheck(getSystemUser(), PROJECT, ENDPOINT, NAME, INSTANCE_ID, UserInstanceStatus.of(STATUS), AUDIT_UPDATE_STATUS);
+        verify(projectService,times(2)).updateAfterStatusCheck(getSystemUser(), PROJECT, ENDPOINT, INSTANCE_ID, UserInstanceStatus.of(STATUS), AUDIT_UPDATE_STATUS);
+        verify(exploratoryService,times(2)).updateAfterStatusCheck(getSystemUser(), PROJECT, ENDPOINT, NAME, INSTANCE_ID, UserInstanceStatus.of(STATUS), AUDIT_UPDATE_STATUS);
+        verify(computationalService,times(2)).updateAfterStatusCheck(getSystemUser(), PROJECT, ENDPOINT, NAME, INSTANCE_ID, UserInstanceStatus.of(STATUS), AUDIT_UPDATE_STATUS);
         verifyNoMoreInteractions(projectService, exploratoryService, computationalService);
     }
 
@@ -337,6 +337,7 @@
     public void updateEnvironmentStatusesWithUnknownStatus() {
         EnvResourceList envResourceList = EnvResourceList.builder()
                 .hostList(Collections.singletonList(new EnvResource().withStatus("unknown status")))
+                .clusterList(Collections.singletonList(new EnvResource().withStatus("unknown status")))
                 .build();
 
         environmentService.updateEnvironmentStatuses(envResourceList);
@@ -351,8 +352,11 @@
     private EnvResourceList getEnvResourceList() {
         List<EnvResource> hostList = Arrays.asList(getEnvResource(ResourceType.EDGE), getEnvResource(ResourceType.EXPLORATORY),
                 getEnvResource(ResourceType.COMPUTATIONAL));
+        List<EnvResource> clusterList = Arrays.asList(getEnvResource(ResourceType.EDGE), getEnvResource(ResourceType.EXPLORATORY),
+                getEnvResource(ResourceType.COMPUTATIONAL));
         return  EnvResourceList.builder()
                 .hostList(hostList)
+                .clusterList(clusterList)
                 .build();
     }
 
@@ -388,6 +392,7 @@
                 .endpoint(ENDPOINT_NAME)
                 .cloudProvider("aws")
                 .exploratoryUrls(null)
+                .gpuEnabled(Boolean.FALSE)
                 .build();
     }
 
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/ExploratoryServiceImplTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/ExploratoryServiceImplTest.java
index 1af7730..e18d576 100644
--- a/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/ExploratoryServiceImplTest.java
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/ExploratoryServiceImplTest.java
@@ -298,7 +298,12 @@
         when(gitCredsDAO.findGitCreds(anyString())).thenReturn(egcDto);
 
         ExploratoryCreateDTO ecDto = new ExploratoryCreateDTO();
-        Exploratory exploratory = Exploratory.builder().name(EXPLORATORY_NAME).endpoint("test").build();
+        Exploratory exploratory = Exploratory.builder()
+                .name(EXPLORATORY_NAME)
+                .endpoint("test")
+                .enabledGPU(false)
+                .version("someVersion")
+                .build();
         when(requestBuilder.newExploratoryCreate(any(ProjectDTO.class), any(EndpointDTO.class),
                 any(Exploratory.class), any(UserInfo.class), any(ExploratoryGitCredsDTO.class), anyMapOf(String.class, String.class))).thenReturn(ecDto);
         String exploratoryCreate = "exploratory/create";
@@ -312,6 +317,7 @@
 
         userInstance.withStatus("creating");
         userInstance.withResources(Collections.emptyList());
+        userInstance.withImageVersion("someVersion");
         verify(projectService).get("project");
         verify(exploratoryDAO).insertExploratory(userInstance);
         verify(gitCredsDAO).findGitCreds(USER);
@@ -330,7 +336,11 @@
         expectedException.expectMessage("Could not create exploratory environment expName for user test: " +
                 "Exploratory for user with name not found");
 
-        Exploratory exploratory = Exploratory.builder().name(EXPLORATORY_NAME).build();
+        Exploratory exploratory = Exploratory.builder()
+                .name(EXPLORATORY_NAME)
+                .enabledGPU(false)
+                .version("someVersion")
+                .build();
         exploratoryService.create(userInfo, exploratory, "project", "exploratory");
         verify(endpointService).get(anyString());
     }
@@ -339,7 +349,13 @@
     public void createWhenMethodInsertExploratoryThrowsExceptionWithItsCatching() {
         when(endpointService.get(anyString())).thenReturn(endpointDTO());
         doThrow(new RuntimeException()).when(exploratoryDAO).insertExploratory(any(UserInstanceDTO.class));
-        Exploratory exploratory = Exploratory.builder().name(EXPLORATORY_NAME).endpoint("test").build();
+        Exploratory exploratory = Exploratory
+                .builder()
+                .name(EXPLORATORY_NAME)
+                .endpoint("test")
+                .enabledGPU(false)
+                .version("someVersion")
+                .build();
         try {
             exploratoryService.create(userInfo, exploratory, "project", "exploratory");
         } catch (DatalabException e) {
@@ -348,6 +364,7 @@
         }
         userInstance.withStatus("creating");
         userInstance.withResources(Collections.emptyList());
+        userInstance.withImageVersion("someVersion");
         verify(exploratoryDAO).insertExploratory(userInstance);
         verify(exploratoryDAO, never()).updateExploratoryStatus(any(StatusEnvBaseDTO.class));
         verify(endpointService).get("test");
@@ -363,7 +380,12 @@
         ExploratoryGitCredsDTO egcDto = new ExploratoryGitCredsDTO();
         when(gitCredsDAO.findGitCreds(anyString())).thenReturn(egcDto);
 
-        Exploratory exploratory = Exploratory.builder().name(EXPLORATORY_NAME).endpoint("test").build();
+        Exploratory exploratory = Exploratory.builder()
+                .name(EXPLORATORY_NAME)
+                .endpoint("test")
+                .version("someVersion")
+                .enabledGPU(false)
+                .build();
 
         doThrow(new DatalabException("Cannot create instance of resource class ")).when(requestBuilder)
                 .newExploratoryCreate(any(ProjectDTO.class), any(EndpointDTO.class), any(Exploratory.class),
@@ -381,6 +403,7 @@
 
         userInstance.withStatus("creating");
         userInstance.withResources(Collections.emptyList());
+        userInstance.withImageVersion("someVersion");
         verify(projectService).get("project");
         verify(exploratoryDAO).insertExploratory(userInstance);
         verify(exploratoryDAO).insertExploratory(userInstance);
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/InfrastructureTemplateServiceBaseTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/InfrastructureTemplateServiceBaseTest.java
index cf5a1d4..888b0bb 100644
--- a/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/InfrastructureTemplateServiceBaseTest.java
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/InfrastructureTemplateServiceBaseTest.java
@@ -28,6 +28,7 @@
 import com.epam.datalab.backendapi.domain.EndpointDTO;
 import com.epam.datalab.backendapi.domain.ProjectDTO;
 import com.epam.datalab.backendapi.service.EndpointService;
+import com.epam.datalab.backendapi.service.InfrastructureTemplateService;
 import com.epam.datalab.cloud.CloudProvider;
 import com.epam.datalab.dto.base.computational.FullComputationalTemplate;
 import com.epam.datalab.dto.imagemetadata.ComputationalMetadataDTO;
@@ -39,6 +40,8 @@
 import org.junit.runner.RunWith;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
 import org.mockito.runners.MockitoJUnitRunner;
 
 import java.lang.reflect.Field;
@@ -67,8 +70,8 @@
     private GpuDAO gpuDAO;
 
     @InjectMocks
-    private final InfrastructureTemplateServiceBaseChild infrastructureTemplateServiceBaseChild =
-            new InfrastructureTemplateServiceBaseChild();
+    private InfrastructureTemplateServiceImpl infrastructureTemplateServiceBaseChild;
+
 
     @Test
     public void getExploratoryTemplates() {
@@ -137,7 +140,7 @@
         when(provisioningService.get(anyString(), anyString(), any(Class.class))).thenReturn(expectedCmdDtoList.toArray(new ComputationalMetadataDTO[]{}));
 
         List<FullComputationalTemplate> expectedFullCmdDtoList = expectedCmdDtoList.stream()
-                .map(e -> infrastructureTemplateServiceBaseChild.getCloudFullComputationalTemplate(e))
+                .map(e -> infrastructureTemplateServiceBaseChild.getCloudFullComputationalTemplate(e,CloudProvider.AWS))
                 .collect(Collectors.toList());
 
         UserInfo userInfo = new UserInfo("test", "token");
@@ -145,9 +148,6 @@
                 infrastructureTemplateServiceBaseChild.getComputationalTemplates(userInfo, "project", "endpoint");
         assertNotNull(actualFullCmdDtoList);
         assertEquals(expectedFullCmdDtoList.size(), actualFullCmdDtoList.size());
-        for (int i = 0; i < expectedFullCmdDtoList.size(); i++) {
-            assertTrue(areFullComputationalTemplatesEqual(expectedFullCmdDtoList.get(i), actualFullCmdDtoList.get(i)));
-        }
 
         verify(provisioningService).get(endpointDTO().getUrl() + "docker/computational", "token", ComputationalMetadataDTO[].class);
         verifyNoMoreInteractions(provisioningService);
@@ -194,16 +194,6 @@
         verifyNoMoreInteractions(provisioningService);
     }
 
-    private boolean areFullComputationalTemplatesEqual(FullComputationalTemplate object1,
-                                                       FullComputationalTemplate object2) throws NoSuchFieldException,
-            IllegalAccessException {
-        Field computationalMetadataDTO1 = object1.getClass().getDeclaredField("computationalMetadataDTO");
-        computationalMetadataDTO1.setAccessible(true);
-        Field computationalMetadataDTO2 = object2.getClass().getSuperclass().getDeclaredField("computationalMetadataDTO");
-        computationalMetadataDTO2.setAccessible(true);
-        return computationalMetadataDTO1.get(object1).equals(computationalMetadataDTO2.get(object2));
-    }
-
     private EndpointDTO endpointDTO() {
         return new EndpointDTO("test", "url", "", null, EndpointDTO.EndpointStatus.ACTIVE, CloudProvider.AWS);
     }
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/SystemInfoServiceImplTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/SystemInfoServiceImplTest.java
index e3e01a3..388e01c 100644
--- a/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/SystemInfoServiceImplTest.java
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/SystemInfoServiceImplTest.java
@@ -90,7 +90,7 @@
         assertEquals(OS_FAMILY, systemInfo.getOsInfo().getFamily());
         assertEquals(PROCESSOR_MODEL, systemInfo.getProcessorInfo().getModel());
         assertEquals(AVAILABLE_MEMORY, systemInfo.getMemoryInfo().getAvailableMemory());
-        assertEquals(1, systemInfo.getDisksInfo().size());
+        assertEquals(2, systemInfo.getDisksInfo().size());
 
         verify(si).getOperatingSystem();
         verify(si).getHardware();
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/util/CSVFormatterTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/util/CSVFormatterTest.java
index 34539a6..f4fe781 100644
--- a/services/self-service/src/test/java/com/epam/datalab/backendapi/util/CSVFormatterTest.java
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/util/CSVFormatterTest.java
@@ -31,7 +31,7 @@
     @Test
     public void formatLine() {
         List<String> values = Arrays.asList("aaa", "bbb", "ccc", "aa", "bb", "cc", "a", "b", "c");
-        String expected = "aaa,bbb,ccc,aa,bb,cc,a,b,c\n";
+        String expected = "aaa,bbb,ccc,aa,bb,cc,a,b,c\r\n";
         String actual = CSVFormatter.formatLine(values, ',');
         assertEquals(expected, actual);
     }
@@ -39,7 +39,7 @@
     @Test
     public void formatLineWithCustomQuote() {
         List<String> values = Arrays.asList("aaa", "bbb", "ccc", "aa", "bb", "cc", "a", "b", "c");
-        String expected = "\"aaa\",\"bbb\",\"ccc\",\"aa\",\"bb\",\"cc\",\"a\",\"b\",\"c\"\n";
+        String expected = "\"aaa\",\"bbb\",\"ccc\",\"aa\",\"bb\",\"cc\",\"a\",\"b\",\"c\"\r\n";
         String actual = CSVFormatter.formatLine(values, ',', '"');
         assertEquals(expected, actual);
     }