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 2019/12/23 09:38:30 UTC

[incubator-dlab] branch develop updated: [DLAB-1410] Added shared images functionality (#498)

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

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


The following commit(s) were added to refs/heads/develop by this push:
     new c32c02e  [DLAB-1410] Added shared images functionality (#498)
c32c02e is described below

commit c32c02eed81c266492f1771720b9acec354cbaea
Author: ofuks <54...@users.noreply.github.com>
AuthorDate: Mon Dec 23 11:38:20 2019 +0200

    [DLAB-1410] Added shared images functionality (#498)
    
    * [DLAB-1410, DLAB-1112] Added shared images functionality
---
 .../com/epam/dlab/dto/aws/AwsCloudSettings.java    |  2 -
 .../aws/computational/ComputationalCreateAws.java  | 15 ++++++
 .../computational/SparkComputationalCreateAws.java |  7 +++
 .../epam/dlab/dto/azure/AzureCloudSettings.java    |  2 -
 .../SparkComputationalCreateAzure.java             |  7 +++
 .../dlab/dto/exploratory/ExploratoryCreateDTO.java | 15 ++++++
 .../com/epam/dlab/dto/gcp/GcpCloudSettings.java    |  2 -
 .../gcp/computational/ComputationalCreateGcp.java  | 15 ++++++
 .../computational/SparkComputationalCreateGcp.java |  7 +++
 .../epam/dlab/dto/project/ProjectCreateDTO.java    |  2 -
 services/provisioning-service/provisioning.yml     |  1 -
 .../epam/dlab/backendapi/CloudConfiguration.java   |  1 -
 .../backendapi/core/commands/CommandBuilder.java   |  3 --
 .../epam/dlab/backendapi/dao/ProjectDAOImpl.java   |  2 +
 .../dlab/backendapi/domain/CreateProjectDTO.java   |  3 ++
 .../epam/dlab/backendapi/domain/ProjectDTO.java    |  6 ++-
 .../dlab/backendapi/domain/UpdateProjectDTO.java   |  4 +-
 .../dlab/backendapi/resources/ProjectResource.java |  5 +-
 .../service/impl/ComputationalServiceImpl.java     | 23 +++++----
 .../service/impl/ExploratoryServiceImpl.java       |  7 ++-
 .../service/impl/ProjectServiceImpl.java           |  2 +-
 .../epam/dlab/backendapi/util/RequestBuilder.java  | 24 ++++++----
 .../project-form/project-form.component.html       |  9 ++--
 .../project/project-form/project-form.component.ts |  7 ++-
 .../administration/project/project.component.ts    |  2 +-
 .../service/impl/ComputationalServiceImplTest.java | 56 +++++++++++++++-------
 .../service/impl/EnvironmentServiceImplTest.java   |  2 +-
 .../service/impl/ExploratoryServiceImplTest.java   | 35 ++++++++++----
 .../InfrastructureTemplateServiceBaseTest.java     |  4 +-
 .../service/impl/UserGroupServiceImplTest.java     |  8 ++--
 30 files changed, 198 insertions(+), 80 deletions(-)

diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/aws/AwsCloudSettings.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/aws/AwsCloudSettings.java
index c27e1b2..cdc1212 100644
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/aws/AwsCloudSettings.java
+++ b/services/dlab-model/src/main/java/com/epam/dlab/dto/aws/AwsCloudSettings.java
@@ -70,8 +70,6 @@ public class AwsCloudSettings extends CloudSettings {
 	protected String confKeyDir;
 	@JsonProperty("conf_image_enabled")
 	private String imageEnabled;
-	@JsonProperty("conf_shared_image_enabled")
-	private String sharedImageEnabled;
 
 	@Override
 	@JsonIgnore
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/aws/computational/ComputationalCreateAws.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/aws/computational/ComputationalCreateAws.java
index 5a7abdf..77021e0 100644
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/aws/computational/ComputationalCreateAws.java
+++ b/services/dlab-model/src/main/java/com/epam/dlab/dto/aws/computational/ComputationalCreateAws.java
@@ -40,6 +40,8 @@ public class ComputationalCreateAws extends ComputationalBase<ComputationalCreat
 	private String version;
 	@JsonProperty("emr_configurations")
 	private List<ClusterConfig> config;
+	@JsonProperty("conf_shared_image_enabled")
+	private String sharedImageEnabled;
 
 	public String getInstanceCount() {
 		return instanceCount;
@@ -132,6 +134,19 @@ public class ComputationalCreateAws extends ComputationalBase<ComputationalCreat
 		return this;
 	}
 
+	public String getSharedImageEnabled() {
+		return sharedImageEnabled;
+	}
+
+	public void setSharedImageEnabled(String sharedImageEnabled) {
+		this.sharedImageEnabled = sharedImageEnabled;
+	}
+
+	public ComputationalCreateAws withSharedImageEnabled(String sharedImageEnabled) {
+		setSharedImageEnabled(sharedImageEnabled);
+		return this;
+	}
+
 	@Override
 	public ToStringHelper toStringHelper(Object self) {
 		return super.toStringHelper(self)
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/aws/computational/SparkComputationalCreateAws.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/aws/computational/SparkComputationalCreateAws.java
index d82628d..539937e 100644
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/aws/computational/SparkComputationalCreateAws.java
+++ b/services/dlab-model/src/main/java/com/epam/dlab/dto/aws/computational/SparkComputationalCreateAws.java
@@ -35,6 +35,8 @@ public class SparkComputationalCreateAws extends ComputationalBase<SparkComputat
 	private String dataEngineMasterShape;
 	@JsonProperty("spark_configurations")
 	private List<ClusterConfig> config;
+	@JsonProperty("conf_shared_image_enabled")
+	private String sharedImageEnabled;
 
 	public SparkComputationalCreateAws withDataEngineInstanceCount(String dataEngineInstanceCount) {
 		this.dataEngineInstanceCount = dataEngineInstanceCount;
@@ -56,6 +58,11 @@ public class SparkComputationalCreateAws extends ComputationalBase<SparkComputat
 		return this;
 	}
 
+	public SparkComputationalCreateAws withSharedImageEnabled(String sharedImageEnabled) {
+		this.sharedImageEnabled = sharedImageEnabled;
+		return this;
+	}
+
 	@Override
 	public MoreObjects.ToStringHelper toStringHelper(Object self) {
 		return super.toStringHelper(self)
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/azure/AzureCloudSettings.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/azure/AzureCloudSettings.java
index 19e4f56..b8d4f5c 100644
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/azure/AzureCloudSettings.java
+++ b/services/dlab-model/src/main/java/com/epam/dlab/dto/azure/AzureCloudSettings.java
@@ -48,8 +48,6 @@ public class AzureCloudSettings extends CloudSettings {
     protected String confKeyDir;
     @JsonProperty("conf_image_enabled")
     private String imageEnabled;
-    @JsonProperty("conf_shared_image_enabled")
-    private String sharedImageEnabled;
 
     @Override
     @JsonIgnore
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/azure/computational/SparkComputationalCreateAzure.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/azure/computational/SparkComputationalCreateAzure.java
index 1bc79fc..5902906 100644
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/azure/computational/SparkComputationalCreateAzure.java
+++ b/services/dlab-model/src/main/java/com/epam/dlab/dto/azure/computational/SparkComputationalCreateAzure.java
@@ -39,6 +39,8 @@ public class SparkComputationalCreateAzure extends ComputationalBase<SparkComput
 	private String azureUserRefreshToken;
 	@JsonProperty("spark_configurations")
 	private List<ClusterConfig> config;
+	@JsonProperty("conf_shared_image_enabled")
+	private String sharedImageEnabled;
 
 	public SparkComputationalCreateAzure withDataEngineInstanceCount(String dataEngineInstanceCount) {
 		this.dataEngineInstanceCount = dataEngineInstanceCount;
@@ -70,6 +72,11 @@ public class SparkComputationalCreateAzure extends ComputationalBase<SparkComput
 		return this;
 	}
 
+	public SparkComputationalCreateAzure withSharedImageEnabled(String sharedImageEnabled) {
+		this.sharedImageEnabled = sharedImageEnabled;
+		return this;
+	}
+
 	@Override
 	public MoreObjects.ToStringHelper toStringHelper(Object self) {
 		return super.toStringHelper(self)
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/ExploratoryCreateDTO.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/ExploratoryCreateDTO.java
index 7f87951..cb32efb 100644
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/ExploratoryCreateDTO.java
+++ b/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/ExploratoryCreateDTO.java
@@ -41,6 +41,8 @@ public class ExploratoryCreateDTO<T extends ExploratoryCreateDTO<?>> extends Exp
 	private Map<String, String> tags;
 	@JsonProperty("endpoint_name")
 	private String endpoint;
+	@JsonProperty("conf_shared_image_enabled")
+	private String sharedImageEnabled;
 
 	/**
 	 * Return the list of GIT credentials.
@@ -82,6 +84,11 @@ public class ExploratoryCreateDTO<T extends ExploratoryCreateDTO<?>> extends Exp
 		return self;
 	}
 
+	public T withSharedImageEnabled(String sharedImageEnabled) {
+		this.sharedImageEnabled = sharedImageEnabled;
+		return self;
+	}
+
 	public String getImageName() {
 		return imageName;
 	}
@@ -103,6 +110,14 @@ public class ExploratoryCreateDTO<T extends ExploratoryCreateDTO<?>> extends Exp
 		this.endpoint = endpoint;
 	}
 
+	public String getSharedImageEnabled() {
+		return sharedImageEnabled;
+	}
+
+	public void setSharedImageEnabled(String sharedImageEnabled) {
+		this.sharedImageEnabled = sharedImageEnabled;
+	}
+
 	public List<ClusterConfig> getClusterConfig() {
 		return clusterConfig;
 	}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/gcp/GcpCloudSettings.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/gcp/GcpCloudSettings.java
index 370da91..ce6f1b7 100644
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/gcp/GcpCloudSettings.java
+++ b/services/dlab-model/src/main/java/com/epam/dlab/dto/gcp/GcpCloudSettings.java
@@ -64,8 +64,6 @@ public class GcpCloudSettings extends CloudSettings {
 	protected String region;
 	@JsonProperty("conf_image_enabled")
 	private String imageEnabled;
-	@JsonProperty("conf_shared_image_enabled")
-	private String sharedImageEnabled;
 
 	@Override
 	@JsonIgnore
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/gcp/computational/ComputationalCreateGcp.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/gcp/computational/ComputationalCreateGcp.java
index c65d2ff..1ab5698 100644
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/gcp/computational/ComputationalCreateGcp.java
+++ b/services/dlab-model/src/main/java/com/epam/dlab/dto/gcp/computational/ComputationalCreateGcp.java
@@ -36,6 +36,8 @@ public class ComputationalCreateGcp extends ComputationalBase<ComputationalCreat
     private String preemptibleCount;
     @JsonProperty("dataproc_version")
     private String version;
+    @JsonProperty("conf_shared_image_enabled")
+    private String sharedImageEnabled;
 
     public ComputationalCreateGcp withMasterInstanceCount(String masterInstanceCount) {
         this.masterInstanceCount = masterInstanceCount;
@@ -67,6 +69,19 @@ public class ComputationalCreateGcp extends ComputationalBase<ComputationalCreat
         return this;
     }
 
+    public String getSharedImageEnabled() {
+        return sharedImageEnabled;
+    }
+
+    public void setSharedImageEnabled(String sharedImageEnabled) {
+        this.sharedImageEnabled = sharedImageEnabled;
+    }
+
+    public ComputationalCreateGcp withSharedImageEnabled(String sharedImageEnabled) {
+        setSharedImageEnabled(sharedImageEnabled);
+        return this;
+    }
+
     @Override
     public MoreObjects.ToStringHelper toStringHelper(Object self) {
         return super.toStringHelper(self)
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/gcp/computational/SparkComputationalCreateGcp.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/gcp/computational/SparkComputationalCreateGcp.java
index 98cfb32..e21881b 100644
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/gcp/computational/SparkComputationalCreateGcp.java
+++ b/services/dlab-model/src/main/java/com/epam/dlab/dto/gcp/computational/SparkComputationalCreateGcp.java
@@ -37,6 +37,8 @@ public class SparkComputationalCreateGcp extends ComputationalBase<SparkComputat
 	private String dataEngineMasterSize;
 	@JsonProperty("spark_configurations")
 	private List<ClusterConfig> config;
+	@JsonProperty("conf_shared_image_enabled")
+	private String sharedImageEnabled;
 
 	public SparkComputationalCreateGcp withDataEngineInstanceCount(String dataEngineInstanceCount) {
 		this.dataEngineInstanceCount = dataEngineInstanceCount;
@@ -58,6 +60,11 @@ public class SparkComputationalCreateGcp extends ComputationalBase<SparkComputat
 		return this;
 	}
 
+	public SparkComputationalCreateGcp withSharedImageEnabled(String sharedImageEnabled) {
+		this.sharedImageEnabled = sharedImageEnabled;
+		return this;
+	}
+
 
 	@Override
 	public MoreObjects.ToStringHelper toStringHelper(Object self) {
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/project/ProjectCreateDTO.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/project/ProjectCreateDTO.java
index 6e11234..c64c505 100644
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/project/ProjectCreateDTO.java
+++ b/services/dlab-model/src/main/java/com/epam/dlab/dto/project/ProjectCreateDTO.java
@@ -15,6 +15,4 @@ public class ProjectCreateDTO extends ResourceBaseDTO<ProjectCreateDTO> {
 	private final String tag;
 	@JsonProperty("endpoint_name")
 	private final String endpoint;
-	@JsonProperty("shared_image_enabled")
-	private String useSharedImage;
 }
diff --git a/services/provisioning-service/provisioning.yml b/services/provisioning-service/provisioning.yml
index 96fbdf4..22e1408 100644
--- a/services/provisioning-service/provisioning.yml
+++ b/services/provisioning-service/provisioning.yml
@@ -123,7 +123,6 @@ cloudProperties:
   azureClientId: AZURE_CLIENT_ID
   gcpProjectId: GCP_PROJECT_ID
   imageEnabled: CONF_IMAGE_ENABLED
-  sharedImageEnabled: SHARED_IMAGE_ENABLED
   ldap:
     host: LDAP_HOST
     dn: LDAP_DN
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/CloudConfiguration.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/CloudConfiguration.java
index 5653a90..58caf23 100644
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/CloudConfiguration.java
+++ b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/CloudConfiguration.java
@@ -46,7 +46,6 @@ public class CloudConfiguration {
 	private final String peeringId;
 	private final String gcpProjectId;
 	private final boolean imageEnabled;
-	private final boolean sharedImageEnabled;
 	@JsonProperty("ldap")
 	private final LdapConfig ldapConfig;
 
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/commands/CommandBuilder.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/commands/CommandBuilder.java
index 68e337b..123c96f 100644
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/commands/CommandBuilder.java
+++ b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/commands/CommandBuilder.java
@@ -90,7 +90,6 @@ public class CommandBuilder {
 				.confKeyDir(cloudConfiguration.getConfKeyDir())
 				.azureIamUser(settings.getIamUser())
 				.imageEnabled(String.valueOf(cloudConfiguration.isImageEnabled()))
-				.sharedImageEnabled(String.valueOf(cloudConfiguration.isSharedImageEnabled()))
 				.build();
 	}
 
@@ -113,7 +112,6 @@ public class CommandBuilder {
 				.confKeyDir(cloudConfiguration.getConfKeyDir())
 				.gcpIamUser(settings.getIamUser())
 				.imageEnabled(String.valueOf(cloudConfiguration.isImageEnabled()))
-				.sharedImageEnabled(String.valueOf(cloudConfiguration.isSharedImageEnabled()))
 				.build();
 	}
 
@@ -139,7 +137,6 @@ public class CommandBuilder {
 				.os(cloudConfiguration.getOs())
 				.confKeyDir(cloudConfiguration.getConfKeyDir())
 				.imageEnabled(String.valueOf(cloudConfiguration.isImageEnabled()))
-				.sharedImageEnabled(String.valueOf(cloudConfiguration.isSharedImageEnabled()))
 				.build();
 	}
 }
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ProjectDAOImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ProjectDAOImpl.java
index 1e86808..7128c51 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ProjectDAOImpl.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ProjectDAOImpl.java
@@ -26,6 +26,7 @@ public class ProjectDAOImpl extends BaseDAO implements ProjectDAO {
 	private static final String GROUPS = "groups";
 	private static final String ENDPOINTS = "endpoints";
 	private static final String STATUS_FIELD = "status";
+	private static final String SHARED_IMAGE_FIELD = "sharedImageEnabled";
 	private static final String ENDPOINT_STATUS_FIELD = "endpoints." + STATUS_FIELD;
 	private static final String EDGE_INFO_FIELD = "edgeInfo";
 	private static final String ENDPOINT_FIELD = "endpoints.$.";
@@ -109,6 +110,7 @@ public class ProjectDAOImpl extends BaseDAO implements ProjectDAO {
 		updateProject.put(GROUPS, projectDTO.getGroups());
 		updateProject.put(ENDPOINTS,
 				projectDTO.getEndpoints().stream().map(this::convertToBson).collect(Collectors.toList()));
+		updateProject.put(SHARED_IMAGE_FIELD, projectDTO.isSharedImageEnabled());
 		return updateOne(PROJECTS_COLLECTION, projectCondition(projectDTO.getName()),
 				new Document(SET, updateProject)).getMatchedCount() > 0L;
 	}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/CreateProjectDTO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/CreateProjectDTO.java
index 2e315b4..f7f89de 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/CreateProjectDTO.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/CreateProjectDTO.java
@@ -1,5 +1,6 @@
 package com.epam.dlab.backendapi.domain;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
 import lombok.Data;
 
 import javax.validation.constraints.NotNull;
@@ -18,4 +19,6 @@ public class CreateProjectDTO {
 	private final String key;
 	@NotNull
 	private final String tag;
+	@JsonProperty("shared_image_enabled")
+	private boolean sharedImageEnabled;
 }
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/ProjectDTO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/ProjectDTO.java
index 2f53873..eb53fc0 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/ProjectDTO.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/ProjectDTO.java
@@ -2,6 +2,8 @@ package com.epam.dlab.backendapi.domain;
 
 import com.epam.dlab.dto.UserInstanceStatus;
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
 import lombok.Data;
 
 import javax.validation.constraints.NotNull;
@@ -10,6 +12,8 @@ import java.util.List;
 import java.util.Set;
 
 @Data
+@Builder
+@AllArgsConstructor
 @JsonIgnoreProperties(ignoreUnknown = true)
 public class ProjectDTO {
 	@NotNull
@@ -23,7 +27,7 @@ public class ProjectDTO {
 	private final String tag;
 	private final Integer budget;
 	private final List<ProjectEndpointDTO> endpoints;
-	private boolean useSharedImage;
+	private final boolean sharedImageEnabled;
 
 
 	public enum Status {
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/UpdateProjectDTO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/UpdateProjectDTO.java
index 5121412..e4070bb 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/UpdateProjectDTO.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/UpdateProjectDTO.java
@@ -1,6 +1,7 @@
 package com.epam.dlab.backendapi.domain;
 
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
 import lombok.Data;
 
 import javax.validation.constraints.NotNull;
@@ -15,5 +16,6 @@ public class UpdateProjectDTO {
 	private final Set<String> endpoints;
 	@NotNull
 	private final Set<String> groups;
-
+	@JsonProperty("shared_image_enabled")
+	private final boolean sharedImageEnabled;
 }
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/ProjectResource.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/ProjectResource.java
index a45446e..966a4aa 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/ProjectResource.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/ProjectResource.java
@@ -60,11 +60,10 @@ public class ProjectResource {
 	@RolesAllowed("/api/project")
 	public Response createProject(@Parameter(hidden = true) @Auth UserInfo userInfo,
 								  @Valid CreateProjectDTO projectDTO) {
-
 		projectService.create(userInfo, new ProjectDTO(projectDTO.getName(), projectDTO.getGroups(),
 				projectDTO.getKey(), projectDTO.getTag(), null,
 				projectDTO.getEndpoints().stream().map(e -> new ProjectEndpointDTO(e, UserInstanceStatus.CREATING,
-						null)).collect(Collectors.toList())));
+						null)).collect(Collectors.toList()), projectDTO.isSharedImageEnabled()));
 		final URI uri = uriInfo.getRequestUriBuilder().path(projectDTO.getName()).build();
 		return Response
 				.ok()
@@ -262,7 +261,7 @@ public class ProjectResource {
 					List<UpdateProjectBudgetDTO> dtos) {
 		final List<ProjectDTO> projects = dtos
 				.stream()
-				.map(dto -> new ProjectDTO(dto.getProject(), null, null, null, dto.getBudget(), null))
+				.map(dto -> ProjectDTO.builder().name(dto.getProject()).budget(dto.getBudget()).build())
 				.collect(Collectors.toList());
 		projectService.updateBudget(projects);
 		return Response.ok().build();
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 5133485..ab26b7c 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
@@ -25,11 +25,13 @@ import com.epam.dlab.backendapi.annotation.BudgetLimited;
 import com.epam.dlab.backendapi.annotation.Project;
 import com.epam.dlab.backendapi.dao.ComputationalDAO;
 import com.epam.dlab.backendapi.dao.ExploratoryDAO;
+import com.epam.dlab.backendapi.domain.ProjectDTO;
 import com.epam.dlab.backendapi.domain.RequestId;
 import com.epam.dlab.backendapi.resources.dto.ComputationalCreateFormDTO;
 import com.epam.dlab.backendapi.resources.dto.SparkStandaloneClusterCreateForm;
 import com.epam.dlab.backendapi.service.ComputationalService;
 import com.epam.dlab.backendapi.service.EndpointService;
+import com.epam.dlab.backendapi.service.ProjectService;
 import com.epam.dlab.backendapi.service.TagService;
 import com.epam.dlab.backendapi.util.RequestBuilder;
 import com.epam.dlab.constants.ServiceConsts;
@@ -76,11 +78,11 @@ public class ComputationalServiceImpl implements ComputationalService {
 	}
 
 	@Inject
+	private ProjectService projectService;
+	@Inject
 	private ExploratoryDAO exploratoryDAO;
-
 	@Inject
 	private ComputationalDAO computationalDAO;
-
 	@Inject
 	@Named(ServiceConsts.PROVISIONING_SERVICE_NAME)
 	private RESTService provisioningService;
@@ -96,10 +98,9 @@ public class ComputationalServiceImpl implements ComputationalService {
 
 	@BudgetLimited
 	@Override
-	public boolean createSparkCluster(UserInfo userInfo, SparkStandaloneClusterCreateForm form,
-									  @Project String project) {
-
+	public boolean createSparkCluster(UserInfo userInfo, SparkStandaloneClusterCreateForm form, @Project String project) {
 
+		final ProjectDTO projectDTO = projectService.get(project);
 		final UserInstanceDTO instance =
 				exploratoryDAO.fetchExploratoryFields(userInfo.getName(), form.getNotebookName());
 		final SparkStandaloneClusterResource compResource = createInitialComputationalResource(form);
@@ -107,10 +108,11 @@ public class ComputationalServiceImpl implements ComputationalService {
 				form.getCustomTag()));
 		if (computationalDAO.addComputational(userInfo.getName(), form.getNotebookName(), compResource)) {
 			try {
-				ComputationalBase<?> dto = requestBuilder.newComputationalCreate(userInfo, instance, form);
+				ComputationalBase<?> dto = requestBuilder.newComputationalCreate(userInfo, projectDTO, instance, form);
 
 				String uuid =
-						provisioningService.post(endpointService.get(instance.getEndpoint()).getUrl() + ComputationalAPI.COMPUTATIONAL_CREATE_SPARK,
+						provisioningService.post(endpointService.get(instance.getEndpoint()).getUrl() +
+										ComputationalAPI.COMPUTATIONAL_CREATE_SPARK,
 								userInfo.getAccessToken(), dto, String.class);
 				requestId.put(userInfo.getName(), uuid);
 				return true;
@@ -166,6 +168,7 @@ public class ComputationalServiceImpl implements ComputationalService {
 	public boolean createDataEngineService(UserInfo userInfo, ComputationalCreateFormDTO formDTO,
 										   UserComputationalResource computationalResource, @Project String project) {
 
+		final ProjectDTO projectDTO = projectService.get(project);
 		final UserInstanceDTO instance = exploratoryDAO.fetchExploratoryFields(userInfo.getName(), formDTO
 				.getNotebookName());
 		final Map<String, String> tags = tagService.getResourceTags(userInfo, instance.getEndpoint(), project,
@@ -177,8 +180,10 @@ public class ComputationalServiceImpl implements ComputationalService {
 		if (isAdded) {
 			try {
 				String uuid =
-						provisioningService.post(endpointService.get(instance.getEndpoint()).getUrl() + COMPUTATIONAL_CREATE_CLOUD_SPECIFIC, userInfo.getAccessToken(),
-								requestBuilder.newComputationalCreate(userInfo, instance, formDTO), String.class);
+						provisioningService.post(endpointService.get(instance.getEndpoint()).getUrl() +
+										COMPUTATIONAL_CREATE_CLOUD_SPECIFIC, userInfo.getAccessToken(),
+								requestBuilder.newComputationalCreate(userInfo, projectDTO, instance, formDTO),
+								String.class);
 				requestId.put(userInfo.getName(), uuid);
 				return true;
 			} catch (Exception t) {
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 12968a3..fe710f5 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
@@ -26,9 +26,11 @@ import com.epam.dlab.backendapi.dao.ComputationalDAO;
 import com.epam.dlab.backendapi.dao.ExploratoryDAO;
 import com.epam.dlab.backendapi.dao.GitCredsDAO;
 import com.epam.dlab.backendapi.dao.ImageExploratoryDao;
+import com.epam.dlab.backendapi.domain.ProjectDTO;
 import com.epam.dlab.backendapi.domain.RequestId;
 import com.epam.dlab.backendapi.service.EndpointService;
 import com.epam.dlab.backendapi.service.ExploratoryService;
+import com.epam.dlab.backendapi.service.ProjectService;
 import com.epam.dlab.backendapi.service.TagService;
 import com.epam.dlab.backendapi.util.RequestBuilder;
 import com.epam.dlab.constants.ServiceConsts;
@@ -60,6 +62,8 @@ import static com.epam.dlab.rest.contracts.ExploratoryAPI.*;
 public class ExploratoryServiceImpl implements ExploratoryService {
 
 	@Inject
+	private ProjectService projectService;
+	@Inject
 	private ExploratoryDAO exploratoryDAO;
 	@Inject
 	private ComputationalDAO computationalDAO;
@@ -100,6 +104,7 @@ public class ExploratoryServiceImpl implements ExploratoryService {
 	public String create(UserInfo userInfo, Exploratory exploratory, @Project String project) {
 		boolean isAdded = false;
 		try {
+			final ProjectDTO projectDTO = projectService.get(project);
 			final UserInstanceDTO userInstanceDTO = getUserInstanceDTO(userInfo, exploratory, project);
 			exploratoryDAO.insertExploratory(userInstanceDTO);
 			isAdded = true;
@@ -108,7 +113,7 @@ public class ExploratoryServiceImpl implements ExploratoryService {
 			final String uuid =
 					provisioningService.post(endpointService.get(userInstanceDTO.getEndpoint()).getUrl() + EXPLORATORY_CREATE,
 							userInfo.getAccessToken(),
-							requestBuilder.newExploratoryCreate(exploratory, userInfo, gitCreds,
+							requestBuilder.newExploratoryCreate(projectDTO, exploratory, userInfo, gitCreds,
 									userInstanceDTO.getTags()),
 							String.class);
 			requestId.put(userInfo.getName(), uuid);
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 976cf68..5697d2e 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
@@ -174,7 +174,7 @@ public class ProjectServiceImpl implements ProjectService {
 				.collect(Collectors.toList());
 		project.getEndpoints().addAll(endpointsToBeCreated);
 		projectDAO.update(new ProjectDTO(project.getName(), projectDTO.getGroups(), project.getKey(),
-				project.getTag(), project.getBudget(), project.getEndpoints()));
+				project.getTag(), project.getBudget(), project.getEndpoints(), projectDTO.isSharedImageEnabled()));
 		endpointsToBeCreated.forEach(e -> createEndpoint(userInfo, project, e.getName()));
 	}
 
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/util/RequestBuilder.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/util/RequestBuilder.java
index ac858e0..d4f690e 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/util/RequestBuilder.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/util/RequestBuilder.java
@@ -186,7 +186,8 @@ public class RequestBuilder {
 	}
 
 	@SuppressWarnings("unchecked")
-	public <T extends ExploratoryCreateDTO<T>> T newExploratoryCreate(Exploratory exploratory, UserInfo userInfo,
+	public <T extends ExploratoryCreateDTO<T>> T newExploratoryCreate(ProjectDTO projectDTO, Exploratory exploratory,
+																	  UserInfo userInfo,
 																	  ExploratoryGitCredsDTO exploratoryGitCredsDTO,
 																	  Map<String, String> tags) {
 
@@ -224,6 +225,7 @@ public class RequestBuilder {
 				.withClusterConfig(exploratory.getClusterConfig())
 				.withProject(exploratory.getProject())
 				.withEndpoint(exploratory.getEndpoint())
+				.withSharedImageEnabled(String.valueOf(projectDTO.isSharedImageEnabled()))
 				.withTags(tags);
 	}
 
@@ -363,7 +365,7 @@ public class RequestBuilder {
 	}
 
 	@SuppressWarnings("unchecked")
-	public <T extends ComputationalBase<T>> T newComputationalCreate(UserInfo userInfo,
+	public <T extends ComputationalBase<T>> T newComputationalCreate(UserInfo userInfo, ProjectDTO projectDTO,
 																	 UserInstanceDTO userInstance,
 																	 ComputationalCreateFormDTO form) {
 		T computationalCreate;
@@ -380,7 +382,8 @@ public class RequestBuilder {
 						.withSlaveInstanceSpot(awsForm.getSlaveInstanceSpot())
 						.withSlaveInstanceSpotPctPrice(awsForm.getSlaveInstanceSpotPctPrice())
 						.withVersion(awsForm.getVersion())
-						.withConfig((awsForm.getConfig()));
+						.withConfig((awsForm.getConfig()))
+						.withSharedImageEnabled(String.valueOf(projectDTO.isSharedImageEnabled()));
 				break;
 			case GCP:
 				GcpComputationalCreateForm gcpForm = (GcpComputationalCreateForm) form;
@@ -390,7 +393,8 @@ public class RequestBuilder {
 						.withPreemptibleCount(gcpForm.getPreemptibleCount())
 						.withMasterInstanceType(gcpForm.getMasterInstanceType())
 						.withSlaveInstanceType(gcpForm.getSlaveInstanceType())
-						.withVersion(gcpForm.getVersion());
+						.withVersion(gcpForm.getVersion())
+						.withSharedImageEnabled(String.valueOf(projectDTO.isSharedImageEnabled()));
 				break;
 
 			default:
@@ -409,7 +413,7 @@ public class RequestBuilder {
 	}
 
 	@SuppressWarnings("unchecked")
-	public <T extends ComputationalBase<T>> T newComputationalCreate(UserInfo userInfo,
+	public <T extends ComputationalBase<T>> T newComputationalCreate(UserInfo userInfo, ProjectDTO projectDTO,
 																	 UserInstanceDTO userInstance,
 																	 SparkStandaloneClusterCreateForm form) {
 
@@ -421,14 +425,16 @@ public class RequestBuilder {
 						.withDataEngineInstanceCount(form.getDataEngineInstanceCount())
 						.withDataEngineMasterShape(form.getDataEngineInstanceShape())
 						.withDataEngineSlaveShape(form.getDataEngineInstanceShape())
-						.withConfig(form.getConfig());
+						.withConfig(form.getConfig())
+						.withSharedImageEnabled(String.valueOf(projectDTO.isSharedImageEnabled()));
 				break;
 			case AZURE:
 				computationalCreate = (T) newResourceSysBaseDTO(userInfo, SparkComputationalCreateAzure.class)
 						.withDataEngineInstanceCount(form.getDataEngineInstanceCount())
 						.withDataEngineMasterSize(form.getDataEngineInstanceShape())
 						.withDataEngineSlaveSize(form.getDataEngineInstanceShape())
-						.withConfig(form.getConfig());
+						.withConfig(form.getConfig())
+						.withSharedImageEnabled(String.valueOf(projectDTO.isSharedImageEnabled()));
 				if (settingsDAO.isAzureDataLakeEnabled()) {
 					((SparkComputationalCreateAzure) computationalCreate)
 							.withAzureUserRefreshToken(userInfo.getKeys().get(AZURE_REFRESH_TOKEN_KEY));
@@ -443,7 +449,8 @@ public class RequestBuilder {
 						.withDataEngineInstanceCount(form.getDataEngineInstanceCount())
 						.withDataEngineMasterSize(form.getDataEngineInstanceShape())
 						.withDataEngineSlaveSize(form.getDataEngineInstanceShape())
-						.withConfig(form.getConfig());
+						.withConfig(form.getConfig())
+						.withSharedImageEnabled(String.valueOf(projectDTO.isSharedImageEnabled()));
 				break;
 			default:
 				throw new IllegalArgumentException(UNSUPPORTED_CLOUD_PROVIDER_MESSAGE + cloudProvider());
@@ -625,7 +632,6 @@ public class RequestBuilder {
 				.name(projectDTO.getName())
 				.tag(projectDTO.getTag())
 				.endpoint(endpoint)
-				.useSharedImage(String.valueOf(projectDTO.isUseSharedImage()))
 				.build()
 				.withCloudSettings(cloudSettings(userInfo));
 	}
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/project/project-form/project-form.component.html b/services/self-service/src/main/resources/webapp/src/app/administration/project/project-form/project-form.component.html
index 4f3730a..cf2ab5a 100644
--- a/services/self-service/src/main/resources/webapp/src/app/administration/project/project-form/project-form.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/project/project-form/project-form.component.html
@@ -160,14 +160,11 @@
             </div>
           </div>
           <div class="text-center m-bott-10">
-
-            <!-- TODO: return after back-end part will be fully completed -->
-            <!-- <div class="control-group">
-              <mat-slide-toggle formControlName="shared_image_enabled" labelPosition="after" [disabled]="item">
+            <div class="control-group">
+              <mat-slide-toggle formControlName="shared_image_enabled" labelPosition="after">
                 <span class="hold-label">Use shared image</span>
               </mat-slide-toggle>
-            </div> -->
-
+            </div>
             <button mat-raised-button type="button" class="butt" [disabled]="item" (click)="reset()">Clear</button>
             <button mat-raised-button matStepperPrevious class="butt"><i
                 class="material-icons">keyboard_arrow_left</i>Back</button>
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/project/project-form/project-form.component.ts b/services/self-service/src/main/resources/webapp/src/app/administration/project/project-form/project-form.component.ts
index afbd3c2..b89a51f 100644
--- a/services/self-service/src/main/resources/webapp/src/app/administration/project/project-form/project-form.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/project/project-form/project-form.component.ts
@@ -141,7 +141,6 @@ export class ProjectFormComponent implements OnInit {
     this.projectForm.controls[key].setValue(select ? filter : []);
   }
 
-  //  TODO: return shared_image_enabled properties after back-end part will be fully completed 
 
   private initFormModel(): void {
     this.projectForm = this._fb.group({
@@ -150,11 +149,11 @@ export class ProjectFormComponent implements OnInit {
       'endpoints': [[], Validators.required],
       'tag': ['', Validators.compose([Validators.required, Validators.pattern(PATTERNS.projectName)])],
       'groups': [[], Validators.required],
-      // 'shared_image_enabled': [false, Validators.required]
+      'shared_image_enabled': [false, Validators.required]
     });
   }
 
-  public editSpecificProject(item: Project) {
+  public editSpecificProject(item) {
     let endpoints = item.endpoints.map((item: any) => item.name);
 
     this.projectForm = this._fb.group({
@@ -163,7 +162,7 @@ export class ProjectFormComponent implements OnInit {
       'endpoints': [endpoints],
       'tag': [item.tag, Validators.required],
       'groups': [item.groups, Validators.required],
-      // 'shared_image_enabled': [item.shared_image_enabled, Validators.required]
+      'shared_image_enabled': [item.sharedImageEnabled, Validators.required]
     });
   }
 
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/project/project.component.ts b/services/self-service/src/main/resources/webapp/src/app/administration/project/project.component.ts
index a501ccc..da7c986 100644
--- a/services/self-service/src/main/resources/webapp/src/app/administration/project/project.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/project/project.component.ts
@@ -38,7 +38,7 @@ export interface Project {
   endpoints: Endpoint[];
   tag: string;
   groups: string[];
-  // shared_image_enabled?: boolean;
+  shared_image_enabled?: boolean;
 }
 
 @Component({
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/ComputationalServiceImplTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/ComputationalServiceImplTest.java
index 24e0791..de9ddd8 100644
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/ComputationalServiceImplTest.java
+++ b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/ComputationalServiceImplTest.java
@@ -24,10 +24,13 @@ import com.epam.dlab.backendapi.conf.SelfServiceApplicationConfiguration;
 import com.epam.dlab.backendapi.dao.ComputationalDAO;
 import com.epam.dlab.backendapi.dao.ExploratoryDAO;
 import com.epam.dlab.backendapi.domain.EndpointDTO;
+import com.epam.dlab.backendapi.domain.ProjectDTO;
+import com.epam.dlab.backendapi.domain.ProjectEndpointDTO;
 import com.epam.dlab.backendapi.domain.RequestId;
 import com.epam.dlab.backendapi.resources.dto.ComputationalCreateFormDTO;
 import com.epam.dlab.backendapi.resources.dto.SparkStandaloneClusterCreateForm;
 import com.epam.dlab.backendapi.service.EndpointService;
+import com.epam.dlab.backendapi.service.ProjectService;
 import com.epam.dlab.backendapi.service.TagService;
 import com.epam.dlab.backendapi.util.RequestBuilder;
 import com.epam.dlab.dto.SchedulerJobDTO;
@@ -36,6 +39,7 @@ import com.epam.dlab.dto.UserInstanceStatus;
 import com.epam.dlab.dto.aws.computational.ClusterConfig;
 import com.epam.dlab.dto.base.DataEngineType;
 import com.epam.dlab.dto.base.computational.ComputationalBase;
+import com.epam.dlab.dto.base.edge.EdgeInfo;
 import com.epam.dlab.dto.computational.*;
 import com.epam.dlab.exceptions.DlabException;
 import com.epam.dlab.exceptions.ResourceNotFoundException;
@@ -88,6 +92,8 @@ public class ComputationalServiceImplTest {
 	private UserComputationalResource ucResource;
 
 	@Mock
+	private ProjectService projectService;
+	@Mock
 	private ExploratoryDAO exploratoryDAO;
 	@Mock
 	private ComputationalDAO computationalDAO;
@@ -125,14 +131,16 @@ public class ComputationalServiceImplTest {
 
 	@Test
 	public void createSparkCluster() {
+		ProjectDTO projectDTO = getProjectDTO();
+		when(projectService.get(anyString())).thenReturn(projectDTO);
 		when(endpointService.get(anyString())).thenReturn(endpointDTO());
 		when(computationalDAO.addComputational(anyString(), anyString(),
 				any(SparkStandaloneClusterResource.class))).thenReturn(true);
 		when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString())).thenReturn(userInstance);
 
 		ComputationalBase compBaseMocked = mock(ComputationalBase.class);
-		when(requestBuilder.newComputationalCreate(any(UserInfo.class), any(UserInstanceDTO.class),
-				any(SparkStandaloneClusterCreateForm.class))).thenReturn(compBaseMocked);
+		when(requestBuilder.newComputationalCreate(any(UserInfo.class), any(ProjectDTO.class),
+				any(UserInstanceDTO.class), any(SparkStandaloneClusterCreateForm.class))).thenReturn(compBaseMocked);
 		when(provisioningService.post(anyString(), anyString(), any(ComputationalBase.class), any())).thenReturn(UUID);
 		when(requestId.put(anyString(), anyString())).thenReturn(UUID);
 
@@ -141,19 +149,20 @@ public class ComputationalServiceImplTest {
 				computationalService.createSparkCluster(userInfo, sparkClusterCreateForm, "");
 		assertTrue(creationResult);
 
+		verify(projectService).get("");
 		verify(computationalDAO)
 				.addComputational(eq(USER), eq(EXPLORATORY_NAME), refEq(sparkClusterResource));
 
 		verify(exploratoryDAO).fetchExploratoryFields(USER, EXPLORATORY_NAME);
 		verify(requestBuilder).newComputationalCreate(
-				refEq(userInfo), refEq(userInstance), refEq(sparkClusterCreateForm));
+				refEq(userInfo), refEq(projectDTO), refEq(userInstance), refEq(sparkClusterCreateForm));
 
 		verify(provisioningService)
 				.post(endpointDTO().getUrl() + ComputationalAPI.COMPUTATIONAL_CREATE_SPARK, TOKEN, compBaseMocked,
 						String.class);
 
 		verify(requestId).put(USER, UUID);
-		verifyNoMoreInteractions(configuration, computationalDAO, requestBuilder, provisioningService, requestId);
+		verifyNoMoreInteractions(projectService, configuration, computationalDAO, requestBuilder, provisioningService, requestId);
 	}
 	@Test
 	public void createSparkClusterWhenResourceAlreadyExists() {
@@ -197,13 +206,15 @@ public class ComputationalServiceImplTest {
 
 	@Test
 	public void createSparkClusterWhenMethodNewComputationalCreateThrowsException() {
+		ProjectDTO projectDTO = getProjectDTO();
+		when(projectService.get(anyString())).thenReturn(projectDTO);
 		when(computationalDAO.addComputational(anyString(), anyString(),
 				any(SparkStandaloneClusterResource.class))).thenReturn(true);
 		when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString())).thenReturn(userInstance);
 
 		doThrow(new DlabException("Cannot create instance of resource class "))
-				.when(requestBuilder).newComputationalCreate(any(UserInfo.class), any(UserInstanceDTO.class),
-				any(SparkStandaloneClusterCreateForm.class));
+				.when(requestBuilder).newComputationalCreate(any(UserInfo.class), any(ProjectDTO.class),
+				any(UserInstanceDTO.class), any(SparkStandaloneClusterCreateForm.class));
 
 		when(computationalDAO.updateComputationalStatus(any(ComputationalStatusDTO.class)))
 				.thenReturn(mock(UpdateResult.class));
@@ -214,11 +225,12 @@ public class ComputationalServiceImplTest {
 		} catch (DlabException e) {
 			assertEquals("Cannot create instance of resource class ", e.getMessage());
 		}
+		verify(projectService).get("");
 		verify(computationalDAO).addComputational(USER, EXPLORATORY_NAME, sparkClusterResource);
 		verify(computationalDAO).updateComputationalStatus(refEq(computationalStatusDTOWithStatusFailed, "self"));
 		verify(exploratoryDAO).fetchExploratoryFields(USER, EXPLORATORY_NAME);
-		verify(requestBuilder).newComputationalCreate(userInfo, userInstance, sparkClusterCreateForm);
-		verifyNoMoreInteractions(configuration, computationalDAO, exploratoryDAO, requestBuilder);
+		verify(requestBuilder).newComputationalCreate(userInfo, projectDTO, userInstance, sparkClusterCreateForm);
+		verifyNoMoreInteractions(projectService, configuration, computationalDAO, exploratoryDAO, requestBuilder);
 	}
 
 	@Test
@@ -345,14 +357,16 @@ public class ComputationalServiceImplTest {
 
 	@Test
 	public void createDataEngineService() {
+		ProjectDTO projectDTO = getProjectDTO();
+		when(projectService.get(anyString())).thenReturn(projectDTO);
 		when(endpointService.get(anyString())).thenReturn(endpointDTO());
 		when(computationalDAO.addComputational(anyString(), anyString(), any(UserComputationalResource.class)))
 				.thenReturn(true);
 		when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString())).thenReturn(userInstance);
 
 		ComputationalBase compBaseMocked = mock(ComputationalBase.class);
-		when(requestBuilder.newComputationalCreate(any(UserInfo.class), any(UserInstanceDTO.class),
-				any(ComputationalCreateFormDTO.class))).thenReturn(compBaseMocked);
+		when(requestBuilder.newComputationalCreate(any(UserInfo.class), any(ProjectDTO.class),
+				any(UserInstanceDTO.class), any(ComputationalCreateFormDTO.class))).thenReturn(compBaseMocked);
 
 		when(provisioningService.post(anyString(), anyString(), any(ComputationalBase.class), any())).thenReturn(UUID);
 		when(requestId.put(anyString(), anyString())).thenReturn(UUID);
@@ -361,19 +375,21 @@ public class ComputationalServiceImplTest {
 				computationalService.createDataEngineService(userInfo, formList.get(1), ucResource, "");
 		assertTrue(creationResult);
 
+		verify(projectService).get("");
+
 		verify(computationalDAO).addComputational(eq(USER), eq(EXPLORATORY_NAME), refEq(ucResource));
 
 		verify(exploratoryDAO).fetchExploratoryFields(USER, EXPLORATORY_NAME);
 
 		verify(requestBuilder).newComputationalCreate(
-				refEq(userInfo), refEq(userInstance), any(ComputationalCreateFormDTO.class));
+				refEq(userInfo), refEq(projectDTO), refEq(userInstance), any(ComputationalCreateFormDTO.class));
 
 		verify(provisioningService)
 				.post(endpointDTO().getUrl() + ComputationalAPI.COMPUTATIONAL_CREATE_CLOUD_SPECIFIC, TOKEN,
 						compBaseMocked, String.class);
 
 		verify(requestId).put(USER, UUID);
-		verifyNoMoreInteractions(computationalDAO, exploratoryDAO, requestBuilder, provisioningService, requestId);
+		verifyNoMoreInteractions(projectService, computationalDAO, exploratoryDAO, requestBuilder, provisioningService, requestId);
 	}
 
 	@Test
@@ -418,14 +434,16 @@ public class ComputationalServiceImplTest {
 
 	@Test
 	public void createDataEngineServiceWhenMethodNewComputationalCreateThrowsException() {
+		ProjectDTO projectDTO = getProjectDTO();
+		when(projectService.get(anyString())).thenReturn(projectDTO);
 		when(endpointService.get(anyString())).thenReturn(endpointDTO());
 		when(computationalDAO.addComputational(anyString(), anyString(), any(UserComputationalResource.class)))
 				.thenReturn(true);
 		when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString())).thenReturn(userInstance);
 
 		doThrow(new DlabException("Cannot create instance of resource class "))
-				.when(requestBuilder).newComputationalCreate(any(UserInfo.class), any(UserInstanceDTO.class),
-				any(ComputationalCreateFormDTO.class));
+				.when(requestBuilder).newComputationalCreate(any(UserInfo.class), any(ProjectDTO.class),
+				any(UserInstanceDTO.class), any(ComputationalCreateFormDTO.class));
 
 		when(computationalDAO.updateComputationalStatus(any(ComputationalStatusDTO.class)))
 				.thenReturn(mock(UpdateResult.class));
@@ -438,13 +456,14 @@ public class ComputationalServiceImplTest {
 					"Cannot create instance of resource class ", e.getMessage());
 		}
 
+		verify(projectService).get("");
 		verify(computationalDAO).addComputational(eq(USER), eq(EXPLORATORY_NAME), refEq(ucResource));
 		verify(exploratoryDAO).fetchExploratoryFields(USER, EXPLORATORY_NAME);
 		verify(requestBuilder).newComputationalCreate(
-				refEq(userInfo), refEq(userInstance), refEq(computationalCreateFormDTO));
+				refEq(userInfo), refEq(projectDTO), refEq(userInstance), refEq(computationalCreateFormDTO));
 		verify(computationalDAO).updateComputationalStatus(refEq(computationalStatusDTOWithStatusFailed, "self"));
 
-		verifyNoMoreInteractions(computationalDAO, exploratoryDAO, requestBuilder);
+		verifyNoMoreInteractions(projectService, computationalDAO, exploratoryDAO, requestBuilder);
 	}
 
 	@Test
@@ -737,4 +756,9 @@ public class ComputationalServiceImplTest {
 		return ucResource;
 	}
 
+	private ProjectDTO getProjectDTO() {
+		return new ProjectDTO("project", Collections.emptySet(), "", "", null,
+				singletonList(new ProjectEndpointDTO("endpoint", UserInstanceStatus.RUNNING,
+						new EdgeInfo())), true);
+	}
 }
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/EnvironmentServiceImplTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/EnvironmentServiceImplTest.java
index 31ce990..bc8db84 100644
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/EnvironmentServiceImplTest.java
+++ b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/EnvironmentServiceImplTest.java
@@ -384,6 +384,6 @@ public class EnvironmentServiceImplTest {
 	private ProjectDTO getProjectDTO() {
 		return new ProjectDTO(PROJECT_NAME, Collections.emptySet(), "", "", null,
 				Collections.singletonList(new ProjectEndpointDTO(ENDPOINT_NAME, UserInstanceStatus.RUNNING,
-						new EdgeInfo())));
+						new EdgeInfo())), true);
 	}
 }
\ No newline at end of file
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/ExploratoryServiceImplTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/ExploratoryServiceImplTest.java
index 8f532ff..3c7de87 100644
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/ExploratoryServiceImplTest.java
+++ b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/ExploratoryServiceImplTest.java
@@ -24,14 +24,18 @@ import com.epam.dlab.backendapi.dao.ComputationalDAO;
 import com.epam.dlab.backendapi.dao.ExploratoryDAO;
 import com.epam.dlab.backendapi.dao.GitCredsDAO;
 import com.epam.dlab.backendapi.domain.EndpointDTO;
+import com.epam.dlab.backendapi.domain.ProjectDTO;
+import com.epam.dlab.backendapi.domain.ProjectEndpointDTO;
 import com.epam.dlab.backendapi.domain.RequestId;
 import com.epam.dlab.backendapi.service.EndpointService;
+import com.epam.dlab.backendapi.service.ProjectService;
 import com.epam.dlab.backendapi.service.TagService;
 import com.epam.dlab.backendapi.util.RequestBuilder;
 import com.epam.dlab.dto.StatusEnvBaseDTO;
 import com.epam.dlab.dto.UserInstanceDTO;
 import com.epam.dlab.dto.UserInstanceStatus;
 import com.epam.dlab.dto.aws.computational.ClusterConfig;
+import com.epam.dlab.dto.base.edge.EdgeInfo;
 import com.epam.dlab.dto.computational.UserComputationalResource;
 import com.epam.dlab.dto.exploratory.*;
 import com.epam.dlab.exceptions.DlabException;
@@ -64,12 +68,16 @@ public class ExploratoryServiceImplTest {
 	private final String TOKEN = "token";
 	private final String EXPLORATORY_NAME = "expName";
 	private final String UUID = "1234-56789765-4321";
+	private static final String ENDPOINT_NAME = "endpointName";
+
 
 	private UserInfo userInfo;
 	private UserInstanceDTO userInstance;
 	private StatusEnvBaseDTO statusEnvBaseDTO;
 
 	@Mock
+	private ProjectService projectService;
+	@Mock
 	private ExploratoryDAO exploratoryDAO;
 	@Mock
 	private ComputationalDAO computationalDAO;
@@ -257,6 +265,8 @@ public class ExploratoryServiceImplTest {
 
 	@Test
 	public void create() {
+		ProjectDTO projectDTO = getProjectDTO();
+		when(projectService.get(anyString())).thenReturn(projectDTO);
 		when(endpointService.get(anyString())).thenReturn(endpointDTO());
 		doNothing().when(exploratoryDAO).insertExploratory(any(UserInstanceDTO.class));
 		ExploratoryGitCredsDTO egcDto = new ExploratoryGitCredsDTO();
@@ -264,8 +274,8 @@ public class ExploratoryServiceImplTest {
 
 		ExploratoryCreateDTO ecDto = new ExploratoryCreateDTO();
 		Exploratory exploratory = Exploratory.builder().name(EXPLORATORY_NAME).build();
-		when(requestBuilder.newExploratoryCreate(any(Exploratory.class), any(UserInfo.class),
-				any(ExploratoryGitCredsDTO.class), anyMapOf(String.class, String.class))).thenReturn(ecDto);
+		when(requestBuilder.newExploratoryCreate(any(ProjectDTO.class), any(Exploratory.class),
+				any(UserInfo.class), any(ExploratoryGitCredsDTO.class), anyMapOf(String.class, String.class))).thenReturn(ecDto);
 		String exploratoryCreate = "exploratory/create";
 		when(provisioningService.post(anyString(), anyString(), any(ExploratoryCreateDTO.class), any()))
 				.thenReturn(UUID);
@@ -277,12 +287,13 @@ public class ExploratoryServiceImplTest {
 
 		userInstance.withStatus("creating");
 		userInstance.withResources(Collections.emptyList());
+		verify(projectService).get("project");
 		verify(exploratoryDAO).insertExploratory(userInstance);
 		verify(gitCredsDAO).findGitCreds(USER);
-		verify(requestBuilder).newExploratoryCreate(exploratory, userInfo, egcDto, Collections.emptyMap());
+		verify(requestBuilder).newExploratoryCreate(projectDTO, exploratory, userInfo, egcDto, Collections.emptyMap());
 		verify(provisioningService).post(endpointDTO().getUrl() + exploratoryCreate, TOKEN, ecDto, String.class);
 		verify(requestId).put(USER, UUID);
-		verifyNoMoreInteractions(exploratoryDAO, gitCredsDAO, requestBuilder, provisioningService, requestId);
+		verifyNoMoreInteractions(projectService, exploratoryDAO, gitCredsDAO, requestBuilder, provisioningService, requestId);
 	}
 
 	@Test
@@ -316,6 +327,8 @@ public class ExploratoryServiceImplTest {
 
 	@Test
 	public void createWhenMethodNewExploratoryCreateThrowsException() {
+		ProjectDTO projectDTO = getProjectDTO();
+		when(projectService.get(anyString())).thenReturn(projectDTO);
 		when(endpointService.get(anyString())).thenReturn(endpointDTO());
 		doNothing().when(exploratoryDAO).insertExploratory(any(UserInstanceDTO.class));
 		ExploratoryGitCredsDTO egcDto = new ExploratoryGitCredsDTO();
@@ -324,8 +337,8 @@ public class ExploratoryServiceImplTest {
 		Exploratory exploratory = Exploratory.builder().name(EXPLORATORY_NAME).build();
 
 		doThrow(new DlabException("Cannot create instance of resource class ")).when(requestBuilder)
-				.newExploratoryCreate(any(Exploratory.class), any(UserInfo.class), any(ExploratoryGitCredsDTO.class),
-						anyMapOf(String.class, String.class));
+				.newExploratoryCreate(any(ProjectDTO.class), any(Exploratory.class), any(UserInfo.class),
+						any(ExploratoryGitCredsDTO.class), anyMapOf(String.class, String.class));
 
 		when(exploratoryDAO.updateExploratoryStatus(any(StatusEnvBaseDTO.class))).thenReturn(mock(UpdateResult.class));
 		try {
@@ -339,11 +352,12 @@ public class ExploratoryServiceImplTest {
 
 		userInstance.withStatus("creating");
 		userInstance.withResources(Collections.emptyList());
+		verify(projectService).get("project");
 		verify(exploratoryDAO).insertExploratory(userInstance);
 		verify(gitCredsDAO).findGitCreds(USER);
-		verify(requestBuilder).newExploratoryCreate(exploratory, userInfo, egcDto, Collections.emptyMap());
+		verify(requestBuilder).newExploratoryCreate(projectDTO, exploratory, userInfo, egcDto, Collections.emptyMap());
 		verify(exploratoryDAO).updateExploratoryStatus(refEq(statusEnvBaseDTO, "self"));
-		verifyNoMoreInteractions(exploratoryDAO, gitCredsDAO, requestBuilder);
+		verifyNoMoreInteractions(projectService, exploratoryDAO, gitCredsDAO, requestBuilder);
 	}
 
 	@Test
@@ -578,4 +592,9 @@ public class ExploratoryServiceImplTest {
 		return new EndpointDTO("test", "url", "", null);
 	}
 
+	private ProjectDTO getProjectDTO() {
+		return new ProjectDTO("project", Collections.emptySet(), "", "", null,
+				singletonList(new ProjectEndpointDTO(ENDPOINT_NAME, UserInstanceStatus.RUNNING,
+						new EdgeInfo())), true);
+	}
 }
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/InfrastructureTemplateServiceBaseTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/InfrastructureTemplateServiceBaseTest.java
index ab5e493..01dbff6 100644
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/InfrastructureTemplateServiceBaseTest.java
+++ b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/InfrastructureTemplateServiceBaseTest.java
@@ -126,7 +126,7 @@ public class InfrastructureTemplateServiceBaseTest {
 				computationalMetadataDTO
 		);
 		when(projectDAO.get(anyString())).thenReturn(Optional.of(new ProjectDTO("project", Collections.emptySet(),
-				null, null, null, null)));
+				null, null, null, null, true)));
 		when(provisioningService.get(anyString(), anyString(), any())).thenReturn(expectedCmdDtoList.toArray(new ComputationalMetadataDTO[]{}));
 
 		List<FullComputationalTemplate> expectedFullCmdDtoList = expectedCmdDtoList.stream()
@@ -171,7 +171,7 @@ public class InfrastructureTemplateServiceBaseTest {
 		List<ComputationalMetadataDTO> expectedCmdDtoList = Collections.singletonList(computationalMetadataDTO);
 		when(provisioningService.get(anyString(), anyString(), any())).thenReturn(expectedCmdDtoList.toArray(new ComputationalMetadataDTO[]{}));
 		when(projectDAO.get(anyString())).thenReturn(Optional.of(new ProjectDTO("project", Collections.emptySet(),
-				null, null, null, null)));
+				null, null, null, null, true)));
 
 		UserInfo userInfo = new UserInfo("test", "token");
 		try {
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/UserGroupServiceImplTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/UserGroupServiceImplTest.java
index d494d5d..305e852 100644
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/UserGroupServiceImplTest.java
+++ b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/UserGroupServiceImplTest.java
@@ -157,7 +157,7 @@ public class UserGroupServiceImplTest {
 
 		when(userRoleDao.removeGroup(anyString())).thenReturn(true);
 		final ProjectDTO projectDTO = new ProjectDTO(
-				"name", Collections.emptySet(), "", "", null, Collections.emptyList());
+				"name", Collections.emptySet(), "", "", null, Collections.emptyList(), true);
 		when(projectDAO.getProjectsWithEndpointStatusNotIn(UserInstanceStatus.TERMINATED,
 				UserInstanceStatus.TERMINATING)).thenReturn(Collections.singletonList(projectDTO));
 		doNothing().when(userGroupDao).removeGroup(anyString());
@@ -175,7 +175,7 @@ public class UserGroupServiceImplTest {
 		when(userRoleDao.removeGroup(anyString())).thenReturn(true);
 		when(projectDAO.getProjectsWithEndpointStatusNotIn(UserInstanceStatus.TERMINATED,
 				UserInstanceStatus.TERMINATING)).thenReturn(Collections.singletonList( new ProjectDTO(
-				"name", Collections.singleton(GROUP), "", "", null, Collections.emptyList())));
+				"name", Collections.singleton(GROUP), "", "", null, Collections.emptyList(), true)));
 		doNothing().when(userGroupDao).removeGroup(anyString());
 
 		try {
@@ -193,7 +193,7 @@ public class UserGroupServiceImplTest {
 	public void removeGroupWhenGroupNotExist() {
 
 		final ProjectDTO projectDTO = new ProjectDTO(
-				"name", Collections.emptySet(), "", "", null, Collections.emptyList());
+				"name", Collections.emptySet(), "", "", null, Collections.emptyList(), true);
 		when(projectDAO.getProjectsWithEndpointStatusNotIn(UserInstanceStatus.TERMINATED,
 				UserInstanceStatus.TERMINATING)).thenReturn(Collections.singletonList(projectDTO));
 		when(userRoleDao.removeGroup(anyString())).thenReturn(false);
@@ -209,7 +209,7 @@ public class UserGroupServiceImplTest {
 	@Test
 	public void removeGroupWithException() {
 		final ProjectDTO projectDTO = new ProjectDTO(
-				"name", Collections.emptySet(), "", "", null, Collections.emptyList());
+				"name", Collections.emptySet(), "", "", null, Collections.emptyList(), true);
 		when(projectDAO.getProjectsWithEndpointStatusNotIn(UserInstanceStatus.TERMINATED,
 				UserInstanceStatus.TERMINATING)).thenReturn(Collections.singletonList(projectDTO));
 		when(userRoleDao.removeGroup(anyString())).thenThrow(new DlabException("Exception"));


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