This is an automated email from the ASF dual-hosted git repository. bhliva pushed a commit to branch feature/projects in repository https://gitbox.apache.org/repos/asf/incubator-dlab.git
The following commit(s) were added to refs/heads/feature/projects by this push: new 2ff5858 DLAB-778, 783, 788, 790 added possibility to use tags in resources 2ff5858 is described below commit 2ff585863a8ed57f7f3ef0e5c6adb683c285f22f Author: bhliva <bohdan_hl...@epam.com> AuthorDate: Tue Jun 18 14:24:02 2019 +0300 DLAB-778, 783, 788, 790 added possibility to use tags in resources --- .../java/com/epam/dlab/dto/UserInstanceDTO.java | 12 ++++--- .../computational/AwsComputationalResource.java | 5 +-- .../SparkStandaloneClusterResource.java | 5 +-- .../computational/UserComputationalResource.java | 5 ++- .../dlab/dto/exploratory/ExploratoryCreateDTO.java | 22 ++++++++++++ .../computational/GcpComputationalResource.java | 6 ++-- .../epam/dlab/model/exploratory/Exploratory.java | 2 ++ .../epam/dlab/backendapi/domain/EndpointDTO.java | 1 + .../epam/dlab/backendapi/domain/ProjectDTO.java | 2 ++ .../epam/dlab/backendapi/modules/DevModule.java | 1 + .../dlab/backendapi/modules/ProductionModule.java | 1 + .../backendapi/resources/ExploratoryResource.java | 2 ++ .../resources/dto/ComputationalCreateFormDTO.java | 2 ++ .../resources/dto/ExploratoryCreateFormDTO.java | 6 ++++ .../epam/dlab/backendapi/service/TagService.java | 9 +++++ .../dlab/backendapi/service/TagServiceImpl.java | 40 ++++++++++++++++++++++ .../service/impl/ComputationalServiceImpl.java | 24 ++++++++----- .../service/impl/ExploratoryServiceImpl.java | 13 +++++-- .../epam/dlab/backendapi/util/RequestBuilder.java | 12 ++++--- .../resources/ExploratoryResourceTest.java | 14 +++++--- .../service/impl/ComputationalServiceImplTest.java | 30 ++++++++++------ .../service/impl/ExploratoryServiceImplTest.java | 28 +++++++++------ .../InfrastructureTemplateServiceBaseTest.java | 6 ++-- .../dlab/backendapi/util/RequestBuilderTest.java | 6 ++-- 24 files changed, 196 insertions(+), 58 deletions(-) diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/UserInstanceDTO.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/UserInstanceDTO.java index 1cb4efc..5dae5ef 100644 --- a/services/dlab-model/src/main/java/com/epam/dlab/dto/UserInstanceDTO.java +++ b/services/dlab-model/src/main/java/com/epam/dlab/dto/UserInstanceDTO.java @@ -28,10 +28,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Date; -import java.util.List; +import java.util.*; /** * Stores info about the user notebook. @@ -79,6 +76,8 @@ public class UserInstanceDTO { private LocalDateTime lastActivity; @JsonProperty("cluster_config") private List<ClusterConfig> clusterConfig; + @JsonProperty + private Map<String, String> tags; /** * Sets the user login name. @@ -174,4 +173,9 @@ public class UserInstanceDTO { setEndpoint(endpoint); return this; } + + public UserInstanceDTO withTags(Map<String, String> tags) { + setTags(tags); + return this; + } } diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/aws/computational/AwsComputationalResource.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/aws/computational/AwsComputationalResource.java index 928733d..8a268c5 100644 --- a/services/dlab-model/src/main/java/com/epam/dlab/dto/aws/computational/AwsComputationalResource.java +++ b/services/dlab-model/src/main/java/com/epam/dlab/dto/aws/computational/AwsComputationalResource.java @@ -31,6 +31,7 @@ import lombok.ToString; import java.time.LocalDateTime; import java.util.Date; import java.util.List; +import java.util.Map; /** * Stores info about the user's computational resources for notebook. @@ -62,10 +63,10 @@ public class AwsComputationalResource extends UserComputationalResource { String instanceId, String masterShape, String slaveShape, Boolean slaveSpot, Integer slaveSpotPctPrice, String slaveNumber, String version, List<ResourceURL> resourceURL, LocalDateTime lastActivity, - List<ClusterConfig> config) { + List<ClusterConfig> config, Map<String, String> tags) { super(computationalName, computationalId, imageName, templateName, status, uptime, schedulerJobData, - reuploadKeyRequired, resourceURL, lastActivity); + reuploadKeyRequired, resourceURL, lastActivity, tags); this.instanceId = instanceId; this.masterShape = masterShape; this.slaveShape = slaveShape; diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/computational/SparkStandaloneClusterResource.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/computational/SparkStandaloneClusterResource.java index 50d2c48..82f5660 100644 --- a/services/dlab-model/src/main/java/com/epam/dlab/dto/computational/SparkStandaloneClusterResource.java +++ b/services/dlab-model/src/main/java/com/epam/dlab/dto/computational/SparkStandaloneClusterResource.java @@ -32,6 +32,7 @@ import org.hibernate.validator.constraints.NotBlank; import java.time.LocalDateTime; import java.util.Date; import java.util.List; +import java.util.Map; @Data @EqualsAndHashCode(callSuper = true) @@ -51,10 +52,10 @@ public class SparkStandaloneClusterResource extends UserComputationalResource { SchedulerJobDTO schedulerJobData, boolean reuploadKeyRequired, String dataEngineInstanceCount, String dataEngineInstanceShape, List<ResourceURL> resourceURL, LocalDateTime lastActivity, - List<ClusterConfig> config) { + List<ClusterConfig> config, Map<String, String> tags) { super(computationalName, computationalId, imageName, templateName, status, uptime, schedulerJobData, - reuploadKeyRequired, resourceURL, lastActivity); + reuploadKeyRequired, resourceURL, lastActivity, tags); this.dataEngineInstanceCount = dataEngineInstanceCount; this.dataEngineInstanceShape = dataEngineInstanceShape; this.config = config; diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/computational/UserComputationalResource.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/computational/UserComputationalResource.java index 14f2b4a..678025f 100644 --- a/services/dlab-model/src/main/java/com/epam/dlab/dto/computational/UserComputationalResource.java +++ b/services/dlab-model/src/main/java/com/epam/dlab/dto/computational/UserComputationalResource.java @@ -31,6 +31,7 @@ import lombok.NoArgsConstructor; import java.time.LocalDateTime; import java.util.Date; import java.util.List; +import java.util.Map; @Data @NoArgsConstructor @@ -63,11 +64,12 @@ public class UserComputationalResource { @JsonProperty("instance_id") private String instanceId; protected List<ClusterConfig> config; + private Map<String,String> tags; public UserComputationalResource(String computationalName, String computationalId, String imageName, String templateName, String status, Date uptime, SchedulerJobDTO schedulerData, boolean reuploadKeyRequired, List<ResourceURL> resourceUrl, - LocalDateTime lastActivity) { + LocalDateTime lastActivity, Map<String,String> tags) { this.computationalName = computationalName; this.computationalId = computationalId; this.imageName = imageName; @@ -78,6 +80,7 @@ public class UserComputationalResource { this.reuploadKeyRequired = reuploadKeyRequired; this.resourceUrl = resourceUrl; this.lastActivity = lastActivity; + this.tags = tags; } public DataEngineType getDataEngineType() { diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/ExploratoryCreateDTO.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/ExploratoryCreateDTO.java index 9eca961..0a4c407 100644 --- a/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/ExploratoryCreateDTO.java +++ b/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/ExploratoryCreateDTO.java @@ -24,6 +24,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.base.MoreObjects.ToStringHelper; import java.util.List; +import java.util.Map; public class ExploratoryCreateDTO<T extends ExploratoryCreateDTO<?>> extends ExploratoryBaseDTO<T> { @@ -36,6 +37,12 @@ public class ExploratoryCreateDTO<T extends ExploratoryCreateDTO<?>> extends Exp private String imageName; @JsonProperty("spark_configurations") private List<ClusterConfig> clusterConfig; + @JsonProperty("tags") + private Map<String, String> tags; + @JsonProperty("project") + private String project; + @JsonProperty("endpoint") + private String endpoint; /** * Return the list of GIT credentials. @@ -67,6 +74,21 @@ public class ExploratoryCreateDTO<T extends ExploratoryCreateDTO<?>> extends Exp return self; } + public T withTags(Map<String, String> tags) { + this.tags = tags; + return self; + } + + public T withEndpoint(String endpoint) { + this.endpoint = endpoint; + return self; + } + + public T withProject(String project) { + this.project = project; + return self; + } + public String getImageName() { return imageName; } diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/gcp/computational/GcpComputationalResource.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/gcp/computational/GcpComputationalResource.java index 061fa06..b56bbd8 100644 --- a/services/dlab-model/src/main/java/com/epam/dlab/dto/gcp/computational/GcpComputationalResource.java +++ b/services/dlab-model/src/main/java/com/epam/dlab/dto/gcp/computational/GcpComputationalResource.java @@ -31,6 +31,7 @@ import lombok.ToString; import java.time.LocalDateTime; import java.util.Date; import java.util.List; +import java.util.Map; /** * Stores info about the user's computational resources for notebook. @@ -61,9 +62,10 @@ public class GcpComputationalResource extends UserComputationalResource { SchedulerJobDTO schedulerJobData, boolean reuploadKeyRequired, String instanceId, String masterShape, String slaveShape, String slaveNumber, String masterNumber, String preemptibleNumber, String version, - List<ResourceURL> resourceURL, LocalDateTime lastActivity) { + List<ResourceURL> resourceURL, LocalDateTime lastActivity, + Map<String, String> tags) { super(computationalName, computationalId, imageName, templateName, status, uptime, schedulerJobData, - reuploadKeyRequired, resourceURL, lastActivity); + reuploadKeyRequired, resourceURL, lastActivity, tags); this.instanceId = instanceId; this.masterShape = masterShape; this.slaveShape = slaveShape; diff --git a/services/dlab-model/src/main/java/com/epam/dlab/model/exploratory/Exploratory.java b/services/dlab-model/src/main/java/com/epam/dlab/model/exploratory/Exploratory.java index dd8dcbb..4b67f70 100644 --- a/services/dlab-model/src/main/java/com/epam/dlab/model/exploratory/Exploratory.java +++ b/services/dlab-model/src/main/java/com/epam/dlab/model/exploratory/Exploratory.java @@ -35,5 +35,7 @@ public class Exploratory { private final String shape; private final String imageName; private final String endpoint; + private final String project; + private final String exploratoryTag; private final List<ClusterConfig> clusterConfig; } diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/EndpointDTO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/EndpointDTO.java index e3c467c..15c2f18 100644 --- a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/EndpointDTO.java +++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/EndpointDTO.java @@ -10,4 +10,5 @@ public class EndpointDTO { private final String name; private final String url; private final String account; + private final String tag; } diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/ProjectDTO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/ProjectDTO.java index 1b60b59..07b281f 100644 --- a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/ProjectDTO.java +++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/ProjectDTO.java @@ -15,5 +15,7 @@ public class ProjectDTO { private final Set<String> endpoints; @NotNull private final Set<String> groups; + @NotNull + private final String tag; private final Integer budget; } diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/DevModule.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/DevModule.java index 2f6ae9b..dc24362 100644 --- a/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/DevModule.java +++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/DevModule.java @@ -76,6 +76,7 @@ public class DevModule extends ModuleBase<SelfServiceApplicationConfiguration> i bind(BackupService.class).to(BackupServiceImpl.class); bind(BackupDao.class).to(BackupDaoImpl.class); bind(ExploratoryService.class).to(ExploratoryServiceImpl.class); + bind(TagService.class).to(TagServiceImpl.class); bind(InactivityService.class).to(InactivityServiceImpl.class); bind(SystemUserInfoService.class).toInstance(new SystemUserInfoService() { @Override diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/ProductionModule.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/ProductionModule.java index 2ed65c4..4a3bc70 100644 --- a/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/ProductionModule.java +++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/ProductionModule.java @@ -91,5 +91,6 @@ public class ProductionModule extends ModuleBase<SelfServiceApplicationConfigura bind(EndpointDAO.class).to(EndpointDAOImpl.class); bind(ProjectService.class).to(ProjectServiceImpl.class); bind(ProjectDAO.class).to(ProjectDAOImpl.class); + bind(TagService.class).to(TagServiceImpl.class); } } diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/ExploratoryResource.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/ExploratoryResource.java index e6aa295..d397e98 100644 --- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/ExploratoryResource.java +++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/ExploratoryResource.java @@ -169,6 +169,8 @@ public class ExploratoryResource implements ExploratoryAPI { .clusterConfig(formDTO.getClusterConfig()) .shape(formDTO.getShape()) .endpoint(formDTO.getEndpoint()) + .project(formDTO.getProject()) + .exploratoryTag(formDTO.getExploratoryTag()) .build(); } } diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/ComputationalCreateFormDTO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/ComputationalCreateFormDTO.java index baf9bc7..ce619e4 100644 --- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/ComputationalCreateFormDTO.java +++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/ComputationalCreateFormDTO.java @@ -48,6 +48,8 @@ public class ComputationalCreateFormDTO { @NotBlank @JsonProperty private String project; + @JsonProperty("custom_tag") + private String customTag; @NotBlank @JsonProperty("notebook_name") diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/ExploratoryCreateFormDTO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/ExploratoryCreateFormDTO.java index 2cb3344..18de17a 100644 --- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/ExploratoryCreateFormDTO.java +++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/ExploratoryCreateFormDTO.java @@ -45,6 +45,8 @@ public class ExploratoryCreateFormDTO { @NotBlank @JsonProperty private String project; + @JsonProperty + private String exploratoryTag; @NotBlank @JsonProperty @@ -168,6 +170,10 @@ public class ExploratoryCreateFormDTO { this.endpoint = endpoint; } + public String getExploratoryTag() { + return exploratoryTag; + } + @Override public String toString() { return MoreObjects.toStringHelper(this) diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/TagService.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/TagService.java new file mode 100644 index 0000000..f436f6d --- /dev/null +++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/TagService.java @@ -0,0 +1,9 @@ +package com.epam.dlab.backendapi.service; + +import com.epam.dlab.auth.UserInfo; + +import java.util.Map; + +public interface TagService { + Map<String, String> getResourceTags(UserInfo userInfo, String endpoint, String project, String customTag); +} diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/TagServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/TagServiceImpl.java new file mode 100644 index 0000000..c601815 --- /dev/null +++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/TagServiceImpl.java @@ -0,0 +1,40 @@ +package com.epam.dlab.backendapi.service; + +import com.epam.dlab.auth.UserInfo; +import com.epam.dlab.backendapi.dao.EndpointDAO; +import com.epam.dlab.backendapi.dao.ProjectDAO; +import com.epam.dlab.backendapi.domain.EndpointDTO; +import com.epam.dlab.backendapi.domain.ProjectDTO; +import com.google.inject.Inject; +import com.google.inject.Singleton; + +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; + +@Singleton +public class TagServiceImpl implements TagService { + private final EndpointDAO endpointDAO; + private final ProjectDAO projectDAO; + + @Inject + public TagServiceImpl(EndpointDAO endpointDAO, ProjectDAO projectDAO) { + this.endpointDAO = endpointDAO; + this.projectDAO = projectDAO; + } + + @Override + public Map<String, String> getResourceTags(UserInfo userInfo, String endpoint, String project, + String customTag) { + Map<String, String> tags = new HashMap<>(); + tags.put("user_tag", userInfo.getName()); + endpointDAO.get(endpoint) + .map(EndpointDTO::getTag) + .ifPresent(tag -> tags.put("endpoint_tag", tag)); + projectDAO.get(project) + .map(ProjectDTO::getTag) + .ifPresent(tag -> tags.put("project_tag", tag)); + Optional.ofNullable(customTag).ifPresent(t -> tags.put("custom_tag", t)); + return tags; + } +} diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ComputationalServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ComputationalServiceImpl.java index cc4ae0a..4a6ab80 100644 --- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ComputationalServiceImpl.java +++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ComputationalServiceImpl.java @@ -29,6 +29,7 @@ import com.epam.dlab.backendapi.domain.RequestId; import com.epam.dlab.backendapi.resources.dto.ComputationalCreateFormDTO; import com.epam.dlab.backendapi.resources.dto.SparkStandaloneClusterCreateForm; import com.epam.dlab.backendapi.service.ComputationalService; +import com.epam.dlab.backendapi.service.TagService; import com.epam.dlab.backendapi.util.RequestBuilder; import com.epam.dlab.constants.ServiceConsts; import com.epam.dlab.dto.UserInstanceDTO; @@ -48,6 +49,7 @@ import lombok.extern.slf4j.Slf4j; import java.util.EnumMap; import java.util.List; +import java.util.Map; import java.util.Optional; import static com.epam.dlab.dto.UserInstanceStatus.*; @@ -81,12 +83,12 @@ public class ComputationalServiceImpl implements ComputationalService { @Inject @Named(ServiceConsts.PROVISIONING_SERVICE_NAME) private RESTService provisioningService; - @Inject private RequestBuilder requestBuilder; - @Inject private RequestId requestId; + @Inject + private TagService tagService; @BudgetLimited @@ -94,13 +96,14 @@ public class ComputationalServiceImpl implements ComputationalService { public boolean createSparkCluster(UserInfo userInfo, SparkStandaloneClusterCreateForm form, @Project String project) { - if (computationalDAO.addComputational(userInfo.getName(), form.getNotebookName(), - createInitialComputationalResource(form))) { + final UserInstanceDTO instance = + exploratoryDAO.fetchExploratoryFields(userInfo.getName(), form.getNotebookName()); + final SparkStandaloneClusterResource compResource = createInitialComputationalResource(form); + compResource.setTags(tagService.getResourceTags(userInfo, instance.getEndpoint(), project, + form.getCustomTag())); + if (computationalDAO.addComputational(userInfo.getName(), form.getNotebookName(), compResource)) { try { - UserInstanceDTO instance = - exploratoryDAO.fetchExploratoryFields(userInfo.getName(), form.getNotebookName()); - ComputationalBase<?> dto = requestBuilder.newComputationalCreate(userInfo, instance, form); String uuid = provisioningService.post(ComputationalAPI.COMPUTATIONAL_CREATE_SPARK, @@ -157,13 +160,16 @@ public class ComputationalServiceImpl implements ComputationalService { public boolean createDataEngineService(UserInfo userInfo, ComputationalCreateFormDTO formDTO, UserComputationalResource computationalResource, @Project String project) { + final UserInstanceDTO instance = exploratoryDAO.fetchExploratoryFields(userInfo.getName(), formDTO + .getNotebookName()); + final Map<String, String> tags = tagService.getResourceTags(userInfo, instance.getEndpoint(), project, + formDTO.getCustomTag()); + computationalResource.setTags(tags); boolean isAdded = computationalDAO.addComputational(userInfo.getName(), formDTO.getNotebookName(), computationalResource); if (isAdded) { try { - UserInstanceDTO instance = exploratoryDAO.fetchExploratoryFields(userInfo.getName(), formDTO - .getNotebookName()); String uuid = provisioningService.post(COMPUTATIONAL_CREATE_CLOUD_SPECIFIC, userInfo.getAccessToken(), requestBuilder.newComputationalCreate(userInfo, instance, formDTO), String.class); requestId.put(userInfo.getName(), uuid); diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ExploratoryServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ExploratoryServiceImpl.java index 0489f71..a043b52 100644 --- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ExploratoryServiceImpl.java +++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ExploratoryServiceImpl.java @@ -28,6 +28,7 @@ import com.epam.dlab.backendapi.dao.GitCredsDAO; import com.epam.dlab.backendapi.dao.ImageExploratoryDao; import com.epam.dlab.backendapi.domain.RequestId; import com.epam.dlab.backendapi.service.ExploratoryService; +import com.epam.dlab.backendapi.service.TagService; import com.epam.dlab.backendapi.util.RequestBuilder; import com.epam.dlab.constants.ServiceConsts; import com.epam.dlab.dto.StatusEnvBaseDTO; @@ -73,6 +74,8 @@ public class ExploratoryServiceImpl implements ExploratoryService { private RequestBuilder requestBuilder; @Inject private RequestId requestId; + @Inject + private TagService tagService; @BudgetLimited @Override @@ -95,12 +98,14 @@ public class ExploratoryServiceImpl implements ExploratoryService { public String create(UserInfo userInfo, Exploratory exploratory, @Project String project) { boolean isAdded = false; try { - exploratoryDAO.insertExploratory(getUserInstanceDTO(userInfo, exploratory, project)); + final UserInstanceDTO userInstanceDTO = getUserInstanceDTO(userInfo, exploratory, project); + exploratoryDAO.insertExploratory(userInstanceDTO); isAdded = true; final ExploratoryGitCredsDTO gitCreds = gitCredsDAO.findGitCreds(userInfo.getName()); log.debug("Created exploratory environment {} for user {}", exploratory.getName(), userInfo.getName()); final String uuid = provisioningService.post(EXPLORATORY_CREATE, userInfo.getAccessToken(), - requestBuilder.newExploratoryCreate(exploratory, userInfo, gitCreds), String.class); + requestBuilder.newExploratoryCreate(exploratory, userInfo, gitCreds, userInstanceDTO.getTags()), + String.class); requestId.put(userInfo.getName(), uuid); return uuid; } catch (Exception t) { @@ -321,7 +326,9 @@ public class ExploratoryServiceImpl implements ExploratoryService { .withClusterConfig(exploratory.getClusterConfig()) .withShape(exploratory.getShape()) .withProject(project) - .withEndpoint(exploratory.getEndpoint()); + .withEndpoint(exploratory.getEndpoint()) + .withTags(tagService.getResourceTags(userInfo, exploratory.getEndpoint(), project, + exploratory.getExploratoryTag())); if (StringUtils.isNotBlank(exploratory.getImageName())) { final List<LibInstallDTO> libInstallDtoList = getImageRelatedLibraries(userInfo, exploratory .getImageName()); diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/util/RequestBuilder.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/util/RequestBuilder.java index b120c53..350fa0e 100644 --- a/services/self-service/src/main/java/com/epam/dlab/backendapi/util/RequestBuilder.java +++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/util/RequestBuilder.java @@ -68,6 +68,7 @@ import com.google.inject.Inject; import com.google.inject.Singleton; import java.util.List; +import java.util.Map; import java.util.UUID; import static com.epam.dlab.cloud.CloudProvider.*; @@ -196,7 +197,8 @@ public class RequestBuilder { @SuppressWarnings("unchecked") public <T extends ExploratoryCreateDTO<T>> T newExploratoryCreate(Exploratory exploratory, UserInfo userInfo, - ExploratoryGitCredsDTO exploratoryGitCredsDTO) { + ExploratoryGitCredsDTO exploratoryGitCredsDTO, + Map<String, String> tags) { T exploratoryCreate; @@ -220,7 +222,6 @@ public class RequestBuilder { exploratoryCreate = (T) newResourceSysBaseDTO(userInfo, ExploratoryCreateGcp.class) .withNotebookInstanceType(exploratory.getShape()); break; - default: throw new IllegalArgumentException(UNSUPPORTED_CLOUD_PROVIDER_MESSAGE + cloudProvider()); } @@ -230,7 +231,10 @@ public class RequestBuilder { .withApplicationName(getApplicationNameFromImage(exploratory.getDockerImage())) .withGitCreds(exploratoryGitCredsDTO.getGitCreds()) .withImageName(exploratory.getImageName()) - .withClusterConfig(exploratory.getClusterConfig()); + .withClusterConfig(exploratory.getClusterConfig()) + .withProject(exploratory.getProject()) + .withEndpoint(exploratory.getEndpoint()) + .withTags(tags); } @SuppressWarnings("unchecked") @@ -586,7 +590,7 @@ public class RequestBuilder { return dto; - } + } public ExploratoryCheckInactivityAction newExploratoryCheckInactivityAction(UserInfo userInfo, UserInstanceDTO userInstance) { diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/ExploratoryResourceTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/ExploratoryResourceTest.java index 0462732..25cc0b7 100644 --- a/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/ExploratoryResourceTest.java +++ b/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/ExploratoryResourceTest.java @@ -63,7 +63,8 @@ public class ExploratoryResourceTest extends TestBase { @Test public void create() { - when(exploratoryService.create(any(UserInfo.class), any(Exploratory.class), anyString())).thenReturn("someUuid"); + when(exploratoryService.create(any(UserInfo.class), any(Exploratory.class), anyString())).thenReturn( + "someUuid"); final Response response = resources.getJerseyTest() .target("/infrastructure_provision/exploratory_environment") .request() @@ -74,14 +75,16 @@ public class ExploratoryResourceTest extends TestBase { assertEquals("someUuid", response.readEntity(String.class)); assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE)); - verify(exploratoryService).create(getUserInfo(), getExploratory(getExploratoryCreateFormDTO()), "project"); + verify(exploratoryService).create(refEq(getUserInfo()), refEq(getExploratory(getExploratoryCreateFormDTO())), + eq("project")); verifyNoMoreInteractions(exploratoryService); } @Test public void createWithFailedAuth() throws AuthenticationException { authFailSetup(); - when(exploratoryService.create(any(UserInfo.class), any(Exploratory.class), anyString())).thenReturn("someUuid"); + when(exploratoryService.create(any(UserInfo.class), any(Exploratory.class), anyString())).thenReturn( + "someUuid"); final Response response = resources.getJerseyTest() .target("/infrastructure_provision/exploratory_environment") .request() @@ -304,6 +307,7 @@ public class ExploratoryResourceTest extends TestBase { ecfDto.setVersion("someVersion"); ecfDto.setImageName("someImageName"); ecfDto.setProject("project"); + ecfDto.setEndpoint("endpoint"); return ecfDto; } @@ -318,6 +322,8 @@ public class ExploratoryResourceTest extends TestBase { .imageName(formDTO.getImageName()) .templateName(formDTO.getTemplateName()) .version(formDTO.getVersion()) - .shape(formDTO.getShape()).build(); + .shape(formDTO.getShape()) + .endpoint(formDTO.getEndpoint()) + .project(formDTO.getProject()).build(); } } diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/ComputationalServiceImplTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/ComputationalServiceImplTest.java index 03e0c0b..6da6ee8 100644 --- a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/ComputationalServiceImplTest.java +++ b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/ComputationalServiceImplTest.java @@ -26,6 +26,7 @@ import com.epam.dlab.backendapi.dao.ExploratoryDAO; import com.epam.dlab.backendapi.domain.RequestId; import com.epam.dlab.backendapi.resources.dto.ComputationalCreateFormDTO; import com.epam.dlab.backendapi.resources.dto.SparkStandaloneClusterCreateForm; +import com.epam.dlab.backendapi.service.TagService; import com.epam.dlab.backendapi.util.RequestBuilder; import com.epam.dlab.dto.SchedulerJobDTO; import com.epam.dlab.dto.UserInstanceDTO; @@ -96,6 +97,8 @@ public class ComputationalServiceImplTest { private RequestBuilder requestBuilder; @Mock private RequestId requestId; + @Mock + private TagService tagService; @InjectMocks private ComputationalServiceImpl computationalService; @@ -151,9 +154,12 @@ public class ComputationalServiceImplTest { public void createSparkClusterWhenResourceAlreadyExists() { when(computationalDAO.addComputational(anyString(), anyString(), any(SparkStandaloneClusterResource.class))).thenReturn(false); + when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString())).thenReturn(userInstance); + boolean creationResult = - computationalService.createSparkCluster(userInfo, (SparkStandaloneClusterCreateForm) formList.get(0), ""); + computationalService.createSparkCluster(userInfo, (SparkStandaloneClusterCreateForm) formList.get(0), + ""); assertFalse(creationResult); verify(computationalDAO).addComputational(eq(USER), eq(EXPLORATORY_NAME), refEq(sparkClusterResource)); @@ -172,13 +178,13 @@ public class ComputationalServiceImplTest { SparkStandaloneClusterCreateForm sparkClusterCreateForm = (SparkStandaloneClusterCreateForm) formList.get(0); try { - computationalService.createSparkCluster(userInfo, sparkClusterCreateForm,""); + computationalService.createSparkCluster(userInfo, sparkClusterCreateForm, ""); } catch (ResourceNotFoundException e) { assertEquals("Exploratory for user with name not found", e.getMessage()); } - verify(computationalDAO).addComputational(USER, EXPLORATORY_NAME, sparkClusterResource); - verify(computationalDAO).updateComputationalStatus(refEq(computationalStatusDTOWithStatusFailed, "self")); + verify(computationalDAO, never()).addComputational(USER, EXPLORATORY_NAME, sparkClusterResource); + verify(computationalDAO, never()).updateComputationalStatus(refEq(computationalStatusDTOWithStatusFailed, "self")); verify(exploratoryDAO).fetchExploratoryFields(USER, EXPLORATORY_NAME); verifyNoMoreInteractions(configuration, computationalDAO, exploratoryDAO); } @@ -366,10 +372,12 @@ public class ComputationalServiceImplTest { @Test public void createDataEngineServiceWhenComputationalResourceNotAdded() { + when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString())).thenReturn(userInstance); when(computationalDAO.addComputational(anyString(), anyString(), any(UserComputationalResource.class))) .thenReturn(false); - boolean creationResult = computationalService.createDataEngineService(userInfo, formList.get(1), ucResource, ""); + boolean creationResult = computationalService.createDataEngineService(userInfo, formList.get(1), ucResource, + ""); assertFalse(creationResult); verify(computationalDAO).addComputational(eq(USER), eq(EXPLORATORY_NAME), refEq(ucResource)); @@ -389,16 +397,15 @@ public class ComputationalServiceImplTest { try { computationalService.createDataEngineService(userInfo, formList.get(1), ucResource, ""); } catch (DlabException e) { - assertEquals("Could not send request for creation the computational resource compName: " + - "Exploratory for user with name not found", e.getMessage()); + assertEquals("Exploratory for user with name not found", e.getMessage()); } - verify(computationalDAO) + verify(computationalDAO, never()) .addComputational(eq(USER), eq(EXPLORATORY_NAME), refEq(ucResource)); verify(exploratoryDAO).fetchExploratoryFields(USER, EXPLORATORY_NAME); - verify(computationalDAO).updateComputationalStatus(refEq(computationalStatusDTOWithStatusFailed, "self")); + verify(computationalDAO, never()).updateComputationalStatus(refEq(computationalStatusDTOWithStatusFailed, "self")); verifyNoMoreInteractions(computationalDAO, exploratoryDAO); } @@ -658,7 +665,7 @@ public class ComputationalServiceImplTest { } private UserInstanceDTO getUserInstanceDto() { - return new UserInstanceDTO().withUser(USER).withExploratoryName(EXPLORATORY_NAME); + return new UserInstanceDTO().withUser(USER).withExploratoryName(EXPLORATORY_NAME).withTags(Collections.emptyMap()); } private List<ComputationalCreateFormDTO> getFormList() { @@ -670,6 +677,7 @@ public class ComputationalServiceImplTest { ComputationalCreateFormDTO desClusterForm = new ComputationalCreateFormDTO(); desClusterForm.setNotebookName(EXPLORATORY_NAME); desClusterForm.setName(COMP_NAME); + return Arrays.asList(sparkClusterForm, desClusterForm); } @@ -687,6 +695,7 @@ public class ComputationalServiceImplTest { .imageName("dataengine") .status(CREATING.toString()) .dataEngineInstanceCount(String.valueOf(2)) + .tags(Collections.emptyMap()) .build(); } @@ -698,6 +707,7 @@ public class ComputationalServiceImplTest { ucResource.setStatus(status.toString()); ucResource.setLastActivity(LAST_ACTIVITY); ucResource.setComputationalId(COMP_ID); + ucResource.setTags(Collections.emptyMap()); final SchedulerJobDTO schedulerData = new SchedulerJobDTO(); schedulerData.setCheckInactivityRequired(true); schedulerData.setMaxInactivity(MAX_INACTIVITY); diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/ExploratoryServiceImplTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/ExploratoryServiceImplTest.java index a3d9682..6a4e771 100644 --- a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/ExploratoryServiceImplTest.java +++ b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/ExploratoryServiceImplTest.java @@ -24,6 +24,7 @@ import com.epam.dlab.backendapi.dao.ComputationalDAO; import com.epam.dlab.backendapi.dao.ExploratoryDAO; import com.epam.dlab.backendapi.dao.GitCredsDAO; import com.epam.dlab.backendapi.domain.RequestId; +import com.epam.dlab.backendapi.service.TagService; import com.epam.dlab.backendapi.util.RequestBuilder; import com.epam.dlab.dto.StatusEnvBaseDTO; import com.epam.dlab.dto.UserInstanceDTO; @@ -78,6 +79,8 @@ public class ExploratoryServiceImplTest { private RequestBuilder requestBuilder; @Mock private RequestId requestId; + @Mock + private TagService tagService; @InjectMocks private ExploratoryServiceImpl exploratoryService; @@ -109,7 +112,7 @@ public class ExploratoryServiceImplTest { .thenReturn(UUID); when(requestId.put(anyString(), anyString())).thenReturn(UUID); - String uuid = exploratoryService.start(userInfo, EXPLORATORY_NAME, ""); + String uuid = exploratoryService.start(userInfo, EXPLORATORY_NAME, "project"); assertNotNull(uuid); assertEquals(UUID, uuid); @@ -128,7 +131,7 @@ public class ExploratoryServiceImplTest { doThrow(new ResourceNotFoundException("Exploratory for user with name not found")) .when(exploratoryDAO).fetchExploratoryFields(anyString(), anyString()); try { - exploratoryService.start(userInfo, EXPLORATORY_NAME, ""); + exploratoryService.start(userInfo, EXPLORATORY_NAME, "project"); } catch (DlabException e) { assertEquals("Could not exploratory/start exploratory environment expName: Exploratory for user with " + "name not found", e.getMessage()); @@ -254,13 +257,13 @@ public class ExploratoryServiceImplTest { ExploratoryCreateDTO ecDto = new ExploratoryCreateDTO(); Exploratory exploratory = Exploratory.builder().name(EXPLORATORY_NAME).build(); when(requestBuilder.newExploratoryCreate(any(Exploratory.class), any(UserInfo.class), - any(ExploratoryGitCredsDTO.class))).thenReturn(ecDto); + any(ExploratoryGitCredsDTO.class), anyMapOf(String.class, String.class))).thenReturn(ecDto); String exploratoryCreate = "exploratory/create"; when(provisioningService.post(anyString(), anyString(), any(ExploratoryCreateDTO.class), any())) .thenReturn(UUID); when(requestId.put(anyString(), anyString())).thenReturn(UUID); - String uuid = exploratoryService.create(userInfo, exploratory, ""); + String uuid = exploratoryService.create(userInfo, exploratory, "project"); assertNotNull(uuid); assertEquals(UUID, uuid); @@ -268,7 +271,7 @@ public class ExploratoryServiceImplTest { userInstance.withResources(Collections.emptyList()); verify(exploratoryDAO).insertExploratory(userInstance); verify(gitCredsDAO).findGitCreds(USER); - verify(requestBuilder).newExploratoryCreate(exploratory, userInfo, egcDto); + verify(requestBuilder).newExploratoryCreate(exploratory, userInfo, egcDto, Collections.emptyMap()); verify(provisioningService).post(exploratoryCreate, TOKEN, ecDto, String.class); verify(requestId).put(USER, UUID); verifyNoMoreInteractions(exploratoryDAO, gitCredsDAO, requestBuilder, provisioningService, requestId); @@ -283,7 +286,7 @@ public class ExploratoryServiceImplTest { "Exploratory for user with name not found"); Exploratory exploratory = Exploratory.builder().name(EXPLORATORY_NAME).build(); - exploratoryService.create(userInfo, exploratory, ""); + exploratoryService.create(userInfo, exploratory, "project"); } @Test @@ -291,7 +294,7 @@ public class ExploratoryServiceImplTest { doThrow(new RuntimeException()).when(exploratoryDAO).insertExploratory(any(UserInstanceDTO.class)); Exploratory exploratory = Exploratory.builder().name(EXPLORATORY_NAME).build(); try { - exploratoryService.create(userInfo, exploratory, ""); + exploratoryService.create(userInfo, exploratory, "project"); } catch (DlabException e) { assertEquals("Could not create exploratory environment expName for user test: null", e.getMessage()); @@ -312,11 +315,12 @@ public class ExploratoryServiceImplTest { Exploratory exploratory = Exploratory.builder().name(EXPLORATORY_NAME).build(); doThrow(new DlabException("Cannot create instance of resource class ")).when(requestBuilder) - .newExploratoryCreate(any(Exploratory.class), any(UserInfo.class), any(ExploratoryGitCredsDTO.class)); + .newExploratoryCreate(any(Exploratory.class), any(UserInfo.class), any(ExploratoryGitCredsDTO.class), + anyMapOf(String.class, String.class)); when(exploratoryDAO.updateExploratoryStatus(any(StatusEnvBaseDTO.class))).thenReturn(mock(UpdateResult.class)); try { - exploratoryService.create(userInfo, exploratory, ""); + exploratoryService.create(userInfo, exploratory, "project"); } catch (DlabException e) { assertEquals("Could not create exploratory environment expName for user test: Cannot create instance " + "of resource class ", e.getMessage()); @@ -328,7 +332,7 @@ public class ExploratoryServiceImplTest { userInstance.withResources(Collections.emptyList()); verify(exploratoryDAO).insertExploratory(userInstance); verify(gitCredsDAO).findGitCreds(USER); - verify(requestBuilder).newExploratoryCreate(exploratory, userInfo, egcDto); + verify(requestBuilder).newExploratoryCreate(exploratory, userInfo, egcDto, Collections.emptyMap()); verify(exploratoryDAO).updateExploratoryStatus(refEq(statusEnvBaseDTO, "self")); verifyNoMoreInteractions(exploratoryDAO, gitCredsDAO, requestBuilder); } @@ -526,7 +530,9 @@ public class ExploratoryServiceImplTest { compResource.setStatus("stopped"); compResource.setComputationalId("compId"); return new UserInstanceDTO().withUser(USER).withExploratoryName(EXPLORATORY_NAME).withStatus("running") - .withResources(singletonList(compResource)); + .withResources(singletonList(compResource)) + .withTags(Collections.emptyMap()) + .withProject("project"); } private StatusEnvBaseDTO getStatusEnvBaseDTOWithStatus(String status) { diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/InfrastructureTemplateServiceBaseTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/InfrastructureTemplateServiceBaseTest.java index 770274e..b2979fa 100644 --- a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/InfrastructureTemplateServiceBaseTest.java +++ b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/InfrastructureTemplateServiceBaseTest.java @@ -77,7 +77,7 @@ public class InfrastructureTemplateServiceBaseTest { emDto2.setExploratoryEnvironmentShapes(shapes2); List<ExploratoryMetadataDTO> expectedEmdDtoList = Arrays.asList(emDto1, emDto2); when(projectDAO.get(anyString())).thenReturn(Optional.of(new ProjectDTO("project", Collections.emptySet(), - Collections.singleton("project"), null))); + Collections.singleton("project"), null, null))); when(provisioningService.get(anyString(), anyString(), any())).thenReturn(expectedEmdDtoList.toArray()); when(settingsDAO.getConfOsFamily()).thenReturn("someConfOsFamily"); @@ -116,7 +116,7 @@ public class InfrastructureTemplateServiceBaseTest { computationalMetadataDTO ); when(projectDAO.get(anyString())).thenReturn(Optional.of(new ProjectDTO("project", Collections.emptySet(), - Collections.singleton("project"), null))); + Collections.singleton("project"), null, null))); when(provisioningService.get(anyString(), anyString(), any())).thenReturn(expectedCmdDtoList.toArray(new ComputationalMetadataDTO[]{})); List<FullComputationalTemplate> expectedFullCmdDtoList = expectedCmdDtoList.stream() @@ -158,7 +158,7 @@ public class InfrastructureTemplateServiceBaseTest { List<ComputationalMetadataDTO> expectedCmdDtoList = Collections.singletonList(computationalMetadataDTO); when(provisioningService.get(anyString(), anyString(), any())).thenReturn(expectedCmdDtoList.toArray(new ComputationalMetadataDTO[]{})); when(projectDAO.get(anyString())).thenReturn(Optional.of(new ProjectDTO("project", Collections.emptySet(), - Collections.singleton("project"), null))); + Collections.singleton("project"), null, null))); UserInfo userInfo = new UserInfo("test", "token"); try { diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/util/RequestBuilderTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/util/RequestBuilderTest.java index adb46f0..ff3e765 100644 --- a/services/self-service/src/test/java/com/epam/dlab/backendapi/util/RequestBuilderTest.java +++ b/services/self-service/src/test/java/com/epam/dlab/backendapi/util/RequestBuilderTest.java @@ -308,7 +308,7 @@ public class RequestBuilderTest { when(settingsDAO.getAwsVpcId()).thenReturn("someAwsVpcId"); when(settingsDAO.getConfTagResourceId()).thenReturn("someConfTagResourceId"); - requestBuilder.newExploratoryCreate(exploratory, userInfo, egcDto); + requestBuilder.newExploratoryCreate(exploratory, userInfo, egcDto, null); verify(configuration, times(3)).getCloudProvider(); verify(settingsDAO).getServiceBaseName(); @@ -336,7 +336,7 @@ public class RequestBuilderTest { when(settingsDAO.getAzureVpcName()).thenReturn("someAzureVpcId"); when(settingsDAO.getAzureDataLakeClientId()).thenReturn("someId"); - requestBuilder.newExploratoryCreate(exploratory, userInfo, egcDto); + requestBuilder.newExploratoryCreate(exploratory, userInfo, egcDto, null); verify(configuration, times(3)).getCloudProvider(); verify(settingsDAO, times(2)).isAzureDataLakeEnabled(); @@ -357,7 +357,7 @@ public class RequestBuilderTest { when(settingsDAO.getServiceBaseName()).thenReturn("someSBN"); when(settingsDAO.getConfOsFamily()).thenReturn("someConfOsFamily"); - requestBuilder.newExploratoryCreate(exploratory, userInfo, egcDto); + requestBuilder.newExploratoryCreate(exploratory, userInfo, egcDto, null); verify(configuration, times(3)).getCloudProvider(); verify(configuration).getMaxUserNameLength(); --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@dlab.apache.org For additional commands, e-mail: commits-h...@dlab.apache.org