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/06/26 23:33:57 UTC

[incubator-datalab] branch DATALAB-2809 created (now 8a94b9401)

This is an automated email from the ASF dual-hosted git repository.

dyankiv pushed a change to branch DATALAB-2809
in repository https://gitbox.apache.org/repos/asf/incubator-datalab.git


      at 8a94b9401 initial support for sharing images

This branch includes the following new commits:

     new 8a94b9401 initial support for sharing images

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



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


[incubator-datalab] 01/01: initial support for sharing images

Posted by dy...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dyankiv pushed a commit to branch DATALAB-2809
in repository https://gitbox.apache.org/repos/asf/incubator-datalab.git

commit 8a94b9401119c8aede38e5d2f27372bb4eefc170
Author: Denys Yankiv <de...@gmail.com>
AuthorDate: Mon Jun 27 02:33:19 2022 +0300

    initial support for sharing images
---
 .../backendapi/dao/ImageExploratoryDAO.java        |   3 +
 .../backendapi/dao/ImageExploratoryDAOImpl.java    |  17 +++-
 .../resources/ImageExploratoryResource.java        |  15 ++-
 .../backendapi/resources/dto/ImageInfoRecord.java  |   2 +-
 ...Record.java => ImageProjectGroupsShareDTO.java} |  28 +-----
 .../backendapi/resources/dto/UserRoleDTO.java      |   6 +-
 .../epam/datalab/backendapi/roles/RoleType.java    |   1 +
 .../service/ImageExploratoryService.java           |   9 ++
 .../service/impl/ImageExploratoryServiceImpl.java  | 102 +++++++++++++++++++--
 .../main/resources/mongo/image/mongo_roles.json    |  10 ++
 10 files changed, 149 insertions(+), 44 deletions(-)

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 4d97437e6..8b9ccc84c 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,10 +38,13 @@ public interface ImageExploratoryDAO {
 
     List<ImageInfoRecord> getImages(String user, String dockerImage, String project, String endpoint, ImageStatus... statuses);
 
+    List<ImageInfoRecord> getImages(String project, String endpoint, String dockerImage);
+
     List<ImageInfoRecord> getImagesOfUser(String user, String project);
 
     List<ImageInfoRecord> getImagesForProject(String project);
 
+    List<ImageInfoRecord> getAllImages();
     Optional<ImageInfoRecord> getImage(String user, String name, String project, String endpoint);
 
     List<Library> getLibraries(String user, String imageFullName, String project, String endpoint, LibStatus status);
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 95f4e0a1a..9fb160585 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,7 +54,6 @@ 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) {
@@ -80,6 +79,13 @@ public class ImageExploratoryDAOImpl extends BaseDAO implements ImageExploratory
                 ImageInfoRecord.class);
     }
 
+    @Override
+    public List<ImageInfoRecord> getImages(String project, String endpoint, String dockerImage) {
+        return find(MongoCollections.IMAGES,
+                imageProjectEndpointDockerCondition(project, endpoint, dockerImage),
+                ImageInfoRecord.class);
+    }
+
     @Override
     public List<ImageInfoRecord> getImagesOfUser(String user, String project) {
         return find(MongoCollections.IMAGES,
@@ -94,6 +100,11 @@ public class ImageExploratoryDAOImpl extends BaseDAO implements ImageExploratory
                 ImageInfoRecord.class);
     }
 
+    @Override
+    public List<ImageInfoRecord> getAllImages() {
+        return find(MongoCollections.IMAGES, ImageInfoRecord.class);
+    }
+
     @Override
     public Optional<ImageInfoRecord> getImage(String user, String name, String project, String endpoint) {
         return findOne(MongoCollections.IMAGES, userImageCondition(user, name, project, endpoint), ImageInfoRecord.class);
@@ -158,6 +169,10 @@ public class ImageExploratoryDAOImpl extends BaseDAO implements ImageExploratory
         return and(eq(USER, user), eq(PROJECT, project));
     }
 
