You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dlab.apache.org by of...@apache.org on 2019/11/14 13:48:57 UTC

[incubator-dlab] 01/01: [DLAB-1261] Custom image is unique per project

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

ofuks pushed a commit to branch DLAB-1261
in repository https://gitbox.apache.org/repos/asf/incubator-dlab.git

commit ee198c4e9ee2dd3a2463323e38c2691a05310032
Author: Oleh Fuks <ol...@gmail.com>
AuthorDate: Thu Nov 14 15:48:37 2019 +0200

    [DLAB-1261] Custom image is unique per project
---
 .../dlab/backendapi/dao/ImageExploratoryDao.java   |  4 ++-
 .../backendapi/dao/ImageExploratoryDaoImpl.java    | 15 ++++++++--
 .../resources/ImageExploratoryResource.java        |  9 +++++-
 .../service/ImageExploratoryService.java           |  2 ++
 .../service/impl/ImageExploratoryServiceImpl.java  | 13 ++++++---
 .../resources/ImageExploratoryResourceTest.java    | 34 ++++++++++++++++++++++
 .../impl/ImageExploratoryServiceImplTest.java      | 17 +++++++++--
 7 files changed, 83 insertions(+), 11 deletions(-)

diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ImageExploratoryDao.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ImageExploratoryDao.java
index b5b2391..0eb86c0 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ImageExploratoryDao.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ImageExploratoryDao.java
@@ -31,7 +31,7 @@ import java.util.Optional;
 
 public interface ImageExploratoryDao {
 
-	boolean exist(String user, String name);
+	boolean exist(String image, String project);
 
 	void save(Image image);
 
@@ -39,6 +39,8 @@ public interface ImageExploratoryDao {
 
 	List<ImageInfoRecord> getImages(String user, String dockerImage, String project, String endpoint, ImageStatus... statuses);
 
+	List<ImageInfoRecord> getImagesForProject(String project);
+
 	Optional<ImageInfoRecord> getImage(String user, String name);
 
 	List<Library> getLibraries(String user, String imageFullName, ResourceType resourceType, LibStatus status);
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ImageExploratoryDaoImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ImageExploratoryDaoImpl.java
index a27b943..c3e0ee1 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ImageExploratoryDaoImpl.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ImageExploratoryDaoImpl.java
@@ -49,8 +49,8 @@ public class ImageExploratoryDaoImpl extends BaseDAO implements ImageExploratory
 	private static final String ENDPOINT = "endpoint";
 
 	@Override
-	public boolean exist(String user, String name) {
-		return findOne(MongoCollections.IMAGES, userImageCondition(user, name)).isPresent();
+	public boolean exist(String image, String project) {
+		return findOne(MongoCollections.IMAGES, imageProjectCondition(image, project)).isPresent();
 	}
 
 	@Override
@@ -73,6 +73,13 @@ public class ImageExploratoryDaoImpl extends BaseDAO implements ImageExploratory
 	}
 
 	@Override
+	public List<ImageInfoRecord> getImagesForProject(String project) {
+		return find(MongoCollections.IMAGES,
+				eq(PROJECT, project),
+				ImageInfoRecord.class);
+	}
+
+	@Override
 	public Optional<ImageInfoRecord> getImage(String user, String name) {
 		return findOne(MongoCollections.IMAGES, userImageCondition(user, name), ImageInfoRecord.class);
 	}
@@ -127,6 +134,10 @@ public class ImageExploratoryDaoImpl extends BaseDAO implements ImageExploratory
 		return and(eq(USER, user), eq(IMAGE_NAME, imageName));
 	}
 
+	private Bson imageProjectCondition(String image, String project) {
+		return and(eq(IMAGE_NAME, image), 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/dlab/backendapi/resources/ImageExploratoryResource.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/ImageExploratoryResource.java
index 685d2ca..fdc15fd 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/ImageExploratoryResource.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/ImageExploratoryResource.java
@@ -68,7 +68,6 @@ public class ImageExploratoryResource {
 		return Response.accepted(uuid).location(imageUri).build();
 	}
 
-
 	@GET
 	public Response getImages(@Auth UserInfo ui,
 							  @QueryParam("docker_image") String dockerImage,
@@ -81,6 +80,14 @@ public class ImageExploratoryResource {
 	}
 
 	@GET
+	@Path("all")
+	public Response getAllImagesForProject(@Auth UserInfo ui, @NotNull @QueryParam("project") String project) {
+		log.debug("Getting images for user {}, project {}", ui.getName(), project);
+		final List<ImageInfoRecord> images = imageExploratoryService.getImagesForProject(project);
+		return Response.ok(images).build();
+	}
+
+	@GET
 	@Path("{name}")
 	public Response getImage(@Auth UserInfo ui,
 							 @PathParam("name") String name) {
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/ImageExploratoryService.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/ImageExploratoryService.java
index 328d9ce..791cd05 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/ImageExploratoryService.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/ImageExploratoryService.java
@@ -34,4 +34,6 @@ public interface ImageExploratoryService {
 	List<ImageInfoRecord> getNotFailedImages(String user, String dockerImage, String project, String endpoint);
 
 	ImageInfoRecord getImage(String user, String name);
+
+	List<ImageInfoRecord> getImagesForProject(String project);
 }
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ImageExploratoryServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ImageExploratoryServiceImpl.java
index 8beda82..905b504 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ImageExploratoryServiceImpl.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ImageExploratoryServiceImpl.java
@@ -54,7 +54,7 @@ import java.util.stream.Collectors;
 @Slf4j
 public class ImageExploratoryServiceImpl implements ImageExploratoryService {
 
-	private static final String IMAGE_EXISTS_MSG = "Image with name %s is already exist";
+	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";
 
 	@Inject
@@ -76,9 +76,9 @@ public class ImageExploratoryServiceImpl implements ImageExploratoryService {
 
 		UserInstanceDTO userInstance = exploratoryDAO.fetchRunningExploratoryFields(user.getName(), exploratoryName);
 
-		if (imageExploratoryDao.exist(user.getName(), imageName)) {
-			log.error(String.format(IMAGE_EXISTS_MSG, imageName));
-			throw new ResourceAlreadyExistException(String.format(IMAGE_EXISTS_MSG, imageName));
+		if (imageExploratoryDao.exist(imageName, userInstance.getProject())) {
+			log.error(String.format(IMAGE_EXISTS_MSG, imageName, userInstance.getProject()));
+			throw new ResourceAlreadyExistException(String.format(IMAGE_EXISTS_MSG, imageName, userInstance.getProject()));
 		}
 		final List<Library> libraries = libDAO.getLibraries(user.getName(), exploratoryName);
 
@@ -132,6 +132,11 @@ public class ImageExploratoryServiceImpl implements ImageExploratoryService {
 				new ResourceNotFoundException(String.format(IMAGE_NOT_FOUND_MSG, name, user)));
 	}
 
+	@Override
+	public List<ImageInfoRecord> getImagesForProject(String project) {
+		return imageExploratoryDao.getImagesForProject(project);
+	}
+
 	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/dlab/backendapi/resources/ImageExploratoryResourceTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/ImageExploratoryResourceTest.java
index 3a4f4ef..be35816 100644
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/ImageExploratoryResourceTest.java
+++ b/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/ImageExploratoryResourceTest.java
@@ -204,6 +204,40 @@ public class ImageExploratoryResourceTest extends TestBase {
 	}
 
 	@Test
+	public void getAllImagesForProject() {
+		when(imageExploratoryService.getImagesForProject(anyString())).thenReturn(getImageList());
+		final Response response = resources.getJerseyTest()
+				.target("/infrastructure_provision/exploratory_environment/image/all")
+				.queryParam("project", "someProject")
+				.request()
+				.header("Authorization", "Bearer " + TOKEN)
+				.get();
+
+		assertEquals(HttpStatus.SC_OK, response.getStatus());
+		assertEquals(getImageList(), response.readEntity(new GenericType<List<ImageInfoRecord>>() {}));
+		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+		verify(imageExploratoryService).getImagesForProject("someProject");
+		verifyNoMoreInteractions(imageExploratoryService);
+	}
+
+	@Test
+	public void getAllImagesForNullProject() {
+		when(imageExploratoryService.getImagesForProject(anyString())).thenReturn(getImageList());
+		final Response response = resources.getJerseyTest()
+				.target("/infrastructure_provision/exploratory_environment/image/all")
+				.request()
+				.header("Authorization", "Bearer " + TOKEN)
+				.get();
+
+		assertEquals(HttpStatus.SC_BAD_REQUEST, response.getStatus());
+		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+		verify(imageExploratoryService, never()).getImagesForProject(anyString());
+		verifyNoMoreInteractions(imageExploratoryService);
+	}
+
+	@Test
 	public void getImageWithException() {
 		doThrow(new ResourceNotFoundException("Image with name was not found for user"))
 				.when(imageExploratoryService).getImage(anyString(), anyString());
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/ImageExploratoryServiceImplTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/ImageExploratoryServiceImplTest.java
index db3d7c0..39ff670 100644
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/ImageExploratoryServiceImplTest.java
+++ b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/ImageExploratoryServiceImplTest.java
@@ -63,6 +63,7 @@ public class ImageExploratoryServiceImplTest {
 	private final String USER = "test";
 	private final String TOKEN = "token";
 	private final String EXPLORATORY_NAME = "expName";
+	private final String PROJECT = "project";
 
 	private UserInfo userInfo;
 	private UserInstanceDTO userInstance;
@@ -120,7 +121,7 @@ public class ImageExploratoryServiceImplTest {
 
 		verify(exploratoryDAO).fetchRunningExploratoryFields(USER, EXPLORATORY_NAME);
 		verify(exploratoryDAO).updateExploratoryStatus(any(ExploratoryStatusDTO.class));
-		verify(imageExploratoryDao).exist(USER, imageName);
+		verify(imageExploratoryDao).exist(imageName, PROJECT);
 		verify(imageExploratoryDao).save(any(Image.class));
 		verify(libDAO).getLibraries(USER, EXPLORATORY_NAME);
 		verify(requestBuilder).newExploratoryImageCreate(userInfo, userInstance, imageName);
@@ -179,7 +180,7 @@ public class ImageExploratoryServiceImplTest {
 
 		verify(exploratoryDAO).fetchRunningExploratoryFields(USER, EXPLORATORY_NAME);
 		verify(exploratoryDAO).updateExploratoryStatus(any(ExploratoryStatusDTO.class));
-		verify(imageExploratoryDao).exist(USER, imageName);
+		verify(imageExploratoryDao).exist(imageName, PROJECT);
 		verify(imageExploratoryDao).save(any(Image.class));
 		verify(libDAO).getLibraries(USER, EXPLORATORY_NAME);
 		verify(requestBuilder).newExploratoryImageCreate(userInfo, userInstance, imageName);
@@ -277,6 +278,16 @@ public class ImageExploratoryServiceImplTest {
 		imageExploratoryService.getImage(USER, "someImageName");
 	}
 
+	@Test
+	public void getImagesForProject() {
+		when(imageExploratoryDao.getImagesForProject(anyString())).thenReturn(Collections.singletonList(getImageInfoRecord()));
+
+		imageExploratoryService.getImagesForProject(PROJECT);
+
+		verify(imageExploratoryDao).getImagesForProject(PROJECT);
+		verifyNoMoreInteractions(imageExploratoryDao);
+	}
+
 	private ImageInfoRecord getImageInfoRecord() {
 		return new ImageInfoRecord("someName", "someDescription", "someProject", "someEndpoint", "someApp",
 				"someFullName", ImageStatus.CREATED);
@@ -301,7 +312,7 @@ public class ImageExploratoryServiceImplTest {
 
 	private UserInstanceDTO getUserInstanceDto() {
 		return new UserInstanceDTO().withUser(USER).withExploratoryName(EXPLORATORY_NAME)
-				.withExploratoryId("explId");
+				.withExploratoryId("explId").withProject(PROJECT);
 	}
 
 	private UserInfo getUserInfo() {


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