This is an automated email from the ASF dual-hosted git repository. dyankiv pushed a commit to branch DATALAB-2812 in repository https://gitbox.apache.org/repos/asf/incubator-datalab.git
commit d1ea368f90e2073d2c16e3c717af7d06fb3591e3 Author: Denys Yankiv <[email protected]> AuthorDate: Mon May 30 14:27:06 2022 +0300 add endpoint for user images --- .../com/epam/datalab/model/exploratory/Image.java | 3 ++ .../backendapi/dao/ImageExploratoryDAO.java | 2 ++ .../backendapi/dao/ImageExploratoryDAOImpl.java | 12 +++++++ .../resources/ImageExploratoryResource.java | 11 +++++++ .../dto/{ImageInfoRecord.java => ImageFilter.java} | 38 +++++++++++++++++----- .../backendapi/resources/dto/ImageInfoRecord.java | 5 +++ ...ImageInfoRecord.java => ProjectImagesInfo.java} | 30 +++++++++-------- .../service/ImageExploratoryService.java | 4 +++ .../service/impl/ImageExploratoryServiceImpl.java | 20 ++++++++++++ .../resources/ImageExploratoryResourceTest.java | 14 ++++++-- .../service/impl/BillingServiceImplTest.java | 13 +++++++- .../impl/ImageExploratoryServiceImplTest.java | 3 +- 12 files changed, 128 insertions(+), 27 deletions(-) diff --git a/services/datalab-model/src/main/java/com/epam/datalab/model/exploratory/Image.java b/services/datalab-model/src/main/java/com/epam/datalab/model/exploratory/Image.java index c8d3b2c35..322d5511a 100644 --- a/services/datalab-model/src/main/java/com/epam/datalab/model/exploratory/Image.java +++ b/services/datalab-model/src/main/java/com/epam/datalab/model/exploratory/Image.java @@ -24,6 +24,7 @@ import com.epam.datalab.model.library.Library; import lombok.Builder; import lombok.Data; +import java.time.Instant; import java.util.List; import java.util.Map; @@ -40,6 +41,8 @@ public class Image { private final String fullName; private final String externalName; private final String application; + private final String instanceName; + private final String cloudProvider; private final String dockerImage; private final List<Library> libraries; private final Map<String, List<Library>> computationalLibraries; diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/ImageExploratoryDAO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/ImageExploratoryDAO.java index d8e89874a..4d97437e6 100644 --- a/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/ImageExploratoryDAO.java +++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/ImageExploratoryDAO.java @@ -38,6 +38,8 @@ public interface ImageExploratoryDAO { List<ImageInfoRecord> getImages(String user, String dockerImage, String project, String endpoint, ImageStatus... statuses); + List<ImageInfoRecord> getImagesOfUser(String user, String project); + List<ImageInfoRecord> getImagesForProject(String project); Optional<ImageInfoRecord> getImage(String user, String name, String project, String endpoint); diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/ImageExploratoryDAOImpl.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/ImageExploratoryDAOImpl.java index 234a15e52..95f4e0a1a 100644 --- a/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/ImageExploratoryDAOImpl.java +++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/ImageExploratoryDAOImpl.java @@ -54,6 +54,7 @@ public class ImageExploratoryDAOImpl extends BaseDAO implements ImageExploratory private static final String DOCKER_IMAGE = "dockerImage"; private static final String PROJECT = "project"; private static final String ENDPOINT = "endpoint"; + private static final String CREATION_DATE = "creationDate"; @Override public boolean exist(String image, String project) { @@ -79,6 +80,13 @@ public class ImageExploratoryDAOImpl extends BaseDAO implements ImageExploratory ImageInfoRecord.class); } + @Override + public List<ImageInfoRecord> getImagesOfUser(String user, String project) { + return find(MongoCollections.IMAGES, + imageUserProjectCondition(user, project), + ImageInfoRecord.class); + } + @Override public List<ImageInfoRecord> getImagesForProject(String project) { return find(MongoCollections.IMAGES, @@ -146,6 +154,10 @@ public class ImageExploratoryDAOImpl extends BaseDAO implements ImageExploratory return and(eq(IMAGE_NAME, image), eq(PROJECT, project)); } + private Bson imageUserProjectCondition(String user, String project) { + return and(eq(USER, user), eq(PROJECT, project)); + } + private Document getUpdatedFields(Image image) { return new Document(STATUS, image.getStatus().toString()) .append(IMAGE_FULL_NAME, image.getFullName()) diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/ImageExploratoryResource.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/ImageExploratoryResource.java index 95dcdb469..03774e657 100644 --- a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/ImageExploratoryResource.java +++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/ImageExploratoryResource.java @@ -22,7 +22,9 @@ package com.epam.datalab.backendapi.resources; import com.epam.datalab.auth.UserInfo; import com.epam.datalab.backendapi.domain.RequestId; import com.epam.datalab.backendapi.resources.dto.ExploratoryImageCreateFormDTO; +import com.epam.datalab.backendapi.resources.dto.ImageFilter; import com.epam.datalab.backendapi.resources.dto.ImageInfoRecord; +import com.epam.datalab.backendapi.resources.dto.ProjectImagesInfo; import com.epam.datalab.backendapi.service.ImageExploratoryService; import com.google.inject.Inject; import io.dropwizard.auth.Auth; @@ -98,6 +100,15 @@ public class ImageExploratoryResource { return Response.ok(images).build(); } + @POST + @Path("user") + public Response getImagesForUser(@Auth UserInfo ui, @Valid @NotNull ImageFilter imageFilter) { + log.debug("Getting images for user {}", ui.getName()); + final List<ProjectImagesInfo> images = imageExploratoryService.getImagesOfUser(ui ,imageFilter); + return Response.ok(images).build(); + } + + @GET @Path("{name}") public Response getImage(@Auth UserInfo ui, diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ImageInfoRecord.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ImageFilter.java similarity index 58% copy from services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ImageInfoRecord.java copy to services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ImageFilter.java index 18692c34c..09c50ef58 100644 --- a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ImageInfoRecord.java +++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ImageFilter.java @@ -19,19 +19,39 @@ package com.epam.datalab.backendapi.resources.dto; +import com.epam.datalab.cloud.CloudProvider; import com.epam.datalab.dto.exploratory.ImageStatus; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.NonNull; + +import java.util.List; @Data +@NoArgsConstructor @JsonIgnoreProperties(ignoreUnknown = true) -public class ImageInfoRecord { - private final String name; - private final String description; - private final String project; - private final String endpoint; - private final String user; - private final String application; - private final String fullName; - private final ImageStatus status; +public class ImageFilter { + @NonNull + private String imageName; + @NonNull + @JsonProperty("date_start") + private String dateStart; + @NonNull + @JsonProperty("date_end") + private String dateEnd; + @NonNull + private List<CloudProvider> cloudProviders; + @NonNull + private List<ImageStatus> statuses; +// @NonNull +// private List<> sharingStatuses; + @NonNull + private List<String> templateNames; + @NonNull + private List<String> instanceNames; + @NonNull + private List<String> projects; + } diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ImageInfoRecord.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ImageInfoRecord.java index 18692c34c..b10db48d6 100644 --- a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ImageInfoRecord.java +++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ImageInfoRecord.java @@ -19,10 +19,13 @@ package com.epam.datalab.backendapi.resources.dto; +import com.epam.datalab.cloud.CloudProvider; import com.epam.datalab.dto.exploratory.ImageStatus; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import lombok.Data; +import java.time.LocalDateTime; + @Data @JsonIgnoreProperties(ignoreUnknown = true) public class ImageInfoRecord { @@ -32,6 +35,8 @@ public class ImageInfoRecord { private final String endpoint; private final String user; private final String application; + private final String instanceName; + private final CloudProvider cloudProvider; private final String fullName; private final ImageStatus status; } diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ImageInfoRecord.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ProjectImagesInfo.java similarity index 63% copy from services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ImageInfoRecord.java copy to services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ProjectImagesInfo.java index 18692c34c..06da51f28 100644 --- a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ImageInfoRecord.java +++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ProjectImagesInfo.java @@ -19,19 +19,21 @@ package com.epam.datalab.backendapi.resources.dto; -import com.epam.datalab.dto.exploratory.ImageStatus; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import lombok.Data; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.EqualsAndHashCode; +import lombok.ToString; -@Data -@JsonIgnoreProperties(ignoreUnknown = true) -public class ImageInfoRecord { - private final String name; - private final String description; - private final String project; - private final String endpoint; - private final String user; - private final String application; - private final String fullName; - private final ImageStatus status; +import java.util.List; + +@AllArgsConstructor +@Builder +@EqualsAndHashCode +@ToString +public class ProjectImagesInfo { + @JsonProperty + private String project; + @JsonProperty + private List<ImageInfoRecord> images; } diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/ImageExploratoryService.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/ImageExploratoryService.java index fae72a33f..c08628820 100644 --- a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/ImageExploratoryService.java +++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/ImageExploratoryService.java @@ -20,7 +20,9 @@ package com.epam.datalab.backendapi.service; import com.epam.datalab.auth.UserInfo; +import com.epam.datalab.backendapi.resources.dto.ImageFilter; import com.epam.datalab.backendapi.resources.dto.ImageInfoRecord; +import com.epam.datalab.backendapi.resources.dto.ProjectImagesInfo; import com.epam.datalab.model.exploratory.Image; import java.util.List; @@ -36,4 +38,6 @@ public interface ImageExploratoryService { ImageInfoRecord getImage(String user, String name, String project, String endpoint); List<ImageInfoRecord> getImagesForProject(String project); + + List<ProjectImagesInfo> getImagesOfUser(UserInfo user, ImageFilter imageFilter); } diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/ImageExploratoryServiceImpl.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/ImageExploratoryServiceImpl.java index 8c6802167..0a3666c1f 100644 --- a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/ImageExploratoryServiceImpl.java +++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/ImageExploratoryServiceImpl.java @@ -30,7 +30,9 @@ import com.epam.datalab.backendapi.dao.ExploratoryLibDAO; import com.epam.datalab.backendapi.dao.ImageExploratoryDAO; import com.epam.datalab.backendapi.domain.EndpointDTO; import com.epam.datalab.backendapi.domain.ProjectDTO; +import com.epam.datalab.backendapi.resources.dto.ImageFilter; import com.epam.datalab.backendapi.resources.dto.ImageInfoRecord; +import com.epam.datalab.backendapi.resources.dto.ProjectImagesInfo; import com.epam.datalab.backendapi.service.EndpointService; import com.epam.datalab.backendapi.service.ImageExploratoryService; import com.epam.datalab.backendapi.service.ProjectService; @@ -53,6 +55,7 @@ import com.google.inject.Singleton; import com.google.inject.name.Named; import lombok.extern.slf4j.Slf4j; +import java.time.LocalDateTime; import java.util.List; import java.util.Map; import java.util.function.Predicate; @@ -104,6 +107,8 @@ public class ImageExploratoryServiceImpl implements ImageExploratoryService { .computationalLibraries(fetchComputationalLibs(libraries)) .dockerImage(userInstance.getImageName()) .exploratoryId(userInstance.getId()) + .instanceName(userInstance.getExploratoryName()) + .cloudProvider(userInstance.getCloudProvider()) .project(userInstance.getProject()) .endpoint(userInstance.getEndpoint()) .build()); @@ -154,6 +159,21 @@ public class ImageExploratoryServiceImpl implements ImageExploratoryService { return imageExploratoryDao.getImagesForProject(project); } + @Override + public List<ProjectImagesInfo> getImagesOfUser(UserInfo user, ImageFilter imageFilter) { + log.debug("Loading list of images for user {}", user.getName()); + return projectService.getUserProjects(user, Boolean.FALSE) + .stream() + .map( p-> { + List<ImageInfoRecord> images = imageExploratoryDao.getImagesOfUser(user.getName(), p.getName()); + return ProjectImagesInfo.builder() + .project(p.getName()) + .images(images) + .build(); + }) + .collect(Collectors.toList()); + } + private Map<String, List<Library>> fetchComputationalLibs(List<Library> libraries) { return libraries.stream() .filter(resourceTypePredicate(ResourceType.COMPUTATIONAL)) diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/ImageExploratoryResourceTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/ImageExploratoryResourceTest.java index f62b1e3c6..7a28c670c 100644 --- a/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/ImageExploratoryResourceTest.java +++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/ImageExploratoryResourceTest.java @@ -24,6 +24,7 @@ import com.epam.datalab.backendapi.domain.RequestId; import com.epam.datalab.backendapi.resources.dto.ExploratoryImageCreateFormDTO; import com.epam.datalab.backendapi.resources.dto.ImageInfoRecord; import com.epam.datalab.backendapi.service.ImageExploratoryService; +import com.epam.datalab.cloud.CloudProvider; import com.epam.datalab.dto.exploratory.ImageStatus; import com.epam.datalab.exceptions.ResourceAlreadyExistException; import com.epam.datalab.exceptions.ResourceNotFoundException; @@ -39,6 +40,7 @@ import javax.ws.rs.core.GenericType; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; +import java.time.LocalDateTime; import java.util.Collections; import java.util.List; @@ -275,8 +277,16 @@ public class ImageExploratoryResourceTest extends TestBase { } private List<ImageInfoRecord> getImageList() { - ImageInfoRecord imageInfoRecord = new ImageInfoRecord("someName", "someDescription", "someProject", "someEndpoint", "someUser", "someApp", - "someFullName", ImageStatus.CREATED); + ImageInfoRecord imageInfoRecord = new ImageInfoRecord("someName", + "someDescription", + "someProject", + "someEndpoint", + "someUser", + "someApp", + "someInstance", + CloudProvider.AWS, + "someFullName", + ImageStatus.CREATED); return Collections.singletonList(imageInfoRecord); } } diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/BillingServiceImplTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/BillingServiceImplTest.java index 5c9ec461b..fc6629c85 100644 --- a/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/BillingServiceImplTest.java +++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/BillingServiceImplTest.java @@ -56,6 +56,7 @@ import org.mockito.runners.MockitoJUnitRunner; import javax.ws.rs.core.GenericType; import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; @@ -745,7 +746,17 @@ public class BillingServiceImplTest extends TestBase { private List<ImageInfoRecord> getImageInfoRecords() { return Collections.singletonList( - new ImageInfoRecord(IMAGE_NAME, IMAGE_DESCRIPTION, PROJECT, ENDPOINT, USER, IMAGE_APPLICATION, IMAGE_FULL_NAME, ImageStatus.CREATED) + new ImageInfoRecord( + IMAGE_NAME, + IMAGE_DESCRIPTION, + PROJECT, + ENDPOINT, + USER, + IMAGE_APPLICATION, + EXPLORATORY_NAME, + CloudProvider.GENERAL, + IMAGE_FULL_NAME, + ImageStatus.CREATED) ); } } \ No newline at end of file diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/ImageExploratoryServiceImplTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/ImageExploratoryServiceImplTest.java index 78eb81f55..c89fda149 100644 --- a/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/ImageExploratoryServiceImplTest.java +++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/ImageExploratoryServiceImplTest.java @@ -52,6 +52,7 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; +import java.time.LocalDateTime; import java.util.Collections; import java.util.List; import java.util.Optional; @@ -309,7 +310,7 @@ public class ImageExploratoryServiceImplTest { private ImageInfoRecord getImageInfoRecord() { return new ImageInfoRecord("someName", "someDescription", "someProject", "someEndpoint", "someUser", "someApp", - "someFullName", ImageStatus.CREATED); + "someInstance",CloudProvider.GENERAL,"someFullName", ImageStatus.CREATED); } private Image fetchImage() { --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