+    private Bson imageProjectEndpointDockerCondition(String project, String endpoint, String dockerImage){
+        return and(eq(PROJECT, project), eq(ENDPOINT, endpoint), eq(DOCKER_IMAGE,dockerImage));
+    }
+
     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 8c5c76861..819ae04bc 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
@@ -21,10 +21,7 @@ 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.resources.dto.*;
 import com.epam.datalab.backendapi.service.ImageExploratoryService;
 import com.google.inject.Inject;
 import io.dropwizard.auth.Auth;
@@ -113,7 +110,7 @@ public class ImageExploratoryResource {
     @Path("user")
     public Response getImagesForUser(@Auth UserInfo ui, @Valid @NotNull ImageFilter imageFilter) {
         log.debug("Getting images for user {} with filter {}", ui.getName(), imageFilter);
-        final List<ProjectImagesInfo> images = imageExploratoryService.getImagesOfUserWithFilter(ui ,imageFilter);
+        final List<ProjectImagesInfo> images = imageExploratoryService.getImagesOfUserWithFilter(ui, imageFilter);
         return Response.ok(images).build();
     }
 
@@ -127,4 +124,12 @@ public class ImageExploratoryResource {
         log.debug("Getting image with name {} for user {}", name, ui.getName());
         return Response.ok(imageExploratoryService.getImage(ui.getName(), name, project, endpoint)).build();
     }
+
+    @POST
+    @Path("share")
+    public Response shareImageWithProjectGroups(@Auth UserInfo ui, @Valid @NotNull ImageProjectGroupsShareDTO dto) {
+        log.debug("Sharing user image {} with project {} groups", dto.getImageName(), dto.getProjectName());
+        imageExploratoryService.shareImageWithProjectGroups(ui, dto.getImageName(), dto.getProjectName(),  dto.getEndpoint());
+        return Response.ok(imageExploratoryService.getImagesOfUser(ui)).build();
+    }
 }
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 d1dd17b1f..4417b211a 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
@@ -26,7 +26,6 @@ import com.epam.datalab.model.library.Library;
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 import lombok.Data;
 
