This is an automated email from the ASF dual-hosted git repository. dyankiv pushed a commit to branch DATALAB-2919 in repository https://gitbox.apache.org/repos/asf/incubator-datalab.git
commit 9fb88470aa75cf1b917ba1788174a2a2366cc3c5 Author: Denys Yankiv <[email protected]> AuthorDate: Mon Aug 1 13:41:20 2022 +0300 add new sharing statuses --- .../dto/exploratory/ImageSharingStatus.java | 8 +++ .../epam/datalab/backendapi/dao/UserRoleDAO.java | 2 + .../datalab/backendapi/dao/UserRoleDAOImpl.java | 5 ++ .../backendapi/resources/dto/ImageFilter.java | 5 +- .../backendapi/resources/dto/ImageInfoRecord.java | 3 +- .../service/impl/ImageExploratoryServiceImpl.java | 63 +++++++++++++--------- 6 files changed, 57 insertions(+), 29 deletions(-) diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/exploratory/ImageSharingStatus.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/exploratory/ImageSharingStatus.java new file mode 100644 index 000000000..5d445e3de --- /dev/null +++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/exploratory/ImageSharingStatus.java @@ -0,0 +1,8 @@ +package com.epam.datalab.dto.exploratory; + +public enum ImageSharingStatus { + PRIVATE, + SHARED, + RECEIVED + +} diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/UserRoleDAO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/UserRoleDAO.java index 89bc126dd..07a4af422 100644 --- a/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/UserRoleDAO.java +++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/UserRoleDAO.java @@ -29,6 +29,8 @@ import java.util.Set; public interface UserRoleDAO { List<UserRoleDTO> findAll(); + UserRoleDTO findById(String roleId); + void insert(UserRoleDTO dto); void insert(List<UserRoleDTO> roles); diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/UserRoleDAOImpl.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/UserRoleDAOImpl.java index 1081deef3..63c221fb0 100644 --- a/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/UserRoleDAOImpl.java +++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/UserRoleDAOImpl.java @@ -79,6 +79,11 @@ public class UserRoleDAOImpl extends BaseDAO implements UserRoleDAO { return find(MongoCollections.ROLES, UserRoleDTO.class); } + @Override + public UserRoleDTO findById(String roleId) { + return findOne(MongoCollections.ROLES, in(ID, roleId),UserRoleDTO.class).orElse(null); + } + @Override public void insert(UserRoleDTO dto) { insertOne(MongoCollections.ROLES, dto, dto.getId()); diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ImageFilter.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ImageFilter.java index 136438d5e..81585ffc8 100644 --- a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ImageFilter.java +++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ImageFilter.java @@ -20,6 +20,7 @@ package com.epam.datalab.backendapi.resources.dto; import com.epam.datalab.cloud.CloudProvider; +import com.epam.datalab.dto.exploratory.ImageSharingStatus; import com.epam.datalab.dto.exploratory.ImageStatus; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; @@ -41,7 +42,7 @@ public class ImageFilter { private List<CloudProvider> cloudProviders; @NonNull private List<String> templateNames; - // @NonNull -// private List<> sharingStatuses; + @NonNull + private List<ImageSharingStatus> sharingStatuses; } 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 d4e240fe8..f13f1b199 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 @@ -21,6 +21,7 @@ package com.epam.datalab.backendapi.resources.dto; import com.epam.datalab.cloud.CloudProvider; 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; @@ -46,7 +47,7 @@ public class ImageInfoRecord { private final String dockerImage; private final String fullName; private final ImageStatus status; - private boolean isShared; + private ImageSharingStatus sharingStatus; private final List<ClusterConfig> clusterConfig; private final String exploratoryURL; private final List<Library> libraries; 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 820cb28f0..fd63d28d2 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 @@ -42,6 +42,7 @@ import com.epam.datalab.constants.ServiceConsts; import com.epam.datalab.dto.UserInstanceDTO; import com.epam.datalab.dto.UserInstanceStatus; import com.epam.datalab.dto.exploratory.ExploratoryStatusDTO; +import com.epam.datalab.dto.exploratory.ImageSharingStatus; import com.epam.datalab.dto.exploratory.ImageStatus; import com.epam.datalab.exceptions.ResourceAlreadyExistException; import com.epam.datalab.exceptions.ResourceNotFoundException; @@ -75,7 +76,7 @@ public class ImageExploratoryServiceImpl implements ImageExploratoryService { private static final String IMAGE_NOT_FOUND_MSG = "Image with name %s was not found for user %s"; private static final String PATH_TO_IMAGE_ROLES = "/mongo/image/mongo_roles.json"; - private static final String IMAGE_FULL_CONTROL_ROLE = "img_%s_%s_%s_%s"; + private static final String IMAGE_ROLE = "img_%s_%s_%s_%s"; /** * projectName-endpointName-exploratoryName-imageName @@ -197,7 +198,7 @@ public class ImageExploratoryServiceImpl implements ImageExploratoryService { .stream() .map(p -> { List<ImageInfoRecord> images = imageExploratoryDao.getImagesOfUser(user.getName(), p.getName()); - images.forEach(img -> img.setShared(isSharedImage(img))); + images.forEach(img -> img.setSharingStatus(getImageSharingStatus(user.getName(),img))); images.addAll(getSharedImages(user, p.getName())); return ProjectImagesInfo.builder() .project(p.getName()) @@ -213,9 +214,11 @@ public class ImageExploratoryServiceImpl implements ImageExploratoryService { return projectService.getUserProjects(user, Boolean.FALSE) .stream() .map(p -> { - List<ImageInfoRecord> images = filterImages(imageExploratoryDao.getImagesOfUser(user.getName(), p.getName()),imageFilter); - List<ImageInfoRecord> sharedImages = filterImages(getSharedImages(user, p.getName()), imageFilter); + List<ImageInfoRecord> images = imageExploratoryDao.getImagesOfUser(user.getName(), p.getName()); + images.forEach(img -> img.setSharingStatus(getImageSharingStatus(user.getName(),img))); + List<ImageInfoRecord> sharedImages = getSharedImages(user, p.getName()); images.addAll(sharedImages); + images = filterImages(images, imageFilter); return ProjectImagesInfo.builder() .project(p.getName()) .images(images) @@ -231,7 +234,7 @@ public class ImageExploratoryServiceImpl implements ImageExploratoryService { if(image.isPresent()){ String exploratoryName = image.get().getInstanceName(); userRoleDAO.addGroupToRole(projectGroups, - Collections.singleton(String.format(IMAGE_FULL_CONTROL_ROLE, + Collections.singleton(String.format(IMAGE_ROLE, projectName, endpoint, exploratoryName ,imageName))); } @@ -258,9 +261,9 @@ public class ImageExploratoryServiceImpl implements ImageExploratoryService { return l -> resourceType == l.getType(); } - private List<UserRoleDTO> getUserImageRoleFromFile() { + private UserRoleDTO getUserImageRoleFromFile() { try (InputStream is = getClass().getResourceAsStream(PATH_TO_IMAGE_ROLES)) { - return MAPPER.readValue(is, new TypeReference<List<UserRoleDTO>>() { + return MAPPER.readValue(is, new TypeReference<UserRoleDTO>() { }); } catch (IOException e) { log.error("Can not marshall datalab image roles due to: {}", e.getMessage(), e); @@ -276,7 +279,7 @@ public class ImageExploratoryServiceImpl implements ImageExploratoryService { String.format(IMAGE_MONIKER, img.getProject(), img.getEndpoint(), img.getInstanceName(), img.getName()), userInfo.getRoles())) .collect(Collectors.toList()); - sharedImages.forEach(img -> img.setShared(true)); + sharedImages.forEach(img -> img.setSharingStatus(getImageSharingStatus(userInfo.getName(),img))); log.info("Shared with user {} images : {}", userInfo.getName(), sharedImages); return sharedImages; } @@ -290,7 +293,7 @@ public class ImageExploratoryServiceImpl implements ImageExploratoryService { String.format(IMAGE_MONIKER, img.getProject(), img.getEndpoint(), img.getInstanceName(), img.getName()), userInfo.getRoles())) .collect(Collectors.toList()); - sharedImages.forEach(img -> img.setShared(true)); + sharedImages.forEach(img -> img.setSharingStatus(getImageSharingStatus(userInfo.getName(),img))); log.info("Found shared with user {} images {}", userInfo.getName(), sharedImages); return sharedImages; } @@ -304,20 +307,29 @@ public class ImageExploratoryServiceImpl implements ImageExploratoryService { String.format(IMAGE_MONIKER, img.getProject(), img.getEndpoint(), img.getInstanceName(), img.getName()), userInfo.getRoles())) .collect(Collectors.toList()); - sharedImages.forEach(img -> img.setShared(true)); + sharedImages.forEach(img -> img.setSharingStatus(getImageSharingStatus(userInfo.getName(),img))); log.info("Found shared with user {} images {}", userInfo.getName(), sharedImages); return sharedImages; } - private boolean isSharedImage(ImageInfoRecord image){ + private ImageSharingStatus getImageSharingStatus(String username, ImageInfoRecord image){ String anyUser = "$anyuser"; - List<UserRoleDTO> imageRoles = userRoleDAO.findAll().stream() - .filter( r -> r.getType().equals(UserRoleDTO.Type.IMAGE)) - .filter(r -> r.getImages().contains(getImageMoniker(image.getProject(),image.getEndpoint(),image.getInstanceName(),image.getName()))) - .filter( r -> (r.getGroups().contains(anyUser) && r.getGroups().size() >= 2) - || (!r.getGroups().contains(anyUser) && !r.getGroups().isEmpty())) - .collect(Collectors.toList()); - return !imageRoles.isEmpty(); + UserRoleDTO role = getImageRole(image); + boolean roleHasGroups = (role.getGroups().contains(anyUser) && role.getGroups().size() >= 2) + || (!role.getGroups().contains(anyUser) && !role.getGroups().isEmpty()); + if(!roleHasGroups && image.getUser().equals(username)){ + return ImageSharingStatus.PRIVATE; + } else if (roleHasGroups && image.getUser().equals(username)){ + return ImageSharingStatus.SHARED; + } + return ImageSharingStatus.RECEIVED ; + } + + private UserRoleDTO getImageRole(ImageInfoRecord image){ + // projectName-endpointName-exploratoryName-imageName + String imageId = String.format(IMAGE_ROLE, + image.getProject(), image.getEndpoint(), image.getInstanceName(),image.getName()); + return userRoleDAO.findById(imageId); } private String getImageMoniker(String project, String endpoint, String exploratoryName, String imageName){ @@ -326,14 +338,12 @@ public class ImageExploratoryServiceImpl implements ImageExploratoryService { private void createImageRole(Image image, String exploratoryName){ if (image.getStatus().equals(ImageStatus.ACTIVE)){ - List<UserRoleDTO> imageRoles = getUserImageRoleFromFile(); - imageRoles.stream().forEach(role -> { - role.setId(String.format(role.getId(), image.getProject(), image.getEndpoint(), exploratoryName ,image.getName())); - role.setDescription(String.format(role.getDescription(), getImageMoniker(image.getProject(), image.getEndpoint(), exploratoryName, image.getName()).replaceAll("_","-"))); - role.setCloud(endpointService.get(image.getEndpoint()).getCloudProvider()); - role.setImages(new HashSet<>(Collections.singletonList(getImageMoniker(image.getProject(), image.getEndpoint(), exploratoryName, image.getName())))); - }); - userRoleDAO.insert(imageRoles); + UserRoleDTO role = getUserImageRoleFromFile(); + role.setId(String.format(role.getId(), image.getProject(), image.getEndpoint(), exploratoryName ,image.getName())); + role.setDescription(String.format(role.getDescription(), getImageMoniker(image.getProject(), image.getEndpoint(), exploratoryName, image.getName()).replaceAll("_","-"))); + role.setCloud(endpointService.get(image.getEndpoint()).getCloudProvider()); + role.setImages(new HashSet<>(Collections.singletonList(getImageMoniker(image.getProject(), image.getEndpoint(), exploratoryName, image.getName())))); + userRoleDAO.insert(role); } } @@ -343,6 +353,7 @@ public class ImageExploratoryServiceImpl implements ImageExploratoryService { .filter(img -> CollectionUtils.isEmpty(filter.getStatuses()) || filter.getStatuses().contains(img.getStatus())) .filter(img -> CollectionUtils.isEmpty(filter.getCloudProviders()) || filter.getCloudProviders().contains(img.getCloudProvider())) .filter(img -> CollectionUtils.isEmpty(filter.getTemplateNames()) || filter.getTemplateNames().contains(img.getTemplateName())) + .filter(img -> CollectionUtils.isEmpty(filter.getSharingStatuses()) || filter.getSharingStatuses().contains(img.getSharingStatus())) .collect(Collectors.toList()); } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
