This is an automated email from the ASF dual-hosted git repository.
zhongjiajie 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 181cd2ff79 [Feature] Add CURD to the project/tenant/user section of
the API and add its tests. (#10913)
181cd2ff79 is described below
commit 181cd2ff791822e5cb90a4e8897c80eea1c0ae56
Author: Lyle Shaw <[email protected]>
AuthorDate: Wed Jul 27 14:33:33 2022 +0800
[Feature] Add CURD to the project/tenant/user section of the API and add
its tests. (#10913)
---
.../dolphinscheduler/api/python/PythonGateway.java | 51 ++++++++++++--
.../dolphinscheduler/api/service/UsersService.java | 18 +++++
.../api/service/impl/UsersServiceImpl.java | 32 ++++++++-
.../api/service/UsersServiceTest.java | 80 +++++++++++++++++-----
4 files changed, 156 insertions(+), 25 deletions(-)
diff --git
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/python/PythonGateway.java
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/python/PythonGateway.java
index e3aecec9be..57e289137a 100644
---
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/python/PythonGateway.java
+++
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/python/PythonGateway.java
@@ -17,6 +17,7 @@
package org.apache.dolphinscheduler.api.python;
+import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Date;
@@ -391,23 +392,61 @@ public class PythonGateway {
}
}
+ public Project queryProjectByName(String userName, String projectName) {
+ User user = usersService.queryUser(userName);
+ return (Project) projectService.queryByName(user, projectName);
+ }
+
+ public void updateProject(String userName, Long projectCode, String
projectName, String desc) {
+ User user = usersService.queryUser(userName);
+ projectService.update(user, projectCode, projectName, desc, userName);
+ }
+
+ public void deleteProject(String userName, Long projectCode) {
+ User user = usersService.queryUser(userName);
+ projectService.deleteProject(user, projectCode);
+ }
+
public Tenant createTenant(String tenantCode, String desc, String
queueName) {
return tenantService.createTenantIfNotExists(tenantCode, desc,
queueName, queueName);
}
+ public Result queryTenantList(String userName, String searchVal, Integer
pageNo, Integer pageSize) {
+ User user = usersService.queryUser(userName);
+ return tenantService.queryTenantList(user, searchVal, pageNo,
pageSize);
+ }
+
+ public void updateTenant(String userName, int id, String tenantCode, int
queueId, String desc) throws Exception {
+ User user = usersService.queryUser(userName);
+ tenantService.updateTenant(user, id, tenantCode, queueId, desc);
+ }
+
+ public void deleteTenantById(String userName, Integer tenantId) throws
Exception {
+ User user = usersService.queryUser(userName);
+ tenantService.deleteTenantById(user, tenantId);
+ }
+
public void createUser(String userName,
String userPassword,
String email,
String phone,
String tenantCode,
String queue,
- int state) {
+ int state) throws IOException {
+ usersService.createUserIfNotExists(userName, userPassword, email,
phone, tenantCode, queue, state);
+ }
+
+ public User queryUser(int id) {
+ return usersService.queryUser(id);
+ }
+
+ public void updateUser(String userName, String userPassword, String email,
String phone, String tenantCode, String queue, int state) throws Exception {
+ usersService.createUserIfNotExists(userName, userPassword, email,
phone, tenantCode, queue, state);
+ }
+
+ public void deleteUser(String userName, int id) throws Exception {
User user = usersService.queryUser(userName);
- if (Objects.isNull(user)) {
- Map<String, Object> tenantResult =
tenantService.queryByTenantCode(tenantCode);
- Tenant tenant = (Tenant) tenantResult.get(Constants.DATA_LIST);
- usersService.createUser(userName, userPassword, email,
tenant.getId(), phone, queue, state);
- }
+ usersService.deleteUserById(user, id);
}
/**
diff --git
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/UsersService.java
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/UsersService.java
index 4a2afe547f..b4555ad505 100644
---
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/UsersService.java
+++
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/UsersService.java
@@ -297,4 +297,22 @@ public interface UsersService {
* @return create result code
*/
Map<String, Object> batchActivateUser(User loginUser, List<String>
userNames);
+
+ /**
+ * Make sure user with given name exists, and create the user if not exists
+ * <p>
+ * ONLY for python gateway server, and should not use this in web ui
function
+ *
+ * @param userName user name
+ * @param userPassword user password
+ * @param email user email
+ * @param phone user phone
+ * @param tenantCode tenant code
+ * @param queue queue
+ * @param state state
+ * @return create result code
+ */
+ User createUserIfNotExists(String userName, String userPassword, String
email, String phone, String tenantCode,
+ String queue,
+ int state) throws IOException;
}
diff --git
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/UsersServiceImpl.java
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/UsersServiceImpl.java
index bb6710155c..a354ada64a 100644
---
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/UsersServiceImpl.java
+++
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/UsersServiceImpl.java
@@ -77,10 +77,10 @@ import java.util.Map;
import java.util.Set;
import java.util.TimeZone;
import java.util.Arrays;
+import java.util.Objects;
import java.util.stream.Collectors;
import static
org.apache.dolphinscheduler.api.constants.ApiFuncIdentificationConstant.USER_MANAGER;
-import static
org.apache.dolphinscheduler.common.Constants.USER_PASSWORD_MAX_LENGTH;
/**
* users service impl
@@ -1344,4 +1344,34 @@ public class UsersServiceImpl extends BaseServiceImpl
implements UsersService {
result.put(Constants.DATA_LIST, res);
return result;
}
+
+ /**
+ * Make sure user with given name exists, and create the user if not exists
+ * <p>
+ * ONLY for python gateway server, and should not use this in web ui
function
+ *
+ * @param userName user name
+ * @param userPassword user password
+ * @param email user email
+ * @param phone user phone
+ * @param tenantCode tenant code
+ * @param queue queue
+ * @param state state
+ * @return create result code
+ */
+ @Override
+ @Transactional
+ public User createUserIfNotExists(String userName, String userPassword,
String email, String phone, String tenantCode,
+ String queue,
+ int state) throws IOException {
+ User user = userMapper.queryByUserNameAccurately(userName);
+ if (Objects.isNull(user)) {
+ Tenant tenant = tenantMapper.queryByTenantCode(tenantCode);
+ user = createUser(userName, userPassword, email, tenant.getId(),
phone, queue, state);
+ return user;
+ }
+
+ updateUser(user, user.getId(), userName, userPassword, email,
user.getTenantId(), phone, queue, state, null);
+ return user;
+ }
}
diff --git
a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/UsersServiceTest.java
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/UsersServiceTest.java
index 0ae19eeffe..183b193524 100644
---
a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/UsersServiceTest.java
+++
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/UsersServiceTest.java
@@ -17,11 +17,14 @@
package org.apache.dolphinscheduler.api.service;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.google.common.collect.Lists;
-import org.apache.commons.collections.CollectionUtils;
+import static
org.apache.dolphinscheduler.api.constants.ApiFuncIdentificationConstant.USER_MANAGER;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.when;
+
import org.apache.dolphinscheduler.api.enums.Status;
+import
org.apache.dolphinscheduler.api.permission.ResourcePermissionCheckService;
import org.apache.dolphinscheduler.api.service.impl.BaseServiceImpl;
import org.apache.dolphinscheduler.api.service.impl.UsersServiceImpl;
import org.apache.dolphinscheduler.api.utils.PageInfo;
@@ -31,10 +34,31 @@ import
org.apache.dolphinscheduler.common.enums.AuthorizationType;
import org.apache.dolphinscheduler.common.enums.UserType;
import org.apache.dolphinscheduler.common.storage.StorageOperate;
import org.apache.dolphinscheduler.common.utils.EncryptionUtils;
-import org.apache.dolphinscheduler.dao.entity.*;
-import org.apache.dolphinscheduler.dao.mapper.*;
-import
org.apache.dolphinscheduler.api.permission.ResourcePermissionCheckService;
+import org.apache.dolphinscheduler.dao.entity.AlertGroup;
+import org.apache.dolphinscheduler.dao.entity.Project;
+import org.apache.dolphinscheduler.dao.entity.Resource;
+import org.apache.dolphinscheduler.dao.entity.Tenant;
+import org.apache.dolphinscheduler.dao.entity.User;
+import org.apache.dolphinscheduler.dao.mapper.AccessTokenMapper;
+import org.apache.dolphinscheduler.dao.mapper.AlertGroupMapper;
+import org.apache.dolphinscheduler.dao.mapper.DataSourceUserMapper;
+import org.apache.dolphinscheduler.dao.mapper.K8sNamespaceUserMapper;
+import org.apache.dolphinscheduler.dao.mapper.ProjectMapper;
+import org.apache.dolphinscheduler.dao.mapper.ProjectUserMapper;
+import org.apache.dolphinscheduler.dao.mapper.ResourceMapper;
+import org.apache.dolphinscheduler.dao.mapper.ResourceUserMapper;
+import org.apache.dolphinscheduler.dao.mapper.TenantMapper;
+import org.apache.dolphinscheduler.dao.mapper.UDFUserMapper;
+import org.apache.dolphinscheduler.dao.mapper.UserMapper;
import org.apache.dolphinscheduler.spi.enums.ResourceType;
+
+import org.apache.commons.collections.CollectionUtils;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
@@ -47,14 +71,9 @@ import org.mockito.junit.MockitoJUnitRunner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-import static
org.apache.dolphinscheduler.api.constants.ApiFuncIdentificationConstant.USER_MANAGER;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.when;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.google.common.collect.Lists;
/**
* users service test
@@ -234,14 +253,14 @@ public class UsersServiceTest {
user.setId(1);
//no operate
-
Mockito.when(resourcePermissionCheckService.operationPermissionCheck(AuthorizationType.ACCESS_TOKEN,1,
USER_MANAGER, serviceLogger)).thenReturn(true);
+
Mockito.when(resourcePermissionCheckService.operationPermissionCheck(AuthorizationType.ACCESS_TOKEN,
1, USER_MANAGER, serviceLogger)).thenReturn(true);
Mockito.when(resourcePermissionCheckService.resourcePermissionCheck(AuthorizationType.ACCESS_TOKEN,
null, 0, serviceLogger)).thenReturn(false);
Map<String, Object> result = usersService.queryUserList(user);
logger.info(result.toString());
Assert.assertEquals(Status.USER_NO_OPERATION_PERM,
result.get(Constants.STATUS));
//success
-
Mockito.when(resourcePermissionCheckService.operationPermissionCheck(AuthorizationType.ACCESS_TOKEN,1,
USER_MANAGER, serviceLogger)).thenReturn(true);
+
Mockito.when(resourcePermissionCheckService.operationPermissionCheck(AuthorizationType.ACCESS_TOKEN,
1, USER_MANAGER, serviceLogger)).thenReturn(true);
Mockito.when(resourcePermissionCheckService.resourcePermissionCheck(AuthorizationType.ACCESS_TOKEN,
null, 0, serviceLogger)).thenReturn(true);
user.setUserType(UserType.ADMIN_USER);
when(userMapper.selectList(null)).thenReturn(getUserList());
@@ -465,7 +484,7 @@ public class UsersServiceTest {
logger.info(result.toString());
Assert.assertEquals(Status.USER_NOT_EXIST,
result.get(Constants.STATUS));
//success
-
when(k8sNamespaceUserMapper.deleteNamespaceRelation(0,1)).thenReturn(1);
+ when(k8sNamespaceUserMapper.deleteNamespaceRelation(0,
1)).thenReturn(1);
result = usersService.grantNamespaces(loginUser, 1, namespaceIds);
logger.info(result.toString());
Assert.assertEquals(Status.SUCCESS, result.get(Constants.STATUS));
@@ -706,6 +725,30 @@ public class UsersServiceTest {
}
}
+ @Test
+ public void testCreateUserIfNotExists() throws IOException {
+ User user;
+ String userName = "userTest0001";
+ String userPassword = "userTest";
+ String email = "[email protected]";
+ String phone = "123456789";
+ String tenantCode = "tenantCode";
+ int stat = 1;
+
+ // User exists
+ Mockito.when(userMapper.existUser(userName)).thenReturn(true);
+
Mockito.when(userMapper.queryByUserNameAccurately(userName)).thenReturn(getUser());
+
Mockito.when(tenantMapper.queryByTenantCode(tenantCode)).thenReturn(getTenant());
+ user = usersService.createUserIfNotExists(userName, userPassword,
email, phone, tenantCode, queueName, stat);
+ Assert.assertEquals(getUser(), user);
+
+ // User not exists
+ Mockito.when(userMapper.existUser(userName)).thenReturn(false);
+
Mockito.when(tenantMapper.queryByTenantCode(tenantCode)).thenReturn(getTenant());
+ user = usersService.createUserIfNotExists(userName, userPassword,
email, phone, tenantCode, queueName, stat);
+ Assert.assertNotNull(user);
+ }
+
/**
* get disabled user
*/
@@ -720,6 +763,7 @@ public class UsersServiceTest {
/**
* Get project
+ *
* @return
*/
private Project getProject() {