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/26 18:47:16 UTC

[incubator-datalab] branch DATALAB-2091 updated: [DATALAB-2352] - Retrieve the list of available GPU during endpoint deployment

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 1aea3b0  [DATALAB-2352] - Retrieve the list of available GPU during endpoint deployment
     new 3532f7d  Merge branch 'DATALAB-2091' of https://github.com/apache/incubator-datalab into DATALAB-2091
1aea3b0 is described below

commit 1aea3b000a8095cbf32ad32c0dc544e43f3651d3
Author: KinashYurii <ur...@gmail.com>
AuthorDate: Mon Apr 26 21:45:29 2021 +0300

    [DATALAB-2352] - Retrieve the list of available GPU during endpoint deployment
---
 .../com/epam/datalab/dto/base/edge/EdgeInfo.java   |   5 +
 .../ComputationalGPU.java => base/edge/GPU.java}   |  10 +-
 .../datalab/dto/base/project/ProjectResult.java    |   3 +-
 .../computational/UserComputationalResource.java   |  10 +-
 .../computational/GcpComputationalResource.java    |  19 +---
 .../imagemetadata/ComputationalMetadataDTO.java    |   5 +-
 .../{ComputationalGPU.java => EdgeGPU.java}        |  12 +--
 .../dto/imagemetadata/ExploratoryMetadataDTO.java  |   5 +-
 .../core/commands/CommandParserMock.java           |  14 ++-
 .../datalab/backendapi/dao/EndpointDAOImpl.java    |   1 -
 .../com/epam/datalab/backendapi/dao/GpuDAO.java}   |  27 ++---
 .../epam/datalab/backendapi/dao/GpuDAOImpl.java    |  52 ++++++++++
 .../epam/datalab/backendapi/modules/DevModule.java | 104 ++++---------------
 .../backendapi/modules/ProductionModule.java       | 112 +++++----------------
 .../resources/callback/ProjectCallback.java        |  27 ++++-
 .../dto/gcp/GcpComputationalCreateForm.java        |  14 +--
 .../resources/gcp/ComputationalResourceGcp.java    |   6 +-
 .../impl/InfrastructureTemplateServiceImpl.java    |  39 ++++---
 .../service/impl/ProjectServiceImpl.java           |  32 ++----
 .../datalab/backendapi/util/RequestBuilder.java    |   6 +-
 .../InfrastructureTemplateServiceBaseTest.java     |  27 ++---
 21 files changed, 221 insertions(+), 309 deletions(-)

diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/base/edge/EdgeInfo.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/base/edge/EdgeInfo.java
index f112383..7370305 100644
--- a/services/datalab-model/src/main/java/com/epam/datalab/dto/base/edge/EdgeInfo.java
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/base/edge/EdgeInfo.java
@@ -25,6 +25,8 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
 import lombok.Data;
 
+import java.util.List;
+
 @Data
 @JsonIgnoreProperties(ignoreUnknown = true)
 @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS)
@@ -68,4 +70,7 @@ public class EdgeInfo {
 
     @JsonProperty("reupload_key_required")
     private boolean reuploadKeyRequired = false;
+
+    @JsonProperty("gpu_types")
+    private List<GPU> gpuList;
 }
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/imagemetadata/ComputationalGPU.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/base/edge/GPU.java
similarity index 89%
copy from services/datalab-model/src/main/java/com/epam/datalab/dto/imagemetadata/ComputationalGPU.java
copy to services/datalab-model/src/main/java/com/epam/datalab/dto/base/edge/GPU.java
index 7c9481b..66af4aa 100644
--- a/services/datalab-model/src/main/java/com/epam/datalab/dto/imagemetadata/ComputationalGPU.java
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/base/edge/GPU.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package com.epam.datalab.dto.imagemetadata;
+package com.epam.datalab.dto.base.edge;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import lombok.AllArgsConstructor;
@@ -29,10 +29,10 @@ import lombok.NoArgsConstructor;
 @NoArgsConstructor
 @AllArgsConstructor
 @EqualsAndHashCode(callSuper = false)
