You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@datalab.apache.org by yk...@apache.org on 2021/04/12 14:46:19 UTC

[incubator-datalab] branch DATALAB-2091 updated: [DATALAB-2091] - fixed conflicts

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

ykinash pushed a commit to branch DATALAB-2091
in repository https://gitbox.apache.org/repos/asf/incubator-datalab.git


The following commit(s) were added to refs/heads/DATALAB-2091 by this push:
     new de076d3  [DATALAB-2091] - fixed conflicts
de076d3 is described below

commit de076d3e789eb2c080ffbd19160a9548ec279079
Author: KinashYurii <ur...@gmail.com>
AuthorDate: Mon Apr 12 17:46:04 2021 +0300

    [DATALAB-2091] - fixed conflicts
---
 .../src/general/files/aws/jupyter_description.json |   4 +
 .../general/files/azure/jupyter_description.json   |   4 +
 .../src/general/files/gcp/jupyter_description.json |   4 +
 .../java/com/epam/datalab/dto/UserInstanceDTO.java |  21 ++++
 .../computational/UserComputationalResource.java   |   9 ++
 .../gcp/computational/ComputationalCreateGcp.java  |  45 +++++++
 .../computational/GcpComputationalResource.java    |  27 +++--
 .../dto/imagemetadata/ComputationalGPU.java}       |  23 ++--
 .../imagemetadata/ComputationalMetadataDTO.java    |   3 +
 .../dto/imagemetadata/ExploratoryMetadataDTO.java  |   4 +
 .../datalab/model/exploratory/Exploratory.java     |   3 +
 .../datalab/backendapi/core/DockerWarmuper.java    |  13 ++-
 .../resources/dto/ComputationalCreateFormDTO.java  |   3 +
 .../resources/dto/ExploratoryCreateFormDTO.java    | 115 ++----------------
 .../backendapi/resources/dto/UserResourceInfo.java |  10 ++
 .../dto/gcp/GcpComputationalCreateForm.java        |  17 +++
 .../resources/gcp/ComputationalResourceGcp.java    |   5 +
 .../datalab/backendapi/service/TagService.java     |   4 +-
 .../datalab/backendapi/service/TagServiceImpl.java |   6 +-
 .../service/impl/ComputationalServiceImpl.java     |  43 ++-----
 .../service/impl/EnvironmentServiceImpl.java       | 129 ++++++++++-----------
 .../service/impl/ExploratoryServiceImpl.java       |  60 ++--------
 .../impl/InfrastructureInfoServiceImpl.java        |  12 +-
 .../datalab/backendapi/util/RequestBuilder.java    |   4 +
 .../backendapi/service/TagServiceImplTest.java     |   8 +-
 25 files changed, 280 insertions(+), 296 deletions(-)

diff --git a/infrastructure-provisioning/src/general/files/aws/jupyter_description.json b/infrastructure-provisioning/src/general/files/aws/jupyter_description.json
index accfd94..ceb8614 100644
--- a/infrastructure-provisioning/src/general/files/aws/jupyter_description.json
+++ b/infrastructure-provisioning/src/general/files/aws/jupyter_description.json
@@ -25,5 +25,9 @@
       "version": "jupyter_notebook-6.1.6",
       "vendor": "AWS"
     }
+  ],
+  "gpu_types": [
+    {"Size": "S",  "Gpu_type": "nvidia-tesla-t4"},
+    {"Size": "M",  "Gpu_type": "nvidia-tesla-v100"}
   ]
 }
\ No newline at end of file
diff --git a/infrastructure-provisioning/src/general/files/azure/jupyter_description.json b/infrastructure-provisioning/src/general/files/azure/jupyter_description.json
index 33ed451..2b02a1b 100644
--- a/infrastructure-provisioning/src/general/files/azure/jupyter_description.json
+++ b/infrastructure-provisioning/src/general/files/azure/jupyter_description.json
@@ -21,5 +21,9 @@
       "version": "jupyter_notebook-6.1.6",
       "vendor": "Azure"
     }
+  ],
+  "gpu_types": [
+    {"Size": "S",  "Gpu_type": "nvidia-tesla-t4"},
+    {"Size": "M",  "Gpu_type": "nvidia-tesla-v100"}
   ]
 }
\ No newline at end of file
diff --git a/infrastructure-provisioning/src/general/files/gcp/jupyter_description.json b/infrastructure-provisioning/src/general/files/gcp/jupyter_description.json
index 1eafbed..ac0ad54 100644
--- a/infrastructure-provisioning/src/general/files/gcp/jupyter_description.json
+++ b/infrastructure-provisioning/src/general/files/gcp/jupyter_description.json
@@ -29,5 +29,9 @@
       "version": "jupyter_notebook-6.1.6",
       "vendor": "GCP"
     }
+  ],
+  "gpu_types": [
+    {"Size": "S",  "Gpu_type": "nvidia-tesla-t4"},
+    {"Size": "M",  "Gpu_type": "nvidia-tesla-v100"}
   ]
 }
