You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@datalab.apache.org by dy...@apache.org on 2022/09/22 14:02:36 UTC
[incubator-datalab] 02/02: sort shared info for images, hide from non owners
This is an automated email from the ASF dual-hosted git repository.
dyankiv pushed a commit to branch DATALAB-2932
in repository https://gitbox.apache.org/repos/asf/incubator-datalab.git
commit 598c5107808365192d41583cbcae8240ed318334
Author: Denys Yankiv <de...@gmail.com>
AuthorDate: Thu Sep 22 17:01:44 2022 +0300
sort shared info for images, hide from non owners
---
.../main/java/com/epam/datalab/dto/SharedWith.java | 8 +--
.../resources/ImageExploratoryResource.java | 5 +-
.../{ImageInfoRecord.java => ImageInfoDTO.java} | 46 ++++++-------
.../backendapi/resources/dto/ImageInfoRecord.java | 3 -
.../resources/dto/ProjectImagesInfo.java | 2 +-
.../service/ImageExploratoryService.java | 2 +-
.../service/impl/ImageExploratoryServiceImpl.java | 77 +++++++++++++++-------
7 files changed, 86 insertions(+), 57 deletions(-)
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/SharedWith.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/SharedWith.java
index 21daa22e1..711043fb7 100644
--- a/services/datalab-model/src/main/java/com/epam/datalab/dto/SharedWith.java
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/SharedWith.java
@@ -20,15 +20,13 @@
package com.epam.datalab.dto;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import lombok.AllArgsConstructor;
import lombok.Data;
-import java.util.HashSet;
-import java.util.Set;
+import java.util.TreeSet;
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class SharedWith {
- private Set<String> users=new HashSet<>();
- private Set<String> groups=new HashSet<>();
+ private TreeSet<String> users = new TreeSet<>();
+ private TreeSet<String> groups = new TreeSet<>();
}
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 3b3c92af9..c70885b83 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
@@ -79,9 +79,8 @@ public class ImageExploratoryResource {
@QueryParam("project") String project,
@QueryParam("endpoint") String endpoint) {
log.debug("Getting images for user {}, project {}", ui.getName(), project);
- final List<ImageInfoRecord> images = imageExploratoryService.getNotFailedImages(ui, dockerImage,
- project, endpoint);
- return Response.ok(images).build();
+ return Response.ok(imageExploratoryService.getNotFailedImages(ui, dockerImage,
+ project, endpoint)).build();
}
@GET
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/ImageInfoDTO.java
similarity index 61%
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/ImageInfoDTO.java
index ca51fe771..f45085b00 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/ImageInfoDTO.java
@@ -17,6 +17,7 @@
* under the License.
*/
+
package com.epam.datalab.backendapi.resources.dto;
import com.epam.datalab.cloud.CloudProvider;
@@ -25,34 +26,35 @@ import com.epam.datalab.dto.aws.computational.ClusterConfig;
import com.epam.datalab.dto.exploratory.ImageSharingStatus;
import com.epam.datalab.dto.exploratory.ImageStatus;
import com.epam.datalab.model.library.Library;
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
import lombok.Data;
import java.util.Date;
import java.util.List;
import java.util.Map;
-
@Data
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class ImageInfoRecord {
- private final String name;
- private final Date timestamp;
- private final String description;
- private final String project;
- private final String endpoint;
- private final String user;
- private final String application;
- private final String templateName;
- private final String instanceName;
- private final CloudProvider cloudProvider;
- private final String dockerImage;
- private final String fullName;
- private final ImageStatus status;
+@Builder
+@AllArgsConstructor
+public class ImageInfoDTO {
+ private String name;
+ private Date timestamp;
+ private String description;
+ private String project;
+ private String endpoint;
+ private String user;
+ private String application;
+ private String templateName;
+ private String instanceName;
+ private CloudProvider cloudProvider;
+ private String dockerImage;
+ private String fullName;
+ private ImageStatus status;
private ImageSharingStatus sharingStatus;
private ImageUserPermissions imageUserPermissions;
- private final SharedWith sharedWith;
- private final List<ClusterConfig> clusterConfig;
- private final String exploratoryURL;
- private final List<Library> libraries;
- private final Map<String, List<Library>> computationalLibraries;
+ private SharedWith sharedWith;
+ private List<ClusterConfig> clusterConfig;
+ private String exploratoryURL;
+ private List<Library> libraries;
+ private Map<String, List<Library>> computationalLibraries;
}
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 ca51fe771..a4472e1d4 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
@@ -22,7 +22,6 @@ package com.epam.datalab.backendapi.resources.dto;
import com.epam.datalab.cloud.CloudProvider;
import com.epam.datalab.dto.SharedWith;
import com.epam.datalab.dto.aws.computational.ClusterConfig;
-import com.epam.datalab.dto.exploratory.ImageSharingStatus;
import com.epam.datalab.dto.exploratory.ImageStatus;
import com.epam.datalab.model.library.Library;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@@ -48,8 +47,6 @@ public class ImageInfoRecord {
private final String dockerImage;
private final String fullName;
private final ImageStatus status;
- private ImageSharingStatus sharingStatus;
- private ImageUserPermissions imageUserPermissions;
private final SharedWith sharedWith;
private final List<ClusterConfig> clusterConfig;
private final String exploratoryURL;
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ProjectImagesInfo.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ProjectImagesInfo.java
index 8743214c4..46dfe6663 100644
--- a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ProjectImagesInfo.java
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ProjectImagesInfo.java
@@ -33,5 +33,5 @@ public class ProjectImagesInfo {
@JsonProperty
private String project;
@JsonProperty
- private List<ImageInfoRecord> images;
+ private List<ImageInfoDTO> 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 a81e8f144..c1149fb42 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
@@ -36,7 +36,7 @@ public interface ImageExploratoryService {
void finishImageCreate(Image image, String exploratoryName, String newNotebookIp);
- List<ImageInfoRecord> getNotFailedImages(UserInfo user, String dockerImage, String project, String endpoint);
+ List<ImageInfoDTO> getNotFailedImages(UserInfo user, String dockerImage, String project, String endpoint);
ImageInfoRecord getImage(String user, String name, String project, String endpoint);
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 67d8658cc..b1acbc270 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
@@ -184,7 +184,7 @@ public class ImageExploratoryServiceImpl implements ImageExploratoryService {
}
@Override
- public List<ImageInfoRecord> getNotFailedImages(UserInfo user, String dockerImage, String project, String endpoint) {
+ public List<ImageInfoDTO> getNotFailedImages(UserInfo user, String dockerImage, String project, String endpoint) {
List<ImageInfoRecord> images = new ArrayList<>();
if (UserRoles.checkAccess(user, RoleType.PAGE, CREATE_NOTEBOOK_BASED_ON_OWN_IMAGES, user.getRoles())) {
images.addAll(imageExploratoryDao.getImages(user.getName(), dockerImage, project, endpoint, ImageStatus.ACTIVE, ImageStatus.CREATING));
@@ -192,7 +192,8 @@ public class ImageExploratoryServiceImpl implements ImageExploratoryService {
if (UserRoles.checkAccess(user, RoleType.PAGE, CREATE_NOTEBOOK_BASED_ON_SHARED_IMAGES, user.getRoles())) {
images.addAll(getSharedImages(user, dockerImage, project, endpoint));
}
- return images;
+ List<ImageInfoDTO> imageInfoDTOs = images.stream().map(img -> toImageInfoDTO(img, user)).collect(Collectors.toList());
+ return removeSharedWithIfNotOwner(user,imageInfoDTOs);
}
@Override
@@ -216,29 +217,30 @@ public class ImageExploratoryServiceImpl implements ImageExploratoryService {
public ImagesPageInfo getImagesOfUser(UserInfo user, ImageFilter imageFilter) {
log.debug("Loading list of images for user {}", user.getName());
List<ImageInfoRecord> images = imageExploratoryDao.getImagesOfUser(user.getName());
- images.forEach(img -> img.setSharingStatus(getImageSharingStatus(user.getName(), img)));
- images.addAll(getSharedImages(user));
- ImageFilterFormData filterData = getDataForFilter(images);
+
+ List<ImageInfoDTO> imagesDTOs = images.stream().map(img -> toImageInfoDTO(img, user)).collect(Collectors.toList());
+ imagesDTOs.addAll(getSharedImages(user).stream().map(img -> toImageInfoDTO(img, user)).collect(Collectors.toList()));
+ ImageFilterFormData filterData = getDataForFilter(imagesDTOs);
if (imageFilter == null) {
if (userSettingsDAO.getImageFilter(user.getName()).isPresent()) {
imageFilter = userSettingsDAO.getImageFilter(user.getName()).get();
- images = filterImages(images, imageFilter);
+ imagesDTOs = filterImages(imagesDTOs, imageFilter);
} else {
imageFilter = new ImageFilter();
userSettingsDAO.setUserImageFilter(user.getName(), imageFilter);
}
} else {
- images = filterImages(images, imageFilter);
+ imagesDTOs = filterImages(imagesDTOs, imageFilter);
userSettingsDAO.setUserImageFilter(user.getName(), imageFilter);
}
- images.forEach(img -> img.setImageUserPermissions(getUserImagePermissions(user, img)));
- final List<ImageInfoRecord> finalImages = images;
+ // do not show sharing if not owner
+ final List<ImageInfoDTO> finalImages = removeSharedWithIfNotOwner(user, imagesDTOs);
List<ProjectImagesInfo> projectImagesInfoList = projectService.getUserProjects(user, Boolean.FALSE)
.stream()
.map(p -> {
- List<ImageInfoRecord> im = finalImages.stream().filter(img -> img.getProject().equals(p.getName())).collect(Collectors.toList());
+ List<ImageInfoDTO> im = finalImages.stream().filter(img -> img.getProject().equals(p.getName())).collect(Collectors.toList());
return ProjectImagesInfo.builder()
.project(p.getName())
.images(im)
@@ -271,13 +273,10 @@ public class ImageExploratoryServiceImpl implements ImageExploratoryService {
@Override
public List<ImageInfoRecord> getSharedImages(UserInfo userInfo) {
- List<ImageInfoRecord> sharedImages = imageExploratoryDao.getAllImages().stream()
+ return imageExploratoryDao.getAllImages().stream()
.filter(img -> !img.getUser().equals(userInfo.getName()))
.filter(img -> hasAccess(userInfo.getName(), img.getSharedWith()))
.collect(Collectors.toList());
- sharedImages.forEach(img -> img.setSharingStatus(getImageSharingStatus(userInfo.getName(), img)));
- log.info("Shared with user {} images : {}", userInfo.getName(), sharedImages);
- return sharedImages;
}
@Override
@@ -288,7 +287,7 @@ public class ImageExploratoryServiceImpl implements ImageExploratoryService {
.filter(img -> img.getDockerImage().equals(dockerImage) && img.getProject().equals(project) && img.getEndpoint().equals(endpoint))
.filter(img -> hasAccess(userInfo.getName(), img.getSharedWith()))
.collect(Collectors.toList());
- sharedImages.forEach(img -> img.setSharingStatus(getImageSharingStatus(userInfo.getName(), img)));
+ //sharedImages.forEach(img -> img.setSharingStatus(getImageSharingStatus(userInfo.getName(), img)));
log.info("Found shared with user {} images {}", userInfo.getName(), sharedImages);
return sharedImages;
}
@@ -391,7 +390,16 @@ public class ImageExploratoryServiceImpl implements ImageExploratoryService {
return ImageSharingStatus.RECEIVED;
}
- private List<ImageInfoRecord> filterImages(List<ImageInfoRecord> images, ImageFilter filter) {
+ private List<ImageInfoDTO> removeSharedWithIfNotOwner(UserInfo user, List<ImageInfoDTO> imageInfoDTOS){
+ imageInfoDTOS.forEach(img -> {
+ if(!img.getUser().equals(user.getName())){
+ img.setSharedWith(new SharedWith());
+ }
+ });
+ return imageInfoDTOS;
+ }
+
+ private List<ImageInfoDTO> filterImages(List<ImageInfoDTO> images, ImageFilter filter) {
return images.stream()
.filter(img -> img.getName().toLowerCase().contains(filter.getImageName().toLowerCase()))
.filter(img -> CollectionUtils.isEmpty(filter.getStatuses()) || filter.getStatuses().contains(img.getStatus()))
@@ -402,13 +410,38 @@ public class ImageExploratoryServiceImpl implements ImageExploratoryService {
}
- private ImageFilterFormData getDataForFilter(List<ImageInfoRecord> images) {
+ private ImageFilterFormData getDataForFilter(List<ImageInfoDTO> images) {
ImageFilterFormData filterData = new ImageFilterFormData();
- filterData.setImageNames(images.stream().map(ImageInfoRecord::getName).collect(Collectors.toSet()));
- filterData.setStatuses(images.stream().map(ImageInfoRecord::getStatus).collect(Collectors.toSet()));
- filterData.setEndpoints(images.stream().map(ImageInfoRecord::getEndpoint).collect(Collectors.toSet()));
- filterData.setTemplateNames(images.stream().map(ImageInfoRecord::getTemplateName).collect(Collectors.toSet()));
- filterData.setSharingStatuses(images.stream().map(ImageInfoRecord::getSharingStatus).collect(Collectors.toSet()));
+ filterData.setImageNames(images.stream().map(ImageInfoDTO::getName).collect(Collectors.toSet()));
+ filterData.setStatuses(images.stream().map(ImageInfoDTO::getStatus).collect(Collectors.toSet()));
+ filterData.setEndpoints(images.stream().map(ImageInfoDTO::getEndpoint).collect(Collectors.toSet()));
+ filterData.setTemplateNames(images.stream().map(ImageInfoDTO::getTemplateName).collect(Collectors.toSet()));
+ filterData.setSharingStatuses(images.stream().map(ImageInfoDTO::getSharingStatus).collect(Collectors.toSet()));
return filterData;
}
+
+ private ImageInfoDTO toImageInfoDTO(ImageInfoRecord imageInfoRecord, UserInfo userInfo){
+ return ImageInfoDTO.builder()
+ .name(imageInfoRecord.getName())
+ .timestamp(imageInfoRecord.getTimestamp())
+ .description(imageInfoRecord.getDescription())
+ .project(imageInfoRecord.getProject())
+ .endpoint(imageInfoRecord.getEndpoint())
+ .user(imageInfoRecord.getUser())
+ .application(imageInfoRecord.getApplication())
+ .templateName(imageInfoRecord.getTemplateName())
+ .instanceName(imageInfoRecord.getInstanceName())
+ .cloudProvider(imageInfoRecord.getCloudProvider())
+ .dockerImage(imageInfoRecord.getDockerImage())
+ .fullName(imageInfoRecord.getFullName())
+ .status(imageInfoRecord.getStatus())
+ .sharingStatus(getImageSharingStatus(userInfo.getName(), imageInfoRecord))
+ .imageUserPermissions(getUserImagePermissions(userInfo, imageInfoRecord))
+ .sharedWith(imageInfoRecord.getSharedWith())
+ .clusterConfig(imageInfoRecord.getClusterConfig())
+ .exploratoryURL(imageInfoRecord.getExploratoryURL())
+ .libraries(imageInfoRecord.getLibraries())
+ .computationalLibraries(imageInfoRecord.getComputationalLibraries())
+ .build();
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@datalab.apache.org
For additional commands, e-mail: commits-help@datalab.apache.org