This is an automated email from the ASF dual-hosted git repository.
caishunfeng pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/dolphinscheduler.git
The following commit(s) were added to refs/heads/dev by this push:
new 8acc697942 [Improvement] add resource full name check (#15786)
8acc697942 is described below
commit 8acc69794275149a359a711359873b39781f58b7
Author: caishunfeng <[email protected]>
AuthorDate: Mon Apr 1 22:49:59 2024 +0800
[Improvement] add resource full name check (#15786)
* [Improvement] add resource full name check
---
.../apache/dolphinscheduler/api/enums/Status.java | 2 +
.../api/service/ResourcesService.java | 6 +-
.../api/service/impl/ResourcesServiceImpl.java | 20 +-
.../api/service/ResourcesServiceTest.java | 333 +++++++++------------
4 files changed, 168 insertions(+), 193 deletions(-)
diff --git
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/enums/Status.java
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/enums/Status.java
index 113ccb6bd1..9dc12d9ba0 100644
---
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/enums/Status.java
+++
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/enums/Status.java
@@ -323,6 +323,8 @@ public enum Status {
REMOVE_TASK_INSTANCE_CACHE_ERROR(20019, "remove task instance cache
error", "删除任务实例缓存错误"),
+ ILLEGAL_RESOURCE_PATH(20020, "Resource file [{0}] is illegal",
"非法的资源路径[{0}]"),
+
USER_NO_OPERATION_PERM(30001, "user has no operation privilege",
"当前用户没有操作权限"),
USER_NO_OPERATION_PROJECT_PERM(30002, "user {0} is not has project {1}
permission", "当前用户[{0}]没有[{1}]项目的操作权限"),
USER_NO_WRITE_PROJECT_PERM(30003, "user [{0}] does not have write
permission for project [{1}]",
diff --git
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/ResourcesService.java
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/ResourcesService.java
index 24d1ba8727..54023baad9 100644
---
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/ResourcesService.java
+++
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/ResourcesService.java
@@ -194,13 +194,13 @@ public interface ResourcesService {
org.springframework.core.io.Resource downloadResource(User loginUser,
String fullName) throws IOException;
/**
- * Get resource by given resource type and full name.
+ * Get resource by given resource type and file name.
* Useful in Python API create task which need processDefinition
information.
*
* @param userName user who query resource
- * @param fullName full name of the resource
+ * @param fileName file name of the resource
*/
- StorageEntity queryFileStatus(String userName, String fullName) throws
Exception;
+ StorageEntity queryFileStatus(String userName, String fileName) throws
Exception;
/**
* delete DATA_TRANSFER data in resource center
diff --git
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ResourcesServiceImpl.java
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ResourcesServiceImpl.java
index e6341f021d..6a15da17a8 100644
---
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ResourcesServiceImpl.java
+++
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ResourcesServiceImpl.java
@@ -126,6 +126,7 @@ public class ResourcesServiceImpl extends BaseServiceImpl
implements ResourcesSe
}
String tenantCode = getTenantCode(user);
+ checkFullName(tenantCode, currentDir);
String userResRootPath = ResourceType.UDF.equals(type) ?
storageOperate.getUdfDir(tenantCode)
: storageOperate.getResDir(tenantCode);
@@ -171,6 +172,7 @@ public class ResourcesServiceImpl extends BaseServiceImpl
implements ResourcesSe
}
String tenantCode = getTenantCode(user);
+ checkFullName(tenantCode, currentDir);
result = verifyFile(name, type, file);
if (!result.getCode().equals(Status.SUCCESS.getCode())) {
@@ -257,6 +259,7 @@ public class ResourcesServiceImpl extends BaseServiceImpl
implements ResourcesSe
}
String tenantCode = getTenantCode(user);
+ checkFullName(tenantCode, resourceFullName);
if (!isUserTenantValid(isAdmin(loginUser), tenantCode, resTenantCode))
{
log.error("current user does not have permission");
@@ -264,7 +267,7 @@ public class ResourcesServiceImpl extends BaseServiceImpl
implements ResourcesSe
return result;
}
- String defaultPath = storageOperate.getResDir(tenantCode);
+ String defaultPath = storageOperate.getDir(type, tenantCode);
StorageEntity resource;
try {
@@ -949,6 +952,7 @@ public class ResourcesServiceImpl extends BaseServiceImpl
implements ResourcesSe
}
String tenantCode = getTenantCode(user);
+ checkFullName(tenantCode, currentDir);
if (FileUtils.directoryTraversal(fileName)) {
log.warn("File name verify failed, fileName:{}.",
RegexUtils.escapeNRT(fileName));
@@ -1280,9 +1284,19 @@ public class ResourcesServiceImpl extends
BaseServiceImpl implements ResourcesSe
}
private void checkFullName(String userTenantCode, String fullName) {
+ if (StringUtils.isEmpty(fullName)) {
+ return;
+ }
+ if (FOLDER_SEPARATOR.equalsIgnoreCase(fullName)) {
+ return;
+ }
+ // Avoid returning to the parent directory
+ if (fullName.contains("../")) {
+ throw new ServiceException(Status.ILLEGAL_RESOURCE_PATH, fullName);
+ }
String baseDir = storageOperate.getDir(ResourceType.ALL,
userTenantCode);
- if (StringUtils.isNotBlank(fullName) &&
!StringUtils.startsWith(fullName, baseDir)) {
- throw new ServiceException("Resource file: " + fullName + " is
illegal");
+ if (!StringUtils.startsWith(fullName, baseDir)) {
+ throw new ServiceException(Status.ILLEGAL_RESOURCE_PATH, fullName);
}
}
}
diff --git
a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/ResourcesServiceTest.java
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/ResourcesServiceTest.java
index 0679b8892d..6e94a25861 100644
---
a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/ResourcesServiceTest.java
+++
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/ResourcesServiceTest.java
@@ -18,7 +18,6 @@
package org.apache.dolphinscheduler.api.service;
import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.when;
@@ -70,8 +69,6 @@ import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;
import org.mockito.junit.jupiter.MockitoSettings;
import org.mockito.quality.Strictness;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.springframework.mock.web.MockMultipartFile;
import com.google.common.io.Files;
@@ -83,9 +80,10 @@ import com.google.common.io.Files;
@MockitoSettings(strictness = Strictness.LENIENT)
public class ResourcesServiceTest {
- private static final Logger logger =
LoggerFactory.getLogger(ResourcesServiceTest.class);
-
+ private static final String basePath = "/dolphinscheduler";
private static final String tenantCode = "123";
+ private static final String tenantFileResourceDir =
"/dolphinscheduler/123/resources/";
+ private static final String tenantUdfResourceDir =
"/dolphinscheduler/123/udfs/";
@InjectMocks
private ResourcesServiceImpl resourcesService;
@@ -153,18 +151,30 @@ public class ResourcesServiceTest {
// CURRENT_LOGIN_USER_TENANT_NOT_EXIST
when(userMapper.selectById(user.getId())).thenReturn(getUser());
when(tenantMapper.queryById(1)).thenReturn(null);
- Assertions.assertThrows(ServiceException.class,
+ ServiceException serviceException =
Assertions.assertThrows(ServiceException.class,
() -> resourcesService.uploadResource(user,
"ResourcesServiceTest", ResourceType.FILE,
new MockMultipartFile("test.pdf", "test.pdf", "pdf",
"test".getBytes()), "/"));
+ assertEquals(Status.CURRENT_LOGIN_USER_TENANT_NOT_EXIST.getMsg(),
serviceException.getMessage());
+
// set tenant for user
user.setTenantId(1);
when(tenantMapper.queryById(1)).thenReturn(getTenant());
+ when(storageOperate.getDir(ResourceType.ALL,
tenantCode)).thenReturn(basePath);
+
+ // ILLEGAL_RESOURCE_FILE
+ String illegal_path = "/dolphinscheduler/123/../";
+ serviceException = Assertions.assertThrows(ServiceException.class,
+ () -> {
+ MockMultipartFile mockMultipartFile = new
MockMultipartFile("test.pdf", "".getBytes());
+ resourcesService.uploadResource(user,
"ResourcesServiceTest", ResourceType.FILE,
+ mockMultipartFile, illegal_path);
+ });
+ assertEquals(new ServiceException(Status.ILLEGAL_RESOURCE_PATH,
illegal_path), serviceException);
// RESOURCE_FILE_IS_EMPTY
MockMultipartFile mockMultipartFile = new
MockMultipartFile("test.pdf", "".getBytes());
Result result = resourcesService.uploadResource(user,
"ResourcesServiceTest", ResourceType.FILE,
- mockMultipartFile, "/");
- logger.info(result.toString());
+ mockMultipartFile, tenantFileResourceDir);
assertEquals(Status.RESOURCE_FILE_IS_EMPTY.getMsg(), result.getMsg());
// RESOURCE_SUFFIX_FORBID_CHANGE
@@ -172,8 +182,7 @@ public class ResourcesServiceTest {
when(Files.getFileExtension("test.pdf")).thenReturn("pdf");
when(Files.getFileExtension("ResourcesServiceTest.jar")).thenReturn("jar");
result = resourcesService.uploadResource(user,
"ResourcesServiceTest.jar", ResourceType.FILE, mockMultipartFile,
- "/");
- logger.info(result.toString());
+ tenantFileResourceDir);
assertEquals(Status.RESOURCE_SUFFIX_FORBID_CHANGE.getMsg(),
result.getMsg());
// UDF_RESOURCE_SUFFIX_NOT_JAR
@@ -181,45 +190,42 @@ public class ResourcesServiceTest {
new MockMultipartFile("ResourcesServiceTest.pdf",
"ResourcesServiceTest.pdf", "pdf", "test".getBytes());
when(Files.getFileExtension("ResourcesServiceTest.pdf")).thenReturn("pdf");
result = resourcesService.uploadResource(user,
"ResourcesServiceTest.pdf", ResourceType.UDF, mockMultipartFile,
- "/");
- logger.info(result.toString());
+ tenantUdfResourceDir);
assertEquals(Status.UDF_RESOURCE_SUFFIX_NOT_JAR.getMsg(),
result.getMsg());
// FULL_FILE_NAME_TOO_LONG
String tooLongFileName =
getRandomStringWithLength(Constants.RESOURCE_FULL_NAME_MAX_LENGTH) + ".pdf";
mockMultipartFile = new MockMultipartFile(tooLongFileName,
tooLongFileName, "pdf", "test".getBytes());
when(Files.getFileExtension(tooLongFileName)).thenReturn("pdf");
+
// '/databasePath/tenantCode/RESOURCE/'
-
when(storageOperate.getResDir(tenantCode)).thenReturn("/dolphinscheduler/123/resources/");
- result = resourcesService.uploadResource(user, tooLongFileName,
ResourceType.FILE, mockMultipartFile, "/");
- logger.info(result.toString());
+
when(storageOperate.getResDir(tenantCode)).thenReturn(tenantFileResourceDir);
+ result = resourcesService.uploadResource(user, tooLongFileName,
ResourceType.FILE, mockMultipartFile,
+ tenantFileResourceDir);
assertEquals(Status.RESOURCE_FULL_NAME_TOO_LONG_ERROR.getMsg(),
result.getMsg());
}
@Test
- public void testCreateDirecotry() {
+ public void testCreateDirecotry() throws IOException {
User user = new User();
user.setId(1);
user.setUserType(UserType.GENERAL_USER);
+ String fileName = "directoryTest";
// RESOURCE_EXIST
user.setId(1);
user.setTenantId(1);
when(tenantMapper.queryById(1)).thenReturn(getTenant());
when(userMapper.selectById(user.getId())).thenReturn(getUser());
-
when(storageOperate.getResDir(tenantCode)).thenReturn("/dolphinscheduler/123/resources/");
- try {
-
when(storageOperate.exists("/dolphinscheduler/123/resources/directoryTest")).thenReturn(true);
- } catch (IOException e) {
- logger.error(e.getMessage(), e);
- }
- Result result = resourcesService.createDirectory(user,
"directoryTest", ResourceType.FILE, -1, "/");
- logger.info(result.toString());
+ when(storageOperate.getDir(ResourceType.ALL,
tenantCode)).thenReturn(basePath);
+
when(storageOperate.getResDir(tenantCode)).thenReturn(tenantFileResourceDir);
+ when(storageOperate.exists(tenantFileResourceDir +
fileName)).thenReturn(true);
+ Result result = resourcesService.createDirectory(user, fileName,
ResourceType.FILE, -1, tenantFileResourceDir);
assertEquals(Status.RESOURCE_EXIST.getMsg(), result.getMsg());
}
@Test
- public void testUpdateResource() {
+ public void testUpdateResource() throws Exception {
User user = new User();
user.setId(1);
user.setUserType(UserType.GENERAL_USER);
@@ -227,7 +233,13 @@ public class ResourcesServiceTest {
when(userMapper.selectById(user.getId())).thenReturn(getUser());
when(tenantMapper.queryById(1)).thenReturn(getTenant());
-
when(storageOperate.getResDir(tenantCode)).thenReturn("/dolphinscheduler/123/resources/");
+ when(storageOperate.getDir(ResourceType.ALL,
tenantCode)).thenReturn(basePath);
+
when(storageOperate.getResDir(tenantCode)).thenReturn(tenantFileResourceDir);
+
+ // TENANT_NOT_EXIST
+ when(tenantMapper.queryById(Mockito.anyInt())).thenReturn(null);
+ Assertions.assertThrows(ServiceException.class, () ->
resourcesService.updateResource(user,
+ "ResourcesServiceTest1.jar", "", "ResourcesServiceTest",
ResourceType.UDF, null));
// USER_NO_OPERATION_PERM
user.setUserType(UserType.GENERAL_USER);
@@ -235,92 +247,58 @@ public class ResourcesServiceTest {
Tenant tenantWNoPermission = new Tenant();
tenantWNoPermission.setTenantCode("321");
when(tenantMapper.queryById(1)).thenReturn(tenantWNoPermission);
- Result result = resourcesService.updateResource(user,
"/dolphinscheduler/123/resources/ResourcesServiceTest",
- tenantCode, "ResourcesServiceTest", ResourceType.FILE, null);
- logger.info(result.toString());
+ when(storageOperate.getDir(ResourceType.ALL,
"321")).thenReturn(basePath);
+
+ String fileName = "ResourcesServiceTest";
+ Result result = resourcesService.updateResource(user,
tenantFileResourceDir + fileName,
+ tenantCode, fileName, ResourceType.FILE, null);
assertEquals(Status.NO_CURRENT_OPERATING_PERMISSION.getMsg(),
result.getMsg());
// SUCCESS
when(tenantMapper.queryById(1)).thenReturn(getTenant());
- try {
- when(storageOperate.exists(Mockito.any())).thenReturn(false);
- } catch (IOException e) {
- logger.error(e.getMessage(), e);
- }
-
- try {
-
when(storageOperate.getFileStatus("/dolphinscheduler/123/resources/ResourcesServiceTest",
- "/dolphinscheduler/123/resources/", tenantCode,
ResourceType.FILE))
- .thenReturn(getStorageEntityResource());
- result = resourcesService.updateResource(user,
"/dolphinscheduler/123/resources/ResourcesServiceTest",
- tenantCode, "ResourcesServiceTest", ResourceType.FILE,
null);
- logger.info(result.toString());
- assertEquals(Status.SUCCESS.getMsg(), result.getMsg());
- } catch (Exception e) {
- logger.error(e.getMessage() + " Resource path: {}",
"/dolphinscheduler/123/resources/ResourcesServiceTest",
- e);
- }
+ when(storageOperate.exists(Mockito.any())).thenReturn(false);
+
+ when(storageOperate.getDir(ResourceType.FILE,
tenantCode)).thenReturn(tenantFileResourceDir);
+ when(storageOperate.getFileStatus(tenantFileResourceDir + fileName,
+ tenantFileResourceDir, tenantCode, ResourceType.FILE))
+ .thenReturn(getStorageEntityResource(fileName));
+ result = resourcesService.updateResource(user, tenantFileResourceDir +
fileName,
+ tenantCode, fileName, ResourceType.FILE, null);
+ assertEquals(Status.SUCCESS.getMsg(), result.getMsg());
// Tests for udf resources.
- // RESOURCE_EXIST
- try {
-
when(storageOperate.exists("/dolphinscheduler/123/resources/ResourcesServiceTest2.jar")).thenReturn(true);
- } catch (IOException e) {
- logger.error("error occurred when checking resource: "
- +
"/dolphinscheduler/123/resources/ResourcesServiceTest2.jar");
- }
-
- try {
-
when(storageOperate.getFileStatus("/dolphinscheduler/123/resources/ResourcesServiceTest1.jar",
- "/dolphinscheduler/123/resources/", tenantCode,
ResourceType.UDF))
- .thenReturn(getStorageEntityUdfResource());
- } catch (Exception e) {
- logger.error(e.getMessage() + " Resource path: {}",
-
"/dolphinscheduler/123/resources/ResourcesServiceTest1.jar", e);
- }
- result = resourcesService.updateResource(user,
"/dolphinscheduler/123/resources/ResourcesServiceTest1.jar",
- tenantCode, "ResourcesServiceTest2.jar", ResourceType.UDF,
null);
- logger.info(result.toString());
- assertEquals(Status.RESOURCE_EXIST.getMsg(), result.getMsg());
-
- // TENANT_NOT_EXIST
- when(tenantMapper.queryById(Mockito.anyInt())).thenReturn(null);
- Assertions.assertThrows(ServiceException.class, () ->
resourcesService.updateResource(user,
- "ResourcesServiceTest1.jar", "", "ResourcesServiceTest",
ResourceType.UDF, null));
-
- // SUCCESS
- when(tenantMapper.queryById(1)).thenReturn(getTenant());
-
- result = resourcesService.updateResource(user,
"/dolphinscheduler/123/resources/ResourcesServiceTest1.jar",
- tenantCode, "ResourcesServiceTest1.jar", ResourceType.UDF,
null);
- logger.info(result.toString());
+ fileName = "ResourcesServiceTest.jar";
+ when(storageOperate.getDir(ResourceType.UDF,
tenantCode)).thenReturn(tenantUdfResourceDir);
+ when(storageOperate.exists(tenantUdfResourceDir +
fileName)).thenReturn(true);
+ when(storageOperate.getFileStatus(tenantUdfResourceDir + fileName,
tenantUdfResourceDir, tenantCode,
+ ResourceType.UDF))
+ .thenReturn(getStorageEntityUdfResource(fileName));
+ result = resourcesService.updateResource(user, tenantUdfResourceDir +
fileName,
+ tenantCode, fileName, ResourceType.UDF, null);
assertEquals(Status.SUCCESS.getMsg(), result.getMsg());
}
@Test
- public void testQueryResourceListPaging() {
+ public void testQueryResourceListPaging() throws Exception {
User loginUser = new User();
loginUser.setId(1);
loginUser.setTenantId(1);
loginUser.setTenantCode("tenant1");
loginUser.setUserType(UserType.ADMIN_USER);
- List<StorageEntity> mockResList = new ArrayList<StorageEntity>();
- mockResList.add(getStorageEntityResource());
- List<User> mockUserList = new ArrayList<User>();
+
+ String fileName = "ResourcesServiceTest";
+ List<StorageEntity> mockResList = new ArrayList<>();
+ mockResList.add(getStorageEntityResource(fileName));
+ List<User> mockUserList = new ArrayList<>();
mockUserList.add(getUser());
when(userMapper.selectList(null)).thenReturn(mockUserList);
when(userMapper.selectById(getUser().getId())).thenReturn(getUser());
when(tenantMapper.queryById(getUser().getTenantId())).thenReturn(getTenant());
-
when(storageOperate.getResDir(tenantCode)).thenReturn("/dolphinscheduler/123/resources/");
+
when(storageOperate.getResDir(tenantCode)).thenReturn(tenantFileResourceDir);
+ when(storageOperate.listFilesStatus(tenantFileResourceDir,
tenantFileResourceDir,
+ tenantCode, ResourceType.FILE)).thenReturn(mockResList);
- try {
-
when(storageOperate.listFilesStatus("/dolphinscheduler/123/resources/",
"/dolphinscheduler/123/resources/",
- tenantCode, ResourceType.FILE)).thenReturn(mockResList);
- } catch (Exception e) {
- logger.error("QueryResourceListPaging Error");
- }
Result result = resourcesService.queryResourceListPaging(loginUser,
"", "", ResourceType.FILE, "Test", 1, 10);
- logger.info(result.toString());
assertEquals(Status.SUCCESS.getCode(), (int) result.getCode());
PageInfo pageInfo = (PageInfo) result.getData();
Assertions.assertTrue(CollectionUtils.isNotEmpty(pageInfo.getTotalList()));
@@ -330,29 +308,30 @@ public class ResourcesServiceTest {
@Test
public void testQueryResourceList() {
User loginUser = getUser();
+ String fileName = "ResourcesServiceTest";
when(userMapper.selectList(null)).thenReturn(Collections.singletonList(loginUser));
when(userMapper.selectById(loginUser.getId())).thenReturn(loginUser);
when(tenantMapper.queryById(Mockito.anyInt())).thenReturn(getTenant());
- when(storageOperate.getDir(ResourceType.ALL,
tenantCode)).thenReturn("/dolphinscheduler");
- when(storageOperate.getDir(ResourceType.FILE,
tenantCode)).thenReturn("/dolphinscheduler/123/resources/");
-
when(storageOperate.getResDir(tenantCode)).thenReturn("/dolphinscheduler/123/resources/");
-
when(storageOperate.listFilesStatusRecursively("/dolphinscheduler/123/resources/",
- "/dolphinscheduler/123/resources/", tenantCode,
ResourceType.FILE))
-
.thenReturn(Collections.singletonList(getStorageEntityResource()));
+ when(storageOperate.getDir(ResourceType.ALL,
tenantCode)).thenReturn(basePath);
+ when(storageOperate.getDir(ResourceType.FILE,
tenantCode)).thenReturn(tenantFileResourceDir);
+
when(storageOperate.getResDir(tenantCode)).thenReturn(tenantFileResourceDir);
+ when(storageOperate.listFilesStatusRecursively(tenantFileResourceDir,
+ tenantFileResourceDir, tenantCode, ResourceType.FILE))
+
.thenReturn(Collections.singletonList(getStorageEntityResource(fileName)));
Map<String, Object> result =
- resourcesService.queryResourceList(loginUser,
ResourceType.FILE, "/dolphinscheduler/123/resources/");
+ resourcesService.queryResourceList(loginUser,
ResourceType.FILE, tenantFileResourceDir);
assertEquals(Status.SUCCESS, result.get(Constants.STATUS));
List<ResourceComponent> resourceList = (List<ResourceComponent>)
result.get(Constants.DATA_LIST);
Assertions.assertTrue(CollectionUtils.isNotEmpty(resourceList));
// test udf
- when(storageOperate.getDir(ResourceType.UDF,
tenantCode)).thenReturn("/dolphinscheduler/123/udfs/");
-
when(storageOperate.getUdfDir(tenantCode)).thenReturn("/dolphinscheduler/123/udfs/");
-
when(storageOperate.listFilesStatusRecursively("/dolphinscheduler/123/udfs/",
"/dolphinscheduler/123/udfs/",
- tenantCode,
ResourceType.UDF)).thenReturn(Arrays.asList(getStorageEntityUdfResource()));
+ when(storageOperate.getDir(ResourceType.UDF,
tenantCode)).thenReturn(tenantUdfResourceDir);
+
when(storageOperate.getUdfDir(tenantCode)).thenReturn(tenantUdfResourceDir);
+ when(storageOperate.listFilesStatusRecursively(tenantUdfResourceDir,
tenantUdfResourceDir,
+ tenantCode,
ResourceType.UDF)).thenReturn(Arrays.asList(getStorageEntityUdfResource("test.jar")));
loginUser.setUserType(UserType.GENERAL_USER);
- result = resourcesService.queryResourceList(loginUser,
ResourceType.UDF, "/dolphinscheduler/123/udfs/");
+ result = resourcesService.queryResourceList(loginUser,
ResourceType.UDF, tenantUdfResourceDir);
assertEquals(Status.SUCCESS, result.get(Constants.STATUS));
resourceList = (List<ResourceComponent>)
result.get(Constants.DATA_LIST);
Assertions.assertTrue(CollectionUtils.isNotEmpty(resourceList));
@@ -360,7 +339,6 @@ public class ResourcesServiceTest {
@Test
public void testDelete() throws Exception {
-
User loginUser = new User();
loginUser.setId(0);
loginUser.setUserType(UserType.GENERAL_USER);
@@ -372,46 +350,40 @@ public class ResourcesServiceTest {
Assertions.assertThrows(ServiceException.class, () ->
resourcesService.delete(loginUser, "", ""));
// RESOURCE_NOT_EXIST
+ String fileName = "ResourcesServiceTest";
when(tenantMapper.queryById(Mockito.anyInt())).thenReturn(getTenant());
- when(storageOperate.getDir(ResourceType.ALL,
tenantCode)).thenReturn("/dolphinscheduler");
-
when(storageOperate.getResDir(getTenant().getTenantCode())).thenReturn("/dolphinscheduler/123/resources/");
-
when(storageOperate.getFileStatus("/dolphinscheduler/123/resources/ResourcesServiceTest",
- "/dolphinscheduler/123/resources/", tenantCode, null))
- .thenReturn(getStorageEntityResource());
- Result result = resourcesService.delete(loginUser,
"/dolphinscheduler/123/resources/ResNotExist", tenantCode);
+ when(storageOperate.getDir(ResourceType.ALL,
tenantCode)).thenReturn(basePath);
+
when(storageOperate.getResDir(getTenant().getTenantCode())).thenReturn(tenantFileResourceDir);
+ when(storageOperate.getFileStatus(tenantFileResourceDir + fileName,
tenantFileResourceDir, tenantCode, null))
+ .thenReturn(getStorageEntityResource(fileName));
+ Result result = resourcesService.delete(loginUser,
tenantFileResourceDir + "ResNotExist", tenantCode);
assertEquals(Status.RESOURCE_NOT_EXIST.getMsg(), result.getMsg());
// SUCCESS
loginUser.setTenantId(1);
- result = resourcesService.delete(loginUser,
"/dolphinscheduler/123/resources/ResourcesServiceTest", tenantCode);
+ result = resourcesService.delete(loginUser, tenantFileResourceDir +
fileName, tenantCode);
assertEquals(Status.SUCCESS.getMsg(), result.getMsg());
}
@Test
- public void testVerifyResourceName() {
-
+ public void testVerifyResourceName() throws IOException {
User user = new User();
user.setId(1);
user.setUserType(UserType.GENERAL_USER);
- try {
-
when(storageOperate.exists("/ResourcesServiceTest.jar")).thenReturn(true);
- } catch (IOException e) {
- logger.error("error occurred when checking resource:
/ResourcesServiceTest.jar\"");
- }
- Result result =
resourcesService.verifyResourceName("/ResourcesServiceTest.jar",
ResourceType.FILE, user);
- logger.info(result.toString());
+
+ String fileName = "ResourcesServiceTest";
+ when(storageOperate.exists(tenantFileResourceDir +
fileName)).thenReturn(true);
+
+ Result result =
resourcesService.verifyResourceName(tenantFileResourceDir + fileName,
ResourceType.FILE, user);
assertEquals(Status.RESOURCE_EXIST.getMsg(), result.getMsg());
// RESOURCE_FILE_EXIST
- result =
resourcesService.verifyResourceName("/ResourcesServiceTest.jar",
ResourceType.FILE, user);
- logger.info(result.toString());
+ result = resourcesService.verifyResourceName(tenantFileResourceDir +
fileName, ResourceType.FILE, user);
Assertions.assertTrue(Status.RESOURCE_EXIST.getCode() ==
result.getCode());
// SUCCESS
result = resourcesService.verifyResourceName("test2",
ResourceType.FILE, user);
- logger.info(result.toString());
assertEquals(Status.SUCCESS.getMsg(), result.getMsg());
-
}
@Test
@@ -441,8 +413,8 @@ public class ResourcesServiceTest {
// SUCCESS
when(FileUtils.getResourceViewSuffixes()).thenReturn("jar,sh");
- when(storageOperate.getDir(ResourceType.ALL,
tenantCode)).thenReturn("/dolphinscheduler");
-
when(storageOperate.getResDir(getTenant().getTenantCode())).thenReturn("/dolphinscheduler/123/resources/");
+ when(storageOperate.getDir(ResourceType.ALL,
tenantCode)).thenReturn(basePath);
+
when(storageOperate.getResDir(getTenant().getTenantCode())).thenReturn(tenantFileResourceDir);
when(userMapper.selectById(getUser().getId())).thenReturn(getUser());
when(tenantMapper.queryById(getUser().getTenantId())).thenReturn(getTenant());
when(storageOperate.exists(Mockito.any())).thenReturn(true);
@@ -465,15 +437,16 @@ public class ResourcesServiceTest {
exception.getMessage().contains("Not allow create or update
resources without extension name"));
// SUCCESS
-
when(storageOperate.getResDir(user.getTenantCode())).thenReturn("/dolphinscheduler/123/resources/");
+ String fileName = "ResourcesServiceTest";
+
when(storageOperate.getResDir(user.getTenantCode())).thenReturn(tenantFileResourceDir);
when(FileUtils.getUploadFilename(Mockito.anyString(),
Mockito.anyString())).thenReturn("test");
when(FileUtils.writeContent2File(Mockito.anyString(),
Mockito.anyString())).thenReturn(true);
when(storageOperate.getFileStatus(Mockito.anyString(),
Mockito.anyString(), Mockito.anyString(), Mockito.any()))
- .thenReturn(getStorageEntityResource());
+ .thenReturn(getStorageEntityResource(fileName));
StorageEntity storageEntity =
resourcesService.createOrUpdateResource(user.getUserName(),
"filename.txt", "my-content");
Assertions.assertNotNull(storageEntity);
- assertEquals("/dolphinscheduler/123/resources/ResourcesServiceTest",
storageEntity.getFullName());
+ assertEquals(tenantFileResourceDir + fileName,
storageEntity.getFullName());
}
@Test
@@ -482,33 +455,35 @@ public class ResourcesServiceTest {
when(userMapper.selectById(getUser().getId())).thenReturn(getUser());
when(tenantMapper.queryById(1)).thenReturn(getTenant());
when(storageOperate.getResDir(Mockito.anyString())).thenReturn("/tmp");
+
+ String fileName = "ResourcesServiceTest.jar";
ServiceException serviceException =
Assertions.assertThrows(ServiceException.class, () ->
resourcesService.updateResourceContent(getUser(),
-
"/dolphinscheduler/123/resources/ResourcesServiceTest.jar", tenantCode,
"content"));
- assertTrue(serviceException.getMessage()
- .contains("Resource file:
/dolphinscheduler/123/resources/ResourcesServiceTest.jar is illegal"));
+ tenantFileResourceDir + fileName, tenantCode,
"content"));
+ assertEquals(new ServiceException(Status.ILLEGAL_RESOURCE_PATH,
tenantFileResourceDir + fileName),
+ serviceException);
// RESOURCE_NOT_EXIST
- when(storageOperate.getDir(ResourceType.ALL,
tenantCode)).thenReturn("/dolphinscheduler");
-
when(storageOperate.getResDir(Mockito.anyString())).thenReturn("/dolphinscheduler/123/resources");
-
when(storageOperate.getFileStatus("/dolphinscheduler/123/resources/ResourcesServiceTest.jar",
"", tenantCode,
- ResourceType.FILE)).thenReturn(null);
- Result result = resourcesService.updateResourceContent(getUser(),
- "/dolphinscheduler/123/resources/ResourcesServiceTest.jar",
tenantCode, "content");
+ when(storageOperate.getDir(ResourceType.ALL,
tenantCode)).thenReturn(basePath);
+
when(storageOperate.getResDir(Mockito.anyString())).thenReturn(tenantFileResourceDir);
+ when(storageOperate.getFileStatus(tenantFileResourceDir + fileName,
"", tenantCode, ResourceType.FILE))
+ .thenReturn(null);
+ Result result = resourcesService.updateResourceContent(getUser(),
tenantFileResourceDir + fileName, tenantCode,
+ "content");
assertEquals(Status.RESOURCE_NOT_EXIST.getMsg(), result.getMsg());
// RESOURCE_SUFFIX_NOT_SUPPORT_VIEW
when(FileUtils.getResourceViewSuffixes()).thenReturn("class");
- when(storageOperate.getFileStatus("/dolphinscheduler/123/resources",
"", tenantCode, ResourceType.FILE))
- .thenReturn(getStorageEntityResource());
+ when(storageOperate.getFileStatus(tenantFileResourceDir, "",
tenantCode, ResourceType.FILE))
+ .thenReturn(getStorageEntityResource(fileName));
- result = resourcesService.updateResourceContent(getUser(),
"/dolphinscheduler/123/resources", tenantCode,
+ result = resourcesService.updateResourceContent(getUser(),
tenantFileResourceDir, tenantCode,
"content");
assertEquals(Status.RESOURCE_SUFFIX_NOT_SUPPORT_VIEW.getMsg(),
result.getMsg());
// USER_NOT_EXIST
when(userMapper.selectById(getUser().getId())).thenReturn(null);
- result = resourcesService.updateResourceContent(getUser(),
"/dolphinscheduler/123/resources/123.class",
+ result = resourcesService.updateResourceContent(getUser(),
tenantFileResourceDir + "123.class",
tenantCode,
"content");
Assertions.assertTrue(Status.USER_NOT_EXIST.getCode() ==
result.getCode());
@@ -517,11 +492,11 @@ public class ResourcesServiceTest {
when(userMapper.selectById(getUser().getId())).thenReturn(getUser());
when(tenantMapper.queryById(1)).thenReturn(null);
Assertions.assertThrows(ServiceException.class, () ->
resourcesService.updateResourceContent(getUser(),
- "/dolphinscheduler/123/resources/ResourcesServiceTest.jar",
tenantCode, "content"));
+ tenantFileResourceDir + fileName, tenantCode, "content"));
// SUCCESS
-
when(storageOperate.getFileStatus("/dolphinscheduler/123/resources/ResourcesServiceTest.jar",
"", tenantCode,
- ResourceType.FILE)).thenReturn(getStorageEntityResource());
+ when(storageOperate.getFileStatus(tenantFileResourceDir + fileName,
"", tenantCode,
+
ResourceType.FILE)).thenReturn(getStorageEntityResource(fileName));
when(Files.getFileExtension(Mockito.anyString())).thenReturn("jar");
when(FileUtils.getResourceViewSuffixes()).thenReturn("jar");
@@ -530,32 +505,25 @@ public class ResourcesServiceTest {
when(FileUtils.getUploadFilename(Mockito.anyString(),
Mockito.anyString())).thenReturn("test");
when(FileUtils.writeContent2File(Mockito.anyString(),
Mockito.anyString())).thenReturn(true);
result = resourcesService.updateResourceContent(getUser(),
- "/dolphinscheduler/123/resources/ResourcesServiceTest.jar",
tenantCode, "content");
- logger.info(result.toString());
+ tenantFileResourceDir + fileName, tenantCode, "content");
assertEquals(Status.SUCCESS.getMsg(), result.getMsg());
}
@Test
- public void testDownloadResource() {
+ public void testDownloadResource() throws IOException {
when(tenantMapper.queryById(1)).thenReturn(getTenant());
when(userMapper.selectById(1)).thenReturn(getUser());
org.springframework.core.io.Resource resourceMock =
Mockito.mock(org.springframework.core.io.Resource.class);
Path path = Mockito.mock(Path.class);
when(Paths.get(Mockito.any())).thenReturn(path);
- try {
- when(java.nio.file.Files.size(Mockito.any())).thenReturn(1L);
- // resource null
- org.springframework.core.io.Resource resource =
resourcesService.downloadResource(getUser(), "");
- Assertions.assertNull(resource);
-
-
when(org.apache.dolphinscheduler.api.utils.FileUtils.file2Resource(Mockito.any())).thenReturn(resourceMock);
- resource = resourcesService.downloadResource(getUser(), "");
- Assertions.assertNotNull(resource);
- } catch (Exception e) {
- logger.error("DownloadResource error", e);
- Assertions.assertTrue(false);
- }
-
+ when(java.nio.file.Files.size(Mockito.any())).thenReturn(1L);
+ // resource null
+ org.springframework.core.io.Resource resource =
resourcesService.downloadResource(getUser(), "");
+ Assertions.assertNull(resource);
+
+
when(org.apache.dolphinscheduler.api.utils.FileUtils.file2Resource(Mockito.any())).thenReturn(resourceMock);
+ resource = resourcesService.downloadResource(getUser(), "");
+ Assertions.assertNotNull(resource);
}
@Test
@@ -605,30 +573,21 @@ public class ResourcesServiceTest {
}
@Test
- public void testCatFile() {
+ public void testCatFile() throws IOException {
// SUCCESS
- try {
- List<String> list = storageOperate.vimFile(Mockito.any(),
Mockito.anyString(), eq(1), eq(10));
- Assertions.assertNotNull(list);
-
- } catch (IOException e) {
- logger.error("hadoop error", e);
- }
+ List<String> list = storageOperate.vimFile(Mockito.any(),
Mockito.anyString(), eq(1), eq(10));
+ Assertions.assertNotNull(list);
}
@Test
- void testQueryBaseDir() {
+ void testQueryBaseDir() throws Exception {
User user = getUser();
+ String fileName = "ResourcesServiceTest.jar";
when(userMapper.selectById(user.getId())).thenReturn(getUser());
when(tenantMapper.queryById(user.getTenantId())).thenReturn(getTenant());
- when(storageOperate.getDir(ResourceType.FILE,
tenantCode)).thenReturn("/dolphinscheduler/123/resources/");
- try {
- when(storageOperate.getFileStatus(Mockito.anyString(),
Mockito.anyString(), Mockito.anyString(),
- Mockito.any())).thenReturn(getStorageEntityResource());
- } catch (Exception e) {
- logger.error(e.getMessage() + " Resource path: {}",
"/dolphinscheduler/123/resources/ResourcesServiceTest",
- e);
- }
+ when(storageOperate.getDir(ResourceType.FILE,
tenantCode)).thenReturn(tenantFileResourceDir);
+ when(storageOperate.getFileStatus(Mockito.anyString(),
Mockito.anyString(), Mockito.anyString(),
+ Mockito.any())).thenReturn(getStorageEntityResource(fileName));
Result<Object> result = resourcesService.queryResourceBaseDir(user,
ResourceType.FILE);
assertEquals(Status.SUCCESS.getMsg(), result.getMsg());
}
@@ -648,25 +607,25 @@ public class ResourcesServiceTest {
return user;
}
- private StorageEntity getStorageEntityResource() {
+ private StorageEntity getStorageEntityResource(String fileName) {
StorageEntity entity = new StorageEntity();
- entity.setAlias("ResourcesServiceTest");
- entity.setFileName("ResourcesServiceTest");
+ entity.setAlias(fileName);
+ entity.setFileName(fileName);
entity.setDirectory(false);
entity.setUserName(tenantCode);
entity.setType(ResourceType.FILE);
-
entity.setFullName("/dolphinscheduler/123/resources/ResourcesServiceTest");
+ entity.setFullName(tenantFileResourceDir + fileName);
return entity;
}
- private StorageEntity getStorageEntityUdfResource() {
+ private StorageEntity getStorageEntityUdfResource(String fileName) {
StorageEntity entity = new StorageEntity();
- entity.setAlias("ResourcesServiceTest1.jar");
- entity.setFileName("ResourcesServiceTest1.jar");
+ entity.setAlias(fileName);
+ entity.setFileName(fileName);
entity.setDirectory(false);
entity.setUserName(tenantCode);
entity.setType(ResourceType.UDF);
-
entity.setFullName("/dolphinscheduler/123/resources/ResourcesServiceTest1.jar");
+ entity.setFullName(tenantUdfResourceDir + fileName);
return entity;
}