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 2020/08/07 12:13:55 UTC

[incubator-dlab] branch develop updated (7480fc8 -> 020b912)

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

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


    from 7480fc8  [DLAB-1984]: Allowed to create EMR/Dataproc with GPU for Jupyter, fix… (#848)
     new fb8226b  [DLAB-1975] Added endpoints for retrieving library groups
     new 0b7ef1c  Merge remote-tracking branch 'origin/develop' into develop
     new 020b912  [DLAB-1975] Updated logic for auto compete per library group

The 3 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.


Summary of changes:
 ...euploadFile.java => LibListExploratoryDTO.java} |  21 +++--
 .../ResourceEnum.java => dto/LibraryGroups.java}   |  16 ++--
 .../dlab/dto/exploratory/LibListStatusDTO.java     |  12 +--
 .../response/handlers/LibListCallbackHandler.java  |  10 +-
 .../dlab/backendapi/resources/LibraryResource.java |  10 +-
 .../backendapi/domain/ExploratoryLibCache.java     |  97 +++++---------------
 .../dlab/backendapi/domain/ExploratoryLibList.java |  53 ++++++-----
 .../dlab/backendapi/domain/NotebookTemplate.java}  |  20 ++--
 .../resources/LibExploratoryResource.java          |  85 ++++++-----------
 .../resources/callback/LibraryCallback.java        |   7 +-
 ...taUsageDTO.java => LibraryAutoCompleteDTO.java} |   8 +-
 .../dlab/backendapi/service/LibraryService.java    |  14 ++-
 .../service/impl/LibraryServiceImpl.java           |  61 ++++++++++--
 .../epam/dlab/backendapi/util/RequestBuilder.java  |  22 ++---
 .../backendapi/domain/ExploratoryLibListTest.java  |  53 +++++------
 .../resources/LibExploratoryResourceTest.java      |  97 ++++++--------------
 .../service/impl/LibraryServiceImplTest.java       | 102 ++++++++++++++++-----
 17 files changed, 341 insertions(+), 347 deletions(-)
 copy services/dlab-model/src/main/java/com/epam/dlab/dto/{base/keyload/ReuploadFile.java => LibListExploratoryDTO.java} (70%)
 copy services/dlab-model/src/main/java/com/epam/dlab/{model/ResourceEnum.java => dto/LibraryGroups.java} (80%)
 copy services/{dlab-model/src/main/java/com/epam/dlab/model/ResourceEnum.java => self-service/src/main/java/com/epam/dlab/backendapi/domain/NotebookTemplate.java} (68%)
 copy services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/{QuotaUsageDTO.java => LibraryAutoCompleteDTO.java} (87%)


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


[incubator-dlab] 03/03: [DLAB-1975] Updated logic for auto compete per library group

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

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

commit 020b912690314668127f877ee4e19dd03bdfd942
Author: Oleh Fuks <ol...@gmail.com>
AuthorDate: Fri Aug 7 15:13:36 2020 +0300

    [DLAB-1975] Updated logic for auto compete per library group
---
 .../com/epam/dlab/dto/LibListExploratoryDTO.java   | 40 +++++++++++++
 .../dlab/dto/exploratory/LibListStatusDTO.java     | 12 ++--
 .../response/handlers/LibListCallbackHandler.java  | 10 ++--
 .../dlab/backendapi/resources/LibraryResource.java | 10 ++--
 .../backendapi/domain/ExploratoryLibCache.java     | 67 +++++++---------------
 .../dlab/backendapi/domain/ExploratoryLibList.java | 53 ++++++++++-------
 .../resources/LibExploratoryResource.java          | 39 ++++++-------
 .../resources/callback/LibraryCallback.java        |  7 +--
 .../resources/dto/LibraryAutoCompleteDTO.java      | 32 +++++++++++
 .../epam/dlab/backendapi/util/RequestBuilder.java  | 22 +++----
 .../backendapi/domain/ExploratoryLibListTest.java  | 53 ++++++++---------
 .../service/impl/LibraryServiceImplTest.java       |  2 +-
 12 files changed, 200 insertions(+), 147 deletions(-)

diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/LibListExploratoryDTO.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/LibListExploratoryDTO.java
new file mode 100644
index 0000000..a4487b7
--- /dev/null
+++ b/services/dlab-model/src/main/java/com/epam/dlab/dto/LibListExploratoryDTO.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.dlab.dto;
+
+import com.epam.dlab.dto.exploratory.ExploratoryActionDTO;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+@Getter
+@Setter
+@ToString(callSuper = true)
+public class LibListExploratoryDTO extends ExploratoryActionDTO<LibListExploratoryDTO> {
+
+	@JsonProperty
+	private String libCacheKey;
+
+	public LibListExploratoryDTO withLibCacheKey(String libCacheKey) {
+		setLibCacheKey(libCacheKey);
+		return this;
+	}
+}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/LibListStatusDTO.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/LibListStatusDTO.java
index 56f82af..17b5d3c 100644
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/LibListStatusDTO.java
+++ b/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/LibListStatusDTO.java
@@ -26,7 +26,7 @@ import lombok.Getter;
 import lombok.Setter;
 
 /**
- * Stores the info about image libraries.
+ * Stores the info about group libraries.
  */
 @Getter
 @Setter
@@ -36,7 +36,7 @@ public class LibListStatusDTO extends StatusBaseDTO<LibListStatusDTO> {
     private String libs;
 
     @JsonProperty
-    private String imageName;
+    private String group;
 
     /**
      * Set the list of libraries and return this object
@@ -47,17 +47,17 @@ public class LibListStatusDTO extends StatusBaseDTO<LibListStatusDTO> {
     }
 
     /**
-     * Set the name of image and return this object
+     * Set the name of group and return this object
      */
-    public LibListStatusDTO withImageName(String imageName) {
-        setImageName(imageName);
+    public LibListStatusDTO withGroup(String group) {
+        setGroup(group);
         return this;
     }
 
     @Override
     public MoreObjects.ToStringHelper toStringHelper(Object self) {
         return MoreObjects.toStringHelper(self)
-                .add("imageName", imageName)
+                .add("group", group)
                 .add("libs", (libs != null) ? "..." : null);
     }
 }
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/LibListCallbackHandler.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/LibListCallbackHandler.java
index ca0268c..b1b302c 100644
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/LibListCallbackHandler.java
+++ b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/LibListCallbackHandler.java
@@ -49,7 +49,7 @@ public class LibListCallbackHandler extends ResourceCallbackHandler<LibListStatu
 	 * The name of docker image.
 	 */
 	@JsonProperty
-	private final String imageName;
+	private final String group;
 
 	/**
 	 * Instantiate handler for process of docker response for list of libraries.
@@ -58,15 +58,15 @@ public class LibListCallbackHandler extends ResourceCallbackHandler<LibListStatu
 	 * @param action      docker action.
 	 * @param uuid        request UID.
 	 * @param user        the name of user.
-	 * @param imageName   the name of docker image.
+	 * @param group       the name of a group.
 	 */
 	@JsonCreator
 	public LibListCallbackHandler(
 			@JacksonInject RESTService selfService, @JsonProperty("action") DockerAction action,
 			@JsonProperty("uuid") String uuid, @JsonProperty("user") String user,
-			@JsonProperty("imageName") String imageName) {
+			@JsonProperty("group") String group) {
 		super(selfService, user, uuid, action);
-		this.imageName = imageName;
+		this.group = group;
 	}
 
 	@Override
@@ -105,6 +105,6 @@ public class LibListCallbackHandler extends ResourceCallbackHandler<LibListStatu
 	@Override
 	protected LibListStatusDTO getBaseStatusDTO(UserInstanceStatus status) {
 		return super.getBaseStatusDTO(status)
-				.withImageName(imageName);
+				.withGroup(group);
 	}
 }
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/LibraryResource.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/LibraryResource.java
index a6ae018..dafa72e 100644
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/LibraryResource.java
+++ b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/LibraryResource.java
@@ -30,6 +30,7 @@ import com.epam.dlab.backendapi.core.response.handlers.LibListCallbackHandler;
 import com.epam.dlab.backendapi.service.impl.DockerService;
 import com.epam.dlab.cloud.CloudProvider;
 import com.epam.dlab.dto.LibListComputationalDTO;
+import com.epam.dlab.dto.LibListExploratoryDTO;
 import com.epam.dlab.dto.base.DataEngineType;
 import com.epam.dlab.dto.exploratory.ExploratoryActionDTO;
 import com.epam.dlab.dto.exploratory.ExploratoryBaseDTO;