-public class ComputationalGPU {
+public class GPU {
 
-    @JsonProperty("Size")
+    @JsonProperty("size")
     private String size;
-    @JsonProperty("Gpu_type")
+    @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/base/project/ProjectResult.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/base/project/ProjectResult.java
index ad05d4d..d355df9 100644
--- a/services/datalab-model/src/main/java/com/epam/datalab/dto/base/project/ProjectResult.java
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/base/project/ProjectResult.java
@@ -24,7 +24,9 @@ import com.epam.datalab.dto.base.edge.EdgeInfo;
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 
+@EqualsAndHashCode(callSuper = true)
 @Data
 @JsonIgnoreProperties(ignoreUnknown = true)
 public class ProjectResult extends StatusBaseDTO<ProjectResult> {
@@ -33,5 +35,4 @@ public class ProjectResult extends StatusBaseDTO<ProjectResult> {
     private String projectName;
     @JsonProperty("endpoint_name")
     private String endpointName;
-
 }
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 37fd927..c845aa1 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
@@ -75,14 +75,10 @@ public class UserComputationalResource {
     protected List<ClusterConfig> config;
     private Map<String, String> tags;
     @JsonProperty("masterGPUType")
-    private  String masterGPUType;
-    @JsonProperty("slaveGPUType")
-    private  String slaveGPUType;
+    private String gpuType;
     @JsonProperty("masterGPUCount")
-    private  String masterGPUCount;
-    @JsonProperty("slaveGPUCount")
-    private  String slaveGPUCount;
-    private  boolean enabledGPU;
+    private String gpuCount;
+    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/GcpComputationalResource.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/gcp/computational/GcpComputationalResource.java
index 72485e0..de62280 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
@@ -57,12 +57,8 @@ public class GcpComputationalResource extends UserComputationalResource {
     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
@@ -73,8 +69,7 @@ public class GcpComputationalResource extends UserComputationalResource {
                                     String masterNumber, String preemptibleNumber, String version,
                                     List<ResourceURL> resourceURL, LocalDateTime lastActivity,
                                     Map<String, String> tags, int totalInstanceCount,
-                                    String masterGPUCount, String masterGPUType, String slaveGPUCount,
-                                    String slaveGPUType, Boolean enabledGPU) {
+                                    String gpuCount, String gpuType, Boolean enabledGPU) {
         super(computationalName, computationalId, imageName, templateName, status, uptime, schedulerJobData,
                 reuploadKeyRequired, resourceURL, lastActivity, tags, totalInstanceCount);
         this.instanceId = instanceId;
@@ -84,15 +79,11 @@ public class GcpComputationalResource extends UserComputationalResource {
         this.masterNumber = masterNumber;
         this.version = version;
         this.preemptibleNumber = preemptibleNumber;
-        this.masterGPUCount = masterGPUCount;
-        this.masterGPUType = masterGPUType;
-        this.slaveGPUCount = slaveGPUCount;
-        this.slaveGPUType = slaveGPUType;
+        this.masterGPUCount = gpuCount;
+        this.masterGPUType = gpuType;
         this.enabledGPU = enabledGPU;
-        super.setMasterGPUCount(masterGPUCount);
-        super.setSlaveGPUCount(slaveGPUCount);
-        super.setMasterGPUType(masterGPUType);
-        super.setSlaveGPUType(slaveGPUType);
+        super.setGpuCount(masterGPUCount);
+        super.setGpuType(masterGPUType);
         super.setEnabledGPU(enabledGPU);
     }
 }
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 61dbb93..83ace74 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
@@ -19,6 +19,7 @@
 
 package com.epam.datalab.dto.imagemetadata;
 
+import com.epam.datalab.dto.base.edge.GPU;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
@@ -46,8 +47,8 @@ public class ComputationalMetadataDTO extends ImageMetadataDTO {
     @JsonProperty(value = "computation_resources_shapes")
     private Map<String, List<ComputationalResourceShapeDto>> computationResourceShapes;
     //GPU
-    @JsonProperty("gpu_types")
-    private List<ComputationalGPU> computationGPU;
+//    @JsonProperty("gpu_types")
+    private List<GPU> computationGPU;
 
     public ComputationalMetadataDTO(String imageName) {
         this.image = imageName;
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/imagemetadata/ComputationalGPU.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/imagemetadata/EdgeGPU.java
similarity index 84%
copy from services/datalab-model/src/main/java/com/epam/datalab/dto/imagemetadata/ComputationalGPU.java
copy to services/datalab-model/src/main/java/com/epam/datalab/dto/imagemetadata/EdgeGPU.java
index 7c9481b..6c67dd0 100644
--- a/services/datalab-model/src/main/java/com/epam/datalab/dto/imagemetadata/ComputationalGPU.java
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/imagemetadata/EdgeGPU.java
@@ -19,20 +19,20 @@
 
 package com.epam.datalab.dto.imagemetadata;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
+import com.epam.datalab.dto.base.edge.GPU;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.NoArgsConstructor;
 
+import java.util.List;
+
 @Data
 @NoArgsConstructor
 @AllArgsConstructor
 @EqualsAndHashCode(callSuper = false)
-public class ComputationalGPU {
+public class EdgeGPU {
 
-    @JsonProperty("Size")
-    private String size;
-    @JsonProperty("Gpu_type")
-    private String gpuType;
+    private String providerName;
+    private List<GPU> gpus;
 }
\ No newline at end of file
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 de42238..5571db2 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
@@ -20,6 +20,7 @@
 
 package com.epam.datalab.dto.imagemetadata;
 
+import com.epam.datalab.dto.base.edge.GPU;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
@@ -42,8 +43,8 @@ public class ExploratoryMetadataDTO extends ImageMetadataDTO {
     private String requestId;
 
     //GPU
-    @JsonProperty("gpu_types")
-    private List<ComputationalGPU> computationGPU;
+//    @JsonProperty("gpu_types")
+    private List<GPU> computationGPU;
 
     public ExploratoryMetadataDTO(String imageName) {
         this.image = imageName;
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/commands/CommandParserMock.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/commands/CommandParserMock.java
index c454fcd..e61f06b 100644
--- a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/commands/CommandParserMock.java
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/commands/CommandParserMock.java
@@ -29,11 +29,7 @@ import org.apache.commons.lang3.tuple.ImmutablePair;
 import org.apache.commons.lang3.tuple.Pair;
 
 import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 /**
  * Parse command for emulate commands of Docker.
@@ -218,10 +214,12 @@ public class CommandParserMock {
      */
     private Pair<String, String> getPair(String argName, String value, String separator) {
         String[] array = value.split(separator);
-        if (array.length != 2) {
-            throw new DatalabException("Invalid value for \"" + argName + "\": " + value);
+        if (array.length == 2) {
+            return new ImmutablePair<>(array[0], array[1]);
+        } else if (array.length == 3) {
+            return new ImmutablePair<>(array[1], array[2]);
         }
-        return new ImmutablePair<>(array[0], array[1]);
+        throw new DatalabException("Invalid value for \"" + argName + "\": " + value);
     }
 
     /**
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/EndpointDAOImpl.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/EndpointDAOImpl.java
index 5b3fedf..6aea428 100644
--- a/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/EndpointDAOImpl.java
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/EndpointDAOImpl.java
@@ -30,7 +30,6 @@ import java.util.regex.Pattern;
 import static com.mongodb.client.model.Filters.eq;
 import static com.mongodb.client.model.Filters.regex;
 
-
 public class EndpointDAOImpl extends BaseDAO implements EndpointDAO {
 
     private static final String ENDPOINTS_COLLECTION = "endpoints";
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/imagemetadata/ComputationalGPU.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/GpuDAO.java
similarity index 64%
rename from services/datalab-model/src/main/java/com/epam/datalab/dto/imagemetadata/ComputationalGPU.java
rename to services/self-service/src/main/java/com/epam/datalab/backendapi/dao/GpuDAO.java
index 7c9481b..bffba51 100644
--- a/services/datalab-model/src/main/java/com/epam/datalab/dto/imagemetadata/ComputationalGPU.java
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/GpuDAO.java
@@ -17,22 +17,17 @@
  * under the License.
  */
 
-package com.epam.datalab.dto.imagemetadata;
+package com.epam.datalab.backendapi.dao;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.NoArgsConstructor;
+import com.epam.datalab.dto.imagemetadata.EdgeGPU;
 
-@Data
-@NoArgsConstructor
-@AllArgsConstructor
-@EqualsAndHashCode(callSuper = false)
-public class ComputationalGPU {
+import java.util.Optional;
 
-    @JsonProperty("Size")
-    private String size;
-    @JsonProperty("Gpu_type")
-    private String gpuType;
-}
\ No newline at end of file
+public interface GpuDAO {
+
+    Optional<EdgeGPU> getGPUByProvider(String provider);
+
+    void create(EdgeGPU gpu);
+
+    void remove(String nodeId);
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/GpuDAOImpl.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/GpuDAOImpl.java
new file mode 100644
index 0000000..37fcb12
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/GpuDAOImpl.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.dao;
+
+import com.epam.datalab.dto.imagemetadata.EdgeGPU;
+import org.bson.conversions.Bson;
+
+import java.util.Optional;
+
+import static com.mongodb.client.model.Filters.eq;
+
+public class GpuDAOImpl extends BaseDAO implements GpuDAO {
+
+    private static final String GPU_COLLECTION = "gpuTypes";
+    private static final String ENDPOINT_EDGE_ID_FIELD = "providerName";
+
+    @Override
+    public Optional<EdgeGPU> getGPUByProvider(String edgeId) {
+        return findOne(GPU_COLLECTION, getByIdCondition(edgeId), EdgeGPU.class);
+    }
+
+    @Override
+    public void create(EdgeGPU gpu) {
+        insertOne(GPU_COLLECTION, gpu);
+    }
+
+    @Override
+    public void remove(String edgeId) {
+        deleteOne(GPU_COLLECTION, getByIdCondition(edgeId));
+    }
+
+    private Bson getByIdCondition(String edgeId) {
+        return eq(ENDPOINT_EDGE_ID_FIELD, edgeId);
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/modules/DevModule.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/modules/DevModule.java
index 047a7f6..6da6ee7 100644
--- a/services/self-service/src/main/java/com/epam/datalab/backendapi/modules/DevModule.java
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/modules/DevModule.java
@@ -23,76 +23,9 @@ import com.epam.datalab.ModuleBase;
 import com.epam.datalab.auth.contract.SecurityAPI;
 import com.epam.datalab.backendapi.auth.SelfServiceSecurityAuthorizer;
 import com.epam.datalab.backendapi.conf.SelfServiceApplicationConfiguration;
-import com.epam.datalab.backendapi.dao.AuditDAO;
-import com.epam.datalab.backendapi.dao.AuditDAOImpl;
-import com.epam.datalab.backendapi.dao.BackupDAO;
-import com.epam.datalab.backendapi.dao.BackupDAOImpl;
-import com.epam.datalab.backendapi.dao.BaseBillingDAO;
-import com.epam.datalab.backendapi.dao.BillingDAO;
-import com.epam.datalab.backendapi.dao.EndpointDAO;
-import com.epam.datalab.backendapi.dao.EndpointDAOImpl;
-import com.epam.datalab.backendapi.dao.ImageExploratoryDAO;
-import com.epam.datalab.backendapi.dao.ImageExploratoryDAOImpl;
-import com.epam.datalab.backendapi.dao.OdahuDAO;
-import com.epam.datalab.backendapi.dao.OdahuDAOImpl;
-import com.epam.datalab.backendapi.dao.ProjectDAO;
-import com.epam.datalab.backendapi.dao.ProjectDAOImpl;
-import com.epam.datalab.backendapi.dao.UserGroupDAO;
-import com.epam.datalab.backendapi.dao.UserGroupDAOImpl;
-import com.epam.datalab.backendapi.dao.UserRoleDAO;
-import com.epam.datalab.backendapi.dao.UserRoleDAOImpl;
-import com.epam.datalab.backendapi.service.AccessKeyService;
-import com.epam.datalab.backendapi.service.ApplicationSettingService;
-import com.epam.datalab.backendapi.service.ApplicationSettingServiceImpl;
-import com.epam.datalab.backendapi.service.AuditService;
-import com.epam.datalab.backendapi.service.BackupService;
-import com.epam.datalab.backendapi.service.BucketService;
-import com.epam.datalab.backendapi.service.ComputationalService;
-import com.epam.datalab.backendapi.service.EndpointService;
-import com.epam.datalab.backendapi.service.EnvironmentService;
-import com.epam.datalab.backendapi.service.ExploratoryService;
-import com.epam.datalab.backendapi.service.ExternalLibraryService;
-import com.epam.datalab.backendapi.service.GitCredentialService;
-import com.epam.datalab.backendapi.service.GuacamoleService;
-import com.epam.datalab.backendapi.service.ImageExploratoryService;
-import com.epam.datalab.backendapi.service.InactivityService;
-import com.epam.datalab.backendapi.service.KeycloakService;
-import com.epam.datalab.backendapi.service.KeycloakServiceImpl;
-import com.epam.datalab.backendapi.service.LibraryService;
-import com.epam.datalab.backendapi.service.OdahuService;
-import com.epam.datalab.backendapi.service.ProjectService;
-import com.epam.datalab.backendapi.service.ReuploadKeyService;
-import com.epam.datalab.backendapi.service.SchedulerJobService;
-import com.epam.datalab.backendapi.service.SecurityService;
-import com.epam.datalab.backendapi.service.SecurityServiceImpl;
-import com.epam.datalab.backendapi.service.SystemInfoService;
-import com.epam.datalab.backendapi.service.TagService;
-import com.epam.datalab.backendapi.service.TagServiceImpl;
-import com.epam.datalab.backendapi.service.UserGroupService;
-import com.epam.datalab.backendapi.service.UserRoleService;
-import com.epam.datalab.backendapi.service.UserRoleServiceImpl;
-import com.epam.datalab.backendapi.service.UserSettingService;
-import com.epam.datalab.backendapi.service.UserSettingServiceImpl;
-import com.epam.datalab.backendapi.service.impl.AccessKeyServiceImpl;
-import com.epam.datalab.backendapi.service.impl.AuditServiceImpl;
-import com.epam.datalab.backendapi.service.impl.BackupServiceImpl;
-import com.epam.datalab.backendapi.service.impl.BucketServiceImpl;
-import com.epam.datalab.backendapi.service.impl.ComputationalServiceImpl;
-import com.epam.datalab.backendapi.service.impl.EndpointServiceImpl;
-import com.epam.datalab.backendapi.service.impl.EnvironmentServiceImpl;
-import com.epam.datalab.backendapi.service.impl.ExploratoryServiceImpl;
-import com.epam.datalab.backendapi.service.impl.GitCredentialServiceImpl;
-import com.epam.datalab.backendapi.service.impl.GuacamoleServiceImpl;
-import com.epam.datalab.backendapi.service.impl.ImageExploratoryServiceImpl;
-import com.epam.datalab.backendapi.service.impl.InactivityServiceImpl;
-import com.epam.datalab.backendapi.service.impl.LibraryServiceImpl;
-import com.epam.datalab.backendapi.service.impl.MavenCentralLibraryService;
-import com.epam.datalab.backendapi.service.impl.OdahuServiceImpl;
-import com.epam.datalab.backendapi.service.impl.ProjectServiceImpl;
-import com.epam.datalab.backendapi.service.impl.ReuploadKeyServiceImpl;
-import com.epam.datalab.backendapi.service.impl.SchedulerJobServiceImpl;
-import com.epam.datalab.backendapi.service.impl.SystemInfoServiceImpl;
-import com.epam.datalab.backendapi.service.impl.UserGroupServiceImpl;
+import com.epam.datalab.backendapi.dao.*;
+import com.epam.datalab.backendapi.service.*;
+import com.epam.datalab.backendapi.service.impl.*;
 import com.epam.datalab.constants.ServiceConsts;
 import com.epam.datalab.mongo.MongoService;
 import com.epam.datalab.rest.client.RESTService;
@@ -170,21 +103,22 @@ public class DevModule extends ModuleBase<SelfServiceApplicationConfiguration> i
         bind(SystemInfoService.class).to(SystemInfoServiceImpl.class);
         bind(UserGroupService.class).to(UserGroupServiceImpl.class);
         bind(UserRoleService.class).to(UserRoleServiceImpl.class);
-	    bind(UserRoleDAO.class).to(UserRoleDAOImpl.class);
-	    bind(UserGroupDAO.class).to(UserGroupDAOImpl.class);
-	    bind(ApplicationSettingService.class).to(ApplicationSettingServiceImpl.class);
-	    bind(UserSettingService.class).to(UserSettingServiceImpl.class);
-	    bind(GuacamoleService.class).to(GuacamoleServiceImpl.class);
-	    bind(EndpointService.class).to(EndpointServiceImpl.class);
-	    bind(EndpointDAO.class).to(EndpointDAOImpl.class);
-	    bind(ProjectService.class).to(ProjectServiceImpl.class);
-	    bind(AuditService.class).to(AuditServiceImpl.class);
-	    bind(ProjectDAO.class).to(ProjectDAOImpl.class);
-	    bind(OdahuDAO.class).to(OdahuDAOImpl.class);
-	    bind(OdahuService.class).to(OdahuServiceImpl.class);
-	    bind(BillingDAO.class).to(BaseBillingDAO.class);
-	    bind(AuditDAO.class).to(AuditDAOImpl.class);
-	    bind(BucketService.class).to(BucketServiceImpl.class);
+        bind(UserRoleDAO.class).to(UserRoleDAOImpl.class);
+        bind(UserGroupDAO.class).to(UserGroupDAOImpl.class);
+        bind(ApplicationSettingService.class).to(ApplicationSettingServiceImpl.class);
+        bind(UserSettingService.class).to(UserSettingServiceImpl.class);
+        bind(GuacamoleService.class).to(GuacamoleServiceImpl.class);
+        bind(EndpointService.class).to(EndpointServiceImpl.class);
+        bind(EndpointDAO.class).to(EndpointDAOImpl.class);
+        bind(ProjectService.class).to(ProjectServiceImpl.class);
+        bind(AuditService.class).to(AuditServiceImpl.class);
+        bind(ProjectDAO.class).to(ProjectDAOImpl.class);
+        bind(GpuDAO.class).to(GpuDAOImpl.class);
+        bind(OdahuDAO.class).to(OdahuDAOImpl.class);
+        bind(OdahuService.class).to(OdahuServiceImpl.class);
+        bind(BillingDAO.class).to(BaseBillingDAO.class);
+        bind(AuditDAO.class).to(AuditDAOImpl.class);
+        bind(BucketService.class).to(BucketServiceImpl.class);
     }
 
     private void configureCors(Environment environment) {
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/modules/ProductionModule.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/modules/ProductionModule.java
index 47ba87e..15df056 100644
--- a/services/self-service/src/main/java/com/epam/datalab/backendapi/modules/ProductionModule.java
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/modules/ProductionModule.java
@@ -22,76 +22,9 @@ package com.epam.datalab.backendapi.modules;
 import com.epam.datalab.ModuleBase;
 import com.epam.datalab.backendapi.auth.SelfServiceSecurityAuthorizer;
 import com.epam.datalab.backendapi.conf.SelfServiceApplicationConfiguration;
-import com.epam.datalab.backendapi.dao.AuditDAO;
-import com.epam.datalab.backendapi.dao.AuditDAOImpl;
-import com.epam.datalab.backendapi.dao.BackupDAO;
-import com.epam.datalab.backendapi.dao.BackupDAOImpl;
-import com.epam.datalab.backendapi.dao.BaseBillingDAO;
-import com.epam.datalab.backendapi.dao.BillingDAO;
-import com.epam.datalab.backendapi.dao.EndpointDAO;
-import com.epam.datalab.backendapi.dao.EndpointDAOImpl;
-import com.epam.datalab.backendapi.dao.ImageExploratoryDAO;
-import com.epam.datalab.backendapi.dao.ImageExploratoryDAOImpl;
-import com.epam.datalab.backendapi.dao.OdahuDAO;
-import com.epam.datalab.backendapi.dao.OdahuDAOImpl;
-import com.epam.datalab.backendapi.dao.ProjectDAO;
-import com.epam.datalab.backendapi.dao.ProjectDAOImpl;
-import com.epam.datalab.backendapi.dao.UserGroupDAO;
-import com.epam.datalab.backendapi.dao.UserGroupDAOImpl;
-import com.epam.datalab.backendapi.dao.UserRoleDAO;
-import com.epam.datalab.backendapi.dao.UserRoleDAOImpl;
-import com.epam.datalab.backendapi.service.AccessKeyService;
-import com.epam.datalab.backendapi.service.ApplicationSettingService;
-import com.epam.datalab.backendapi.service.ApplicationSettingServiceImpl;
-import com.epam.datalab.backendapi.service.AuditService;
-import com.epam.datalab.backendapi.service.BackupService;
-import com.epam.datalab.backendapi.service.BucketService;
-import com.epam.datalab.backendapi.service.ComputationalService;
-import com.epam.datalab.backendapi.service.EndpointService;
-import com.epam.datalab.backendapi.service.EnvironmentService;
-import com.epam.datalab.backendapi.service.ExploratoryService;
-import com.epam.datalab.backendapi.service.ExternalLibraryService;
-import com.epam.datalab.backendapi.service.GitCredentialService;
-import com.epam.datalab.backendapi.service.GuacamoleService;
-import com.epam.datalab.backendapi.service.ImageExploratoryService;
-import com.epam.datalab.backendapi.service.InactivityService;
-import com.epam.datalab.backendapi.service.KeycloakService;
-import com.epam.datalab.backendapi.service.KeycloakServiceImpl;
-import com.epam.datalab.backendapi.service.LibraryService;
-import com.epam.datalab.backendapi.service.OdahuService;
-import com.epam.datalab.backendapi.service.ProjectService;
-import com.epam.datalab.backendapi.service.ReuploadKeyService;
-import com.epam.datalab.backendapi.service.SchedulerJobService;
-import com.epam.datalab.backendapi.service.SecurityService;
-import com.epam.datalab.backendapi.service.SecurityServiceImpl;
-import com.epam.datalab.backendapi.service.SystemInfoService;
-import com.epam.datalab.backendapi.service.TagService;
-import com.epam.datalab.backendapi.service.TagServiceImpl;
-import com.epam.datalab.backendapi.service.UserGroupService;
-import com.epam.datalab.backendapi.service.UserRoleService;
-import com.epam.datalab.backendapi.service.UserRoleServiceImpl;
-import com.epam.datalab.backendapi.service.UserSettingService;
-import com.epam.datalab.backendapi.service.UserSettingServiceImpl;
-import com.epam.datalab.backendapi.service.impl.AccessKeyServiceImpl;
-import com.epam.datalab.backendapi.service.impl.AuditServiceImpl;
-import com.epam.datalab.backendapi.service.impl.BackupServiceImpl;
-import com.epam.datalab.backendapi.service.impl.BucketServiceImpl;
-import com.epam.datalab.backendapi.service.impl.ComputationalServiceImpl;
-import com.epam.datalab.backendapi.service.impl.EndpointServiceImpl;
-import com.epam.datalab.backendapi.service.impl.EnvironmentServiceImpl;
-import com.epam.datalab.backendapi.service.impl.ExploratoryServiceImpl;
-import com.epam.datalab.backendapi.service.impl.GitCredentialServiceImpl;
-import com.epam.datalab.backendapi.service.impl.GuacamoleServiceImpl;
-import com.epam.datalab.backendapi.service.impl.ImageExploratoryServiceImpl;
-import com.epam.datalab.backendapi.service.impl.InactivityServiceImpl;
-import com.epam.datalab.backendapi.service.impl.LibraryServiceImpl;
-import com.epam.datalab.backendapi.service.impl.MavenCentralLibraryService;
-import com.epam.datalab.backendapi.service.impl.OdahuServiceImpl;
-import com.epam.datalab.backendapi.service.impl.ProjectServiceImpl;
-import com.epam.datalab.backendapi.service.impl.ReuploadKeyServiceImpl;
-import com.epam.datalab.backendapi.service.impl.SchedulerJobServiceImpl;
-import com.epam.datalab.backendapi.service.impl.SystemInfoServiceImpl;
-import com.epam.datalab.backendapi.service.impl.UserGroupServiceImpl;
+import com.epam.datalab.backendapi.dao.*;
+import com.epam.datalab.backendapi.service.*;
+import com.epam.datalab.backendapi.service.impl.*;
 import com.epam.datalab.constants.ServiceConsts;
 import com.epam.datalab.mongo.MongoService;
 import com.epam.datalab.rest.client.RESTService;
@@ -159,24 +92,25 @@ public class ProductionModule extends ModuleBase<SelfServiceApplicationConfigura
         bind(UserGroupService.class).to(UserGroupServiceImpl.class);
         bind(UserRoleService.class).to(UserRoleServiceImpl.class);
         bind(UserRoleDAO.class).to(UserRoleDAOImpl.class);
-	    bind(UserGroupDAO.class).to(UserGroupDAOImpl.class);
-	    bind(InactivityService.class).to(InactivityServiceImpl.class);
-	    bind(ApplicationSettingService.class).to(ApplicationSettingServiceImpl.class);
-	    bind(UserSettingService.class).to(UserSettingServiceImpl.class);
-	    bind(GuacamoleService.class).to(GuacamoleServiceImpl.class);
-	    bind(EndpointService.class).to(EndpointServiceImpl.class);
-	    bind(EndpointDAO.class).to(EndpointDAOImpl.class);
-	    bind(ProjectService.class).to(ProjectServiceImpl.class);
-	    bind(AuditService.class).to(AuditServiceImpl.class);
-	    bind(ProjectDAO.class).to(ProjectDAOImpl.class);
-	    bind(OdahuDAO.class).to(OdahuDAOImpl.class);
-	    bind(OdahuService.class).to(OdahuServiceImpl.class);
-	    bind(BillingDAO.class).to(BaseBillingDAO.class);
-	    bind(AuditDAO.class).to(AuditDAOImpl.class);
-	    bind(BucketService.class).to(BucketServiceImpl.class);
-	    bind(TagService.class).to(TagServiceImpl.class);
-	    bind(SecurityService.class).to(SecurityServiceImpl.class);
-	    bind(KeycloakService.class).to(KeycloakServiceImpl.class);
-	    bind(Client.class).toInstance(httpClient);
+        bind(UserGroupDAO.class).to(UserGroupDAOImpl.class);
+        bind(InactivityService.class).to(InactivityServiceImpl.class);
+        bind(ApplicationSettingService.class).to(ApplicationSettingServiceImpl.class);
+        bind(UserSettingService.class).to(UserSettingServiceImpl.class);
+        bind(GuacamoleService.class).to(GuacamoleServiceImpl.class);
+        bind(EndpointService.class).to(EndpointServiceImpl.class);
+        bind(EndpointDAO.class).to(EndpointDAOImpl.class);
+        bind(ProjectService.class).to(ProjectServiceImpl.class);
+        bind(AuditService.class).to(AuditServiceImpl.class);
+        bind(ProjectDAO.class).to(ProjectDAOImpl.class);
+        bind(GpuDAO.class).to(GpuDAOImpl.class);
+        bind(OdahuDAO.class).to(OdahuDAOImpl.class);
+        bind(OdahuService.class).to(OdahuServiceImpl.class);
+        bind(BillingDAO.class).to(BaseBillingDAO.class);
+        bind(AuditDAO.class).to(AuditDAOImpl.class);
+        bind(BucketService.class).to(BucketServiceImpl.class);
+        bind(TagService.class).to(TagServiceImpl.class);
+        bind(SecurityService.class).to(SecurityServiceImpl.class);
+        bind(KeycloakService.class).to(KeycloakServiceImpl.class);
+        bind(Client.class).toInstance(httpClient);
     }
 }
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/callback/ProjectCallback.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/callback/ProjectCallback.java
index 3ac6d02..d3097ca 100644
--- a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/callback/ProjectCallback.java
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/callback/ProjectCallback.java
@@ -19,11 +19,17 @@
 
 package com.epam.datalab.backendapi.resources.callback;
 
+import com.epam.datalab.backendapi.dao.EndpointDAO;
+import com.epam.datalab.backendapi.dao.GpuDAO;
 import com.epam.datalab.backendapi.dao.ProjectDAO;
+import com.epam.datalab.backendapi.domain.EndpointDTO;
 import com.epam.datalab.backendapi.domain.RequestId;
 import com.epam.datalab.backendapi.service.ExploratoryService;
 import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.dto.base.edge.GPU;
 import com.epam.datalab.dto.base.project.ProjectResult;
+import com.epam.datalab.dto.imagemetadata.EdgeGPU;
+import com.epam.datalab.exceptions.ResourceNotFoundException;
 import com.google.inject.Inject;
 import lombok.extern.slf4j.Slf4j;
 
@@ -32,6 +38,7 @@ import javax.ws.rs.POST;
 import javax.ws.rs.Path;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
+import java.util.List;
 import java.util.Objects;
 
 @Path("/project/status")
@@ -40,14 +47,19 @@ import java.util.Objects;
 public class ProjectCallback {
 
     private final ProjectDAO projectDAO;
+    private final EndpointDAO endpointDAO;
     private final ExploratoryService exploratoryService;
     private final RequestId requestId;
+    private final GpuDAO gpuDAO;
 
     @Inject
-    public ProjectCallback(ProjectDAO projectDAO, ExploratoryService exploratoryService, RequestId requestId) {
+    public ProjectCallback(ProjectDAO projectDAO, EndpointDAO endpointDAO, ExploratoryService exploratoryService, RequestId requestId,
+                           GpuDAO gpuDAO) {
         this.projectDAO = projectDAO;
+        this.endpointDAO = endpointDAO;
         this.exploratoryService = exploratoryService;
         this.requestId = requestId;
+        this.gpuDAO = gpuDAO;
     }
 
 
@@ -55,7 +67,10 @@ public class ProjectCallback {
     public Response updateProjectStatus(ProjectResult projectResult) {
         requestId.checkAndRemove(projectResult.getRequestId());
         final String projectName = projectResult.getProjectName();
+        final String endpointName = projectResult.getEndpointName();
         final UserInstanceStatus status = UserInstanceStatus.of(projectResult.getStatus());
+        List<GPU> gpuList = projectResult.getEdgeInfo().getGpuList();
+        addGpuForProvider(endpointName, gpuList);
         if (UserInstanceStatus.RUNNING == status && Objects.nonNull(projectResult.getEdgeInfo())) {
             projectDAO.updateEdgeInfo(projectName, projectResult.getEndpointName(), projectResult.getEdgeInfo());
         } else {
@@ -65,6 +80,16 @@ public class ProjectCallback {
         return Response.ok().build();
     }
 
+    private void addGpuForProvider(String endpointName, List<GPU> gpuList) {
+        try {
+            EndpointDTO endpointDTO = endpointDAO.get(endpointName)
+                    .orElseThrow(() -> new ResourceNotFoundException(String.format("Endpoint %s does not exist", endpointName)));
+            gpuDAO.create(new EdgeGPU(endpointDTO.getCloudProvider().getName(), gpuList));
+        } catch (ResourceNotFoundException ignored) {
+
+        }
+    }
+
     private void updateExploratoriesStatusIfNeeded(UserInstanceStatus status, String projectName, String endpoint) {
         if (UserInstanceStatus.TERMINATED == status) {
             exploratoryService.updateProjectExploratoryStatuses(projectName, endpoint, UserInstanceStatus.TERMINATED);
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 afca270..92c8402 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
@@ -56,15 +56,9 @@ public class GcpComputationalCreateForm extends ComputationalCreateFormDTO {
     @JsonProperty("gpu_enabled")
     private Boolean enabledGPU;
 
-    @JsonProperty("masterGPUType")
-    private String masterGPUType;
+    @JsonProperty("gpuType")
+    private String gpuType;
 
-    @JsonProperty("slaveGPUType")
-    private String slaveGPUType;
-
-    @JsonProperty("masterGPUCount")
-    private String masterGPUCount;
-
-    @JsonProperty("slaveGPUCount")
-    private String slaveGPUCount;
+    @JsonProperty("gpuCount")
+    private String gpuCount;
 }
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 460e255..00310c9 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,10 +101,8 @@ 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())
+                    .gpuCount(form.getGpuCount())
+                    .gpuType(form.getGpuCount())
                     .enabledGPU(form.getEnabledGPU())
                     .masterShape(form.getMasterInstanceType())
                     .slaveShape(form.getSlaveInstanceType())
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/InfrastructureTemplateServiceImpl.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/InfrastructureTemplateServiceImpl.java
index de4e6e5..6740dc9 100644
--- a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/InfrastructureTemplateServiceImpl.java
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/InfrastructureTemplateServiceImpl.java
@@ -21,6 +21,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.GpuDAO;
 import com.epam.datalab.backendapi.dao.ProjectDAO;
 import com.epam.datalab.backendapi.dao.SettingsDAO;
 import com.epam.datalab.backendapi.dao.UserGroupDAO;
@@ -59,21 +60,28 @@ import static com.epam.datalab.rest.contracts.DockerAPI.DOCKER_EXPLORATORY;
 @Slf4j
 public class InfrastructureTemplateServiceImpl implements InfrastructureTemplateService {
 
-    @Inject
-    private SelfServiceApplicationConfiguration configuration;
-    @Inject
-    private SettingsDAO settingsDAO;
-    @Inject
-    private ProjectDAO projectDAO;
-    @Inject
-    private EndpointService endpointService;
-    @Inject
-    private UserGroupDAO userGroupDao;
+    private final SelfServiceApplicationConfiguration configuration;
+    private final SettingsDAO settingsDAO;
+    private final UserGroupDAO userGroupDao;
+    private final GpuDAO gpuDAO;
+    private final EndpointService endpointService;
 
 
     @Inject
-    @Named(ServiceConsts.PROVISIONING_SERVICE_NAME)
-    private RESTService provisioningService;
+    private final RESTService provisioningService;
+
+    @Inject
+    public InfrastructureTemplateServiceImpl(SelfServiceApplicationConfiguration configuration, SettingsDAO settingsDAO,
+                                             ProjectDAO projectDAO, EndpointService endpointService,
+                                             UserGroupDAO userGroupDao, GpuDAO gpuDAO,
+                                             @Named(ServiceConsts.PROVISIONING_SERVICE_NAME) RESTService provisioningService) {
+        this.configuration = configuration;
+        this.settingsDAO = settingsDAO;
+        this.endpointService = endpointService;
+        this.userGroupDao = userGroupDao;
+        this.gpuDAO = gpuDAO;
+        this.provisioningService = provisioningService;
+    }
 
     @Override
     public List<ExploratoryMetadataDTO> getExploratoryTemplates(UserInfo user, String project, String endpoint) {
@@ -92,6 +100,7 @@ public class InfrastructureTemplateServiceImpl implements InfrastructureTemplate
                     .filter(e -> exploratoryGpuIssuesAzureFilter(e, endpointDTO.getCloudProvider()) &&
                             UserRoles.checkAccess(user, RoleType.EXPLORATORY, e.getImage(), roles))
                     .peek(e -> filterShapes(user, e.getExploratoryEnvironmentShapes(), RoleType.EXPLORATORY_SHAPES, roles))
+                    .peek(e -> addGpu(e, endpointDTO.getCloudProvider().getName()))
                     .collect(Collectors.toList());
 
         } catch (DatalabException e) {
@@ -100,6 +109,10 @@ public class InfrastructureTemplateServiceImpl implements InfrastructureTemplate
         }
     }
 
+    private void addGpu(ExploratoryMetadataDTO e, String provider) {
+        gpuDAO.getGPUByProvider(provider).ifPresent(x -> x.setGpus(x.getGpus()));
+    }
+
     @Override
     public List<FullComputationalTemplate> getComputationalTemplates(UserInfo user, String project, String endpoint) {
 
@@ -171,6 +184,7 @@ public class InfrastructureTemplateServiceImpl implements InfrastructureTemplate
                                                                 CloudProvider cloudProvider) {
 
         DataEngineType dataEngineType = DataEngineType.fromDockerImageName(metadataDTO.getImage());
+        gpuDAO.getGPUByProvider(cloudProvider.getName()).ifPresent(x -> metadataDTO.setComputationGPU(x.getGpus()));
 
         if (dataEngineType == DataEngineType.CLOUD_SERVICE) {
             return getCloudFullComputationalTemplate(metadataDTO, cloudProvider);
@@ -187,6 +201,7 @@ public class InfrastructureTemplateServiceImpl implements InfrastructureTemplate
 
     protected FullComputationalTemplate getCloudFullComputationalTemplate(ComputationalMetadataDTO metadataDTO,
                                                                           CloudProvider cloudProvider) {
+
         switch (cloudProvider) {
             case AWS:
                 return new AwsFullComputationalTemplate(metadataDTO,
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/ProjectServiceImpl.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/ProjectServiceImpl.java
index dc39c36..4df5d92 100644
--- a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/ProjectServiceImpl.java
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/ProjectServiceImpl.java
@@ -20,24 +20,12 @@
 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.ProjectAdmin;
-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.ExploratoryDAO;
 import com.epam.datalab.backendapi.dao.ProjectDAO;
 import com.epam.datalab.backendapi.dao.UserGroupDAO;
-import com.epam.datalab.backendapi.domain.BudgetDTO;
-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.UpdateProjectBudgetDTO;
-import com.epam.datalab.backendapi.domain.UpdateProjectDTO;
+import com.epam.datalab.backendapi.domain.*;
 import com.epam.datalab.backendapi.roles.UserRoles;
 import com.epam.datalab.backendapi.service.EndpointService;
 import com.epam.datalab.backendapi.service.ExploratoryService;
@@ -53,20 +41,11 @@ import com.google.inject.Inject;
 import com.google.inject.name.Named;
 import lombok.extern.slf4j.Slf4j;
 
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Optional;
-import java.util.Set;
+import java.util.*;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
 
-import static com.epam.datalab.backendapi.domain.AuditActionEnum.CREATE;
-import static com.epam.datalab.backendapi.domain.AuditActionEnum.RECREATE;
-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.EDGE_NODE;
 import static com.epam.datalab.backendapi.domain.AuditResourceTypeEnum.PROJECT;
 import static java.util.stream.Collectors.toSet;
@@ -302,7 +281,8 @@ public class ProjectServiceImpl implements ProjectService {
 
     private void createProjectOnCloud(UserInfo user, ProjectDTO project) {
         try {
-            project.getEndpoints().forEach(e -> createEndpoint(user, project, e.getName(), project.getName(), String.format(AUDIT_ADD_EDGE_NODE, e.getName(), project.getName())));
+            project.getEndpoints().forEach(e -> createEndpoint(user, project, e.getName(), project.getName(),
+                            String.format(AUDIT_ADD_EDGE_NODE, e.getName(), project.getName())));
         } catch (Exception e) {
             log.error("Can not create project due to: {}", e.getMessage(), e);
             projectDAO.updateStatus(project.getName(), ProjectDTO.Status.FAILED);
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 1e47fb1..76457cf 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,10 +358,8 @@ public class RequestBuilder {
                         .withMasterInstanceType(gcpForm.getMasterInstanceType())
                         .withSlaveInstanceType(gcpForm.getSlaveInstanceType())
                         .withVersion(gcpForm.getVersion())
-                        .withMasterGPUCount(gcpForm.getMasterGPUCount())
-                        .withMasterGPUType(gcpForm.getMasterGPUType())
-                        .withSlaveGPUCount(gcpForm.getSlaveGPUCount())
-                        .withSlaveGPUType(gcpForm.getSlaveGPUType())
+                        .withMasterGPUCount(gcpForm.getGpuCount())
+                        .withMasterGPUType(gcpForm.getGpuType())
                         .withSharedImageEnabled(String.valueOf(projectDTO.isSharedImageEnabled()));
                 break;
 
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/InfrastructureTemplateServiceBaseTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/InfrastructureTemplateServiceBaseTest.java
index d68e157..cf5a1d4 100644
--- a/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/InfrastructureTemplateServiceBaseTest.java
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/InfrastructureTemplateServiceBaseTest.java
@@ -21,6 +21,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.GpuDAO;
 import com.epam.datalab.backendapi.dao.ProjectDAO;
 import com.epam.datalab.backendapi.dao.SettingsDAO;
 import com.epam.datalab.backendapi.dao.UserGroupDAO;
@@ -41,23 +42,11 @@ import org.mockito.Mock;
 import org.mockito.runners.MockitoJUnitRunner;
 
 import java.lang.reflect.Field;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Optional;
+import java.util.*;
 import java.util.stream.Collectors;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.any;
-import static org.mockito.Mockito.anyString;
-import static org.mockito.Mockito.doThrow;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-import static org.mockito.Mockito.when;
+import static org.junit.Assert.*;
+import static org.mockito.Mockito.*;
 
 @RunWith(MockitoJUnitRunner.class)
 public class InfrastructureTemplateServiceBaseTest {
@@ -74,9 +63,11 @@ public class InfrastructureTemplateServiceBaseTest {
     private UserGroupDAO userGroupDao;
     @Mock
     private SelfServiceApplicationConfiguration configuration;
+    @Mock
+    private GpuDAO gpuDAO;
 
     @InjectMocks
-    private InfrastructureTemplateServiceBaseChild infrastructureTemplateServiceBaseChild =
+    private final InfrastructureTemplateServiceBaseChild infrastructureTemplateServiceBaseChild =
             new InfrastructureTemplateServiceBaseChild();
 
     @Test
@@ -219,6 +210,10 @@ public class InfrastructureTemplateServiceBaseTest {
 
     private class InfrastructureTemplateServiceBaseChild extends InfrastructureTemplateServiceImpl {
 
+        private InfrastructureTemplateServiceBaseChild() {
+            super(configuration, settingsDAO, projectDAO, endpointService, userGroupDao, gpuDAO, provisioningService);
+        }
+
         protected FullComputationalTemplate getCloudFullComputationalTemplate(ComputationalMetadataDTO metadataDTO) {
             return new FullComputationalTemplate(metadataDTO);
         }

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