-import java.time.LocalDateTime;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
@@ -43,6 +42,7 @@ public class ImageInfoRecord {
     private final String application;
     private final String instanceName;
     private final CloudProvider cloudProvider;
+    private final String dockerImage;
     private final String fullName;
     private final ImageStatus status;
     private final boolean isShared;
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/ImageProjectGroupsShareDTO.java
similarity index 52%
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/ImageProjectGroupsShareDTO.java
index d1dd17b1f..17613954c 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/ImageProjectGroupsShareDTO.java
@@ -19,35 +19,13 @@
 
 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.ImageStatus;
-import com.epam.datalab.model.library.Library;
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 import lombok.Data;
 
-import java.time.LocalDateTime;
-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;
+public class ImageProjectGroupsShareDTO {
+    private final String imageName;
+    private final String projectName;
     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;
-    private final boolean isShared;
-    private final List<ClusterConfig> clusterConfig;
-    private final String exploratoryURL;
-    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/resources/dto/UserRoleDTO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/UserRoleDTO.java
index 62514f328..cdf652157 100644
--- a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/UserRoleDTO.java
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/UserRoleDTO.java
@@ -42,15 +42,17 @@ public class UserRoleDTO {
     private Set<String> pages;
     private Set<String> computationals;
     private Set<String> exploratories;
+    private Set<String> images;
     @JsonProperty("exploratory_shapes")
     private Set<String> exploratoryShapes;
     @JsonProperty("computational_shapes")
     private Set<String> computationalShapes;
     private Set<String> groups;
 
-    private enum Type {
+    public enum Type {
         NOTEBOOK,
         COMPUTATIONAL,
+        IMAGE,
         NOTEBOOK_SHAPE,
         COMPUTATIONAL_SHAPE,
         BILLING,
@@ -59,6 +61,6 @@ public class UserRoleDTO {
     }
 
     public static List<Type> cloudSpecificTypes() {
-        return Arrays.asList(Type.NOTEBOOK, Type.COMPUTATIONAL, Type.NOTEBOOK_SHAPE, Type.COMPUTATIONAL_SHAPE);
+        return Arrays.asList(Type.NOTEBOOK, Type.COMPUTATIONAL, Type.IMAGE, Type.NOTEBOOK_SHAPE, Type.COMPUTATIONAL_SHAPE);
     }
 }
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/roles/RoleType.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/roles/RoleType.java
index 998e01f39..1b27567ce 100644
--- a/services/self-service/src/main/java/com/epam/datalab/backendapi/roles/RoleType.java
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/roles/RoleType.java
@@ -25,6 +25,7 @@ package com.epam.datalab.backendapi.roles;
 public enum RoleType {
     COMPUTATIONAL("computationals"),
     EXPLORATORY("exploratories"),
+    IMAGE("images"),
     EXPLORATORY_SHAPES("exploratory_shapes"),
     COMPUTATIONAL_SHAPES("computational_shapes"),
     PAGE("pages");
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 99973f1a6..98c439b70 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
@@ -35,10 +35,19 @@ public interface ImageExploratoryService {
 
     List<ImageInfoRecord> getNotFailedImages(String user, String dockerImage, String project, String endpoint);
 
+    List<ImageInfoRecord> getNotFailedImages(String dockerImage, String project, String endpoint);
+
     ImageInfoRecord getImage(String user, String name, String project, String endpoint);
 
     List<ImageInfoRecord> getImagesForProject(String project);
 
     List<ProjectImagesInfo> getImagesOfUser(UserInfo user);
     List<ProjectImagesInfo> getImagesOfUserWithFilter(UserInfo user, ImageFilter imageFilter);
+
+    void shareImageWithProjectGroups(UserInfo user, String imageName, String projectName, String endpoint);
+
+    List<ImageInfoRecord> getSharedImages(UserInfo user);
+
+    List<ImageInfoRecord> getSharedImages(UserInfo userInfo, String dockerImage, 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 d2ec48e0f..5c9eaec4e 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
@@ -25,18 +25,20 @@ import com.epam.datalab.backendapi.annotation.Info;
 import com.epam.datalab.backendapi.annotation.Project;
 import com.epam.datalab.backendapi.annotation.ResourceName;
 import com.epam.datalab.backendapi.annotation.User;
-import com.epam.datalab.backendapi.dao.ExploratoryDAO;
-import com.epam.datalab.backendapi.dao.ExploratoryLibDAO;
-import com.epam.datalab.backendapi.dao.ImageExploratoryDAO;
+import com.epam.datalab.backendapi.dao.*;
 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.resources.dto.UserRoleDTO;
+import com.epam.datalab.backendapi.roles.RoleType;
+import com.epam.datalab.backendapi.roles.UserRoles;
 import com.epam.datalab.backendapi.service.EndpointService;
 import com.epam.datalab.backendapi.service.ImageExploratoryService;
 import com.epam.datalab.backendapi.service.ProjectService;
 import com.epam.datalab.backendapi.util.RequestBuilder;
+import com.epam.datalab.cloud.CloudProvider;
 import com.epam.datalab.constants.ServiceConsts;
 import com.epam.datalab.dto.UserInstanceDTO;
 import com.epam.datalab.dto.UserInstanceStatus;
@@ -49,15 +51,18 @@ import com.epam.datalab.model.exploratory.Image;
 import com.epam.datalab.model.library.Library;
 import com.epam.datalab.rest.client.RESTService;
 import com.epam.datalab.rest.contracts.ExploratoryAPI;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.common.collect.Lists;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
 import com.google.inject.name.Named;
 import lombok.extern.slf4j.Slf4j;
 
+import java.io.IOException;
+import java.io.InputStream;
 import java.time.LocalDateTime;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.function.Predicate;
 import java.util.stream.Collectors;
 
@@ -69,13 +74,22 @@ import static com.epam.datalab.backendapi.domain.AuditResourceTypeEnum.IMAGE;
 public class ImageExploratoryServiceImpl implements ImageExploratoryService {
     private static final String IMAGE_EXISTS_MSG = "Image with name %s is already exist in project %s";
     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 = "imgFull_%s_%s_%s";
+    private static final ObjectMapper MAPPER = new ObjectMapper();
     @Inject
     private ExploratoryDAO exploratoryDAO;
     @Inject
     private ImageExploratoryDAO imageExploratoryDao;
     @Inject
     private ExploratoryLibDAO libDAO;
+
+    @Inject
+    private UserRoleDAO userRoleDAO;
+
+    @Inject
+    private UserGroupDAO userGroupDAO;
     @Inject
     @Named(ServiceConsts.PROVISIONING_SERVICE_NAME)
     private RESTService provisioningService;
@@ -119,7 +133,6 @@ public class ImageExploratoryServiceImpl implements ImageExploratoryService {
                 .withProject(project)
                 .withExploratoryName(exploratoryName)
                 .withStatus(UserInstanceStatus.CREATING_IMAGE));
-
         EndpointDTO endpointDTO = endpointService.get(userInstance.getEndpoint());
         return provisioningService.post(endpointDTO.getUrl() + ExploratoryAPI.EXPLORATORY_IMAGE,
                 user.getAccessToken(),
@@ -136,6 +149,19 @@ public class ImageExploratoryServiceImpl implements ImageExploratoryService {
                 .withExploratoryName(exploratoryName)
                 .withStatus(UserInstanceStatus.RUNNING));
         imageExploratoryDao.updateImageFields(image);
+
+        // Create image roles
+        if (image.getStatus().equals(ImageStatus.CREATED)){
+            List<UserRoleDTO> imageRoles = getUserImageRoleFromFile();
+            imageRoles.stream().forEach(role -> {
+                role.setId(String.format(role.getId(), image.getProject(), image.getEndpoint(), image.getName()));
+                role.setDescription(String.format(role.getDescription(), image.getFullName()));
+                role.setCloud(CloudProvider.valueOf(image.getCloudProvider()));
+                role.setImages(new HashSet<>(Collections.singletonList(image.getFullName())));
+            });
+            userRoleDAO.insert(imageRoles);
+        }
+
         if (newNotebookIp != null) {
             log.debug("Changing exploratory ip with name {} for user {} to {}", exploratoryName, image.getUser(),
                     newNotebookIp);
@@ -149,6 +175,11 @@ public class ImageExploratoryServiceImpl implements ImageExploratoryService {
         return imageExploratoryDao.getImages(user, dockerImage, project, endpoint, ImageStatus.CREATED, ImageStatus.CREATING);
     }
 
+    @Override
+    public List<ImageInfoRecord> getNotFailedImages(String dockerImage, String project, String endpoint) {
+        return imageExploratoryDao.getImages(project, endpoint, dockerImage);
+    }
+
     @Override
     public ImageInfoRecord getImage(String user, String name, String project, String endpoint) {
         return imageExploratoryDao.getImage(user, name, project, endpoint).orElseThrow(() ->
@@ -165,8 +196,9 @@ public class ImageExploratoryServiceImpl implements ImageExploratoryService {
         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());
+                .map(p -> {
+                    List<ImageInfoRecord> images = imageExploratoryDao.getImagesOfUser(user.getName(), p.getName());
+                    images.addAll(getSharedImages(user, p.getName()));
                     return ProjectImagesInfo.builder()
                             .project(p.getName())
                             .images(images)
@@ -180,8 +212,8 @@ public class ImageExploratoryServiceImpl implements ImageExploratoryService {
         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());
+                .map(p -> {
+                    List<ImageInfoRecord> images = imageExploratoryDao.getImagesOfUser(user.getName(), p.getName());
                     return ProjectImagesInfo.builder()
                             .project(p.getName())
                             .images(images)
@@ -190,6 +222,14 @@ public class ImageExploratoryServiceImpl implements ImageExploratoryService {
                 .collect(Collectors.toList());
     }
 
+    @Override
+    public void shareImageWithProjectGroups(UserInfo user, String imageName, String projectName, String endpoint) {
+        Set<String> projectGroups = projectService.get(projectName).getGroups();
+        userRoleDAO.addGroupToRole(projectGroups,
+                Collections.singleton(String.format(IMAGE_FULL_CONTROL_ROLE,
+                        projectName, endpoint, imageName)));
+    }
+
     private Map<String, List<Library>> fetchComputationalLibs(List<Library> libraries) {
         return libraries.stream()
                 .filter(resourceTypePredicate(ResourceType.COMPUTATIONAL))
@@ -210,4 +250,46 @@ public class ImageExploratoryServiceImpl implements ImageExploratoryService {
     private Predicate<Library> resourceTypePredicate(ResourceType resourceType) {
         return l -> resourceType == l.getType();
     }
+
+    private List<UserRoleDTO> getUserImageRoleFromFile() {
+        try (InputStream is = getClass().getResourceAsStream(PATH_TO_IMAGE_ROLES)) {
+            return MAPPER.readValue(is, new TypeReference<List<UserRoleDTO>>() {
+            });
+        } catch (IOException e) {
+            log.error("Can not marshall datalab image roles due to: {}", e.getMessage(), e);
+            throw new IllegalStateException("Can not marshall datalab image roles due to: " + e.getMessage());
+        }
+    }
+
+    public List<ImageInfoRecord> getSharedImages(UserInfo userInfo) {
+        List<ImageInfoRecord> sharedImages = imageExploratoryDao.getAllImages().stream()
+                .filter(img -> !img.getUser().equals(userInfo.getName()))
+                .filter(img ->
+                        UserRoles.checkAccess(userInfo, RoleType.IMAGE, img.getFullName(), userInfo.getRoles()))
+                .collect(Collectors.toList());
+        log.info("Shared with user {} images : {}", userInfo.getName(), sharedImages);
+        return sharedImages;
+    }
+
+    public List<ImageInfoRecord> getSharedImages(UserInfo userInfo, String dockerImage, String project, String endpoint) {
+        List<ImageInfoRecord> sharedImages = imageExploratoryDao.getAllImages().stream()
+                .filter(img -> img.getStatus().equals(ImageStatus.CREATED))
+                .filter(img -> !img.getUser().equals(userInfo.getName()))
+                .filter(img -> img.getDockerImage().equals(dockerImage) && img.getProject().equals(project) && img.getEndpoint().equals(endpoint))
+                .filter(img -> UserRoles.checkAccess(userInfo, RoleType.IMAGE, img.getFullName(), userInfo.getRoles()))
+                .collect(Collectors.toList());
+        log.info("Found shared with user {} images {}", userInfo.getName(), sharedImages);
+        return sharedImages;
+    }
+
+    public List<ImageInfoRecord> getSharedImages(UserInfo userInfo, String project){
+        List<ImageInfoRecord> sharedImages = imageExploratoryDao.getAllImages().stream()
+                .filter(img -> img.getStatus().equals(ImageStatus.CREATED))
+                .filter(img -> !img.getUser().equals(userInfo.getName()))
+                .filter(img -> img.getProject().equals(project) )
+                .filter(img -> UserRoles.checkAccess(userInfo, RoleType.IMAGE, img.getFullName(), userInfo.getRoles()))
+                .collect(Collectors.toList());
+        log.info("Found shared with user {} images {}", userInfo.getName(), sharedImages);
+        return sharedImages;
+    }
 }
diff --git a/services/self-service/src/main/resources/mongo/image/mongo_roles.json b/services/self-service/src/main/resources/mongo/image/mongo_roles.json
new file mode 100644
index 000000000..e9efc3437
--- /dev/null
+++ b/services/self-service/src/main/resources/mongo/image/mongo_roles.json
@@ -0,0 +1,10 @@
+[
+  {
+    "_id": "imgFull_%s_%s_%s",
+    "description": "Full control of %s image",
+    "type": "IMAGE",
+    "groups": [
+      "$anyuser"
+    ]
+  }
+]
\ No newline at end of file


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