@@ -56,7 +57,7 @@ public class LibraryResource extends DockerService implements DockerCommands {
 
 	@POST
 	@Path(ExploratoryAPI.EXPLORATORY + "/lib_list")
-	public String getLibList(@Auth UserInfo ui, ExploratoryActionDTO<?> dto) throws JsonProcessingException {
+	public String getLibList(@Auth UserInfo ui, LibListExploratoryDTO dto) throws JsonProcessingException {
 		return actionExploratory(ui.getName(), dto, DockerAction.LIB_LIST);
 	}
 
@@ -160,13 +161,14 @@ public class LibraryResource extends DockerService implements DockerCommands {
 	private FileHandlerCallback getFileHandlerCallbackExploratory(DockerAction action, String uuid,
 																  ExploratoryBaseDTO<?> dto) {
 		switch (action) {
+			case LIB_LIST:
+				final String group = ((LibListExploratoryDTO) dto).getLibCacheKey();
+				return new LibListCallbackHandler(selfService, DockerAction.LIB_LIST, uuid,
+						dto.getCloudSettings().getIamUser(), group);
 			case LIB_INSTALL:
 				return new LibInstallCallbackHandler(selfService, action, uuid,
 						dto.getCloudSettings().getIamUser(),
 						(LibraryInstallDTO) dto);
-			case LIB_LIST:
-				return new LibListCallbackHandler(selfService, DockerAction.LIB_LIST, uuid,
-						dto.getCloudSettings().getIamUser(), dto.getNotebookImage());
 			default:
 				throw new IllegalArgumentException("Unknown action " + action);
 		}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/ExploratoryLibCache.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/ExploratoryLibCache.java
index 380a436..3c768ad 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/ExploratoryLibCache.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/ExploratoryLibCache.java
@@ -21,15 +21,14 @@
 package com.epam.dlab.backendapi.domain;
 
 import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.resources.dto.LibraryDTO;
+import com.epam.dlab.backendapi.resources.dto.LibraryAutoCompleteDTO;
 import com.epam.dlab.backendapi.service.EndpointService;
 import com.epam.dlab.backendapi.util.RequestBuilder;
 import com.epam.dlab.constants.ServiceConsts;
 import com.epam.dlab.dto.LibListComputationalDTO;
+import com.epam.dlab.dto.LibListExploratoryDTO;
 import com.epam.dlab.dto.UserInstanceDTO;
-import com.epam.dlab.dto.base.DataEngineType;
 import com.epam.dlab.dto.computational.UserComputationalResource;
-import com.epam.dlab.dto.exploratory.ExploratoryActionDTO;
 import com.epam.dlab.rest.client.RESTService;
 import com.epam.dlab.rest.contracts.ComputationalAPI;
 import com.epam.dlab.rest.contracts.ExploratoryAPI;
@@ -41,7 +40,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 
 /**
@@ -54,10 +52,8 @@ public class ExploratoryLibCache implements Managed, Runnable {
 	@Inject
 	@Named(ServiceConsts.PROVISIONING_SERVICE_NAME)
 	private RESTService provisioningService;
-
 	@Inject
 	private RequestBuilder requestBuilder;
-
 	@Inject
 	private RequestId requestId;
 	@Inject
@@ -117,14 +113,13 @@ public class ExploratoryLibCache implements Managed, Runnable {
 	/**
 	 * Return the list of libraries for docker image and group start with prefix from cache.
 	 *
-	 * @param userInfo     the user info.
-	 * @param userInstance the notebook info.
-	 * @param group        the name of group.
-	 * @param startWith    the prefix for library name.
+	 * @param userInfo  the user info.
+	 * @param group     the name of group.
+	 * @param startWith the prefix for library name.
+	 * @return LibraryAutoCompleteDTO dto
 	 */
-	public List<LibraryDTO> getLibList(UserInfo userInfo, UserInstanceDTO userInstance, String group,
-									   String startWith) {
-		ExploratoryLibList libs = getLibs(userInfo, userInstance);
+	public LibraryAutoCompleteDTO getLibList(UserInfo userInfo, UserInstanceDTO userInstance, String group, String startWith) {
+		ExploratoryLibList libs = getLibs(userInfo, userInstance, group);
 		return libs.getLibs(group, startWith);
 	}
 
@@ -132,54 +127,33 @@ public class ExploratoryLibCache implements Managed, Runnable {
 	 * Return the list of libraries for docker image from cache.
 	 *
 	 * @param userInfo     the user info.
-	 * @param userInstance the notebook info.
+	 * @param userInstance userInstance
+	 * @param cacheKey     the group of library
 	 */
-	private ExploratoryLibList getLibs(UserInfo userInfo, UserInstanceDTO userInstance) {
+	private ExploratoryLibList getLibs(UserInfo userInfo, UserInstanceDTO userInstance, String cacheKey) {
 		ExploratoryLibList libs;
-		String cacheKey = libraryCacheKey(userInstance);
 		synchronized (cache) {
 			cache.computeIfAbsent(cacheKey, libraries -> new ExploratoryLibList(cacheKey, null));
 			libs = cache.get(cacheKey);
 			if (libs.isUpdateNeeded() && !libs.isUpdating()) {
 				libs.setUpdating();
-				requestLibList(userInfo, userInstance);
+				requestLibList(userInfo, userInstance, cacheKey);
 			}
 		}
 
 		return libs;
 	}
 
-	public static String libraryCacheKey(UserInstanceDTO instanceDTO) {
-		if (instanceDTO.getResources() != null && !instanceDTO.getResources().isEmpty()) {
-			if (instanceDTO.getResources().size() > 1) {
-				throw new IllegalStateException("Several clusters in userInstance");
-			}
-
-			UserComputationalResource userComputationalResource = instanceDTO.getResources().get(0);
-			return (DataEngineType.fromDockerImageName(userComputationalResource.getImageName()) == DataEngineType.SPARK_STANDALONE)
-					? instanceDTO.getImageName()
-					: libraryCacheKey(instanceDTO.getImageName(), userComputationalResource.getImageName());
-
-		} else {
-			return instanceDTO.getImageName();
-		}
-	}
-
-	private static String libraryCacheKey(String exploratoryImage, String computationalImage) {
-		return exploratoryImage + "/" + computationalImage;
-	}
-
-
 	/**
 	 * Update the list of libraries for docker image in cache.
 	 *
-	 * @param imageName the name of image.
-	 * @param content   the content of libraries list.
+	 * @param group   the name of image.
+	 * @param content the content of libraries list.
 	 */
-	public void updateLibList(String imageName, String content) {
+	public void updateLibList(String group, String content) {
 		synchronized (cache) {
-			cache.remove(imageName);
-			cache.put(imageName, new ExploratoryLibList(imageName, content));
+			cache.remove(group);
+			cache.put(group, new ExploratoryLibList(group, content));
 		}
 	}
 
@@ -199,8 +173,9 @@ public class ExploratoryLibCache implements Managed, Runnable {
 	 *
 	 * @param userInfo     the user info.
 	 * @param userInstance the notebook info.
+	 * @param group        the library group
 	 */
-	private void requestLibList(UserInfo userInfo, UserInstanceDTO userInstance) {
+	private void requestLibList(UserInfo userInfo, UserInstanceDTO userInstance, String group) {
 		try {
 
 			LOGGER.debug("Ask docker for the list of libraries for user {} and exploratory {} computational {}",
@@ -212,14 +187,14 @@ public class ExploratoryLibCache implements Managed, Runnable {
 				UserComputationalResource userComputationalResource = userInstance.getResources().get(0);
 				EndpointDTO endpointDTO = endpointService.get(userInstance.getEndpoint());
 				LibListComputationalDTO dto = requestBuilder.newLibComputationalList(userInfo, userInstance,
-						userComputationalResource, endpointDTO);
+						userComputationalResource, endpointDTO, group);
 
 				uuid = provisioningService.post(endpointDTO.getUrl() + ComputationalAPI.COMPUTATIONAL_LIB_LIST,
 						userInfo.getAccessToken(),
 						dto, String.class);
 			} else {
 				EndpointDTO endpointDTO = endpointService.get(userInstance.getEndpoint());
-				ExploratoryActionDTO<?> dto = requestBuilder.newLibExploratoryList(userInfo, userInstance, endpointDTO);
+				LibListExploratoryDTO dto = requestBuilder.newLibExploratoryList(userInfo, userInstance, endpointDTO, group);
 				uuid = provisioningService.post(endpointDTO.getUrl() + ExploratoryAPI.EXPLORATORY_LIB_LIST,
 						userInfo.getAccessToken(), dto,
 						String.class);
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/ExploratoryLibList.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/ExploratoryLibList.java
index 3c79963..19b5176 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/ExploratoryLibList.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/ExploratoryLibList.java
@@ -20,6 +20,7 @@
 
 package com.epam.dlab.backendapi.domain;
 
+import com.epam.dlab.backendapi.resources.dto.LibraryAutoCompleteDTO;
 import com.epam.dlab.backendapi.resources.dto.LibraryDTO;
 import com.epam.dlab.exceptions.DlabException;
 import com.fasterxml.jackson.databind.ObjectMapper;
@@ -28,7 +29,12 @@ import io.dropwizard.util.Duration;
 import lombok.extern.slf4j.Slf4j;
 
 import java.io.IOException;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
 import java.util.stream.Collectors;
 
 /**
@@ -53,9 +59,9 @@ public class ExploratoryLibList {
 	protected static final long UPDATE_REQUEST_TIMEOUT_MILLIS = Duration.minutes(15).toMilliseconds();
 
 	/**
-	 * Image name.
+	 * Group name.
 	 */
-	private String imageName;
+	private String group;
 
 	/**
 	 * List of libraries group:libraries:version.
@@ -86,11 +92,11 @@ public class ExploratoryLibList {
 	/**
 	 * Instantiate the list of libraries.
 	 *
-	 * @param imageName the name of docker's image.
-	 * @param content   JSON string.
+	 * @param group   the name of docker's image.
+	 * @param content JSON string.
 	 */
-	ExploratoryLibList(String imageName, String content) {
-		this.imageName = imageName;
+	ExploratoryLibList(String group, String content) {
+		this.group = group;
 		if (content != null) {
 			setLibs(content);
 		}
@@ -108,8 +114,8 @@ public class ExploratoryLibList {
 	/**
 	 * Return the name of docker image;
 	 */
-	public String getImageName() {
-		return imageName;
+	public String getGroup() {
+		return group;
 	}
 
 	/**
@@ -130,14 +136,13 @@ public class ExploratoryLibList {
 		ObjectMapper mapper = new ObjectMapper();
 		try {
 			synchronized (this) {
-				libs.clear();
 				@SuppressWarnings("unchecked")
 				Map<String, Map<String, String>> map = mapper.readValue(content, Map.class);
 				for (Map.Entry<String, Map<String, String>> entry : map.entrySet()) {
 					Map<String, String> group = entry.getValue();
 					String groupName = entry.getKey();
-					log.debug("Update {} image with lib group {} with {} libraries", imageName, groupName,
-							(group != null) ? group.size() : null);
+					libs.remove(groupName);
+					log.info("Update {} group with lib group {} with {} libraries", this.group, groupName, (group != null) ? group.size() : null);
 					libs.put(groupName, new TreeMap<>(group));
 				}
 				expiredTimeMillis = System.currentTimeMillis() + EXPIRED_TIMEOUT_MILLIS;
@@ -154,21 +159,27 @@ public class ExploratoryLibList {
 	 *
 	 * @param group     the name of group.
 	 * @param startWith the prefix for library name.
+	 * @return LibraryAutoCompleteDTO dto
 	 */
-	public List<LibraryDTO> getLibs(String group, String startWith) {
-
-		String startsWithLower = startWith.toLowerCase();
-
+	public LibraryAutoCompleteDTO getLibs(String group, String startWith) {
+		final String startsWithLower = startWith.toLowerCase();
 		Map<String, String> libMap = getLibs(group);
-
 		if (libMap == null) {
-			return Collections.emptyList();
+			return LibraryAutoCompleteDTO.builder()
+					.autoComplete(Boolean.FALSE)
+					.libraries(Collections.emptyList())
+					.build();
 		}
-
-		return libMap.entrySet().stream()
+		List<LibraryDTO> libraries = libMap.entrySet()
+				.stream()
 				.filter(e -> e.getKey().toLowerCase().startsWith(startsWithLower))
 				.map(e -> new LibraryDTO(e.getKey(), e.getValue()))
 				.collect(Collectors.toList());
+
+		return LibraryAutoCompleteDTO.builder()
+				.autoComplete(Boolean.TRUE)
+				.libraries(libraries)
+				.build();
 	}
 
 	/**
@@ -217,7 +228,7 @@ public class ExploratoryLibList {
 	@Override
 	public String toString() {
 		return MoreObjects.toStringHelper(this)
-				.add("imageName", imageName)
+				.add("group", group)
 				.add("expiredTimeMillis", expiredTimeMillis)
 				.add("accessTimeMillis", accessTimeMillis)
 				.add("updateStartTimeMillis", updateStartTimeMillis)
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/LibExploratoryResource.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/LibExploratoryResource.java
index c6af719..7adf447 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/LibExploratoryResource.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/LibExploratoryResource.java
@@ -24,7 +24,7 @@ import com.epam.dlab.backendapi.dao.ExploratoryDAO;
 import com.epam.dlab.backendapi.domain.ExploratoryLibCache;
 import com.epam.dlab.backendapi.resources.dto.LibInfoRecord;
 import com.epam.dlab.backendapi.resources.dto.LibInstallFormDTO;
-import com.epam.dlab.backendapi.resources.dto.LibraryDTO;
+import com.epam.dlab.backendapi.resources.dto.LibraryAutoCompleteDTO;
 import com.epam.dlab.backendapi.resources.dto.SearchLibsFormDTO;
 import com.epam.dlab.backendapi.service.ExternalLibraryService;
 import com.epam.dlab.backendapi.service.LibraryService;
@@ -169,40 +169,33 @@ public class LibExploratoryResource {
 	}
 
 	/**
-	 * Returns the list of available libraries for exploratory basing on search conditions provided in @formDTO.
+	 * Returns the list of available libraries for exploratory basing on search conditions provided in @searchDTO.
 	 *
-	 * @param userInfo user info.
-	 * @param formDTO  search condition for find libraries for the exploratory environment.
+	 * @param userInfo  user info.
+	 * @param searchDTO search condition for find libraries for the exploratory environment.
 	 * @return found libraries
 	 */
 	@POST
 	@Path("search/lib_list")
-	public List<LibraryDTO> getLibList(@Auth UserInfo userInfo,
-									   @Valid @NotNull SearchLibsFormDTO formDTO) {
-		log.trace("Search list of libs for user {} with condition {}", userInfo.getName(), formDTO);
+	public Response getLibList(@Auth UserInfo userInfo,
+	                           @Valid @NotNull SearchLibsFormDTO searchDTO) {
 		try {
-
 			UserInstanceDTO userInstance;
-
-			if (StringUtils.isNotEmpty(formDTO.getComputationalName())) {
-
-				userInstance = exploratoryDAO.fetchExploratoryFields(userInfo.getName(), formDTO.getProjectName(),
-						formDTO.getNotebookName(), formDTO.getComputationalName());
-
+			if (StringUtils.isNotEmpty(searchDTO.getComputationalName())) {
+				userInstance = exploratoryDAO.fetchExploratoryFields(userInfo.getName(), searchDTO.getProjectName(),
+						searchDTO.getNotebookName(), searchDTO.getComputationalName());
 				userInstance.setResources(userInstance.getResources().stream()
-						.filter(e -> e.getComputationalName().equals(formDTO.getComputationalName()))
+						.filter(e -> e.getComputationalName().equals(searchDTO.getComputationalName()))
 						.collect(Collectors.toList()));
-
 			} else {
-				userInstance = exploratoryDAO.fetchExploratoryFields(userInfo.getName(), formDTO.getProjectName(),
-						formDTO.getNotebookName());
+				userInstance = exploratoryDAO.fetchExploratoryFields(userInfo.getName(), searchDTO.getProjectName(), searchDTO.getNotebookName());
 			}
 
-			return ExploratoryLibCache.getCache().getLibList(userInfo, userInstance, formDTO.getGroup(), formDTO.getStartWith());
-		} catch (Exception t) {
-			log.error("Cannot search libs for user {} with condition {}",
-					userInfo.getName(), formDTO, t);
-			throw new DlabException("Cannot search libraries: " + t.getLocalizedMessage(), t);
+			LibraryAutoCompleteDTO autoCompleteDTO = ExploratoryLibCache.getCache().getLibList(userInfo, userInstance, searchDTO.getGroup(), searchDTO.getStartWith());
+			return Response.ok(autoCompleteDTO).build();
+		} catch (Exception e) {
+			log.error("Cannot search libs for user {} with condition {}", userInfo.getName(), searchDTO, e);
+			throw new DlabException("Cannot search libraries: " + e.getLocalizedMessage(), e);
 		}
 	}
 
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/callback/LibraryCallback.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/callback/LibraryCallback.java
index 6eaedf9..53684e6 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/callback/LibraryCallback.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/callback/LibraryCallback.java
@@ -81,19 +81,18 @@ public class LibraryCallback {
 	@POST
 	@Path("/update_lib_list")
 	public Response updateLibList(LibListStatusDTO dto) {
-		log.debug("Updating the list of libraries for image {}", dto.getImageName());
+		log.debug("Updating the list of libraries for image {}", dto.getGroup());
 		requestId.checkAndRemove(dto.getRequestId());
 		try {
 			if (UserInstanceStatus.FAILED == UserInstanceStatus.of(dto.getStatus())) {
 				log.warn("Request for the list of libraries fails: {}", dto.getErrorMessage());
-				ExploratoryLibCache.getCache().removeLibList(dto.getImageName());
+				ExploratoryLibCache.getCache().removeLibList(dto.getGroup());
 			} else {
-				ExploratoryLibCache.getCache().updateLibList(dto.getImageName(), dto.getLibs());
+				ExploratoryLibCache.getCache().updateLibList(dto.getGroup(), dto.getLibs());
 			}
 		} catch (Exception e) {
 			log.warn("Cannot update the list of libs: {}", e.getLocalizedMessage(), e);
 		}
-		// Always necessary send OK for status request
 		return Response.ok().build();
 	}
 }
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/LibraryAutoCompleteDTO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/LibraryAutoCompleteDTO.java
new file mode 100644
index 0000000..6c1d7b7
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/LibraryAutoCompleteDTO.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.dlab.backendapi.resources.dto;
+
+import lombok.Builder;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@Builder
+public class LibraryAutoCompleteDTO {
+	private boolean autoComplete;
+	private List<LibraryDTO> libraries;
+}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/util/RequestBuilder.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/util/RequestBuilder.java
index 228f868..ebc5fb9 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/util/RequestBuilder.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/util/RequestBuilder.java
@@ -23,7 +23,6 @@ import com.epam.dlab.auth.UserInfo;
 import com.epam.dlab.backendapi.conf.SelfServiceApplicationConfiguration;
 import com.epam.dlab.backendapi.dao.SettingsDAO;
 import com.epam.dlab.backendapi.domain.EndpointDTO;
-import com.epam.dlab.backendapi.domain.ExploratoryLibCache;
 import com.epam.dlab.backendapi.domain.ProjectDTO;
 import com.epam.dlab.backendapi.resources.dto.BackupFormDTO;
 import com.epam.dlab.backendapi.resources.dto.ComputationalCreateFormDTO;
@@ -32,6 +31,7 @@ import com.epam.dlab.backendapi.resources.dto.aws.AwsComputationalCreateForm;
 import com.epam.dlab.backendapi.resources.dto.gcp.GcpComputationalCreateForm;
 import com.epam.dlab.cloud.CloudProvider;
 import com.epam.dlab.dto.LibListComputationalDTO;
+import com.epam.dlab.dto.LibListExploratoryDTO;
 import com.epam.dlab.dto.ResourceBaseDTO;
 import com.epam.dlab.dto.ResourceSysBaseDTO;
 import com.epam.dlab.dto.UserInstanceDTO;
@@ -292,17 +292,17 @@ public class RequestBuilder {
 	}
 
 	@SuppressWarnings("unchecked")
-	public <T extends ExploratoryActionDTO<T>> T newLibExploratoryList(UserInfo userInfo,
-																	   UserInstanceDTO userInstance,
-																	   EndpointDTO endpointDTO) {
+	public <T extends LibListExploratoryDTO> T newLibExploratoryList(UserInfo userInfo, UserInstanceDTO userInstance,
+	                                                                 EndpointDTO endpointDTO, String group) {
 		checkInappropriateCloudProviderOrElseThrowException(endpointDTO.getCloudProvider());
-		return (T) newResourceSysBaseDTO(userInfo.getName(), endpointDTO.getCloudProvider(), ExploratoryActionDTO.class)
+		return (T) newResourceSysBaseDTO(userInfo.getName(), endpointDTO.getCloudProvider(), LibListExploratoryDTO.class)
 				.withNotebookInstanceName(userInstance.getExploratoryId())
 				.withProject(userInstance.getProject())
 				.withEndpoint(endpointDTO.getName())
 				.withNotebookImage(userInstance.getImageName())
 				.withApplicationName(getApplicationNameFromImage(userInstance.getImageName()))
-				.withExploratoryName(userInstance.getExploratoryName());
+				.withExploratoryName(userInstance.getExploratoryName())
+				.withLibCacheKey(group);
 	}
 
 	@SuppressWarnings("unchecked")
@@ -323,10 +323,10 @@ public class RequestBuilder {
 
 	@SuppressWarnings("unchecked")
 	public <T extends LibListComputationalDTO> T newLibComputationalList(UserInfo userInfo,
-																		 UserInstanceDTO userInstance,
-																		 UserComputationalResource
-																				 computationalResource,
-																		 EndpointDTO endpointDTO) {
+	                                                                     UserInstanceDTO userInstance,
+	                                                                     UserComputationalResource
+			                                                                     computationalResource,
+	                                                                     EndpointDTO endpointDTO, String group) {
 
 		checkInappropriateCloudProviderOrElseThrowException(endpointDTO.getCloudProvider());
 		return (T) newResourceSysBaseDTO(userInfo.getName(), endpointDTO.getCloudProvider(), LibListComputationalDTO.class)
@@ -334,7 +334,7 @@ public class RequestBuilder {
 				.withProject(userInstance.getProject())
 				.withEndpoint(endpointDTO.getName())
 				.withComputationalImage(computationalResource.getImageName())
-				.withLibCacheKey(ExploratoryLibCache.libraryCacheKey(userInstance))
+				.withLibCacheKey(group)
 				.withApplicationName(getApplicationNameFromImage(userInstance.getImageName()));
 	}
 
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/domain/ExploratoryLibListTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/domain/ExploratoryLibListTest.java
index 69d2f50..ee54306 100644
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/domain/ExploratoryLibListTest.java
+++ b/services/self-service/src/test/java/com/epam/dlab/backendapi/domain/ExploratoryLibListTest.java
@@ -18,49 +18,50 @@
  */
 package com.epam.dlab.backendapi.domain;
 
-import static junit.framework.TestCase.assertEquals;
+import com.epam.dlab.backendapi.resources.dto.LibraryAutoCompleteDTO;
+import org.junit.Test;
 
 import java.util.List;
 import java.util.Map;
 
-import com.epam.dlab.backendapi.resources.dto.LibraryDTO;
-import org.junit.Test;
+import static junit.framework.TestCase.assertEquals;
+import static junit.framework.TestCase.assertFalse;
+import static junit.framework.TestCase.assertTrue;
 
 public class ExploratoryLibListTest {
 
 	@Test
     public void getLibs() {
 		String content =
-			"{" +
-			"\"os_pkg\": {\"htop\": \"2.0.1-1ubuntu1\", \"python-mysqldb\": \"1.3.7-1build2\"}," +
-			"\"pip2\": {\"requests\": \"N/A\", \"configparser\": \"N/A\"}," +
-			"\"pip3\": {\"configparser\": \"N/A\"}," +
-			"\"r_pkg\": {\"rmarkdown\": \"1.5\"}" +
-			"}";
-		
+				"{" +
+						"\"os_pkg\": {\"htop\": \"2.0.1-1ubuntu1\", \"python-mysqldb\": \"1.3.7-1build2\"}," +
+						"\"pip2\": {\"requests\": \"N/A\", \"configparser\": \"N/A\"}," +
+						"\"pip3\": {\"configparser\": \"N/A\"}," +
+						"\"r_pkg\": {\"rmarkdown\": \"1.5\"}" +
+						"}";
+
 		ExploratoryLibList libs = new ExploratoryLibList("imageName", content);
-		
-		assertEquals("imageName", libs.getImageName());
-		assertEquals(false, libs.isExpired());
-		assertEquals(false, libs.isUpdateNeeded());
-		
-		assertEquals(false, libs.isUpdating());
+
+		assertEquals("imageName", libs.getGroup());
+		assertFalse(libs.isExpired());
+		assertFalse(libs.isUpdateNeeded());
+		assertFalse(libs.isUpdating());
 
 		List<String> groups = libs.getGroupList();
 		assertEquals(4, groups.size());
-    	assertEquals("os_pkg", groups.get(0));
-    	assertEquals("r_pkg", groups.get(3));
-    	
+		assertEquals("os_pkg", groups.get(0));
+		assertEquals("r_pkg", groups.get(3));
+
 		Map<String, String> map = libs.getLibs("os_pkg");
 		assertEquals(2, map.size());
-    	assertEquals("2.0.1-1ubuntu1", map.get("htop"));
-    	assertEquals("1.3.7-1build2", map.get("python-mysqldb"));
+		assertEquals("2.0.1-1ubuntu1", map.get("htop"));
+		assertEquals("1.3.7-1build2", map.get("python-mysqldb"));
 
-		final List<LibraryDTO> dtoList = libs.getLibs("os_pkg", "py");
-		assertEquals(1, dtoList.size());
-    	assertEquals("1.3.7-1build2", dtoList.get(0).getVersion());
+		final LibraryAutoCompleteDTO dtoList = libs.getLibs("os_pkg", "py");
+		assertEquals(1, dtoList.getLibraries().size());
+		assertEquals("1.3.7-1build2", dtoList.getLibraries().get(0).getVersion());
 
-    	libs.setUpdating();
-		assertEquals(true, libs.isUpdating());
+		libs.setUpdating();
+		assertTrue(libs.isUpdating());
 	}
 }
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/LibraryServiceImplTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/LibraryServiceImplTest.java
index 68b2f41..9c3a4cb 100644
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/LibraryServiceImplTest.java
+++ b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/LibraryServiceImplTest.java
@@ -366,7 +366,7 @@ public class LibraryServiceImplTest {
 
 	@Test
 	public void getExploratoryJupyterLibGroups() {
-		List<Object> exploratoryGroups = Arrays.asList(GROUP_JAVA, GROUP_OS_PKG, GROUP_PIP2, GROUP_PIP3, GROUP_OTHERS);
+		List<Object> exploratoryGroups = Arrays.asList(GROUP_JAVA, GROUP_OS_PKG, GROUP_PIP2, GROUP_PIP3, GROUP_OTHERS, GROUP_R_PKG);
 		when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString())).thenReturn(getJupyterUserInstanceDtoForLibGroups());
 
 		List<String> exploratoryGroupsResult = libraryService.getExploratoryLibGroups(getUser(), PROJECT, EXPLORATORY_NAME);


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


[incubator-dlab] 02/03: Merge remote-tracking branch 'origin/develop' into develop

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

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

commit 0b7ef1cf361b086f71751ee02576d7995304f0ca
Merge: fb8226b 7480fc8
Author: Oleh Fuks <ol...@gmail.com>
AuthorDate: Fri Aug 7 15:12:43 2020 +0300

    Merge remote-tracking branch 'origin/develop' into develop

 infrastructure-provisioning/scripts/deploy_dlab.py |  7 ++
 .../src/general/conf/dlab.ini                      |  6 ++
 .../src/general/lib/os/debian/common_lib.py        | 51 ++++++++++++++
 .../src/general/lib/os/debian/edge_lib.py          | 11 +++
 .../src/general/lib/os/debian/ssn_lib.py           |  1 -
 .../src/general/lib/os/redhat/common_lib.py        | 26 ++++++++
 .../src/general/lib/os/redhat/edge_lib.py          |  2 +
 .../src/general/lib/os/redhat/ssn_lib.py           |  2 +
 .../src/general/scripts/aws/ssn_configure.py       | 71 ++++++++++++++++++++
 .../src/general/scripts/azure/ssn_configure.py     | 71 ++++++++++++++++++++
 .../src/general/scripts/gcp/ssn_configure.py       | 78 ++++++++++++++++++++++
 .../src/ssn/scripts/configure_ssn_node.py          | 10 ++-
 .../src/app/core/pipes/keys-pipe/keys.pipe.ts      |  2 +-
 .../underscoreless-pipe/underscoreless.pipe.ts     |  2 +-
 .../bucket-browser/bucket-browser.component.ts     | 41 +++++++++---
 .../buckets-tree/bucket-tree.component.scss        |  2 +-
 .../folder-tree/folder-tree.component.ts           |  2 +-
 ...utational-resource-create-dialog.component.html |  2 +-
 ...mputational-resource-create-dialog.component.ts | 38 ++++++-----
 .../ami-create-dialog.component.ts                 |  2 +-
 .../create-environment.component.scss              |  2 +-
 .../detail-dialog/detail-dialog.component.html     | 40 ++++++-----
 .../install-libraries.component.ts                 | 35 +++-------
 .../resources-grid/resources-grid.component.html   | 12 ++--
 .../resources-grid/resources-grid.component.ts     | 43 +++++-------
 .../src/app/resources/resources.component.ts       |  1 -
 .../confirmation-dialog.component.ts               |  8 ++-
 .../webapp/src/assets/styles/_dialogs.scss         |  3 +-
 28 files changed, 454 insertions(+), 117 deletions(-)


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


[incubator-dlab] 01/03: [DLAB-1975] Added endpoints for retrieving library groups

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

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

commit fb8226b03109678776dcb776c5d44931fc04e0d2
Author: Oleh Fuks <ol...@gmail.com>
AuthorDate: Thu Aug 6 16:35:17 2020 +0300

    [DLAB-1975] Added endpoints for retrieving library groups
---
 .../java/com/epam/dlab/dto/LibraryGroups.java}     |  30 +++---
 .../backendapi/domain/ExploratoryLibCache.java     |  32 +------
 .../NotebookTemplate.java}                         |  30 +++---
 .../resources/LibExploratoryResource.java          |  48 +++-------
 .../dlab/backendapi/service/LibraryService.java    |  14 ++-
 .../service/impl/LibraryServiceImpl.java           |  61 ++++++++++--
 .../resources/LibExploratoryResourceTest.java      |  97 ++++++--------------
 .../service/impl/LibraryServiceImplTest.java       | 102 ++++++++++++++++-----
 8 files changed, 210 insertions(+), 204 deletions(-)

diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/LibraryService.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/LibraryGroups.java
similarity index 50%
copy from services/self-service/src/main/java/com/epam/dlab/backendapi/service/LibraryService.java
copy to services/dlab-model/src/main/java/com/epam/dlab/dto/LibraryGroups.java
index adf53e3..f6c5d93 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/LibraryService.java
+++ b/services/dlab-model/src/main/java/com/epam/dlab/dto/LibraryGroups.java
@@ -17,22 +17,24 @@
  * under the License.
  */
 
-package com.epam.dlab.backendapi.service;
+package com.epam.dlab.dto;
 
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.resources.dto.LibInfoRecord;
-import com.epam.dlab.dto.exploratory.LibInstallDTO;
-import org.bson.Document;
+public enum LibraryGroups {
+	GROUP_JAVA("java"),
+	GROUP_PIP2("pip2"),
+	GROUP_PIP3("pip3"),
+	GROUP_R_PKG("r_pkg"),
+	GROUP_OS_PKG("os_pkg"),
+	GROUP_OTHERS("others");
 
-import java.util.List;
+	private String name;
 
-public interface LibraryService {
-    List<Document> getLibs(String user, String project, String exploratoryName, String computationalName);
+	LibraryGroups(String name) {
+		this.name = name;
+	}
 
-    List<LibInfoRecord> getLibInfo(String user, String project, String exploratoryName);
-
-    String installComputationalLibs(UserInfo userInfo, String project, String exploratoryName, String computationalName,
-                                    List<LibInstallDTO> libs, String auditInfo);
-
-    String installExploratoryLibs(UserInfo userInfo, String project, String exploratoryName, List<LibInstallDTO> libs, String auditInfo);
+	@Override
+	public String toString() {
+		return name;
+	}
 }
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/ExploratoryLibCache.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/ExploratoryLibCache.java
index 41debbb..380a436 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/ExploratoryLibCache.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/ExploratoryLibCache.java
@@ -43,7 +43,6 @@ import org.slf4j.LoggerFactory;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.stream.Collectors;
 
 /**
  * Cache of libraries for exploratory.
@@ -51,7 +50,6 @@ import java.util.stream.Collectors;
 @Singleton
 public class ExploratoryLibCache implements Managed, Runnable {
 	private static final Logger LOGGER = LoggerFactory.getLogger(ExploratoryLibCache.class);
-	private static final String PIP2_GROUP = "pip2";
 
 	@Inject
 	@Named(ServiceConsts.PROVISIONING_SERVICE_NAME)
@@ -117,33 +115,6 @@ public class ExploratoryLibCache implements Managed, Runnable {
 	}
 
 	/**
-	 * Return the list of libraries groups from cache for compute resource.
-	 *
-	 * @param userInfo     the user info.
-	 * @param userInstance the notebook info.
-	 * @return list of libraries groups
-	 */
-	public List<String> getComputeLibGroupList(UserInfo userInfo, UserInstanceDTO userInstance) {
-		ExploratoryLibList libs = getLibs(userInfo, userInstance);
-		return libs.getGroupList()
-				.stream()
-				.filter(g -> !PIP2_GROUP.equals(g))
-				.collect(Collectors.toList());
-	}
-
-	/**
-	 * Return the list of libraries groups from cache for exploratory resource.
-	 *
-	 * @param userInfo     the user info.
-	 * @param userInstance the notebook info.
-	 * @return list of libraries groups
-	 */
-	public List<String> getExploratoryLibGroupList(UserInfo userInfo, UserInstanceDTO userInstance) {
-		ExploratoryLibList libs = getLibs(userInfo, userInstance);
-		return libs.getGroupList();
-	}
-
-	/**
 	 * Return the list of libraries for docker image and group start with prefix from cache.
 	 *
 	 * @param userInfo     the user info.
@@ -208,8 +179,7 @@ public class ExploratoryLibCache implements Managed, Runnable {
 	public void updateLibList(String imageName, String content) {
 		synchronized (cache) {
 			cache.remove(imageName);
-			cache.put(imageName,
-					new ExploratoryLibList(imageName, content));
+			cache.put(imageName, new ExploratoryLibList(imageName, content));
 		}
 	}
 
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/LibraryService.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/NotebookTemplate.java
similarity index 50%
copy from services/self-service/src/main/java/com/epam/dlab/backendapi/service/LibraryService.java
copy to services/self-service/src/main/java/com/epam/dlab/backendapi/domain/NotebookTemplate.java
index adf53e3..d13d430 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/LibraryService.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/NotebookTemplate.java
@@ -17,22 +17,24 @@
  * under the License.
  */
 
-package com.epam.dlab.backendapi.service;
+package com.epam.dlab.backendapi.domain;
 
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.resources.dto.LibInfoRecord;
-import com.epam.dlab.dto.exploratory.LibInstallDTO;
-import org.bson.Document;
+public enum NotebookTemplate {
+	JUPYTER("Jupyter notebook 6.0.2"),
+	JUPYTER_LAB("JupyterLab 0.35.6"),
+	ZEPPELIN("Apache Zeppelin 0.8.2"),
+	DEEP_LEARNING("Deep Learning  2.3"),
+	TENSOR("Jupyter with TensorFlow 1.8.0"),
+	TENSOR_RSTUDIO("RStudio with TensorFlow 1.8.0"),
+	RSTUDIO("RStudio 1.2.5033");
 
-import java.util.List;
+	private String name;
 
-public interface LibraryService {
-    List<Document> getLibs(String user, String project, String exploratoryName, String computationalName);
+	NotebookTemplate(String name) {
+		this.name = name;
+	}
 
-    List<LibInfoRecord> getLibInfo(String user, String project, String exploratoryName);
-
-    String installComputationalLibs(UserInfo userInfo, String project, String exploratoryName, String computationalName,
-                                    List<LibInstallDTO> libs, String auditInfo);
-
-    String installExploratoryLibs(UserInfo userInfo, String project, String exploratoryName, List<LibInstallDTO> libs, String auditInfo);
+	public String getName() {
+		return name;
+	}
 }
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/LibExploratoryResource.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/LibExploratoryResource.java
index 1e4ee7b..c6af719 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/LibExploratoryResource.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/LibExploratoryResource.java
@@ -74,43 +74,18 @@ public class LibExploratoryResource {
 		this.externalLibraryService = externalLibraryService;
 	}
 
-	/**
-	 * Returns the list of libraries groups for exploratory.
-	 *
-	 * @param userInfo          user info.
-	 * @param exploratoryName   name of exploratory
-	 * @param computationalName name of computational cluster
-	 * @return library groups
-	 */
 	@GET
-	@Path("/lib_groups")
-	public Iterable<String> getLibGroupList(@Auth UserInfo userInfo,
-											@QueryParam("project_name") @NotBlank String projectName,
-											@QueryParam("exploratory_name") @NotBlank String exploratoryName,
-											@QueryParam("computational_name") String computationalName) {
-
-		log.trace("Loading list of lib groups for user {} and exploratory {}, computational {}", userInfo.getName(),
-				exploratoryName, computationalName);
-		try {
-			if (StringUtils.isEmpty(computationalName)) {
-				UserInstanceDTO userInstance = exploratoryDAO.fetchExploratoryFields(userInfo.getName(), projectName,
-						exploratoryName);
-				return ExploratoryLibCache.getCache().getExploratoryLibGroupList(userInfo, userInstance);
-			} else {
-				UserInstanceDTO userInstance = exploratoryDAO.fetchExploratoryFields(userInfo.getName(), projectName,
-						exploratoryName, computationalName);
-
-				userInstance.setResources(userInstance.getResources().stream()
-						.filter(e -> e.getComputationalName().equals(computationalName))
-						.collect(Collectors.toList()));
+	@Path("/lib-groups/exploratory")
+	public Response getExploratoryLibGroupList(@Auth UserInfo userInfo,
+	                                           @QueryParam("project") @NotBlank String projectName,
+	                                           @QueryParam("exploratory") @NotBlank String exploratoryName) {
+		return Response.ok(libraryService.getExploratoryLibGroups(userInfo, projectName, exploratoryName)).build();
+	}
 
-				return ExploratoryLibCache.getCache().getComputeLibGroupList(userInfo, userInstance);
-			}
-		} catch (Exception t) {
-			log.error("Cannot load list of lib groups for user {} and exploratory {}", userInfo.getName(),
-					exploratoryName, t);
-			throw new DlabException("Cannot load list of libraries groups: " + t.getLocalizedMessage(), t);
-		}
+	@GET
+	@Path("/lib-groups/compute")
+	public Response getComputeLibGroupList(@Auth UserInfo userInfo) {
+		return Response.ok(libraryService.getComputeLibGroups()).build();
 	}
 
 	/**
@@ -223,8 +198,7 @@ public class LibExploratoryResource {
 						formDTO.getNotebookName());
 			}
 
-			return ExploratoryLibCache.getCache().getLibList(userInfo, userInstance, formDTO.getGroup(), formDTO
-					.getStartWith());
+			return ExploratoryLibCache.getCache().getLibList(userInfo, userInstance, formDTO.getGroup(), formDTO.getStartWith());
 		} catch (Exception t) {
 			log.error("Cannot search libs for user {} with condition {}",
 					userInfo.getName(), formDTO, t);
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/LibraryService.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/LibraryService.java
index adf53e3..ba689f5 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/LibraryService.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/LibraryService.java
@@ -27,12 +27,16 @@ import org.bson.Document;
 import java.util.List;
 
 public interface LibraryService {
-    List<Document> getLibs(String user, String project, String exploratoryName, String computationalName);
+	List<Document> getLibs(String user, String project, String exploratoryName, String computationalName);
 
-    List<LibInfoRecord> getLibInfo(String user, String project, String exploratoryName);
+	List<LibInfoRecord> getLibInfo(String user, String project, String exploratoryName);
 
-    String installComputationalLibs(UserInfo userInfo, String project, String exploratoryName, String computationalName,
-                                    List<LibInstallDTO> libs, String auditInfo);
+	String installComputationalLibs(UserInfo userInfo, String project, String exploratoryName, String computationalName,
+	                                List<LibInstallDTO> libs, String auditInfo);
 
-    String installExploratoryLibs(UserInfo userInfo, String project, String exploratoryName, List<LibInstallDTO> libs, String auditInfo);
+	String installExploratoryLibs(UserInfo userInfo, String project, String exploratoryName, List<LibInstallDTO> libs, String auditInfo);
+
+	List<String> getExploratoryLibGroups(UserInfo userInfo, String projectName, String exploratoryName);
+
+	List<String> getComputeLibGroups();
 }
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/LibraryServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/LibraryServiceImpl.java
index ea4aae3..7c70d97 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/LibraryServiceImpl.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/LibraryServiceImpl.java
@@ -37,6 +37,7 @@ import com.epam.dlab.backendapi.service.EndpointService;
 import com.epam.dlab.backendapi.service.LibraryService;
 import com.epam.dlab.backendapi.util.RequestBuilder;
 import com.epam.dlab.constants.ServiceConsts;
+import com.epam.dlab.dto.LibraryGroups;
 import com.epam.dlab.dto.UserInstanceDTO;
 import com.epam.dlab.dto.UserInstanceStatus;
 import com.epam.dlab.dto.computational.UserComputationalResource;
@@ -56,6 +57,7 @@ import org.apache.commons.lang3.StringUtils;
 import org.bson.Document;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.LinkedHashMap;
 import java.util.LinkedList;
 import java.util.List;
@@ -63,17 +65,31 @@ import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 import static com.epam.dlab.backendapi.domain.AuditActionEnum.INSTALL;
 import static com.epam.dlab.backendapi.domain.AuditResourceTypeEnum.COMPUTATIONAL_LIBS;
 import static com.epam.dlab.backendapi.domain.AuditResourceTypeEnum.NOTEBOOK_LIBS;
+import static com.epam.dlab.backendapi.domain.NotebookTemplate.DEEP_LEARNING;
+import static com.epam.dlab.backendapi.domain.NotebookTemplate.JUPYTER;
+import static com.epam.dlab.backendapi.domain.NotebookTemplate.JUPYTER_LAB;
+import static com.epam.dlab.backendapi.domain.NotebookTemplate.RSTUDIO;
+import static com.epam.dlab.backendapi.domain.NotebookTemplate.TENSOR;
+import static com.epam.dlab.backendapi.domain.NotebookTemplate.TENSOR_RSTUDIO;
+import static com.epam.dlab.backendapi.domain.NotebookTemplate.ZEPPELIN;
+import static com.epam.dlab.dto.LibraryGroups.GROUP_JAVA;
+import static com.epam.dlab.dto.LibraryGroups.GROUP_OS_PKG;
+import static com.epam.dlab.dto.LibraryGroups.GROUP_OTHERS;
+import static com.epam.dlab.dto.LibraryGroups.GROUP_PIP2;
+import static com.epam.dlab.dto.LibraryGroups.GROUP_PIP3;
+import static com.epam.dlab.dto.LibraryGroups.GROUP_R_PKG;
 
 @Slf4j
 @Singleton
 public class LibraryServiceImpl implements LibraryService {
-
 	private static final String COMPUTATIONAL_NOT_FOUND_MSG = "Computational with name %s was not found";
 	private static final String LIB_ALREADY_INSTALLED = "Library %s is already installing";
+
 	@Inject
 	private ExploratoryDAO exploratoryDAO;
 
@@ -148,17 +164,44 @@ public class LibraryServiceImpl implements LibraryService {
     @Audit(action = INSTALL, type = NOTEBOOK_LIBS)
     @Override
     public String installExploratoryLibs(@User UserInfo ui, @Project String project, @ResourceName String expName, List<LibInstallDTO> libs, @Info String auditInfo) {
-        final UserInstanceDTO userInstance = exploratoryDAO.fetchRunningExploratoryFields(ui.getName(), project, expName);
-        EndpointDTO endpointDTO = endpointService.get(userInstance.getEndpoint());
-        final String uuid = provisioningService.post(endpointDTO.getUrl() + ExploratoryAPI.EXPLORATORY_LIB_INSTALL,
-                ui.getAccessToken(), toExploratoryLibraryInstallDto(ui, project, expName, libs, userInstance, endpointDTO),
-                String.class);
-        requestId.put(ui.getName(), uuid);
-        return uuid;
+	    final UserInstanceDTO userInstance = exploratoryDAO.fetchRunningExploratoryFields(ui.getName(), project, expName);
+	    EndpointDTO endpointDTO = endpointService.get(userInstance.getEndpoint());
+	    final String uuid = provisioningService.post(endpointDTO.getUrl() + ExploratoryAPI.EXPLORATORY_LIB_INSTALL,
+			    ui.getAccessToken(), toExploratoryLibraryInstallDto(ui, project, expName, libs, userInstance, endpointDTO),
+			    String.class);
+	    requestId.put(ui.getName(), uuid);
+	    return uuid;
     }
 
+	@Override
+	public List<String> getExploratoryLibGroups(UserInfo userInfo, String projectName, String exploratoryName) {
+		UserInstanceDTO userInstanceDTO = exploratoryDAO.fetchExploratoryFields(userInfo.getName(), projectName, exploratoryName);
+		final String templateName = userInstanceDTO.getTemplateName();
+		List<LibraryGroups> groups = new ArrayList<>(Arrays.asList(GROUP_JAVA, GROUP_OS_PKG));
+
+		if (Arrays.asList(JUPYTER.getName(), JUPYTER_LAB.getName(), ZEPPELIN.getName(), DEEP_LEARNING.getName(), TENSOR.getName(), TENSOR_RSTUDIO.getName(),
+				RSTUDIO.getName()).contains(templateName)) {
+			groups.addAll(Arrays.asList(GROUP_PIP2, GROUP_PIP3, GROUP_OTHERS));
+		}
+		if (Arrays.asList(JUPYTER.getName(), JUPYTER_LAB.getName(), ZEPPELIN.getName(), TENSOR_RSTUDIO.getName(), RSTUDIO.getName()).contains(templateName)) {
+			groups.add(GROUP_R_PKG);
+		}
+
+		return groups
+				.stream()
+				.map(LibraryGroups::toString)
+				.collect(Collectors.toList());
+	}
+
+	@Override
+	public List<String> getComputeLibGroups() {
+		return Stream.of(GROUP_JAVA, GROUP_OS_PKG, GROUP_PIP2, GROUP_PIP3, GROUP_OTHERS)
+				.map(LibraryGroups::toString)
+				.collect(Collectors.toList());
+	}
+
 	private LibraryInstallDTO toExploratoryLibraryInstallDto(UserInfo userInfo, String project, String exploratoryName,
-															 List<LibInstallDTO> libs, UserInstanceDTO userInstance, EndpointDTO endpointDTO) {
+	                                                         List<LibInstallDTO> libs, UserInstanceDTO userInstance, EndpointDTO endpointDTO) {
 		final List<LibInstallDTO> libsToInstall = libs.stream()
 				.map(lib -> toLibInstallDto(lib, libraryDAO.getLibrary(userInfo.getName(), project, exploratoryName,
 						lib.getGroup(), lib.getName())))
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/LibExploratoryResourceTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/LibExploratoryResourceTest.java
index f1b9810..419acbf 100644
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/LibExploratoryResourceTest.java
+++ b/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/LibExploratoryResourceTest.java
@@ -49,6 +49,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.util.Collections;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -90,83 +91,41 @@ public class LibExploratoryResourceTest extends TestBase {
         authSetup();
     }
 
-    @Test
-    public void getLibGroupListWithFailedAuth() throws AuthenticationException {
-        authFailSetup();
-        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString(), anyString()))
-                .thenReturn(getUserInstanceDto());
-        final Response response = resources.getJerseyTest()
-                .target("/infrastructure_provision/exploratory_environment/lib_groups")
-                .queryParam("exploratory_name", "explName")
-                .queryParam("project_name", "projectName")
-                .queryParam("computational_name", "compName")
-                .request()
-                .header("Authorization", "Bearer " + TOKEN)
-                .get();
-
-        assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
-        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-        verify(exploratoryDAO).fetchExploratoryFields(USER.toLowerCase(), "projectName", "explName", "compName");
-        verifyNoMoreInteractions(exploratoryDAO);
-    }
-
 	@Test
-	public void getLibGroupListWithException() {
-        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString(), anyString())).thenReturn
-                (getUserInstanceDto());
-        final Response response = resources.getJerseyTest()
-                .target("/infrastructure_provision/exploratory_environment/lib_groups")
-                .queryParam("project_name", "projectName")
-                .queryParam("exploratory_name", "explName")
-                .queryParam("computational_name", "compName")
-                .request()
-                .header("Authorization", "Bearer " + TOKEN)
-                .get();
-
-        assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
-        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-        verify(exploratoryDAO).fetchExploratoryFields(USER.toLowerCase(), "projectName", "explName", "compName");
-        verifyNoMoreInteractions(exploratoryDAO);
-    }
+	public void getComputeLibGroupList() {
+		when(libraryService.getComputeLibGroups()).thenReturn(Collections.emptyList());
 
-	@Test
-	public void getLibGroupListWithoutComputationalWithFailedAuth() throws AuthenticationException {
-        authFailSetup();
-        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString())).thenReturn(getUserInstanceDto());
-        final Response response = resources.getJerseyTest()
-                .target("/infrastructure_provision/exploratory_environment/lib_groups")
-                .queryParam("exploratory_name", "explName")
-                .queryParam("project_name", "projectName")
-                .request()
-                .header("Authorization", "Bearer " + TOKEN)
-                .get();
+		final Response response = resources.getJerseyTest()
+				.target("/infrastructure_provision/exploratory_environment/lib-groups/compute")
+				.request()
+				.header("Authorization", "Bearer " + TOKEN)
+				.get();
 
-        assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
-        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+		assertEquals(HttpStatus.SC_OK, response.getStatus());
+		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
 
-        verify(exploratoryDAO).fetchExploratoryFields(USER.toLowerCase(), "projectName", "explName");
-        verifyNoMoreInteractions(exploratoryDAO);
-    }
+		verify(libraryService).getComputeLibGroups();
+		verifyNoMoreInteractions(libraryService);
+	}
 
 	@Test
-	public void getLibGroupListWithoutComputationalWithException() {
-        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString())).thenReturn(getUserInstanceDto());
-        final Response response = resources.getJerseyTest()
-                .target("/infrastructure_provision/exploratory_environment/lib_groups")
-                .queryParam("exploratory_name", "explName")
-                .queryParam("project_name", "projectName")
-                .request()
-                .header("Authorization", "Bearer " + TOKEN)
-                .get();
+	public void getExploratoryLibGroupList() {
+		when(libraryService.getExploratoryLibGroups(any(UserInfo.class), anyString(), anyString())).thenReturn(Collections.emptyList());
 
-        assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
-        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+		final Response response = resources.getJerseyTest()
+				.target("/infrastructure_provision/exploratory_environment/lib-groups/exploratory")
+				.queryParam("project", "projectName")
+				.queryParam("exploratory", "explName")
+				.request()
+				.header("Authorization", "Bearer " + TOKEN)
+				.get();
 
-        verify(exploratoryDAO).fetchExploratoryFields(USER.toLowerCase(), "projectName", "explName");
-        verifyNoMoreInteractions(exploratoryDAO);
-    }
+		assertEquals(HttpStatus.SC_OK, response.getStatus());
+		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+		verify(libraryService).getExploratoryLibGroups(getUserInfo(), "projectName", "explName");
+		verifyNoMoreInteractions(libraryService);
+	}
 
 	@Test
 	public void getLibList() {
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/LibraryServiceImplTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/LibraryServiceImplTest.java
index 76d2360..68b2f41 100644
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/LibraryServiceImplTest.java
+++ b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/LibraryServiceImplTest.java
@@ -23,6 +23,7 @@ import com.epam.dlab.auth.UserInfo;
 import com.epam.dlab.backendapi.dao.ExploratoryDAO;
 import com.epam.dlab.backendapi.dao.ExploratoryLibDAO;
 import com.epam.dlab.backendapi.domain.EndpointDTO;
+import com.epam.dlab.backendapi.domain.NotebookTemplate;
 import com.epam.dlab.backendapi.domain.RequestId;
 import com.epam.dlab.backendapi.resources.dto.LibInfoRecord;
 import com.epam.dlab.backendapi.resources.dto.LibInstallFormDTO;
@@ -68,24 +69,31 @@ import static org.mockito.Mockito.when;
 @RunWith(MockitoJUnitRunner.class)
 public class LibraryServiceImplTest {
 
-    private static final String LIB_NAME = "name";
-    private static final String LIB_GROUP = "group";
-    private static final String LIB_VERSION = "version";
-    private static final String UUID = "id";
-    private final String USER = "test";
-    private final String EXPLORATORY_NAME = "explName";
-    private final String PROJECT = "projectName";
-    private final String COMPUTATIONAL_NAME = "compName";
-
-    private LibInstallDTO liDto;
-    private List<LibInstallDTO> libs;
-    private LibInstallFormDTO libInstallFormDTO;
-    private LibraryInstallDTO libraryInstallDto;
-
-    @Mock
-    private ExploratoryDAO exploratoryDAO;
-    @Mock
-    private ExploratoryLibDAO libraryDAO;
+	private static final String LIB_NAME = "name";
+	private static final String LIB_GROUP = "group";
+	private static final String LIB_VERSION = "version";
+	private static final String UUID = "id";
+	private final String USER = "test";
+	private final String EXPLORATORY_NAME = "explName";
+	private final String PROJECT = "projectName";
+	private final String COMPUTATIONAL_NAME = "compName";
+
+	private static final String GROUP_JAVA = "java";
+	private static final String GROUP_PIP2 = "pip2";
+	private static final String GROUP_PIP3 = "pip3";
+	private static final String GROUP_R_PKG = "r_pkg";
+	private static final String GROUP_OS_PKG = "os_pkg";
+	private static final String GROUP_OTHERS = "others";
+
+	private LibInstallDTO liDto;
+	private List<LibInstallDTO> libs;
+	private LibInstallFormDTO libInstallFormDTO;
+	private LibraryInstallDTO libraryInstallDto;
+
+	@Mock
+	private ExploratoryDAO exploratoryDAO;
+	@Mock
+	private ExploratoryLibDAO libraryDAO;
     @Mock
     private RequestBuilder requestBuilder;
     @Mock
@@ -338,14 +346,45 @@ public class LibraryServiceImplTest {
         try {
             libraryService.installExploratoryLibs(user, PROJECT, EXPLORATORY_NAME, getLibs(null), null);
         } catch (DlabException e) {
-            assertEquals("Library name is already installing", e.getMessage());
+	        assertEquals("Library name is already installing", e.getMessage());
         }
 
-        verify(libraryDAO).getLibrary(USER, PROJECT, EXPLORATORY_NAME, LIB_GROUP, LIB_NAME);
-        verify(exploratoryDAO).fetchRunningExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
-        verifyNoMoreInteractions(libraryDAO, requestBuilder, provisioningService, requestId, exploratoryDAO);
+		verify(libraryDAO).getLibrary(USER, PROJECT, EXPLORATORY_NAME, LIB_GROUP, LIB_NAME);
+		verify(exploratoryDAO).fetchRunningExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
+		verifyNoMoreInteractions(libraryDAO, requestBuilder, provisioningService, requestId, exploratoryDAO);
 
-    }
+	}
+
+	@Test
+	public void getComputeLibGroups() {
+		List<Object> computeGroups = Arrays.asList(GROUP_JAVA, GROUP_OS_PKG, GROUP_PIP2, GROUP_PIP3, GROUP_OTHERS);
+
+		List<String> computeGroupsResult = libraryService.getComputeLibGroups();
+
+		assertEquals("lists are not equals", computeGroups, computeGroupsResult);
+	}
+
+	@Test
+	public void getExploratoryJupyterLibGroups() {
+		List<Object> exploratoryGroups = Arrays.asList(GROUP_JAVA, GROUP_OS_PKG, GROUP_PIP2, GROUP_PIP3, GROUP_OTHERS);
+		when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString())).thenReturn(getJupyterUserInstanceDtoForLibGroups());
+
+		List<String> exploratoryGroupsResult = libraryService.getExploratoryLibGroups(getUser(), PROJECT, EXPLORATORY_NAME);
+
+		assertEquals("lists are not equals", exploratoryGroups, exploratoryGroupsResult);
+		verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
+	}
+
+	@Test
+	public void getExploratoryRstudioLibGroups() {
+		List<Object> exploratoryGroups = Arrays.asList(GROUP_JAVA, GROUP_OS_PKG, GROUP_PIP2, GROUP_PIP3, GROUP_OTHERS, GROUP_R_PKG);
+		when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString())).thenReturn(getRstudioUserInstanceDtoForLibGroups());
+
+		List<String> exploratoryGroupsResult = libraryService.getExploratoryLibGroups(getUser(), PROJECT, EXPLORATORY_NAME);
+
+		assertEquals("lists are not equals", exploratoryGroups, exploratoryGroupsResult);
+		verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
+	}
 
 	private Library getLibrary(LibStatus status) {
 		return new Library(LIB_GROUP, LIB_NAME, "1", status, "");
@@ -382,12 +421,25 @@ public class LibraryServiceImplTest {
 	}
 
 	private UserInstanceDTO getUserInstanceDto() {
-		final UserInstanceDTO userInstanceDTO =
-				new UserInstanceDTO().withUser(USER).withExploratoryName(EXPLORATORY_NAME);
+		final UserInstanceDTO userInstanceDTO = new UserInstanceDTO().withUser(USER).withExploratoryName(EXPLORATORY_NAME);
 		userInstanceDTO.getResources().add(getUserComputationalResourceWithName(COMPUTATIONAL_NAME));
 		return userInstanceDTO;
 	}
 
+	private UserInstanceDTO getJupyterUserInstanceDtoForLibGroups() {
+		return new UserInstanceDTO()
+				.withUser(USER)
+				.withExploratoryName(EXPLORATORY_NAME)
+				.withTemplateName(NotebookTemplate.JUPYTER.getName());
+	}
+
+	private UserInstanceDTO getRstudioUserInstanceDtoForLibGroups() {
+		return new UserInstanceDTO()
+				.withUser(USER)
+				.withExploratoryName(EXPLORATORY_NAME)
+				.withTemplateName(NotebookTemplate.RSTUDIO.getName());
+	}
+
 	private List<Document> getExpLibsList() {
 		Document explLibsDoc = new Document();
 		explLibsDoc.append(ExploratoryLibDAO.LIB_NAME, "expLibName");


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