\ No newline at end of file
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/UserInstanceDTO.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/UserInstanceDTO.java
index 45607f1..bfa00f7 100644
--- a/services/datalab-model/src/main/java/com/epam/datalab/dto/UserInstanceDTO.java
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/UserInstanceDTO.java
@@ -86,6 +86,12 @@ public class UserInstanceDTO {
     private List<ClusterConfig> clusterConfig;
     @JsonProperty
     private Map<String, String> tags;
+    @JsonProperty("gpu_enabled")
+    private boolean enabledGPU = false;
+    @JsonProperty("gpuType")
+    private String gpuType;
+    @JsonProperty("gpuCount")
+    private String gpuCount;
 
     /**
      * Sets the user login name.
@@ -191,4 +197,19 @@ public class UserInstanceDTO {
         setTags(tags);
         return this;
     }
+
+    public UserInstanceDTO withGPUType(String gpuType) {
+        setGpuType(gpuType);
+        return this;
+    }
+
+    public UserInstanceDTO withGPUEnabled(boolean gpuEnabled) {
+        setEnabledGPU(gpuEnabled);
+        return this;
+    }
+
+    public UserInstanceDTO withGPUCount(String gpuCount) {
+        setGpuCount(gpuCount);
+        return this;
+    }
 }
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/computational/UserComputationalResource.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/computational/UserComputationalResource.java
index 8a52ece..37fd927 100644
--- a/services/datalab-model/src/main/java/com/epam/datalab/dto/computational/UserComputationalResource.java
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/computational/UserComputationalResource.java
@@ -74,6 +74,15 @@ public class UserComputationalResource {
     private int totalInstanceCount;
     protected List<ClusterConfig> config;
     private Map<String, String> tags;
+    @JsonProperty("masterGPUType")
+    private  String masterGPUType;
+    @JsonProperty("slaveGPUType")
+    private  String slaveGPUType;
+    @JsonProperty("masterGPUCount")
+    private  String masterGPUCount;
+    @JsonProperty("slaveGPUCount")
+    private  String slaveGPUCount;
+    private  boolean enabledGPU;
 
     public UserComputationalResource(String computationalName, String computationalId, String imageName,
                                      String templateName, String status, Date uptime, SchedulerJobDTO schedulerData,
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/gcp/computational/ComputationalCreateGcp.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/gcp/computational/ComputationalCreateGcp.java
index 7cbcfac..7b32117 100644
--- a/services/datalab-model/src/main/java/com/epam/datalab/dto/gcp/computational/ComputationalCreateGcp.java
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/gcp/computational/ComputationalCreateGcp.java
@@ -38,6 +38,51 @@ public class ComputationalCreateGcp extends ComputationalBase<ComputationalCreat
     private String version;
     @JsonProperty("conf_shared_image_enabled")
     private String sharedImageEnabled;
+    @JsonProperty("masterGPUType")
+    private String masterGPUType;
+    @JsonProperty("slaveGPUType")
+    private String slaveGPUType;
+    @JsonProperty("masterGPUCount")
+    private String masterGPUCount;
+    @JsonProperty("slaveGPUCount")
+    private String slaveGPUCount;
+
+
+    public ComputationalCreateGcp withMasterGPUType(String masterGPUType) {
+        this.masterGPUType = masterGPUType;
+        return this;
+    }
+
+    public ComputationalCreateGcp withSlaveGPUType(String slaveGPUType) {
+        this.slaveGPUType = slaveGPUType;
+        return this;
+    }
+
+    public ComputationalCreateGcp withMasterGPUCount(String masterGPUCount) {
+        this.masterGPUCount = masterGPUCount;
+        return this;
+    }
+
+    public ComputationalCreateGcp withSlaveGPUCount(String slaveGPUCount) {
+        this.slaveGPUCount = slaveGPUCount;
+        return this;
+    }
+
+    public String getSlaveGPUCount() {
+        return slaveGPUCount;
+    }
+
+    public String getMasterGPUCount() {
+        return masterGPUCount;
+    }
+
+    public String getSlaveGPUType() {
+        return slaveGPUType;
+    }
+
+    public String getMasterGPUType() {
+        return masterGPUType;
+    }
 
     public ComputationalCreateGcp withMasterInstanceCount(String masterInstanceCount) {
         this.masterInstanceCount = masterInstanceCount;
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/gcp/computational/GcpComputationalResource.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/gcp/computational/GcpComputationalResource.java
index e807c6d..72485e0 100644
--- a/services/datalab-model/src/main/java/com/epam/datalab/dto/gcp/computational/GcpComputationalResource.java
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/gcp/computational/GcpComputationalResource.java
@@ -42,19 +42,28 @@ import java.util.Map;
 public class GcpComputationalResource extends UserComputationalResource {
 
     @JsonProperty("instance_id")
-    private String instanceId;
+    private final String instanceId;
     @JsonProperty("master_node_shape")
-    private String masterShape;
+    private final String masterShape;
     @JsonProperty("slave_node_shape")
-    private String slaveShape;
+    private final String slaveShape;
     @JsonProperty("total_slave_instance_number")
-    private String slaveNumber;
+    private final String slaveNumber;
     @JsonProperty("total_master_instance_number")
-    private String masterNumber;
+    private final String masterNumber;
     @JsonProperty("total_preemptible_number")
-    private String preemptibleNumber;
+    private final String preemptibleNumber;
     @JsonProperty("dataproc_version")
-    private String version;
+    private final String version;
+    @JsonProperty("masterGPUType")
+    private final String masterGPUType;
+    @JsonProperty("slaveGPUType")
+    private final String slaveGPUType;
+    @JsonProperty("masterGPUCount")
+    private final String masterGPUCount;
+    @JsonProperty("slaveGPUCount")
+    private final String slaveGPUCount;
+    private final Boolean enabledGPU;
 
     @Builder
     public GcpComputationalResource(String computationalName, String computationalId, String imageName,
@@ -63,7 +72,9 @@ public class GcpComputationalResource extends UserComputationalResource {
                                     String instanceId, String masterShape, String slaveShape, String slaveNumber,
                                     String masterNumber, String preemptibleNumber, String version,
                                     List<ResourceURL> resourceURL, LocalDateTime lastActivity,
-                                    Map<String, String> tags, int totalInstanceCount) {
+                                    Map<String, String> tags, int totalInstanceCount,
+                                    String masterGPUCount, String masterGPUType, String slaveGPUCount,
+                                    String slaveGPUType, Boolean enabledGPU) {
         super(computationalName, computationalId, imageName, templateName, status, uptime, schedulerJobData,
                 reuploadKeyRequired, resourceURL, lastActivity, tags, totalInstanceCount);
         this.instanceId = instanceId;
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/TagService.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/imagemetadata/ComputationalGPU.java
similarity index 64%
copy from services/self-service/src/main/java/com/epam/datalab/backendapi/service/TagService.java
copy to services/datalab-model/src/main/java/com/epam/datalab/dto/imagemetadata/ComputationalGPU.java
index e003e02..7c9481b 100644
--- a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/TagService.java
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/imagemetadata/ComputationalGPU.java
@@ -17,13 +17,22 @@
  * under the License.
  */
 
-package com.epam.datalab.backendapi.service;
+package com.epam.datalab.dto.imagemetadata;
 
-import com.epam.datalab.auth.UserInfo;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
 
-import java.util.Map;
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = false)
+public class ComputationalGPU {
 
-@FunctionalInterface
-public interface TagService {
-    Map<String, String> getResourceTags(UserInfo userInfo, String endpoint, String project, String customTag);
-}
+    @JsonProperty("Size")
+    private String size;
+    @JsonProperty("Gpu_type")
+    private String gpuType;
+}
\ No newline at end of file
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/imagemetadata/ComputationalMetadataDTO.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/imagemetadata/ComputationalMetadataDTO.java
index 626e70e..61dbb93 100644
--- a/services/datalab-model/src/main/java/com/epam/datalab/dto/imagemetadata/ComputationalMetadataDTO.java
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/imagemetadata/ComputationalMetadataDTO.java
@@ -45,6 +45,9 @@ public class ComputationalMetadataDTO extends ImageMetadataDTO {
     private String requestId;
     @JsonProperty(value = "computation_resources_shapes")
     private Map<String, List<ComputationalResourceShapeDto>> computationResourceShapes;
+    //GPU
+    @JsonProperty("gpu_types")
+    private List<ComputationalGPU> computationGPU;
 
     public ComputationalMetadataDTO(String imageName) {
         this.image = imageName;
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/imagemetadata/ExploratoryMetadataDTO.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/imagemetadata/ExploratoryMetadataDTO.java
index 3c961c2..de42238 100644
--- a/services/datalab-model/src/main/java/com/epam/datalab/dto/imagemetadata/ExploratoryMetadataDTO.java
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/imagemetadata/ExploratoryMetadataDTO.java
@@ -41,6 +41,10 @@ public class ExploratoryMetadataDTO extends ImageMetadataDTO {
     @JsonProperty("request_id")
     private String requestId;
 
+    //GPU
+    @JsonProperty("gpu_types")
+    private List<ComputationalGPU> computationGPU;
+
     public ExploratoryMetadataDTO(String imageName) {
         this.image = imageName;
         setImageType(ImageType.EXPLORATORY);
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/model/exploratory/Exploratory.java b/services/datalab-model/src/main/java/com/epam/datalab/model/exploratory/Exploratory.java
index 176e6a9..1414dd4 100644
--- a/services/datalab-model/src/main/java/com/epam/datalab/model/exploratory/Exploratory.java
+++ b/services/datalab-model/src/main/java/com/epam/datalab/model/exploratory/Exploratory.java
@@ -38,4 +38,7 @@ public class Exploratory {
     private final String project;
     private final String exploratoryTag;
     private final List<ClusterConfig> clusterConfig;
+    private Boolean enabledGPU;
+    private String gpuType;
+    private String gpuCount;
 }
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/DockerWarmuper.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/DockerWarmuper.java
index 3ed6399..5073406 100644
--- a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/DockerWarmuper.java
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/DockerWarmuper.java
@@ -156,17 +156,18 @@ public class DockerWarmuper implements Managed, DockerCommands, MetadataHolder {
         //do nothing
     }
 
+    @Override
+    public String getResourceType() {
+        return Directories.NOTEBOOK_LOG_DIRECTORY;
+    }
+
     public Map<String, String> getUuids() {
         return Collections.unmodifiableMap(imageList);
     }
 
     public Set<ImageMetadataDTO> getMetadata(ImageType type) {
-        return metadataDTOs.stream().filter(m -> m.getImageType().equals(type))
+        return metadataDTOs.stream()
+                .filter(m -> m.getImageType().equals(type))
                 .collect(Collectors.toSet());
     }
-
-    @Override
-    public String getResourceType() {
-        return Directories.NOTEBOOK_LOG_DIRECTORY;
-    }
 }
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ComputationalCreateFormDTO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ComputationalCreateFormDTO.java
index f4520ba..aab25ec 100644
--- a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ComputationalCreateFormDTO.java
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ComputationalCreateFormDTO.java
@@ -61,4 +61,7 @@ public class ComputationalCreateFormDTO {
     @Valid
     private List<ClusterConfig> config;
 
+    @JsonProperty("gpu_tag")
+    protected boolean gpuTag = false;
+
 }
\ No newline at end of file
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ExploratoryCreateFormDTO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ExploratoryCreateFormDTO.java
index d703563..8440ac5 100644
--- a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ExploratoryCreateFormDTO.java
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ExploratoryCreateFormDTO.java
@@ -22,6 +22,7 @@ package com.epam.datalab.backendapi.resources.dto;
 import com.epam.datalab.dto.aws.computational.ClusterConfig;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.google.common.base.MoreObjects;
+import lombok.Data;
 import org.hibernate.validator.constraints.NotBlank;
 
 import java.util.List;
@@ -29,6 +30,7 @@ import java.util.List;
 /**
  * Stores info about new exploratory.
  */
+@Data
 public class ExploratoryCreateFormDTO {
     @NotBlank
     @JsonProperty
@@ -66,113 +68,12 @@ public class ExploratoryCreateFormDTO {
     @JsonProperty("cluster_config")
     private List<ClusterConfig> clusterConfig;
 
-    /**
-     * Returns the image name of notebook.
-     */
-    public String getImage() {
-        return image;
-    }
-
-    /**
-     * Sets the image name of notebook.
-     */
-    public void setImage(String image) {
-        this.image = image;
-    }
-
-    /**
-     * Returns name of template.
-     */
-    public String getTemplateName() {
-        return templateName;
-    }
-
-    /**
-     * Sets name of template.
-     */
-    public void setTemplateName(String templateName) {
-        this.templateName = templateName;
-    }
-
-    /**
-     * Returns name of notebook.
-     */
-    public String getName() {
-        return name;
-    }
-
-    /**
-     * Sets name of notebook.
-     */
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    /**
-     * Returns name of shape.
-     */
-    public String getShape() {
-        return shape;
-    }
-
-    /**
-     * Sets name of shape.
-     */
-    public void setShape(String shape) {
-        this.shape = shape;
-    }
-
-    /**
-     * Returns version.
-     */
-    public String getVersion() {
-        return version;
-    }
-
-    /**
-     * Sets version.
-     */
-    public void setVersion(String version) {
-        this.version = version;
-    }
-
-    /**
-     * Returns image name from which notebook should be created
-     */
-    public String getImageName() {
-        return imageName;
-    }
-
-    /**
-     * Sets image name from which notebook should be created
-     */
-    public void setImageName(String imageName) {
-        this.imageName = imageName;
-    }
-
-    public List<ClusterConfig> getClusterConfig() {
-        return clusterConfig;
-    }
-
-    public String getProject() {
-        return project;
-    }
-
-    public void setProject(String project) {
-        this.project = project;
-    }
-
-    public String getEndpoint() {
-        return endpoint;
-    }
-
-    public void setEndpoint(String endpoint) {
-        this.endpoint = endpoint;
-    }
-
-    public String getExploratoryTag() {
-        return exploratoryTag;
-    }
+    @JsonProperty("gpu_enabled")
+    private Boolean enabledGPU;
+    @JsonProperty("gpuType")
+    private String gpuType;
+    @JsonProperty("gpuCount")
+    private String gpuCount;
 
     @Override
     public String toString() {
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/UserResourceInfo.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/UserResourceInfo.java
index 135fbaa..cca6769 100644
--- a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/UserResourceInfo.java
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/UserResourceInfo.java
@@ -27,6 +27,7 @@ import lombok.Builder;
 import lombok.Data;
 
 import java.util.List;
+import java.util.Map;
 
 @Data
 @Builder
@@ -54,4 +55,13 @@ public class UserResourceInfo {
     private String cloudProvider;
     @JsonProperty("exploratory_urls")
     private List<ResourceURL> exploratoryUrls;
+
+    @JsonProperty("gpu_enabled")
+    private Boolean gpuEnabled;
+    @JsonProperty("gpu_type")
+    private String gpuType;
+    @JsonProperty("gpu_count")
+    private String gpuCount;
+    @JsonProperty
+    private Map<String, String> tags;
 }
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/gcp/GcpComputationalCreateForm.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/gcp/GcpComputationalCreateForm.java
index df0bfd3..afca270 100644
--- a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/gcp/GcpComputationalCreateForm.java
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/gcp/GcpComputationalCreateForm.java
@@ -22,9 +22,11 @@ package com.epam.datalab.backendapi.resources.dto.gcp;
 import com.epam.datalab.backendapi.resources.dto.ComputationalCreateFormDTO;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 import lombok.ToString;
 import org.hibernate.validator.constraints.NotBlank;
 
+@EqualsAndHashCode(callSuper = true)
 @Data
 @ToString(callSuper = true)
 public class GcpComputationalCreateForm extends ComputationalCreateFormDTO {
@@ -50,4 +52,19 @@ public class GcpComputationalCreateForm extends ComputationalCreateFormDTO {
     @NotBlank
     @JsonProperty("dataproc_version")
     private String version;
+
+    @JsonProperty("gpu_enabled")
+    private Boolean enabledGPU;
+
+    @JsonProperty("masterGPUType")
+    private String masterGPUType;
+
+    @JsonProperty("slaveGPUType")
+    private String slaveGPUType;
+
+    @JsonProperty("masterGPUCount")
+    private String masterGPUCount;
+
+    @JsonProperty("slaveGPUCount")
+    private String slaveGPUCount;
 }
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/gcp/ComputationalResourceGcp.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/gcp/ComputationalResourceGcp.java
index 28470e4..460e255 100644
--- a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/gcp/ComputationalResourceGcp.java
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/gcp/ComputationalResourceGcp.java
@@ -101,6 +101,11 @@ public class ComputationalResourceGcp implements ComputationalAPI {
                     .imageName(form.getImage())
                     .templateName(form.getTemplateName())
                     .status(CREATING.toString())
+                    .masterGPUCount(form.getMasterGPUCount())
+                    .masterGPUType(form.getMasterGPUType())
+                    .slaveGPUCount(form.getSlaveGPUCount())
+                    .slaveGPUType(form.getSlaveGPUType())
+                    .enabledGPU(form.getEnabledGPU())
                     .masterShape(form.getMasterInstanceType())
                     .slaveShape(form.getSlaveInstanceType())
                     .slaveNumber(form.getSlaveInstanceCount())
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/TagService.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/TagService.java
index e003e02..3aea642 100644
--- a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/TagService.java
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/TagService.java
@@ -25,5 +25,5 @@ import java.util.Map;
 
 @FunctionalInterface
 public interface TagService {
-    Map<String, String> getResourceTags(UserInfo userInfo, String endpoint, String project, String customTag);
-}
+    Map<String, String> getResourceTags(UserInfo userInfo, String endpoint, String project, String customTag
+            , boolean gpuEnabled);}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/TagServiceImpl.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/TagServiceImpl.java
index 1990dfa..891b599 100644
--- a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/TagServiceImpl.java
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/TagServiceImpl.java
@@ -30,12 +30,16 @@ import java.util.Optional;
 public class TagServiceImpl implements TagService {
 
     @Override
-    public Map<String, String> getResourceTags(UserInfo userInfo, String endpoint, String project, String customTag) {
+    public Map<String, String> getResourceTags(UserInfo userInfo, String endpoint, String project,
+                                               String customTag, boolean gpuEnabled) {
         Map<String, String> tags = new HashMap<>();
         tags.put("user_tag", userInfo.getName());
         tags.put("endpoint_tag", endpoint);
         tags.put("project_tag", project);
         Optional.ofNullable(customTag).ifPresent(t -> tags.put("custom_tag", t));
+        if (gpuEnabled) {
+            tags.put("gpu_tag", "gpu");
+        }
         return tags;
     }
 }
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 245f4c4..de80e1d 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
@@ -21,12 +21,7 @@ package com.epam.datalab.backendapi.service.impl;
 
 
 import com.epam.datalab.auth.UserInfo;
-import com.epam.datalab.backendapi.annotation.Audit;
-import com.epam.datalab.backendapi.annotation.BudgetLimited;
-import com.epam.datalab.backendapi.annotation.Info;
-import com.epam.datalab.backendapi.annotation.Project;
-import com.epam.datalab.backendapi.annotation.ResourceName;
-import com.epam.datalab.backendapi.annotation.User;
+import com.epam.datalab.backendapi.annotation.*;
 import com.epam.datalab.backendapi.dao.ComputationalDAO;
 import com.epam.datalab.backendapi.dao.ExploratoryDAO;
 import com.epam.datalab.backendapi.domain.EndpointDTO;
@@ -35,11 +30,7 @@ import com.epam.datalab.backendapi.domain.RequestId;
 import com.epam.datalab.backendapi.resources.dto.ComputationalCreateFormDTO;
 import com.epam.datalab.backendapi.resources.dto.ComputationalTemplatesDTO;
 import com.epam.datalab.backendapi.resources.dto.SparkStandaloneClusterCreateForm;
-import com.epam.datalab.backendapi.service.ComputationalService;
-import com.epam.datalab.backendapi.service.EndpointService;
-import com.epam.datalab.backendapi.service.InfrastructureTemplateService;
-import com.epam.datalab.backendapi.service.ProjectService;
-import com.epam.datalab.backendapi.service.TagService;
+import com.epam.datalab.backendapi.service.*;
 import com.epam.datalab.backendapi.util.RequestBuilder;
 import com.epam.datalab.constants.ServiceConsts;
 import com.epam.datalab.dto.UserInstanceDTO;
@@ -48,11 +39,7 @@ import com.epam.datalab.dto.aws.computational.ClusterConfig;
 import com.epam.datalab.dto.base.DataEngineType;
 import com.epam.datalab.dto.base.computational.ComputationalBase;
 import com.epam.datalab.dto.base.computational.FullComputationalTemplate;
-import com.epam.datalab.dto.computational.ComputationalClusterConfigDTO;
-import com.epam.datalab.dto.computational.ComputationalStatusDTO;
-import com.epam.datalab.dto.computational.ComputationalTerminateDTO;
-import com.epam.datalab.dto.computational.SparkStandaloneClusterResource;
-import com.epam.datalab.dto.computational.UserComputationalResource;
+import com.epam.datalab.dto.computational.*;
 import com.epam.datalab.exceptions.DatalabException;
 import com.epam.datalab.exceptions.ResourceNotFoundException;
 import com.epam.datalab.rest.client.RESTService;
@@ -62,26 +49,12 @@ import com.google.inject.Singleton;
 import com.google.inject.name.Named;
 import lombok.extern.slf4j.Slf4j;
 
-import java.util.Collection;
-import java.util.EnumMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
+import java.util.*;
 import java.util.stream.Collectors;
 
-import static com.epam.datalab.backendapi.domain.AuditActionEnum.CREATE;
-import static com.epam.datalab.backendapi.domain.AuditActionEnum.RECONFIGURE;
-import static com.epam.datalab.backendapi.domain.AuditActionEnum.START;
-import static com.epam.datalab.backendapi.domain.AuditActionEnum.STOP;
-import static com.epam.datalab.backendapi.domain.AuditActionEnum.TERMINATE;
-import static com.epam.datalab.backendapi.domain.AuditActionEnum.UPDATE;
+import static com.epam.datalab.backendapi.domain.AuditActionEnum.*;
 import static com.epam.datalab.backendapi.domain.AuditResourceTypeEnum.COMPUTE;
-import static com.epam.datalab.dto.UserInstanceStatus.CREATING;
-import static com.epam.datalab.dto.UserInstanceStatus.FAILED;
-import static com.epam.datalab.dto.UserInstanceStatus.RECONFIGURING;
-import static com.epam.datalab.dto.UserInstanceStatus.STARTING;
-import static com.epam.datalab.dto.UserInstanceStatus.STOPPING;
-import static com.epam.datalab.dto.UserInstanceStatus.TERMINATING;
+import static com.epam.datalab.dto.UserInstanceStatus.*;
 import static com.epam.datalab.dto.base.DataEngineType.CLOUD_SERVICE;
 import static com.epam.datalab.dto.base.DataEngineType.SPARK_STANDALONE;
 import static com.epam.datalab.rest.contracts.ComputationalAPI.COMPUTATIONAL_CREATE_CLOUD_SPECIFIC;
@@ -162,7 +135,7 @@ public class ComputationalServiceImpl implements ComputationalService {
                 exploratoryDAO.fetchExploratoryFields(userInfo.getName(), project, form.getNotebookName());
         final SparkStandaloneClusterResource compResource = createInitialComputationalResource(form);
         compResource.setTags(tagService.getResourceTags(userInfo, instance.getEndpoint(), project,
-                form.getCustomTag()));
+                form.getCustomTag(), false));
         if (computationalDAO.addComputational(userInfo.getName(), form.getNotebookName(), project, compResource)) {
             try {
                 EndpointDTO endpointDTO = endpointService.get(instance.getEndpoint());
@@ -225,7 +198,7 @@ public class ComputationalServiceImpl implements ComputationalService {
         final UserInstanceDTO instance = exploratoryDAO.fetchExploratoryFields(userInfo.getName(), project, formDTO
                 .getNotebookName());
         final Map<String, String> tags = tagService.getResourceTags(userInfo, instance.getEndpoint(), project,
-                formDTO.getCustomTag());
+                formDTO.getCustomTag(), formDTO.isGpuTag());
         computationalResource.setTags(tags);
         boolean isAdded = computationalDAO.addComputational(userInfo.getName(), formDTO.getNotebookName(), project,
                 computationalResource);
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/EnvironmentServiceImpl.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/EnvironmentServiceImpl.java
index 19e1cd3..2f23861 100644
--- a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/EnvironmentServiceImpl.java
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/EnvironmentServiceImpl.java
@@ -30,11 +30,7 @@ import com.epam.datalab.backendapi.domain.OdahuDTO;
 import com.epam.datalab.backendapi.domain.ProjectDTO;
 import com.epam.datalab.backendapi.resources.dto.UserDTO;
 import com.epam.datalab.backendapi.resources.dto.UserResourceInfo;
-import com.epam.datalab.backendapi.service.ComputationalService;
-import com.epam.datalab.backendapi.service.EnvironmentService;
-import com.epam.datalab.backendapi.service.ExploratoryService;
-import com.epam.datalab.backendapi.service.ProjectService;
-import com.epam.datalab.backendapi.service.SecurityService;
+import com.epam.datalab.backendapi.service.*;
 import com.epam.datalab.dto.UserInstanceDTO;
 import com.epam.datalab.dto.UserInstanceStatus;
 import com.epam.datalab.dto.status.EnvResource;
@@ -45,20 +41,13 @@ import com.google.inject.Inject;
 import com.google.inject.Singleton;
 import lombok.extern.slf4j.Slf4j;
 
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-import java.util.Objects;
-import java.util.Set;
+import java.util.*;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 import static com.epam.datalab.backendapi.resources.dto.UserDTO.Status.ACTIVE;
 import static com.epam.datalab.backendapi.resources.dto.UserDTO.Status.NOT_ACTIVE;
-import static com.epam.datalab.dto.UserInstanceStatus.CREATING;
-import static com.epam.datalab.dto.UserInstanceStatus.CREATING_IMAGE;
-import static com.epam.datalab.dto.UserInstanceStatus.RUNNING;
-import static com.epam.datalab.dto.UserInstanceStatus.STARTING;
+import static com.epam.datalab.dto.UserInstanceStatus.*;
 import static com.epam.datalab.rest.contracts.ComputationalAPI.AUDIT_MESSAGE;
 
 @Singleton
@@ -102,19 +91,19 @@ public class EnvironmentServiceImpl implements EnvironmentService {
         final Stream<UserDTO> notActiveUsersStream = notActiveUsers
                 .stream()
                 .map(u -> toUserDTO(u, NOT_ACTIVE));
-	    return Stream.concat(activeUsersStream, notActiveUsersStream)
-			    .collect(Collectors.toList());
+        return Stream.concat(activeUsersStream, notActiveUsersStream)
+                .collect(Collectors.toList());
     }
 
     @Override
     public List<UserResourceInfo> getAllEnv(UserInfo user) {
         log.debug("Getting all user's environment...");
         List<UserInstanceDTO> expList = exploratoryDAO.getInstances();
-	    return projectService.getProjects(user)
-			    .stream()
-			    .map(projectDTO -> getProjectEnv(projectDTO, expList))
-			    .flatMap(Collection::stream)
-			    .collect(Collectors.toList());
+        return projectService.getProjects(user)
+                .stream()
+                .map(projectDTO -> getProjectEnv(projectDTO, expList))
+                .flatMap(Collection::stream)
+                .collect(Collectors.toList());
     }
 
     @Override
@@ -137,7 +126,7 @@ public class EnvironmentServiceImpl implements EnvironmentService {
     @Override
     public void stopProjectEnvironment(String project) {
         log.debug("Stopping environment for project {}", project);
-        checkProjectResourceConditions(project, "stop");
+        checkProjectResourceConditions(project);
         exploratoryDAO.fetchRunningExploratoryFieldsForProject(project)
                 .forEach(this::stopNotebookWithServiceAccount);
 
@@ -225,29 +214,29 @@ public class EnvironmentServiceImpl implements EnvironmentService {
     }
 
     private List<UserResourceInfo> getProjectEnv(ProjectDTO projectDTO, List<UserInstanceDTO> allInstances) {
-	    final Stream<UserResourceInfo> userResources = allInstances
-			    .stream()
-			    .filter(instance -> instance.getProject().equals(projectDTO.getName()))
-			    .map(this::toUserResourceInfo);
+        final Stream<UserResourceInfo> userResources = allInstances
+                .stream()
+                .filter(instance -> instance.getProject().equals(projectDTO.getName()))
+                .map(this::toUserResourceInfo);
 
-	    Stream<UserResourceInfo> odahuResources = projectDTO.getOdahu()
-			    .stream()
-			    .map(this::toUserResourceInfo);
+        Stream<UserResourceInfo> odahuResources = projectDTO.getOdahu()
+                .stream()
+                .map(this::toUserResourceInfo);
 
-	    if (projectDTO.getEndpoints() != null) {
-		    final Stream<UserResourceInfo> edges = projectDTO.getEndpoints()
-				    .stream()
-				    .map(e -> UserResourceInfo.builder()
-						    .resourceType(ResourceEnum.EDGE_NODE)
-						    .resourceStatus(e.getStatus().toString())
-						    .project(projectDTO.getName())
-						    .endpoint(e.getName())
-						    .ip(e.getEdgeInfo() != null ? e.getEdgeInfo().getPublicIp() : null)
-						    .build());
-		    return Stream.concat(edges, Stream.concat(odahuResources, userResources))
-				    .collect(Collectors.toList());
-	    } else {
-		    return userResources.collect(Collectors.toList());
+        if (projectDTO.getEndpoints() != null) {
+            final Stream<UserResourceInfo> edges = projectDTO.getEndpoints()
+                    .stream()
+                    .map(e -> UserResourceInfo.builder()
+                            .resourceType(ResourceEnum.EDGE_NODE)
+                            .resourceStatus(e.getStatus().toString())
+                            .project(projectDTO.getName())
+                            .endpoint(e.getName())
+                            .ip(e.getEdgeInfo() != null ? e.getEdgeInfo().getPublicIp() : null)
+                            .build());
+            return Stream.concat(edges, Stream.concat(odahuResources, userResources))
+                    .collect(Collectors.toList());
+        } else {
+            return userResources.collect(Collectors.toList());
         }
     }
 
@@ -255,33 +244,37 @@ public class EnvironmentServiceImpl implements EnvironmentService {
         return UserResourceInfo.builder()
                 .resourceType(ResourceEnum.NOTEBOOK)
                 .resourceName(userInstance.getExploratoryName())
-		        .resourceShape(userInstance.getShape())
-		        .resourceStatus(userInstance.getStatus())
-		        .computationalResources(userInstance.getResources())
-		        .user(userInstance.getUser())
-		        .project(userInstance.getProject())
-		        .endpoint(userInstance.getEndpoint())
-		        .cloudProvider(userInstance.getCloudProvider())
-		        .exploratoryUrls(userInstance.getResourceUrl())
-		        .build();
+                .resourceShape(userInstance.getShape())
+                .resourceStatus(userInstance.getStatus())
+                .computationalResources(userInstance.getResources())
+                .user(userInstance.getUser())
+                .project(userInstance.getProject())
+                .endpoint(userInstance.getEndpoint())
+                .cloudProvider(userInstance.getCloudProvider())
+                .exploratoryUrls(userInstance.getResourceUrl())
+                .gpuCount(userInstance.getGpuCount())
+                .gpuEnabled(userInstance.isEnabledGPU())
+                .gpuType(userInstance.getGpuType())
+                .tags(userInstance.getTags())
+                .build();
     }
 
-	private UserResourceInfo toUserResourceInfo(OdahuDTO odahuDTO) {
-		return UserResourceInfo.builder()
-				.resourceType(ResourceEnum.ODAHU)
-				.resourceName(odahuDTO.getName())
-				.resourceStatus(odahuDTO.getStatus().toString())
-				.project(odahuDTO.getProject())
-				.build();
-	}
+    private UserResourceInfo toUserResourceInfo(OdahuDTO odahuDTO) {
+        return UserResourceInfo.builder()
+                .resourceType(ResourceEnum.ODAHU)
+                .resourceName(odahuDTO.getName())
+                .resourceStatus(odahuDTO.getStatus().toString())
+                .project(odahuDTO.getProject())
+                .build();
+    }
 
-	private void checkProjectResourceConditions(String project, String action) {
-		final List<UserInstanceDTO> userInstances = exploratoryDAO.fetchProjectExploratoriesWhereStatusIn(project,
-				Arrays.asList(CREATING, STARTING, CREATING_IMAGE), CREATING, STARTING, CREATING_IMAGE);
+    private void checkProjectResourceConditions(String project) {
+        final List<UserInstanceDTO> userInstances = exploratoryDAO.fetchProjectExploratoriesWhereStatusIn(project,
+                Arrays.asList(CREATING, STARTING, CREATING_IMAGE), CREATING, STARTING, CREATING_IMAGE);
 
-		if (!userInstances.isEmpty()) {
-			log.error(String.format(ERROR_MSG_FORMAT, action));
-			throw new ResourceConflictException(String.format(ERROR_MSG_FORMAT, action));
-		}
-	}
+        if (!userInstances.isEmpty()) {
+            log.error(String.format(ERROR_MSG_FORMAT, "stop"));
+            throw new ResourceConflictException(String.format(ERROR_MSG_FORMAT, "stop"));
+        }
+    }
 }
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 72f0801..ade4807 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
@@ -20,29 +20,15 @@
 package com.epam.datalab.backendapi.service.impl;
 
 import com.epam.datalab.auth.UserInfo;
-import com.epam.datalab.backendapi.annotation.Audit;
-import com.epam.datalab.backendapi.annotation.BudgetLimited;
-import com.epam.datalab.backendapi.annotation.Info;
-import com.epam.datalab.backendapi.annotation.Project;
-import com.epam.datalab.backendapi.annotation.ResourceName;
-import com.epam.datalab.backendapi.annotation.User;
+import com.epam.datalab.backendapi.annotation.*;
 import com.epam.datalab.backendapi.conf.SelfServiceApplicationConfiguration;
 import com.epam.datalab.backendapi.dao.ComputationalDAO;
 import com.epam.datalab.backendapi.dao.ExploratoryDAO;
 import com.epam.datalab.backendapi.dao.GitCredsDAO;
 import com.epam.datalab.backendapi.dao.ImageExploratoryDAO;
-import com.epam.datalab.backendapi.domain.AuditActionEnum;
-import com.epam.datalab.backendapi.domain.AuditDTO;
-import com.epam.datalab.backendapi.domain.AuditResourceTypeEnum;
-import com.epam.datalab.backendapi.domain.EndpointDTO;
-import com.epam.datalab.backendapi.domain.ProjectDTO;
-import com.epam.datalab.backendapi.domain.RequestId;
+import com.epam.datalab.backendapi.domain.*;
 import com.epam.datalab.backendapi.resources.dto.ExploratoryCreatePopUp;
-import com.epam.datalab.backendapi.service.AuditService;
-import com.epam.datalab.backendapi.service.EndpointService;
-import com.epam.datalab.backendapi.service.ExploratoryService;
-import com.epam.datalab.backendapi.service.ProjectService;
-import com.epam.datalab.backendapi.service.TagService;
+import com.epam.datalab.backendapi.service.*;
 import com.epam.datalab.backendapi.util.RequestBuilder;
 import com.epam.datalab.cloud.CloudProvider;
 import com.epam.datalab.constants.ServiceConsts;
@@ -51,12 +37,7 @@ import com.epam.datalab.dto.UserInstanceDTO;
 import com.epam.datalab.dto.UserInstanceStatus;
 import com.epam.datalab.dto.aws.computational.ClusterConfig;
 import com.epam.datalab.dto.base.DataEngineType;
-import com.epam.datalab.dto.exploratory.ExploratoryActionDTO;
-import com.epam.datalab.dto.exploratory.ExploratoryGitCredsDTO;
-import com.epam.datalab.dto.exploratory.ExploratoryReconfigureSparkClusterActionDTO;
-import com.epam.datalab.dto.exploratory.ExploratoryStatusDTO;
-import com.epam.datalab.dto.exploratory.LibInstallDTO;
-import com.epam.datalab.dto.exploratory.LibStatus;
+import com.epam.datalab.dto.exploratory.*;
 import com.epam.datalab.exceptions.DatalabException;
 import com.epam.datalab.model.exploratory.Exploratory;
 import com.epam.datalab.model.library.Library;
@@ -67,33 +48,13 @@ import com.google.inject.name.Named;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
+import java.util.*;
 import java.util.stream.Collectors;
 
-import static com.epam.datalab.backendapi.domain.AuditActionEnum.CREATE;
-import static com.epam.datalab.backendapi.domain.AuditActionEnum.RECONFIGURE;
-import static com.epam.datalab.backendapi.domain.AuditActionEnum.START;
-import static com.epam.datalab.backendapi.domain.AuditActionEnum.STOP;
-import static com.epam.datalab.backendapi.domain.AuditActionEnum.TERMINATE;
-import static com.epam.datalab.backendapi.domain.AuditActionEnum.UPDATE;
+import static com.epam.datalab.backendapi.domain.AuditActionEnum.*;
 import static com.epam.datalab.backendapi.domain.AuditResourceTypeEnum.NOTEBOOK;
-import static com.epam.datalab.dto.UserInstanceStatus.CREATING;
-import static com.epam.datalab.dto.UserInstanceStatus.FAILED;
-import static com.epam.datalab.dto.UserInstanceStatus.RUNNING;
-import static com.epam.datalab.dto.UserInstanceStatus.STARTING;
-import static com.epam.datalab.dto.UserInstanceStatus.STOPPED;
-import static com.epam.datalab.dto.UserInstanceStatus.STOPPING;
-import static com.epam.datalab.dto.UserInstanceStatus.TERMINATED;
-import static com.epam.datalab.dto.UserInstanceStatus.TERMINATING;
-import static com.epam.datalab.rest.contracts.ExploratoryAPI.EXPLORATORY_CREATE;
-import static com.epam.datalab.rest.contracts.ExploratoryAPI.EXPLORATORY_RECONFIGURE_SPARK;
-import static com.epam.datalab.rest.contracts.ExploratoryAPI.EXPLORATORY_START;
-import static com.epam.datalab.rest.contracts.ExploratoryAPI.EXPLORATORY_STOP;
-import static com.epam.datalab.rest.contracts.ExploratoryAPI.EXPLORATORY_TERMINATE;
+import static com.epam.datalab.dto.UserInstanceStatus.*;
+import static com.epam.datalab.rest.contracts.ExploratoryAPI.*;
 
 @Slf4j
 @Singleton
@@ -443,7 +404,10 @@ public class ExploratoryServiceImpl implements ExploratoryService {
                 .withEndpoint(exploratory.getEndpoint())
                 .withCloudProvider(cloudProvider.toString())
                 .withTags(tagService.getResourceTags(userInfo, exploratory.getEndpoint(), project,
-                        exploratory.getExploratoryTag()));
+                        exploratory.getExploratoryTag(), exploratory.getEnabledGPU()))
+                .withGPUCount(exploratory.getGpuCount())
+                .withGPUEnabled(exploratory.getEnabledGPU())
+                .withGPUType(exploratory.getGpuType());
         if (StringUtils.isNotBlank(exploratory.getImageName())) {
             final List<LibInstallDTO> libInstallDtoList = getImageRelatedLibraries(userInfo, exploratory.getImageName(),
                     project, exploratory.getEndpoint());
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 b7ad081..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
@@ -22,11 +22,7 @@ package com.epam.datalab.backendapi.service.impl;
 import com.epam.datalab.auth.UserInfo;
 import com.epam.datalab.backendapi.conf.SelfServiceApplicationConfiguration;
 import com.epam.datalab.backendapi.dao.ExploratoryDAO;
-import com.epam.datalab.backendapi.domain.BillingReport;
-import com.epam.datalab.backendapi.domain.EndpointDTO;
-import com.epam.datalab.backendapi.domain.ProjectDTO;
-import com.epam.datalab.backendapi.domain.ProjectEndpointDTO;
-import com.epam.datalab.backendapi.domain.RequestId;
+import com.epam.datalab.backendapi.domain.*;
 import com.epam.datalab.backendapi.resources.dto.HealthStatusEnum;
 import com.epam.datalab.backendapi.resources.dto.HealthStatusPageDTO;
 import com.epam.datalab.backendapi.resources.dto.ProjectInfrastructureInfo;
@@ -53,11 +49,7 @@ import com.google.inject.name.Named;
 import com.jcabi.manifests.Manifests;
 import lombok.extern.slf4j.Slf4j;
 
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
+import java.util.*;
 import java.util.stream.Collectors;
 
 @Slf4j
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 388a4e0..1e47fb1 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
@@ -358,6 +358,10 @@ public class RequestBuilder {
                         .withMasterInstanceType(gcpForm.getMasterInstanceType())
                         .withSlaveInstanceType(gcpForm.getSlaveInstanceType())
                         .withVersion(gcpForm.getVersion())
+                        .withMasterGPUCount(gcpForm.getMasterGPUCount())
+                        .withMasterGPUType(gcpForm.getMasterGPUType())
+                        .withSlaveGPUCount(gcpForm.getSlaveGPUCount())
+                        .withSlaveGPUType(gcpForm.getSlaveGPUType())
                         .withSharedImageEnabled(String.valueOf(projectDTO.isSharedImageEnabled()));
                 break;
 
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/service/TagServiceImplTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/TagServiceImplTest.java
index 652d193..1b061db 100644
--- a/services/self-service/src/test/java/com/epam/datalab/backendapi/service/TagServiceImplTest.java
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/TagServiceImplTest.java
@@ -37,15 +37,15 @@ public class TagServiceImplTest extends TestBase {
 
     @Test
     public void getResourceTags() {
-        Map<String, String> actualResourceTags = tagService.getResourceTags(getUserInfo(), ENDPOINT, PROJECT, CUSTOM_TAG);
-
+        Map<String, String> actualResourceTags = tagService.getResourceTags(getUserInfo(), ENDPOINT, PROJECT, CUSTOM_TAG,
+                false);
         assertEquals("maps of tags are not equals", getExpectedResourceTags(), actualResourceTags);
     }
 
     @Test
     public void getResourceTagsWithNullCustomTag() {
-        Map<String, String> actualResourceTags = tagService.getResourceTags(getUserInfo(), ENDPOINT, PROJECT, null);
-
+        Map<String, String> actualResourceTags = tagService.getResourceTags(getUserInfo(), ENDPOINT, PROJECT, null
+                , false);
         assertEquals("maps of tags are not equals", getExpectedResourceTagsWithNullCustomTag(), actualResourceTags);
     }
 

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