From 181cd2ff791822e5cb90a4e8897c80eea1c0ae56 Mon Sep 17 00:00:00 2001 From: Lyle Shaw Date: Wed, 27 Jul 2022 14:33:33 +0800 Subject: [PATCH] [Feature] Add CURD to the project/tenant/user section of the API and add its tests. (#10913) --- .../api/python/PythonGateway.java | 51 ++++++++++-- .../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 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 batchActivateUser(User loginUser, List userNames); + + /** + * Make sure user with given name exists, and create the user if not exists + *

+ * 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 + *

+ * 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 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 = "abc@x.com"; + 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() {