break60 5 years ago
parent
commit
fd250ff3d3
  1. 2
      dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/ProcessInstanceController.java
  2. 3
      dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/dto/ProcessMeta.java
  3. 36
      dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/dto/TaskCountDto.java
  4. 13
      dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/ProcessDefinitionService.java
  5. 15
      dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/ProcessInstanceService.java
  6. 4
      dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/TaskInstanceService.java
  7. 4
      dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/TaskRecordService.java
  8. 4
      dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/TenantService.java
  9. 2
      dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/WorkerGroupService.java
  10. 2
      dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/LoginControllerTest.java
  11. 2
      dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/TaskRecordControllerTest.java
  12. 2
      dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/UsersControllerTest.java
  13. 2
      dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/enums/TaskStateType.java
  14. 6
      dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/model/TaskNode.java
  15. 36
      dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/thread/ThreadPoolExecutors.java
  16. 103
      dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/ConnectionUtils.java
  17. 8
      dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/placeholder/TimePlaceholderUtils.java
  18. 20
      dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/process/ProcessEnvironmentForWin32.java
  19. 113
      dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/process/ProcessImplForWin32.java
  20. 8
      dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/AlertDao.java
  21. 10
      dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/MonitorDBDao.java
  22. 39
      dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/TaskRecordDao.java
  23. 109
      dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/datasource/BaseDataSource.java
  24. 47
      dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/datasource/ClickHouseDataSource.java
  25. 14
      dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/datasource/ConnectionFactory.java
  26. 46
      dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/datasource/DB2ServerDataSource.java
  27. 51
      dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/datasource/HiveDataSource.java
  28. 44
      dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/datasource/MySQLDataSource.java
  29. 47
      dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/datasource/OracleDataSource.java
  30. 49
      dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/datasource/PostgreDataSource.java
  31. 61
      dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/datasource/SQLServerDataSource.java
  32. 52
      dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/datasource/SparkDataSource.java
  33. 2
      dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/ProcessInstance.java
  34. 4
      dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/upgrade/MysqlUpgradeDao.java
  35. 4
      dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/upgrade/PostgresqlUpgradeDao.java
  36. 24
      dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/upgrade/UpgradeDao.java
  37. 35
      dolphinscheduler-dao/src/test/java/org/apache/dolphinscheduler/dao/AlertDaoTest.java
  38. 115
      dolphinscheduler-dao/src/test/java/org/apache/dolphinscheduler/dao/datasource/BaseDataSourceTest.java
  39. 2
      dolphinscheduler-dao/src/test/java/org/apache/dolphinscheduler/dao/mapper/ConnectionFactoryTest.java
  40. 6
      dolphinscheduler-dao/src/test/java/org/apache/dolphinscheduler/dao/mapper/ProcessInstanceMapMapperTest.java
  41. 14
      dolphinscheduler-dao/src/test/java/org/apache/dolphinscheduler/dao/mapper/ProcessInstanceMapperTest.java
  42. 4
      dolphinscheduler-dao/src/test/java/org/apache/dolphinscheduler/dao/mapper/TaskInstanceMapperTest.java
  43. 4
      dolphinscheduler-dao/src/test/java/org/apache/dolphinscheduler/dao/mapper/TenantMapperTest.java
  44. 4
      dolphinscheduler-dao/src/test/java/org/apache/dolphinscheduler/dao/mapper/WorkerGroupMapperTest.java
  45. 2
      dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/master/runner/MasterExecThread.java
  46. 18
      dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/worker/WorkerServer.java
  47. 2
      dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/worker/runner/TaskScheduleThread.java
  48. 9
      dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/worker/task/shell/ShellTask.java
  49. 22
      dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/worker/task/sql/SqlTask.java
  50. 6
      dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/queue/TaskQueueZkImpl.java
  51. 24
      dolphinscheduler-service/src/test/java/org/apache/dolphinscheduler/service/queue/TaskQueueZKImplTest.java
  52. 8
      e2e/src/main/java/org/apache/dolphinscheduler/constant/TestConstant.java
  53. 4
      e2e/src/main/java/org/apache/dolphinscheduler/util/RedisUtil.java
  54. 16
      e2e/src/test/java/org/apache/dolphinscheduler/base/BaseDriver.java
  55. 34
      e2e/src/test/java/org/apache/dolphinscheduler/common/BrowserCommon.java
  56. 46
      e2e/src/test/java/org/apache/dolphinscheduler/data/project/CreatWorkflowData.java
  57. 2
      e2e/src/test/java/org/apache/dolphinscheduler/data/project/CreateProjectData.java
  58. 8
      e2e/src/test/java/org/apache/dolphinscheduler/data/project/CreateWorkflowData.java
  59. 8
      e2e/src/test/java/org/apache/dolphinscheduler/data/security/TenantManageData.java
  60. 2
      e2e/src/test/java/org/apache/dolphinscheduler/data/security/UserManageData.java
  61. 15
      e2e/src/test/java/org/apache/dolphinscheduler/locator/project/CreateProjectLocator.java
  62. 11
      e2e/src/test/java/org/apache/dolphinscheduler/locator/project/CreateWorkflowLocator.java
  63. 2
      e2e/src/test/java/org/apache/dolphinscheduler/locator/security/TenantManageLocator.java
  64. 3
      e2e/src/test/java/org/apache/dolphinscheduler/page/LoginPage.java
  65. 33
      e2e/src/test/java/org/apache/dolphinscheduler/page/project/CreateProjectPage.java
  66. 41
      e2e/src/test/java/org/apache/dolphinscheduler/page/project/CreateWorkflowPage.java
  67. 28
      e2e/src/test/java/org/apache/dolphinscheduler/page/security/TenantManagePage.java
  68. 6
      e2e/src/test/java/org/apache/dolphinscheduler/page/security/UserManagePage.java
  69. 1
      e2e/src/test/java/org/apache/dolphinscheduler/testcase/LoginTest.java
  70. 39
      e2e/src/test/java/org/apache/dolphinscheduler/testcase/deleteData/DeleteProjectTest.java
  71. 7
      e2e/src/test/java/org/apache/dolphinscheduler/testcase/deleteData/DeleteTenantTest.java
  72. 8
      e2e/src/test/java/org/apache/dolphinscheduler/testcase/deleteData/DeleteUserTest.java
  73. 43
      e2e/src/test/java/org/apache/dolphinscheduler/testcase/deleteData/DeleteWorkflowTest.java
  74. 3
      e2e/src/test/java/org/apache/dolphinscheduler/testcase/project/CreateProjectTest.java
  75. 6
      e2e/src/test/java/org/apache/dolphinscheduler/testcase/project/CreateWorkflowTest.java
  76. 5
      e2e/src/test/java/org/apache/dolphinscheduler/testcase/security/TenantManageTest.java
  77. 2
      e2e/src/test/java/org/apache/dolphinscheduler/testcase/security/UserManageTest.java
  78. 10
      e2e/testng.xml
  79. 1
      pom.xml

2
dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/ProcessInstanceController.java

@ -391,7 +391,7 @@ public class ProcessInstanceController extends BaseController{
} }
} }
} }
if(deleteFailedIdList.size() > 0){ if(!deleteFailedIdList.isEmpty()){
putMsg(result, Status.BATCH_DELETE_PROCESS_INSTANCE_BY_IDS_ERROR, String.join(",", deleteFailedIdList)); putMsg(result, Status.BATCH_DELETE_PROCESS_INSTANCE_BY_IDS_ERROR, String.join(",", deleteFailedIdList));
}else{ }else{
putMsg(result, Status.SUCCESS); putMsg(result, Status.SUCCESS);

3
dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/dto/ProcessMeta.java

@ -106,9 +106,6 @@ public class ProcessMeta {
*/ */
private String scheduleWorkerGroupName; private String scheduleWorkerGroupName;
public ProcessMeta() {
}
public String getProjectName() { public String getProjectName() {
return projectName; return projectName;
} }

36
dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/dto/TaskCountDto.java

@ -43,36 +43,36 @@ public class TaskCountDto {
} }
private void countTaskDtos(List<ExecuteStatusCount> taskInstanceStateCounts){ private void countTaskDtos(List<ExecuteStatusCount> taskInstanceStateCounts){
int submitted_success = 0; int submittedSuccess = 0;
int running_exeution = 0; int runningExeution = 0;
int ready_pause = 0; int readyPause = 0;
int pause = 0; int pause = 0;
int ready_stop = 0; int readyStop = 0;
int stop = 0; int stop = 0;
int failure = 0; int failure = 0;
int success = 0; int success = 0;
int need_fault_tolerance = 0; int needFaultTolerance = 0;
int kill = 0; int kill = 0;
int waitting_thread = 0; int waittingThread = 0;
for(ExecuteStatusCount taskInstanceStateCount : taskInstanceStateCounts){ for(ExecuteStatusCount taskInstanceStateCount : taskInstanceStateCounts){
ExecutionStatus status = taskInstanceStateCount.getExecutionStatus(); ExecutionStatus status = taskInstanceStateCount.getExecutionStatus();
totalCount += taskInstanceStateCount.getCount(); totalCount += taskInstanceStateCount.getCount();
switch (status){ switch (status){
case SUBMITTED_SUCCESS: case SUBMITTED_SUCCESS:
submitted_success += taskInstanceStateCount.getCount(); submittedSuccess += taskInstanceStateCount.getCount();
break; break;
case RUNNING_EXEUTION: case RUNNING_EXEUTION:
running_exeution += taskInstanceStateCount.getCount(); runningExeution += taskInstanceStateCount.getCount();
break; break;
case READY_PAUSE: case READY_PAUSE:
ready_pause += taskInstanceStateCount.getCount(); readyPause += taskInstanceStateCount.getCount();
break; break;
case PAUSE: case PAUSE:
pause += taskInstanceStateCount.getCount(); pause += taskInstanceStateCount.getCount();
break; break;
case READY_STOP: case READY_STOP:
ready_stop += taskInstanceStateCount.getCount(); readyStop += taskInstanceStateCount.getCount();
break; break;
case STOP: case STOP:
stop += taskInstanceStateCount.getCount(); stop += taskInstanceStateCount.getCount();
@ -84,13 +84,13 @@ public class TaskCountDto {
success += taskInstanceStateCount.getCount(); success += taskInstanceStateCount.getCount();
break; break;
case NEED_FAULT_TOLERANCE: case NEED_FAULT_TOLERANCE:
need_fault_tolerance += taskInstanceStateCount.getCount(); needFaultTolerance += taskInstanceStateCount.getCount();
break; break;
case KILL: case KILL:
kill += taskInstanceStateCount.getCount(); kill += taskInstanceStateCount.getCount();
break; break;
case WAITTING_THREAD: case WAITTING_THREAD:
waitting_thread += taskInstanceStateCount.getCount(); waittingThread += taskInstanceStateCount.getCount();
break; break;
default: default:
@ -98,17 +98,17 @@ public class TaskCountDto {
} }
} }
this.taskCountDtos = new ArrayList<>(); this.taskCountDtos = new ArrayList<>();
this.taskCountDtos.add(new TaskStateCount(ExecutionStatus.SUBMITTED_SUCCESS, submitted_success)); this.taskCountDtos.add(new TaskStateCount(ExecutionStatus.SUBMITTED_SUCCESS, submittedSuccess));
this.taskCountDtos.add(new TaskStateCount(ExecutionStatus.RUNNING_EXEUTION, running_exeution)); this.taskCountDtos.add(new TaskStateCount(ExecutionStatus.RUNNING_EXEUTION, runningExeution));
this.taskCountDtos.add(new TaskStateCount(ExecutionStatus.READY_PAUSE, ready_pause)); this.taskCountDtos.add(new TaskStateCount(ExecutionStatus.READY_PAUSE, readyPause));
this.taskCountDtos.add(new TaskStateCount(ExecutionStatus.PAUSE, pause)); this.taskCountDtos.add(new TaskStateCount(ExecutionStatus.PAUSE, pause));
this.taskCountDtos.add(new TaskStateCount(ExecutionStatus.READY_STOP, ready_stop)); this.taskCountDtos.add(new TaskStateCount(ExecutionStatus.READY_STOP, readyStop));
this.taskCountDtos.add(new TaskStateCount(ExecutionStatus.STOP, stop)); this.taskCountDtos.add(new TaskStateCount(ExecutionStatus.STOP, stop));
this.taskCountDtos.add(new TaskStateCount(ExecutionStatus.FAILURE, failure)); this.taskCountDtos.add(new TaskStateCount(ExecutionStatus.FAILURE, failure));
this.taskCountDtos.add(new TaskStateCount(ExecutionStatus.SUCCESS, success)); this.taskCountDtos.add(new TaskStateCount(ExecutionStatus.SUCCESS, success));
this.taskCountDtos.add(new TaskStateCount(ExecutionStatus.NEED_FAULT_TOLERANCE, need_fault_tolerance)); this.taskCountDtos.add(new TaskStateCount(ExecutionStatus.NEED_FAULT_TOLERANCE, needFaultTolerance));
this.taskCountDtos.add(new TaskStateCount(ExecutionStatus.KILL, kill)); this.taskCountDtos.add(new TaskStateCount(ExecutionStatus.KILL, kill));
this.taskCountDtos.add(new TaskStateCount(ExecutionStatus.WAITTING_THREAD, waitting_thread)); this.taskCountDtos.add(new TaskStateCount(ExecutionStatus.WAITTING_THREAD, waittingThread));
} }

13
dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/ProcessDefinitionService.java

@ -148,7 +148,7 @@ public class ProcessDefinitionService extends BaseDAGService {
//custom global params //custom global params
List<Property> globalParamsList = processData.getGlobalParams(); List<Property> globalParamsList = processData.getGlobalParams();
if (globalParamsList != null && globalParamsList.size() > 0) { if (CollectionUtils.isNotEmpty(globalParamsList)) {
Set<Property> globalParamsSet = new HashSet<>(globalParamsList); Set<Property> globalParamsSet = new HashSet<>(globalParamsList);
globalParamsList = new ArrayList<>(globalParamsSet); globalParamsList = new ArrayList<>(globalParamsSet);
processDefine.setGlobalParamList(globalParamsList); processDefine.setGlobalParamList(globalParamsList);
@ -314,7 +314,7 @@ public class ProcessDefinitionService extends BaseDAGService {
//custom global params //custom global params
List<Property> globalParamsList = new ArrayList<>(); List<Property> globalParamsList = new ArrayList<>();
if (processData.getGlobalParams() != null && processData.getGlobalParams().size() > 0) { if (CollectionUtils.isNotEmpty(processData.getGlobalParams())) {
Set<Property> userDefParamsSet = new HashSet<>(processData.getGlobalParams()); Set<Property> userDefParamsSet = new HashSet<>(processData.getGlobalParams());
globalParamsList = new ArrayList<>(userDefParamsSet); globalParamsList = new ArrayList<>(userDefParamsSet);
} }
@ -453,12 +453,11 @@ public class ProcessDefinitionService extends BaseDAGService {
ProcessDefinition processDefinition = processDefineMapper.selectById(id); ProcessDefinition processDefinition = processDefineMapper.selectById(id);
switch (state) { switch (state) {
case ONLINE: { case ONLINE:
processDefinition.setReleaseState(state); processDefinition.setReleaseState(state);
processDefineMapper.updateById(processDefinition); processDefineMapper.updateById(processDefinition);
break; break;
} case OFFLINE:
case OFFLINE: {
processDefinition.setReleaseState(state); processDefinition.setReleaseState(state);
processDefineMapper.updateById(processDefinition); processDefineMapper.updateById(processDefinition);
List<Schedule> scheduleList = scheduleMapper.selectAllByProcessDefineArray( List<Schedule> scheduleList = scheduleMapper.selectAllByProcessDefineArray(
@ -473,11 +472,9 @@ public class ProcessDefinitionService extends BaseDAGService {
SchedulerService.deleteSchedule(project.getId(), schedule.getId()); SchedulerService.deleteSchedule(project.getId(), schedule.getId());
} }
break; break;
} default:
default: {
putMsg(result, Status.REQUEST_PARAMS_NOT_VALID_ERROR, "releaseState"); putMsg(result, Status.REQUEST_PARAMS_NOT_VALID_ERROR, "releaseState");
return result; return result;
}
} }
putMsg(result, Status.SUCCESS); putMsg(result, Status.SUCCESS);

15
dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/ProcessInstanceService.java

@ -239,7 +239,7 @@ public class ProcessInstanceService extends BaseDAGService {
} }
ProcessInstance processInstance = processService.findProcessInstanceDetailById(processId); ProcessInstance processInstance = processService.findProcessInstanceDetailById(processId);
List<TaskInstance> taskInstanceList = processService.findValidTaskListByProcessId(processId); List<TaskInstance> taskInstanceList = processService.findValidTaskListByProcessId(processId);
AddDependResultForTaskList(taskInstanceList); addDependResultForTaskList(taskInstanceList);
Map<String, Object> resultMap = new HashMap<>(); Map<String, Object> resultMap = new HashMap<>();
resultMap.put(PROCESS_INSTANCE_STATE, processInstance.getState().toString()); resultMap.put(PROCESS_INSTANCE_STATE, processInstance.getState().toString());
resultMap.put(TASK_LIST, taskInstanceList); resultMap.put(TASK_LIST, taskInstanceList);
@ -253,9 +253,9 @@ public class ProcessInstanceService extends BaseDAGService {
* add dependent result for dependent task * add dependent result for dependent task
* @param taskInstanceList * @param taskInstanceList
*/ */
private void AddDependResultForTaskList(List<TaskInstance> taskInstanceList) throws IOException { private void addDependResultForTaskList(List<TaskInstance> taskInstanceList) throws IOException {
for(TaskInstance taskInstance: taskInstanceList){ for(TaskInstance taskInstance: taskInstanceList){
if(taskInstance.getTaskType().toUpperCase().equals(TaskType.DEPENDENT.toString())){ if(taskInstance.getTaskType().equalsIgnoreCase(TaskType.DEPENDENT.toString())){
Result logResult = loggerService.queryLog( Result logResult = loggerService.queryLog(
taskInstance.getId(), 0, 4098); taskInstance.getId(), 0, 4098);
if(logResult.getCode() == Status.SUCCESS.ordinal()){ if(logResult.getCode() == Status.SUCCESS.ordinal()){
@ -414,11 +414,10 @@ public class ProcessInstanceService extends BaseDAGService {
processInstance.setProcessInstanceJson(processInstanceJson); processInstance.setProcessInstanceJson(processInstanceJson);
processInstance.setGlobalParams(globalParams); processInstance.setGlobalParams(globalParams);
} }
// int update = processDao.updateProcessInstance(processInstanceId, processInstanceJson,
// globalParams, schedule, flag, locations, connects);
int update = processService.updateProcessInstance(processInstance); int update = processService.updateProcessInstance(processInstance);
int updateDefine = 1; int updateDefine = 1;
if (syncDefine && StringUtils.isNotEmpty(processInstanceJson)) { if (Boolean.TRUE.equals(syncDefine) && StringUtils.isNotEmpty(processInstanceJson)) {
processDefinition.setProcessDefinitionJson(processInstanceJson); processDefinition.setProcessDefinitionJson(processInstanceJson);
processDefinition.setGlobalParams(originDefParams); processDefinition.setGlobalParams(originDefParams);
processDefinition.setLocations(locations); processDefinition.setLocations(locations);
@ -544,7 +543,7 @@ public class ProcessInstanceService extends BaseDAGService {
nodeValueSb.append(ipSb); nodeValueSb.append(ipSb);
} }
logger.info("delete task queue node : {}",nodeValueSb.toString()); logger.info("delete task queue node : {}",nodeValueSb);
tasksQueue.removeNode(org.apache.dolphinscheduler.common.Constants.DOLPHINSCHEDULER_TASKS_QUEUE, nodeValueSb.toString()); tasksQueue.removeNode(org.apache.dolphinscheduler.common.Constants.DOLPHINSCHEDULER_TASKS_QUEUE, nodeValueSb.toString());
} }
@ -621,7 +620,7 @@ public class ProcessInstanceService extends BaseDAGService {
Map<String,Object> localParamsMap = new HashMap<>(); Map<String,Object> localParamsMap = new HashMap<>();
localParamsMap.put("taskType",taskNode.getType()); localParamsMap.put("taskType",taskNode.getType());
localParamsMap.put("localParamsList",localParamsList); localParamsMap.put("localParamsList",localParamsList);
if (localParamsList.size() > 0) { if (CollectionUtils.isNotEmpty(localParamsList)) {
localUserDefParams.put(taskNode.getName(), localParamsMap); localUserDefParams.put(taskNode.getName(), localParamsMap);
} }
} }

4
dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/TaskInstanceService.java

@ -32,8 +32,6 @@ import org.apache.dolphinscheduler.dao.entity.User;
import org.apache.dolphinscheduler.dao.mapper.ProjectMapper; import org.apache.dolphinscheduler.dao.mapper.ProjectMapper;
import org.apache.dolphinscheduler.dao.mapper.TaskInstanceMapper; import org.apache.dolphinscheduler.dao.mapper.TaskInstanceMapper;
import org.apache.dolphinscheduler.service.process.ProcessService; import org.apache.dolphinscheduler.service.process.ProcessService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -46,8 +44,6 @@ import java.util.*;
@Service @Service
public class TaskInstanceService extends BaseService { public class TaskInstanceService extends BaseService {
private static final Logger logger = LoggerFactory.getLogger(TaskInstanceService.class);
@Autowired @Autowired
ProjectMapper projectMapper; ProjectMapper projectMapper;

4
dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/TaskRecordService.java

@ -21,8 +21,6 @@ import org.apache.dolphinscheduler.api.utils.PageInfo;
import org.apache.dolphinscheduler.common.Constants; import org.apache.dolphinscheduler.common.Constants;
import org.apache.dolphinscheduler.dao.TaskRecordDao; import org.apache.dolphinscheduler.dao.TaskRecordDao;
import org.apache.dolphinscheduler.dao.entity.TaskRecord; import org.apache.dolphinscheduler.dao.entity.TaskRecord;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.HashMap; import java.util.HashMap;
@ -37,8 +35,6 @@ import static org.apache.dolphinscheduler.common.Constants.*;
@Service @Service
public class TaskRecordService extends BaseService{ public class TaskRecordService extends BaseService{
private static final Logger logger = LoggerFactory.getLogger(TaskRecordService.class);
/** /**
* query task record list paging * query task record list paging
* *

4
dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/TenantService.java

@ -310,7 +310,7 @@ public class TenantService extends BaseService{
Map<String, Object> result = new HashMap<>(5); Map<String, Object> result = new HashMap<>(5);
List<Tenant> resourceList = tenantMapper.queryByTenantCode(tenantCode); List<Tenant> resourceList = tenantMapper.queryByTenantCode(tenantCode);
if (resourceList != null && resourceList.size() > 0) { if (CollectionUtils.isNotEmpty(resourceList)) {
result.put(Constants.DATA_LIST, resourceList); result.put(Constants.DATA_LIST, resourceList);
putMsg(result, Status.SUCCESS); putMsg(result, Status.SUCCESS);
} else { } else {
@ -346,6 +346,6 @@ public class TenantService extends BaseService{
*/ */
private boolean checkTenantExists(String tenantCode) { private boolean checkTenantExists(String tenantCode) {
List<Tenant> tenants = tenantMapper.queryByTenantCode(tenantCode); List<Tenant> tenants = tenantMapper.queryByTenantCode(tenantCode);
return (tenants != null && tenants.size() > 0); return CollectionUtils.isNotEmpty(tenants);
} }
} }

2
dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/WorkerGroupService.java

@ -111,7 +111,7 @@ public class WorkerGroupService extends BaseService {
List<WorkerGroup> workerGroupList = workerGroupMapper.queryWorkerGroupByName(workerGroup.getName()); List<WorkerGroup> workerGroupList = workerGroupMapper.queryWorkerGroupByName(workerGroup.getName());
if(workerGroupList.size() > 0 ){ if(CollectionUtils.isNotEmpty(workerGroupList)){
// new group has same name.. // new group has same name..
if(workerGroup.getId() == 0){ if(workerGroup.getId() == 0){
return true; return true;

2
dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/LoginControllerTest.java

@ -36,7 +36,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
* login controller test * login controller test
*/ */
public class LoginControllerTest extends AbstractControllerTest{ public class LoginControllerTest extends AbstractControllerTest{
private static Logger logger = LoggerFactory.getLogger(SchedulerControllerTest.class); private static Logger logger = LoggerFactory.getLogger(LoginControllerTest.class);
@Test @Test

2
dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/TaskRecordControllerTest.java

@ -33,7 +33,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
public class TaskRecordControllerTest extends AbstractControllerTest { public class TaskRecordControllerTest extends AbstractControllerTest {
private static final Logger logger = LoggerFactory.getLogger(TaskInstanceController.class); private static final Logger logger = LoggerFactory.getLogger(TaskRecordControllerTest.class);
@Test @Test
public void testQueryTaskRecordListPaging() throws Exception { public void testQueryTaskRecordListPaging() throws Exception {

2
dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/UsersControllerTest.java

@ -37,7 +37,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
* users controller test * users controller test
*/ */
public class UsersControllerTest extends AbstractControllerTest{ public class UsersControllerTest extends AbstractControllerTest{
private static Logger logger = LoggerFactory.getLogger(QueueControllerTest.class); private static Logger logger = LoggerFactory.getLogger(UsersControllerTest.class);
@Test @Test
public void testCreateUser() throws Exception { public void testCreateUser() throws Exception {

2
dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/enums/TaskStateType.java

@ -60,7 +60,7 @@ public enum TaskStateType {
default: default:
break; break;
} }
return null; return new int[0];
} }
} }

6
dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/model/TaskNode.java

@ -293,14 +293,14 @@ public class TaskNode {
public TaskTimeoutParameter getTaskTimeoutParameter() { public TaskTimeoutParameter getTaskTimeoutParameter() {
if(StringUtils.isNotEmpty(this.getTimeout())){ if(StringUtils.isNotEmpty(this.getTimeout())){
String formatStr = String.format("%s,%s", TaskTimeoutStrategy.WARN.name(), TaskTimeoutStrategy.FAILED.name()); String formatStr = String.format("%s,%s", TaskTimeoutStrategy.WARN.name(), TaskTimeoutStrategy.FAILED.name());
String timeout = this.getTimeout().replace(formatStr,TaskTimeoutStrategy.WARNFAILED.name()); String taskTimeout = this.getTimeout().replace(formatStr,TaskTimeoutStrategy.WARNFAILED.name());
return JSON.parseObject(timeout,TaskTimeoutParameter.class); return JSON.parseObject(taskTimeout,TaskTimeoutParameter.class);
} }
return new TaskTimeoutParameter(false); return new TaskTimeoutParameter(false);
} }
public boolean isConditionsTask(){ public boolean isConditionsTask(){
return this.getType().toUpperCase().equals(TaskType.CONDITIONS.toString()); return TaskType.CONDITIONS.toString().equalsIgnoreCase(this.getType());
} }
@Override @Override

36
dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/thread/ThreadPoolExecutors.java

@ -74,21 +74,21 @@ public class ThreadPoolExecutors {
* @param event * @param event
*/ */
public void execute(final Runnable event) { public void execute(final Runnable event) {
Executor executor = getExecutor(); Executor eventExecutor = getExecutor();
if (executor == null) { if (eventExecutor == null) {
logger.error("Cannot execute [" + event + "] because the executor is missing."); logger.error("Cannot execute [{}}] because the executor is missing.", event);
} else { } else {
executor.execute(event); eventExecutor.execute(event);
} }
} }
public Future<?> submit(Runnable event) { public Future<?> submit(Runnable event) {
Executor executor = getExecutor(); Executor eventExecutor = getExecutor();
if (executor == null) { if (eventExecutor == null) {
logger.error("Cannot submit [" + event + "] because the executor is missing."); logger.error("Cannot submit [{}}] because the executor is missing.", event);
} else { } else {
return executor.submit(event); return eventExecutor.submit(event);
} }
return null; return null;
@ -97,11 +97,11 @@ public class ThreadPoolExecutors {
public Future<?> submit(Callable<?> task) { public Future<?> submit(Callable<?> task) {
Executor executor = getExecutor(); Executor taskExecutor = getExecutor();
if (executor == null) { if (taskExecutor == null) {
logger.error("Cannot submit [" + task + "] because the executor is missing."); logger.error("Cannot submit [{}] because the executor is missing.", task);
} else { } else {
return executor.submit(task); return taskExecutor.submit(task);
} }
return null; return null;
@ -110,8 +110,8 @@ public class ThreadPoolExecutors {
public void printStatus() { public void printStatus() {
Executor executor = getExecutor(); Executor printExecutor = getExecutor();
executor.getStatus().dumpInfo(); printExecutor.getStatus().dumpInfo();
} }
@ -125,7 +125,7 @@ public class ThreadPoolExecutors {
List<Runnable> wasRunning = executor.threadPoolExecutor List<Runnable> wasRunning = executor.threadPoolExecutor
.shutdownNow(); .shutdownNow();
if (!wasRunning.isEmpty()) { if (!wasRunning.isEmpty()) {
logger.info(executor + " had " + wasRunning + " on shutdown"); logger.info("{} had {} on shutdown", executor, wasRunning);
} }
} }
} }
@ -138,7 +138,7 @@ public class ThreadPoolExecutors {
/** /**
* how long to retain excess threads * how long to retain excess threads
*/ */
final long keepAliveTimeInMillis = 1000; static final long KEEP_ALIVE_TIME_IN_MILLIS = 1000;
/** /**
* the thread pool executor that services the requests * the thread pool executor that services the requests
*/ */
@ -146,7 +146,7 @@ public class ThreadPoolExecutors {
/** /**
* work queue to use - unbounded queue * work queue to use - unbounded queue
*/ */
final BlockingQueue<Runnable> q = new LinkedBlockingQueue<Runnable>(); final BlockingQueue<Runnable> q = new LinkedBlockingQueue<>();
private final String name; private final String name;
private static final AtomicLong seqids = new AtomicLong(0); private static final AtomicLong seqids = new AtomicLong(0);
private final long id; private final long id;
@ -156,7 +156,7 @@ public class ThreadPoolExecutors {
this.name = name; this.name = name;
//create the thread pool executor //create the thread pool executor
this.threadPoolExecutor = new TrackingThreadPoolExecutor( this.threadPoolExecutor = new TrackingThreadPoolExecutor(
maxThreads, maxThreads, keepAliveTimeInMillis, maxThreads, maxThreads, KEEP_ALIVE_TIME_IN_MILLIS,
TimeUnit.MILLISECONDS, q); TimeUnit.MILLISECONDS, q);
// name the threads for this threadpool // name the threads for this threadpool
ThreadFactoryBuilder tfb = new ThreadFactoryBuilder(); ThreadFactoryBuilder tfb = new ThreadFactoryBuilder();

103
dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/ConnectionUtils.java

@ -16,86 +16,35 @@
*/ */
package org.apache.dolphinscheduler.common.utils; package org.apache.dolphinscheduler.common.utils;
import java.util.Arrays;
import java.util.Objects;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.sql.*;
public class ConnectionUtils { public class ConnectionUtils {
public static final Logger logger = LoggerFactory.getLogger(ConnectionUtils.class); public static final Logger logger = LoggerFactory.getLogger(ConnectionUtils.class);
private static ConnectionUtils instance; private ConnectionUtils() {
throw new IllegalStateException("ConnectionUtils class");
ConnectionUtils() { }
}
/**
public static ConnectionUtils getInstance() { * release resource
if (null == instance) { * @param resources resources
syncInit(); */
} public static void releaseResource(AutoCloseable... resources) {
return instance;
} if (resources == null || resources.length == 0) {
return;
private static synchronized void syncInit() { }
if (instance == null) { Arrays.stream(resources).filter(Objects::nonNull)
instance = new ConnectionUtils(); .forEach(resource -> {
} try {
} resource.close();
} catch (Exception e) {
public void release(ResultSet rs, Statement stmt, Connection conn) { logger.error(e.getMessage(), e);
try { }
if (rs != null) { });
rs.close(); }
rs = null;
}
} catch (SQLException e) {
logger.error(e.getMessage(),e);
} finally {
try {
if (stmt != null) {
stmt.close();
stmt = null;
}
} catch (SQLException e) {
logger.error(e.getMessage(),e);
} finally {
try {
if (conn != null) {
conn.close();
conn = null;
}
} catch (SQLException e) {
logger.error(e.getMessage(),e);
}
}
}
}
public static void releaseResource(ResultSet rs, PreparedStatement ps, Connection conn) {
ConnectionUtils.getInstance().release(rs,ps,conn);
if (null != rs) {
try {
rs.close();
} catch (SQLException e) {
logger.error(e.getMessage(),e);
}
}
if (null != ps) {
try {
ps.close();
} catch (SQLException e) {
logger.error(e.getMessage(),e);
}
}
if (null != conn) {
try {
conn.close();
} catch (SQLException e) {
logger.error(e.getMessage(),e);
}
}
}
} }

8
dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/placeholder/TimePlaceholderUtils.java

@ -35,12 +35,12 @@ public class TimePlaceholderUtils {
/** /**
* Prefix of the position to be replaced * Prefix of the position to be replaced
*/ */
public static final String placeholderPrefix = "$["; public static final String PLACEHOLDER_PREFIX = "$[";
/** /**
* The suffix of the position to be replaced * The suffix of the position to be replaced
*/ */
public static final String placeholderSuffix = "]"; public static final String PLACEHOLDER_SUFFIX = "]";
/** /**
* Replaces all placeholders of format {@code ${name}} with the value returned * Replaces all placeholders of format {@code ${name}} with the value returned
@ -66,7 +66,7 @@ public class TimePlaceholderUtils {
* be ignored ({@code true}) or cause an exception ({@code false}) * be ignored ({@code true}) or cause an exception ({@code false})
*/ */
private static PropertyPlaceholderHelper getPropertyPlaceholderHelper(boolean ignoreUnresolvablePlaceholders) { private static PropertyPlaceholderHelper getPropertyPlaceholderHelper(boolean ignoreUnresolvablePlaceholders) {
return new PropertyPlaceholderHelper(placeholderPrefix, placeholderSuffix, null, ignoreUnresolvablePlaceholders); return new PropertyPlaceholderHelper(PLACEHOLDER_PREFIX, PLACEHOLDER_SUFFIX, null, ignoreUnresolvablePlaceholders);
} }
/** /**
@ -503,7 +503,7 @@ public class TimePlaceholderUtils {
* @return calculate need minutes * @return calculate need minutes
*/ */
public static Integer calcMinutes(String minuteExpression) { public static Integer calcMinutes(String minuteExpression) {
int index = minuteExpression.indexOf("/"); int index = minuteExpression.indexOf('/');
String calcExpression; String calcExpression;

20
dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/process/ProcessEnvironmentForWin32.java

@ -46,22 +46,23 @@ final class ProcessEnvironmentForWin32 extends HashMap<String,String> {
return (String) o; return (String) o;
} }
@Override
public String put(String key, String value) { public String put(String key, String value) {
return super.put(validateName(key), validateValue(value)); return super.put(validateName(key), validateValue(value));
} }
@Override
public String get(Object key) { public String get(Object key) {
return super.get(nonNullString(key)); return super.get(nonNullString(key));
} }
@Override
public boolean containsKey(Object key) { public boolean containsKey(Object key) {
return super.containsKey(nonNullString(key)); return super.containsKey(nonNullString(key));
} }
@Override
public boolean containsValue(Object value) { public boolean containsValue(Object value) {
return super.containsValue(nonNullString(value)); return super.containsValue(nonNullString(value));
} }
@Override
public String remove(Object key) { public String remove(Object key) {
return super.remove(nonNullString(key)); return super.remove(nonNullString(key));
} }
@ -92,6 +93,7 @@ final class ProcessEnvironmentForWin32 extends HashMap<String,String> {
public Entry<String,String> next() { public Entry<String,String> next() {
return new CheckedEntry(i.next()); return new CheckedEntry(i.next());
} }
@Override
public void remove() { i.remove();} public void remove() { i.remove();}
}; };
} }
@ -110,10 +112,14 @@ final class ProcessEnvironmentForWin32 extends HashMap<String,String> {
private final Collection<String> c; private final Collection<String> c;
public CheckedValues(Collection<String> c) {this.c = c;} public CheckedValues(Collection<String> c) {this.c = c;}
public int size() {return c.size();} public int size() {return c.size();}
@Override
public boolean isEmpty() {return c.isEmpty();} public boolean isEmpty() {return c.isEmpty();}
@Override
public void clear() { c.clear();} public void clear() { c.clear();}
public Iterator<String> iterator() {return c.iterator();} public Iterator<String> iterator() {return c.iterator();}
@Override
public boolean contains(Object o) {return c.contains(nonNullString(o));} public boolean contains(Object o) {return c.contains(nonNullString(o));}
@Override
public boolean remove(Object o) {return c.remove(nonNullString(o));} public boolean remove(Object o) {return c.remove(nonNullString(o));}
} }
@ -127,15 +133,15 @@ final class ProcessEnvironmentForWin32 extends HashMap<String,String> {
public boolean contains(Object o) {return s.contains(nonNullString(o));} public boolean contains(Object o) {return s.contains(nonNullString(o));}
public boolean remove(Object o) {return s.remove(nonNullString(o));} public boolean remove(Object o) {return s.remove(nonNullString(o));}
} }
@Override
public Set<String> keySet() { public Set<String> keySet() {
return new CheckedKeySet(super.keySet()); return new CheckedKeySet(super.keySet());
} }
@Override
public Collection<String> values() { public Collection<String> values() {
return new CheckedValues(super.values()); return new CheckedValues(super.values());
} }
@Override
public Set<Entry<String,String>> entrySet() { public Set<Entry<String,String>> entrySet() {
return new CheckedEntrySet(super.entrySet()); return new CheckedEntrySet(super.entrySet());
} }

113
dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/process/ProcessImplForWin32.java

@ -113,7 +113,7 @@ public class ProcessImplForWin32 extends Process {
// System-dependent portion of ProcessBuilderForWindows.start() // System-dependent portion of ProcessBuilderForWindows.start()
static Process start(String username, static Process start(String username,
String password, String password,
String cmdarray[], String[] cmdarray,
java.util.Map<String,String> environment, java.util.Map<String,String> environment,
String dir, String dir,
ProcessBuilderForWin32.Redirect[] redirects, ProcessBuilderForWin32.Redirect[] redirects,
@ -178,10 +178,10 @@ public class ProcessImplForWin32 extends Process {
private static class LazyPattern { private static class LazyPattern {
// Escape-support version: // Escape-support version:
// "(\")((?:\\\\\\1|.)+?)\\1|([^\\s\"]+)"; // "(\")((?:\\\\\\1|.)+?)\\1|([^\\s\"]+)"
private static final Pattern PATTERN = private static final Pattern PATTERN =
Pattern.compile("[^\\s\"]+|\"[^\"]*\""); Pattern.compile("[^\\s\"]+|\"[^\"]*\"");
}; }
/* Parses the command string parameter into the executable name and /* Parses the command string parameter into the executable name and
* program arguments. * program arguments.
@ -204,7 +204,7 @@ public class ProcessImplForWin32 extends Process {
private static final int VERIFICATION_LEGACY = 3; private static final int VERIFICATION_LEGACY = 3;
// See Command shell overview for documentation of special characters. // See Command shell overview for documentation of special characters.
// https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-xp/bb490954(v=technet.10) // https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-xp/bb490954(v=technet.10)
private static final char ESCAPE_VERIFICATION[][] = { private static final char[][] ESCAPE_VERIFICATION = {
// We guarantee the only command file execution for implicit [cmd.exe] run. // We guarantee the only command file execution for implicit [cmd.exe] run.
// http://technet.microsoft.com/en-us/library/bb490954.aspx // http://technet.microsoft.com/en-us/library/bb490954.aspx
{' ', '\t', '<', '>', '&', '|', '^'}, {' ', '\t', '<', '>', '&', '|', '^'},
@ -215,7 +215,7 @@ public class ProcessImplForWin32 extends Process {
private static String createCommandLine(int verificationType, private static String createCommandLine(int verificationType,
final String executablePath, final String executablePath,
final String cmd[]) final String[] cmd)
{ {
StringBuilder cmdbuf = new StringBuilder(80); StringBuilder cmdbuf = new StringBuilder(80);
@ -310,7 +310,7 @@ public class ProcessImplForWin32 extends Process {
} }
if (!argIsQuoted) { if (!argIsQuoted) {
char testEscape[] = ESCAPE_VERIFICATION[verificationType]; char[] testEscape = ESCAPE_VERIFICATION[verificationType];
for (int i = 0; i < testEscape.length; ++i) { for (int i = 0; i < testEscape.length; ++i) {
if (arg.indexOf(testEscape[i]) >= 0) { if (arg.indexOf(testEscape[i]) >= 0) {
return true; return true;
@ -391,14 +391,14 @@ public class ProcessImplForWin32 extends Process {
private static final char BACKSLASH = '\\'; private static final char BACKSLASH = '\\';
private WinNT.HANDLE handle; private WinNT.HANDLE handle;
private OutputStream stdin_stream; private OutputStream stdinStream;
private InputStream stdout_stream; private InputStream stdoutStream;
private InputStream stderr_stream; private InputStream stderrStream;
private ProcessImplForWin32( private ProcessImplForWin32(
String username, String username,
String password, String password,
String cmd[], String[] cmd,
final String envblock, final String envblock,
final String path, final String path,
final long[] stdHandles, final long[] stdHandles,
@ -473,44 +473,44 @@ public class ProcessImplForWin32 extends Process {
new PrivilegedAction<Void>() { new PrivilegedAction<Void>() {
public Void run() { public Void run() {
if (stdHandles[0] == -1L) if (stdHandles[0] == -1L)
stdin_stream = ProcessBuilderForWin32.NullOutputStream.INSTANCE; stdinStream = ProcessBuilderForWin32.NullOutputStream.INSTANCE;
else { else {
FileDescriptor stdin_fd = new FileDescriptor(); FileDescriptor stdinFd = new FileDescriptor();
setHandle(stdin_fd, stdHandles[0]); setHandle(stdinFd, stdHandles[0]);
stdin_stream = new BufferedOutputStream( stdinStream = new BufferedOutputStream(
new FileOutputStream(stdin_fd)); new FileOutputStream(stdinFd));
} }
if (stdHandles[1] == -1L) if (stdHandles[1] == -1L)
stdout_stream = ProcessBuilderForWin32.NullInputStream.INSTANCE; stdoutStream = ProcessBuilderForWin32.NullInputStream.INSTANCE;
else { else {
FileDescriptor stdout_fd = new FileDescriptor(); FileDescriptor stdoutFd = new FileDescriptor();
setHandle(stdout_fd, stdHandles[1]); setHandle(stdoutFd, stdHandles[1]);
stdout_stream = new BufferedInputStream( stdoutStream = new BufferedInputStream(
new FileInputStream(stdout_fd)); new FileInputStream(stdoutFd));
} }
if (stdHandles[2] == -1L) if (stdHandles[2] == -1L)
stderr_stream = ProcessBuilderForWin32.NullInputStream.INSTANCE; stderrStream = ProcessBuilderForWin32.NullInputStream.INSTANCE;
else { else {
FileDescriptor stderr_fd = new FileDescriptor(); FileDescriptor stderrFd = new FileDescriptor();
setHandle(stderr_fd, stdHandles[2]); setHandle(stderrFd, stdHandles[2]);
stderr_stream = new FileInputStream(stderr_fd); stderrStream = new FileInputStream(stderrFd);
} }
return null; }}); return null; }});
} }
public OutputStream getOutputStream() { public OutputStream getOutputStream() {
return stdin_stream; return stdinStream;
} }
public InputStream getInputStream() { public InputStream getInputStream() {
return stdout_stream; return stdoutStream;
} }
public InputStream getErrorStream() { public InputStream getErrorStream() {
return stderr_stream; return stderrStream;
} }
protected void finalize() { protected void finalize() {
@ -558,11 +558,12 @@ public class ProcessImplForWin32 extends Process {
public void destroy() { terminateProcess(handle); } public void destroy() { terminateProcess(handle); }
@Override
public Process destroyForcibly() { public Process destroyForcibly() {
destroy(); destroy();
return this; return this;
} }
@Override
public boolean isAlive() { public boolean isAlive() {
return isProcessAlive(handle); return isProcessAlive(handle);
} }
@ -583,7 +584,7 @@ public class ProcessImplForWin32 extends Process {
pjhandles.setValue(thisProcessEnd); pjhandles.setValue(thisProcessEnd);
} }
} }
Kernel32.INSTANCE.SetHandleInformation(phStd.getValue(), Kernel32.HANDLE_FLAG_INHERIT, Kernel32.HANDLE_FLAG_INHERIT); Kernel32.INSTANCE.SetHandleInformation(phStd.getValue(), WinBase.HANDLE_FLAG_INHERIT, WinBase.HANDLE_FLAG_INHERIT);
return true; return true;
} }
@ -597,17 +598,17 @@ public class ProcessImplForWin32 extends Process {
private static void prepareIOEHandleState(WinNT.HANDLE[] stdIOE, Boolean[] inherit) { private static void prepareIOEHandleState(WinNT.HANDLE[] stdIOE, Boolean[] inherit) {
for(int i = 0; i < HANDLE_STORAGE_SIZE; ++i) { for(int i = 0; i < HANDLE_STORAGE_SIZE; ++i) {
WinNT.HANDLE hstd = stdIOE[i]; WinNT.HANDLE hstd = stdIOE[i];
if (!Kernel32.INVALID_HANDLE_VALUE.equals(hstd)) { if (!WinBase.INVALID_HANDLE_VALUE.equals(hstd)) {
inherit[i] = Boolean.TRUE; inherit[i] = Boolean.TRUE;
Kernel32.INSTANCE.SetHandleInformation(hstd, Kernel32.HANDLE_FLAG_INHERIT, 0); Kernel32.INSTANCE.SetHandleInformation(hstd, WinBase.HANDLE_FLAG_INHERIT, 0);
} }
} }
} }
private static void restoreIOEHandleState(WinNT.HANDLE[] stdIOE, Boolean[] inherit) { private static void restoreIOEHandleState(WinNT.HANDLE[] stdIOE, Boolean[] inherit) {
for (int i = HANDLE_STORAGE_SIZE - 1; i >= 0; --i) { for (int i = HANDLE_STORAGE_SIZE - 1; i >= 0; --i) {
if (!Kernel32.INVALID_HANDLE_VALUE.equals(stdIOE[i])) { if (!WinBase.INVALID_HANDLE_VALUE.equals(stdIOE[i])) {
Kernel32.INSTANCE.SetHandleInformation(stdIOE[i], Kernel32.HANDLE_FLAG_INHERIT, inherit[i] ? Kernel32.HANDLE_FLAG_INHERIT : 0); Kernel32.INSTANCE.SetHandleInformation(stdIOE[i], WinBase.HANDLE_FLAG_INHERIT, Boolean.TRUE.equals(inherit[i]) ? WinBase.HANDLE_FLAG_INHERIT : 0);
} }
} }
} }
@ -622,12 +623,12 @@ public class ProcessImplForWin32 extends Process {
WinNT.HANDLE ret = new WinNT.HANDLE(Pointer.createConstant(0)); WinNT.HANDLE ret = new WinNT.HANDLE(Pointer.createConstant(0));
WinNT.HANDLE[] stdIOE = new WinNT.HANDLE[] { WinNT.HANDLE[] stdIOE = new WinNT.HANDLE[] {
Kernel32.INVALID_HANDLE_VALUE, Kernel32.INVALID_HANDLE_VALUE, Kernel32.INVALID_HANDLE_VALUE, WinBase.INVALID_HANDLE_VALUE, WinBase.INVALID_HANDLE_VALUE, WinBase.INVALID_HANDLE_VALUE,
stdHandles[0].getValue(), stdHandles[1].getValue(), stdHandles[2].getValue() stdHandles[0].getValue(), stdHandles[1].getValue(), stdHandles[2].getValue()
}; };
stdIOE[0] = Kernel32.INSTANCE.GetStdHandle(Kernel32.STD_INPUT_HANDLE); stdIOE[0] = Kernel32.INSTANCE.GetStdHandle(Wincon.STD_INPUT_HANDLE);
stdIOE[1] = Kernel32.INSTANCE.GetStdHandle(Kernel32.STD_OUTPUT_HANDLE); stdIOE[1] = Kernel32.INSTANCE.GetStdHandle(Wincon.STD_OUTPUT_HANDLE);
stdIOE[2] = Kernel32.INSTANCE.GetStdHandle(Kernel32.STD_ERROR_HANDLE); stdIOE[2] = Kernel32.INSTANCE.GetStdHandle(Wincon.STD_ERROR_HANDLE);
Boolean[] inherit = new Boolean[] { Boolean[] inherit = new Boolean[] {
Boolean.FALSE, Boolean.FALSE, Boolean.FALSE, Boolean.FALSE, Boolean.FALSE, Boolean.FALSE,
@ -639,17 +640,17 @@ public class ProcessImplForWin32 extends Process {
// input // input
WinNT.HANDLEByReference hStdInput = new WinNT.HANDLEByReference(); WinNT.HANDLEByReference hStdInput = new WinNT.HANDLEByReference();
WinNT.HANDLEByReference[] pipeIn = new WinNT.HANDLEByReference[] { WinNT.HANDLEByReference[] pipeIn = new WinNT.HANDLEByReference[] {
new WinNT.HANDLEByReference(Kernel32.INVALID_HANDLE_VALUE), new WinNT.HANDLEByReference(Kernel32.INVALID_HANDLE_VALUE) }; new WinNT.HANDLEByReference(WinBase.INVALID_HANDLE_VALUE), new WinNT.HANDLEByReference(WinBase.INVALID_HANDLE_VALUE) };
// output // output
WinNT.HANDLEByReference hStdOutput = new WinNT.HANDLEByReference(); WinNT.HANDLEByReference hStdOutput = new WinNT.HANDLEByReference();
WinNT.HANDLEByReference[] pipeOut = new WinNT.HANDLEByReference[] { WinNT.HANDLEByReference[] pipeOut = new WinNT.HANDLEByReference[] {
new WinNT.HANDLEByReference(Kernel32.INVALID_HANDLE_VALUE), new WinNT.HANDLEByReference(Kernel32.INVALID_HANDLE_VALUE) }; new WinNT.HANDLEByReference(WinBase.INVALID_HANDLE_VALUE), new WinNT.HANDLEByReference(WinBase.INVALID_HANDLE_VALUE) };
// error // error
WinNT.HANDLEByReference hStdError = new WinNT.HANDLEByReference(); WinNT.HANDLEByReference hStdError = new WinNT.HANDLEByReference();
WinNT.HANDLEByReference[] pipeError = new WinNT.HANDLEByReference[] { WinNT.HANDLEByReference[] pipeError = new WinNT.HANDLEByReference[] {
new WinNT.HANDLEByReference(Kernel32.INVALID_HANDLE_VALUE), new WinNT.HANDLEByReference(Kernel32.INVALID_HANDLE_VALUE) }; new WinNT.HANDLEByReference(WinBase.INVALID_HANDLE_VALUE), new WinNT.HANDLEByReference(WinBase.INVALID_HANDLE_VALUE) };
boolean success; boolean success;
if (initHolder(stdHandles[0], pipeIn, OFFSET_READ, hStdInput)) { if (initHolder(stdHandles[0], pipeIn, OFFSET_READ, hStdInput)) {
@ -669,8 +670,8 @@ public class ProcessImplForWin32 extends Process {
if (success) { if (success) {
WTypes.LPSTR lpEnvironment = envblock == null ? new WTypes.LPSTR() : new WTypes.LPSTR(envblock); WTypes.LPSTR lpEnvironment = envblock == null ? new WTypes.LPSTR() : new WTypes.LPSTR(envblock);
Kernel32.PROCESS_INFORMATION pi = new WinBase.PROCESS_INFORMATION(); WinBase.PROCESS_INFORMATION pi = new WinBase.PROCESS_INFORMATION();
si.dwFlags = Kernel32.STARTF_USESTDHANDLES; si.dwFlags = WinBase.STARTF_USESTDHANDLES;
if (!Advapi32.INSTANCE.CreateProcessWithLogonW( if (!Advapi32.INSTANCE.CreateProcessWithLogonW(
username username
, null , null
@ -678,7 +679,7 @@ public class ProcessImplForWin32 extends Process {
, Advapi32.LOGON_WITH_PROFILE , Advapi32.LOGON_WITH_PROFILE
, null , null
, cmd , cmd
, Kernel32.CREATE_NO_WINDOW , WinBase.CREATE_NO_WINDOW
, lpEnvironment.getPointer() , lpEnvironment.getPointer()
, path , path
, si , si
@ -710,13 +711,11 @@ public class ProcessImplForWin32 extends Process {
for (int i = 0; i < stdHandles.length; i++) { for (int i = 0; i < stdHandles.length; i++) {
handles[i] = new WinNT.HANDLEByReference(new WinNT.HANDLE(Pointer.createConstant(stdHandles[i]))); handles[i] = new WinNT.HANDLEByReference(new WinNT.HANDLE(Pointer.createConstant(stdHandles[i])));
} }
if (cmd != null) { if (cmd != null && username != null && password != null) {
if (username != null && password != null) { ret = processCreate(username, password, cmd, envblock, path, handles, redirectErrorStream);
ret = processCreate(username, password, cmd, envblock, path, handles, redirectErrorStream);
}
} }
for (int i = 0; i < stdHandles.length; i++) { for (int i = 0; i < stdHandles.length; i++) {
stdHandles[i] = handles[i].getPointer().getLong(0); stdHandles[i] = handles[i].getPointer().getLong(0);
} }
@ -756,15 +755,15 @@ public class ProcessImplForWin32 extends Process {
* @return the native HANDLE * @return the native HANDLE
*/ */
private static long openForAtomicAppend(String path) throws IOException { private static long openForAtomicAppend(String path) throws IOException {
int access = Kernel32.GENERIC_READ | Kernel32.GENERIC_WRITE; int access = WinNT.GENERIC_READ | WinNT.GENERIC_WRITE;
int sharing = Kernel32.FILE_SHARE_READ | Kernel32.FILE_SHARE_WRITE; int sharing = WinNT.FILE_SHARE_READ | WinNT.FILE_SHARE_WRITE;
int disposition = Kernel32.OPEN_ALWAYS; int disposition = WinNT.OPEN_ALWAYS;
int flagsAndAttributes = Kernel32.FILE_ATTRIBUTE_NORMAL; int flagsAndAttributes = WinNT.FILE_ATTRIBUTE_NORMAL;
if (path == null || path.isEmpty()) { if (path == null || path.isEmpty()) {
return -1; return -1;
} else { } else {
WinNT.HANDLE handle = Kernel32.INSTANCE.CreateFile(path, access, sharing, null, disposition, flagsAndAttributes, null); WinNT.HANDLE handle = Kernel32.INSTANCE.CreateFile(path, access, sharing, null, disposition, flagsAndAttributes, null);
if (handle == Kernel32.INVALID_HANDLE_VALUE) { if (handle == WinBase.INVALID_HANDLE_VALUE) {
throw new Win32Exception(Kernel32.INSTANCE.GetLastError()); throw new Win32Exception(Kernel32.INSTANCE.GetLastError());
} }
return handle.getPointer().getLong(0); return handle.getPointer().getLong(0);
@ -772,15 +771,15 @@ public class ProcessImplForWin32 extends Process {
} }
private static void waitForInterruptibly(WinNT.HANDLE handle) { private static void waitForInterruptibly(WinNT.HANDLE handle) {
int result = Kernel32.INSTANCE.WaitForMultipleObjects(1, new WinNT.HANDLE[]{handle}, false, Kernel32.INFINITE); int result = Kernel32.INSTANCE.WaitForMultipleObjects(1, new WinNT.HANDLE[]{handle}, false, WinBase.INFINITE);
if (result == Kernel32.WAIT_FAILED) { if (result == WinBase.WAIT_FAILED) {
throw new Win32Exception(Kernel32.INSTANCE.GetLastError()); throw new Win32Exception(Kernel32.INSTANCE.GetLastError());
} }
} }
private static void waitForTimeoutInterruptibly(WinNT.HANDLE handle, long timeout) { private static void waitForTimeoutInterruptibly(WinNT.HANDLE handle, long timeout) {
int result = Kernel32.INSTANCE.WaitForMultipleObjects(1, new WinNT.HANDLE[]{handle}, false, (int) timeout); int result = Kernel32.INSTANCE.WaitForMultipleObjects(1, new WinNT.HANDLE[]{handle}, false, (int) timeout);
if (result == Kernel32.WAIT_FAILED) { if (result == WinBase.WAIT_FAILED) {
throw new Win32Exception(Kernel32.INSTANCE.GetLastError()); throw new Win32Exception(Kernel32.INSTANCE.GetLastError());
} }
} }

8
dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/AlertDao.java

@ -169,5 +169,11 @@ public class AlertDao extends AbstractBaseDao {
return userAlertGroupMapper.listUserByAlertgroupId(alertgroupId); return userAlertGroupMapper.listUserByAlertgroupId(alertgroupId);
} }
/**
* for test
* @return
*/
public AlertMapper getAlertMapper() {
return alertMapper;
}
} }

10
dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/MonitorDBDao.java

@ -18,10 +18,10 @@ package org.apache.dolphinscheduler.dao;
import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.pool.DruidDataSource;
import java.sql.Connection; import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.apache.dolphinscheduler.common.enums.DbType; import org.apache.dolphinscheduler.common.enums.DbType;
import org.apache.dolphinscheduler.common.utils.ConnectionUtils;
import org.apache.dolphinscheduler.dao.entity.MonitorRecord; import org.apache.dolphinscheduler.dao.entity.MonitorRecord;
import org.apache.dolphinscheduler.dao.utils.MysqlPerformance; import org.apache.dolphinscheduler.dao.utils.MysqlPerformance;
import org.apache.dolphinscheduler.dao.utils.PostgrePerformance; import org.apache.dolphinscheduler.dao.utils.PostgrePerformance;
@ -63,13 +63,7 @@ public class MonitorDBDao {
}catch (Exception e) { }catch (Exception e) {
logger.error("SQLException: {}", e.getMessage(), e); logger.error("SQLException: {}", e.getMessage(), e);
}finally { }finally {
try { ConnectionUtils.releaseResource(conn);
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
logger.error("SQLException ", e);
}
} }
return monitorRecord; return monitorRecord;
} }

39
dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/TaskRecordDao.java

@ -19,6 +19,7 @@ package org.apache.dolphinscheduler.dao;
import org.apache.dolphinscheduler.common.Constants; import org.apache.dolphinscheduler.common.Constants;
import org.apache.dolphinscheduler.common.enums.TaskRecordStatus; import org.apache.dolphinscheduler.common.enums.TaskRecordStatus;
import org.apache.dolphinscheduler.common.utils.CollectionUtils; import org.apache.dolphinscheduler.common.utils.CollectionUtils;
import org.apache.dolphinscheduler.common.utils.ConnectionUtils;
import org.apache.dolphinscheduler.common.utils.DateUtils; import org.apache.dolphinscheduler.common.utils.DateUtils;
import org.apache.dolphinscheduler.common.utils.StringUtils; import org.apache.dolphinscheduler.common.utils.StringUtils;
import org.apache.dolphinscheduler.dao.entity.TaskRecord; import org.apache.dolphinscheduler.dao.entity.TaskRecord;
@ -84,9 +85,9 @@ public class TaskRecordDao {
Class.forName(driver); Class.forName(driver);
conn = DriverManager.getConnection(url, username, password); conn = DriverManager.getConnection(url, username, password);
} catch (ClassNotFoundException e) { } catch (ClassNotFoundException e) {
logger.error("Exception ", e); logger.error("Class not found Exception ", e);
} catch (SQLException e) { } catch (SQLException e) {
logger.error("Exception ", e); logger.error("SQL Exception ", e);
} }
return conn; return conn;
} }
@ -163,14 +164,14 @@ public class TaskRecordDao {
sql += getWhereString(filterMap); sql += getWhereString(filterMap);
pstmt = conn.prepareStatement(sql); pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery(); rs = pstmt.executeQuery();
while (rs.next()) { while (rs.next()){
count = rs.getInt("count"); count = rs.getInt("count");
break; break;
} }
} catch (SQLException e) { } catch (SQLException e) {
logger.error("Exception ", e); logger.error("Exception ", e);
} finally { }finally {
closeResource(rs, pstmt, conn); ConnectionUtils.releaseResource(rs, pstmt, conn);
} }
return count; return count;
} }
@ -254,8 +255,8 @@ public class TaskRecordDao {
} }
} catch (SQLException e) { } catch (SQLException e) {
logger.error("Exception ", e); logger.error("Exception ", e);
} finally { }finally {
closeResource(rs, pstmt, conn); ConnectionUtils.releaseResource(rs, pstmt, conn);
} }
return recordList; return recordList;
} }
@ -292,28 +293,4 @@ public class TaskRecordDao {
} }
} }
private static void closeResource(ResultSet rs, PreparedStatement pstmt, Connection conn) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
logger.error("Exception ", e);
}
}
if (pstmt != null) {
try {
pstmt.close();
} catch (SQLException e) {
logger.error("Exception ", e);
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
logger.error("Exception ", e);
}
}
}
} }

109
dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/datasource/BaseDataSource.java

@ -16,10 +16,21 @@
*/ */
package org.apache.dolphinscheduler.dao.datasource; package org.apache.dolphinscheduler.dao.datasource;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import org.apache.dolphinscheduler.common.enums.DbType;
import org.apache.dolphinscheduler.common.utils.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/** /**
* data source base class * data source base class
*/ */
public abstract class BaseDataSource { public abstract class BaseDataSource {
private static final Logger logger = LoggerFactory.getLogger(BaseDataSource.class);
/** /**
* user name * user name
*/ */
@ -57,17 +68,105 @@ public abstract class BaseDataSource {
public void setPrincipal(String principal) { public void setPrincipal(String principal) {
this.principal = principal; this.principal = principal;
} }
/** /**
* test whether the data source can be connected successfully * @return driver class
* @throws Exception */
public abstract String driverClassSelector();
/**
* @return db type
*/ */
public abstract void isConnectable() throws Exception; public abstract DbType dbTypeSelector();
/** /**
* gets the JDBC url for the data source connection * gets the JDBC url for the data source connection
* @return
*/ */
public abstract String getJdbcUrl(); public String getJdbcUrl() {
StringBuilder jdbcUrl = new StringBuilder(getAddress());
appendDatabase(jdbcUrl);
appendPrincipal(jdbcUrl);
appendOther(jdbcUrl);
return jdbcUrl.toString();
}
/**
* append database
* @param jdbcUrl jdbc url
*/
private void appendDatabase(StringBuilder jdbcUrl) {
if (dbTypeSelector() == DbType.SQLSERVER) {
jdbcUrl.append(";databaseName=").append(getDatabase());
} else {
if (getAddress().lastIndexOf('/') != (jdbcUrl.length() - 1)) {
jdbcUrl.append("/");
}
jdbcUrl.append(getDatabase());
}
}
/**
* append principal
* @param jdbcUrl jdbc url
*/
private void appendPrincipal(StringBuilder jdbcUrl) {
boolean tag = dbTypeSelector() == DbType.HIVE || dbTypeSelector() == DbType.SPARK;
if (tag && StringUtils.isNotEmpty(getPrincipal())) {
jdbcUrl.append(";principal=").append(getPrincipal());
}
}
/**
* append other
* @param jdbcUrl jdbc url
*/
private void appendOther(StringBuilder jdbcUrl) {
if (StringUtils.isNotEmpty(getOther())) {
String separator = "";
switch (dbTypeSelector()) {
case CLICKHOUSE:
case MYSQL:
case ORACLE:
case POSTGRESQL:
separator = "?";
break;
case DB2:
separator = ":";
break;
case HIVE:
case SPARK:
case SQLSERVER:
separator = ";";
break;
default:
logger.error("Db type mismatch!");
}
jdbcUrl.append(separator).append(getOther());
}
}
/**
* test whether the data source can be connected successfully
*/
public void isConnectable() {
Connection con = null;
try {
Class.forName(driverClassSelector());
con = DriverManager.getConnection(getJdbcUrl(), getUser(), getPassword());
} catch (ClassNotFoundException | SQLException e) {
logger.error("Get connection error: {}", e.getMessage());
} finally {
if (con != null) {
try {
con.close();
} catch (SQLException e) {
logger.error(e.getMessage(), e);
}
}
}
}
public String getUser() { public String getUser() {
return user; return user;

47
dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/datasource/ClickHouseDataSource.java

@ -17,59 +17,26 @@
package org.apache.dolphinscheduler.dao.datasource; package org.apache.dolphinscheduler.dao.datasource;
import org.apache.dolphinscheduler.common.Constants; import org.apache.dolphinscheduler.common.Constants;
import org.apache.dolphinscheduler.common.utils.StringUtils; import org.apache.dolphinscheduler.common.enums.DbType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/** /**
* data source of ClickHouse * data source of ClickHouse
*/ */
public class ClickHouseDataSource extends BaseDataSource { public class ClickHouseDataSource extends BaseDataSource {
private static final Logger logger = LoggerFactory.getLogger(ClickHouseDataSource.class);
/** /**
* gets the JDBC url for the data source connection * @return driver class
* @return
*/ */
@Override @Override
public String getJdbcUrl() { public String driverClassSelector() {
String jdbcUrl = getAddress(); return Constants.COM_CLICKHOUSE_JDBC_DRIVER;
if (jdbcUrl.lastIndexOf('/') != (jdbcUrl.length() - 1)) {
jdbcUrl += "/";
}
jdbcUrl += getDatabase();
if (StringUtils.isNotEmpty(getOther())) {
jdbcUrl += "?" + getOther();
}
return jdbcUrl;
} }
/** /**
* test whether the data source can be connected successfully * @return db type
* @throws Exception
*/ */
@Override @Override
public void isConnectable() throws Exception { public DbType dbTypeSelector() {
Connection con = null; return DbType.CLICKHOUSE;
try {
Class.forName(Constants.COM_CLICKHOUSE_JDBC_DRIVER);
con = DriverManager.getConnection(getJdbcUrl(), getUser(), getPassword());
} finally {
if (con != null) {
try {
con.close();
} catch (SQLException e) {
logger.error("ClickHouse datasource try conn close conn error", e);
}
}
}
} }
} }

14
dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/datasource/ConnectionFactory.java

@ -51,6 +51,7 @@ public class ConnectionFactory extends SpringConnectionFactory {
private ConnectionFactory() { private ConnectionFactory() {
try { try {
dataSource = buildDataSource();
sqlSessionFactory = getSqlSessionFactory(); sqlSessionFactory = getSqlSessionFactory();
sqlSessionTemplate = getSqlSessionTemplate(); sqlSessionTemplate = getSqlSessionTemplate();
} catch (Exception e) { } catch (Exception e) {
@ -69,12 +70,18 @@ public class ConnectionFactory extends SpringConnectionFactory {
*/ */
private SqlSessionTemplate sqlSessionTemplate; private SqlSessionTemplate sqlSessionTemplate;
private DataSource dataSource;
public DataSource getDataSource() {
return dataSource;
}
/** /**
* get the data source * get the data source
* *
* @return druid dataSource * @return druid dataSource
*/ */
public DruidDataSource getDataSource() { private DataSource buildDataSource() {
DruidDataSource druidDataSource = new DruidDataSource(); DruidDataSource druidDataSource = new DruidDataSource();
@ -112,10 +119,9 @@ public class ConnectionFactory extends SpringConnectionFactory {
* @throws Exception sqlSessionFactory exception * @throws Exception sqlSessionFactory exception
*/ */
private SqlSessionFactory getSqlSessionFactory() throws Exception { private SqlSessionFactory getSqlSessionFactory() throws Exception {
DataSource dataSource = getDataSource();
TransactionFactory transactionFactory = new JdbcTransactionFactory(); TransactionFactory transactionFactory = new JdbcTransactionFactory();
Environment environment = new Environment("development", transactionFactory, dataSource); Environment environment = new Environment("development", transactionFactory, getDataSource());
MybatisConfiguration configuration = new MybatisConfiguration(); MybatisConfiguration configuration = new MybatisConfiguration();
configuration.setEnvironment(environment); configuration.setEnvironment(environment);
@ -125,7 +131,7 @@ public class ConnectionFactory extends SpringConnectionFactory {
MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean(); MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
sqlSessionFactoryBean.setConfiguration(configuration); sqlSessionFactoryBean.setConfiguration(configuration);
sqlSessionFactoryBean.setDataSource(dataSource); sqlSessionFactoryBean.setDataSource(getDataSource());
sqlSessionFactoryBean.setTypeEnumsPackage("org.apache.dolphinscheduler.*.enums"); sqlSessionFactoryBean.setTypeEnumsPackage("org.apache.dolphinscheduler.*.enums");
sqlSessionFactory = sqlSessionFactoryBean.getObject(); sqlSessionFactory = sqlSessionFactoryBean.getObject();

46
dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/datasource/DB2ServerDataSource.java

@ -17,58 +17,26 @@
package org.apache.dolphinscheduler.dao.datasource; package org.apache.dolphinscheduler.dao.datasource;
import org.apache.dolphinscheduler.common.Constants; import org.apache.dolphinscheduler.common.Constants;
import org.apache.dolphinscheduler.common.utils.StringUtils; import org.apache.dolphinscheduler.common.enums.DbType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/** /**
* data source of DB2 Server * data source of DB2 Server
*/ */
public class DB2ServerDataSource extends BaseDataSource { public class DB2ServerDataSource extends BaseDataSource {
private static final Logger logger = LoggerFactory.getLogger(DB2ServerDataSource.class);
/** /**
* gets the JDBC url for the data source connection * @return driver class
* @return
*/ */
@Override @Override
public String getJdbcUrl() { public String driverClassSelector() {
String jdbcUrl = getAddress(); return Constants.COM_DB2_JDBC_DRIVER;
if (jdbcUrl.lastIndexOf("/") != (jdbcUrl.length() - 1)) {
jdbcUrl += "/";
}
jdbcUrl += getDatabase();
if (StringUtils.isNotEmpty(getOther())) {
jdbcUrl += ":" + getOther();
}
return jdbcUrl;
} }
/** /**
* test whether the data source can be connected successfully * @return db type
* @throws Exception
*/ */
@Override @Override
public void isConnectable() throws Exception { public DbType dbTypeSelector() {
Connection con = null; return DbType.DB2;
try {
Class.forName(Constants.COM_DB2_JDBC_DRIVER);
con = DriverManager.getConnection(getJdbcUrl(), getUser(), getPassword());
} finally {
if (con != null) {
try {
con.close();
} catch (SQLException e) {
logger.error("DB2 Server datasource try conn close conn error", e);
}
}
}
} }
} }

51
dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/datasource/HiveDataSource.java

@ -17,63 +17,26 @@
package org.apache.dolphinscheduler.dao.datasource; package org.apache.dolphinscheduler.dao.datasource;
import org.apache.dolphinscheduler.common.Constants; import org.apache.dolphinscheduler.common.Constants;
import org.apache.dolphinscheduler.common.utils.StringUtils; import org.apache.dolphinscheduler.common.enums.DbType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/** /**
* data source of hive * data source of hive
*/ */
public class HiveDataSource extends BaseDataSource { public class HiveDataSource extends BaseDataSource {
private static final Logger logger = LoggerFactory.getLogger(HiveDataSource.class);
/** /**
* gets the JDBC url for the data source connection * @return driver class
* @return
*/ */
@Override @Override
public String getJdbcUrl() { public String driverClassSelector() {
String jdbcUrl = getAddress(); return Constants.ORG_APACHE_HIVE_JDBC_HIVE_DRIVER;
if (jdbcUrl.lastIndexOf('/') != (jdbcUrl.length() - 1)) {
jdbcUrl += "/";
}
jdbcUrl += getDatabase();
if (StringUtils.isNotEmpty(getPrincipal())){
jdbcUrl += ";principal=" + getPrincipal();
}
if (StringUtils.isNotEmpty(getOther())) {
jdbcUrl += ";" + getOther();
}
return jdbcUrl;
} }
/** /**
* test whether the data source can be connected successfully * @return db type
* @throws Exception
*/ */
@Override @Override
public void isConnectable() throws Exception { public DbType dbTypeSelector() {
Connection con = null; return DbType.HIVE;
try {
Class.forName(Constants.ORG_APACHE_HIVE_JDBC_HIVE_DRIVER);
con = DriverManager.getConnection(getJdbcUrl(), getUser(), "");
} finally {
if (con != null) {
try {
con.close();
} catch (SQLException e) {
logger.error("hive datasource try conn close conn error", e);
}
}
}
} }
} }

44
dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/datasource/MySQLDataSource.java

@ -17,57 +17,27 @@
package org.apache.dolphinscheduler.dao.datasource; package org.apache.dolphinscheduler.dao.datasource;
import org.apache.dolphinscheduler.common.Constants; import org.apache.dolphinscheduler.common.Constants;
import org.apache.dolphinscheduler.common.utils.StringUtils; import org.apache.dolphinscheduler.common.enums.DbType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/** /**
* data source of mySQL * data source of mySQL
*/ */
public class MySQLDataSource extends BaseDataSource { public class MySQLDataSource extends BaseDataSource {
private static final Logger logger = LoggerFactory.getLogger(MySQLDataSource.class);
/** /**
* gets the JDBC url for the data source connection * @return driver class
* @return
*/ */
@Override @Override
public String getJdbcUrl() { public String driverClassSelector() {
String address = getAddress(); return Constants.COM_MYSQL_JDBC_DRIVER;
if (address.lastIndexOf('/') != (address.length() - 1)) {
address += "/";
}
String jdbcUrl = address + getDatabase();
if (StringUtils.isNotEmpty(getOther())) {
jdbcUrl += "?" + getOther();
}
return jdbcUrl;
} }
/** /**
* test whether the data source can be connected successfully * @return db type
* @throws Exception
*/ */
@Override @Override
public void isConnectable() throws Exception { public DbType dbTypeSelector() {
Connection con = null; return DbType.MYSQL;
try {
Class.forName(Constants.COM_MYSQL_JDBC_DRIVER);
con = DriverManager.getConnection(getJdbcUrl(), getUser(), getPassword());
} finally {
if (con != null) {
try {
con.close();
} catch (SQLException e) {
logger.error("Mysql datasource try conn close conn error", e);
}
}
}
} }
} }

47
dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/datasource/OracleDataSource.java

@ -17,59 +17,26 @@
package org.apache.dolphinscheduler.dao.datasource; package org.apache.dolphinscheduler.dao.datasource;
import org.apache.dolphinscheduler.common.Constants; import org.apache.dolphinscheduler.common.Constants;
import org.apache.dolphinscheduler.common.utils.StringUtils; import org.apache.dolphinscheduler.common.enums.DbType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/** /**
* data source of Oracle * data source of Oracle
*/ */
public class OracleDataSource extends BaseDataSource { public class OracleDataSource extends BaseDataSource {
private static final Logger logger = LoggerFactory.getLogger(OracleDataSource.class);
/** /**
* gets the JDBC url for the data source connection * @return driver class
* @return
*/ */
@Override @Override
public String getJdbcUrl() { public String driverClassSelector() {
String jdbcUrl = getAddress(); return Constants.COM_ORACLE_JDBC_DRIVER;
if (jdbcUrl.lastIndexOf("/") != (jdbcUrl.length() - 1)) {
jdbcUrl += "/";
}
jdbcUrl += getDatabase();
if (StringUtils.isNotEmpty(getOther())) {
jdbcUrl += "?" + getOther();
}
return jdbcUrl;
} }
/** /**
* test whether the data source can be connected successfully * @return db type
* @throws Exception
*/ */
@Override @Override
public void isConnectable() throws Exception { public DbType dbTypeSelector() {
Connection con = null; return DbType.ORACLE;
try {
Class.forName(Constants.COM_ORACLE_JDBC_DRIVER);
con = DriverManager.getConnection(getJdbcUrl(), getUser(), getPassword());
} finally {
if (con != null) {
try {
con.close();
} catch (SQLException e) {
logger.error("Oracle datasource try conn close conn error", e);
}
}
}
} }
} }

49
dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/datasource/PostgreDataSource.java

@ -17,61 +17,26 @@
package org.apache.dolphinscheduler.dao.datasource; package org.apache.dolphinscheduler.dao.datasource;
import org.apache.dolphinscheduler.common.Constants; import org.apache.dolphinscheduler.common.Constants;
import org.apache.dolphinscheduler.common.utils.StringUtils; import org.apache.dolphinscheduler.common.enums.DbType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/** /**
* data source of postgreSQL * data source of postgreSQL
*/ */
public class PostgreDataSource extends BaseDataSource { public class PostgreDataSource extends BaseDataSource {
private static final Logger logger = LoggerFactory.getLogger(PostgreDataSource.class);
/** /**
* gets the JDBC url for the data source connection * @return driver class
* @return
*/ */
@Override @Override
public String getJdbcUrl() { public String driverClassSelector() {
String jdbcUrl = getAddress(); return Constants.ORG_POSTGRESQL_DRIVER;
if (jdbcUrl.lastIndexOf('/') != (jdbcUrl.length() - 1)) {
jdbcUrl += "/";
}
jdbcUrl += getDatabase();
if (StringUtils.isNotEmpty(getOther())) {
jdbcUrl += "?" + getOther();
}
return jdbcUrl;
} }
/** /**
* test whether the data source can be connected successfully * @return db type
* @throws Exception
*/ */
@Override @Override
public void isConnectable() throws Exception { public DbType dbTypeSelector() {
Connection con = null; return DbType.POSTGRESQL;
try {
Class.forName(Constants.ORG_POSTGRESQL_DRIVER);
con = DriverManager.getConnection(getJdbcUrl(), getUser(), getPassword());
} finally {
if (con != null) {
try {
con.close();
} catch (SQLException e) {
logger.error("Postgre datasource try conn close conn error", e);
}
}
}
} }
} }

61
dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/datasource/SQLServerDataSource.java

@ -17,55 +17,26 @@
package org.apache.dolphinscheduler.dao.datasource; package org.apache.dolphinscheduler.dao.datasource;
import org.apache.dolphinscheduler.common.Constants; import org.apache.dolphinscheduler.common.Constants;
import org.apache.dolphinscheduler.common.utils.StringUtils; import org.apache.dolphinscheduler.common.enums.DbType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/** /**
* data source of SQL Server * data source of SQL Server
*/ */
public class SQLServerDataSource extends BaseDataSource { public class SQLServerDataSource extends BaseDataSource {
private static final Logger logger = LoggerFactory.getLogger(SQLServerDataSource.class);
/**
* gets the JDBC url for the data source connection
* @return
*/
@Override
public String getJdbcUrl() {
String jdbcUrl = getAddress();
jdbcUrl += ";databaseName=" + getDatabase();
if (StringUtils.isNotEmpty(getOther())) {
jdbcUrl += ";" + getOther();
}
return jdbcUrl;
}
/**
* test whether the data source can be connected successfully
* @throws Exception
*/
@Override
public void isConnectable() throws Exception {
Connection con = null;
try {
Class.forName(Constants.COM_SQLSERVER_JDBC_DRIVER);
con = DriverManager.getConnection(getJdbcUrl(), getUser(), getPassword());
} finally {
if (con != null) {
try {
con.close();
} catch (SQLException e) {
logger.error("SQL Server datasource try conn close conn error", e);
}
}
}
} /**
* @return driver class
*/
@Override
public String driverClassSelector() {
return Constants.COM_SQLSERVER_JDBC_DRIVER;
}
/**
* @return db type
*/
@Override
public DbType dbTypeSelector() {
return DbType.SQLSERVER;
}
} }

52
dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/datasource/SparkDataSource.java

@ -17,64 +17,26 @@
package org.apache.dolphinscheduler.dao.datasource; package org.apache.dolphinscheduler.dao.datasource;
import org.apache.dolphinscheduler.common.Constants; import org.apache.dolphinscheduler.common.Constants;
import org.apache.dolphinscheduler.common.utils.StringUtils; import org.apache.dolphinscheduler.common.enums.DbType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/** /**
* data source of spark * data source of spark
*/ */
public class SparkDataSource extends BaseDataSource { public class SparkDataSource extends BaseDataSource {
private static final Logger logger = LoggerFactory.getLogger(SparkDataSource.class);
/** /**
* gets the JDBC url for the data source connection * @return driver class
* @return
*/ */
@Override @Override
public String getJdbcUrl() { public String driverClassSelector() {
String jdbcUrl = getAddress(); return Constants.ORG_APACHE_HIVE_JDBC_HIVE_DRIVER;
if (jdbcUrl.lastIndexOf("/") != (jdbcUrl.length() - 1)) {
jdbcUrl += "/";
}
jdbcUrl += getDatabase();
if (StringUtils.isNotEmpty(getPrincipal())){
jdbcUrl += ";principal=" + getPrincipal();
}
if (StringUtils.isNotEmpty(getOther())) {
jdbcUrl += ";" + getOther();
}
return jdbcUrl;
} }
/** /**
* test whether the data source can be connected successfully * @return db type
* @throws Exception
*/ */
@Override @Override
public void isConnectable() throws Exception { public DbType dbTypeSelector() {
Connection con = null; return DbType.SPARK;
try {
Class.forName(Constants.ORG_APACHE_HIVE_JDBC_HIVE_DRIVER);
con = DriverManager.getConnection(getJdbcUrl(), getUser(), "");
} finally {
if (con != null) {
try {
con.close();
} catch (SQLException e) {
logger.error("Spark datasource try conn close conn error", e);
}
}
}
} }
} }

2
dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/ProcessInstance.java

@ -366,7 +366,7 @@ public class ProcessInstance {
} }
public boolean IsProcessInstanceStop(){ public boolean isProcessInstanceStop(){
return this.state.typeIsFinished(); return this.state.typeIsFinished();
} }

4
dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/upgrade/MysqlUpgradeDao.java

@ -66,7 +66,7 @@ public class MysqlUpgradeDao extends UpgradeDao {
logger.error(e.getMessage(),e); logger.error(e.getMessage(),e);
throw new RuntimeException(e.getMessage(),e); throw new RuntimeException(e.getMessage(),e);
} finally { } finally {
ConnectionUtils.releaseResource(rs, null, conn); ConnectionUtils.releaseResource(rs, conn);
} }
} }
@ -89,7 +89,7 @@ public class MysqlUpgradeDao extends UpgradeDao {
logger.error(e.getMessage(),e); logger.error(e.getMessage(),e);
throw new RuntimeException(e.getMessage(),e); throw new RuntimeException(e.getMessage(),e);
} finally { } finally {
ConnectionUtils.releaseResource(null, null, conn); ConnectionUtils.releaseResource(conn);
} }
} }

4
dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/upgrade/PostgresqlUpgradeDao.java

@ -96,7 +96,7 @@ public class PostgresqlUpgradeDao extends UpgradeDao {
logger.error(e.getMessage(),e); logger.error(e.getMessage(),e);
throw new RuntimeException(e.getMessage(),e); throw new RuntimeException(e.getMessage(),e);
} finally { } finally {
ConnectionUtils.releaseResource(rs, null, conn); ConnectionUtils.releaseResource(rs, conn);
} }
} }
@ -119,7 +119,7 @@ public class PostgresqlUpgradeDao extends UpgradeDao {
logger.error(e.getMessage(),e); logger.error(e.getMessage(),e);
throw new RuntimeException(e.getMessage(),e); throw new RuntimeException(e.getMessage(),e);
} finally { } finally {
ConnectionUtils.releaseResource(rs, null, conn); ConnectionUtils.releaseResource(rs, conn);
} }

24
dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/upgrade/UpgradeDao.java

@ -27,6 +27,7 @@ import org.apache.dolphinscheduler.dao.datasource.ConnectionFactory;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import javax.sql.DataSource;
import java.io.*; import java.io.*;
import java.sql.Connection; import java.sql.Connection;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
@ -40,7 +41,7 @@ public abstract class UpgradeDao extends AbstractBaseDao {
private static final String T_VERSION_NAME = "t_escheduler_version"; private static final String T_VERSION_NAME = "t_escheduler_version";
private static final String T_NEW_VERSION_NAME = "t_ds_version"; private static final String T_NEW_VERSION_NAME = "t_ds_version";
private static final String rootDir = System.getProperty("user.dir"); private static final String rootDir = System.getProperty("user.dir");
protected static final DruidDataSource dataSource = getDataSource(); protected static final DataSource dataSource = getDataSource();
private static final DbType dbType = getCurrentDbType(); private static final DbType dbType = getCurrentDbType();
@Override @Override
@ -52,13 +53,8 @@ public abstract class UpgradeDao extends AbstractBaseDao {
* get datasource * get datasource
* @return DruidDataSource * @return DruidDataSource
*/ */
public static DruidDataSource getDataSource(){ public static DataSource getDataSource(){
DruidDataSource dataSource = ConnectionFactory.getInstance().getDataSource(); return ConnectionFactory.getInstance().getDataSource();
dataSource.setInitialSize(2);
dataSource.setMinIdle(2);
dataSource.setMaxActive(2);
return dataSource;
} }
/** /**
@ -83,7 +79,7 @@ public abstract class UpgradeDao extends AbstractBaseDao {
logger.error(e.getMessage(),e); logger.error(e.getMessage(),e);
return null; return null;
}finally { }finally {
ConnectionUtils.releaseResource(null, null, conn); ConnectionUtils.releaseResource(conn);
} }
} }
@ -164,7 +160,7 @@ public abstract class UpgradeDao extends AbstractBaseDao {
logger.error(e.getMessage(),e); logger.error(e.getMessage(),e);
throw new RuntimeException(e.getMessage(),e); throw new RuntimeException(e.getMessage(),e);
} finally { } finally {
ConnectionUtils.releaseResource(null, null, conn); ConnectionUtils.releaseResource(conn);
} }
@ -197,7 +193,7 @@ public abstract class UpgradeDao extends AbstractBaseDao {
logger.error(e.getMessage(),e); logger.error(e.getMessage(),e);
throw new RuntimeException(e.getMessage(),e); throw new RuntimeException(e.getMessage(),e);
} finally { } finally {
ConnectionUtils.releaseResource(null, null, conn); ConnectionUtils.releaseResource(conn);
} }
@ -333,7 +329,7 @@ public abstract class UpgradeDao extends AbstractBaseDao {
logger.error(e.getMessage(),e); logger.error(e.getMessage(),e);
throw new RuntimeException(e.getMessage(),e); throw new RuntimeException(e.getMessage(),e);
} finally { } finally {
ConnectionUtils.releaseResource(null, pstmt, conn); ConnectionUtils.releaseResource(pstmt, conn);
} }
} }
@ -376,7 +372,7 @@ public abstract class UpgradeDao extends AbstractBaseDao {
logger.error(e.getMessage(),e); logger.error(e.getMessage(),e);
throw new RuntimeException(e.getMessage(),e); throw new RuntimeException(e.getMessage(),e);
} finally { } finally {
ConnectionUtils.releaseResource(null, pstmt, conn); ConnectionUtils.releaseResource(pstmt, conn);
} }
} }
@ -405,7 +401,7 @@ public abstract class UpgradeDao extends AbstractBaseDao {
logger.error(e.getMessage(),e); logger.error(e.getMessage(),e);
throw new RuntimeException("sql: " + upgradeSQL, e); throw new RuntimeException("sql: " + upgradeSQL, e);
} finally { } finally {
ConnectionUtils.releaseResource(null, pstmt, conn); ConnectionUtils.releaseResource(pstmt, conn);
} }
} }

35
dolphinscheduler-dao/src/test/java/org/apache/dolphinscheduler/dao/AlertDaoTest.java

@ -16,19 +16,42 @@
*/ */
package org.apache.dolphinscheduler.dao; package org.apache.dolphinscheduler.dao;
import org.apache.dolphinscheduler.common.enums.AlertStatus;
import org.apache.dolphinscheduler.common.enums.AlertType;
import org.apache.dolphinscheduler.common.enums.ShowType;
import org.apache.dolphinscheduler.dao.entity.Alert;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Test; import org.junit.Test;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
public class AlertDaoTest { import java.util.Arrays;
private static final Logger logger = LoggerFactory.getLogger(AlertDaoTest.class); import java.util.List;
public class AlertDaoTest {
@Test @Test
public void testGetAlertDao() { public void testAlertDao(){
logger.info("testGetAlertDao start");
AlertDao alertDao = DaoFactory.getDaoInstance(AlertDao.class); AlertDao alertDao = DaoFactory.getDaoInstance(AlertDao.class);
Assert.assertNotNull(alertDao); Alert alert = new Alert();
logger.info("testGetAlertDao end"); alert.setTitle("Mysql Exception");
alert.setShowType(ShowType.TEXT);
alert.setContent("[\"alarm time:2018-02-05\", \"service name:MYSQL_ALTER\", \"alarm name:MYSQL_ALTER_DUMP\", " +
"\"get the alarm exception.!,interface error,exception information:timed out\", \"request address:http://blog.csdn.net/dreamInTheWorld/article/details/78539286\"]");
alert.setAlertType(AlertType.EMAIL);
alert.setAlertGroupId(1);
alert.setAlertStatus(AlertStatus.WAIT_EXECUTION);
alertDao.addAlert(alert);
List<Alert> alerts = alertDao.listWaitExecutionAlert();
Assert.assertNotNull(alerts);
Assert.assertNotEquals(0, alerts.size());
int id = alerts.get(0).getId();
AlertStatus alertStatus = alerts.get(0).getAlertStatus();
alertDao.updateAlert(AlertStatus.EXECUTION_SUCCESS, "", id);
alerts = alertDao.listWaitExecutionAlert();
Assert.assertEquals(0, alerts.size());
alertDao.getAlertMapper().deleteById(id);
} }
} }

115
dolphinscheduler-dao/src/test/java/org/apache/dolphinscheduler/dao/datasource/BaseDataSourceTest.java

@ -0,0 +1,115 @@
/*
* 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 org.apache.dolphinscheduler.dao.datasource;
import org.apache.dolphinscheduler.common.Constants;
import org.junit.Assert;
import org.junit.Test;
public class BaseDataSourceTest {
@Test
public void testDriverClassSelector() {
String mysqlDriverClass = new MySQLDataSource().driverClassSelector();
Assert.assertEquals(Constants.COM_MYSQL_JDBC_DRIVER, mysqlDriverClass);
String clickHouseDriverClass = new ClickHouseDataSource().driverClassSelector();
Assert.assertEquals(Constants.COM_CLICKHOUSE_JDBC_DRIVER, clickHouseDriverClass);
String db2ServerDriverClass = new DB2ServerDataSource().driverClassSelector();
Assert.assertEquals(Constants.COM_DB2_JDBC_DRIVER, db2ServerDriverClass);
String oracleDriverClass = new OracleDataSource().driverClassSelector();
Assert.assertEquals(Constants.COM_ORACLE_JDBC_DRIVER, oracleDriverClass);
String postgreDriverClass = new PostgreDataSource().driverClassSelector();
Assert.assertEquals(Constants.ORG_POSTGRESQL_DRIVER, postgreDriverClass);
String sqlServerDriverClass = new SQLServerDataSource().driverClassSelector();
Assert.assertEquals(Constants.COM_SQLSERVER_JDBC_DRIVER, sqlServerDriverClass);
String hiveDriverClass = new HiveDataSource().driverClassSelector();
Assert.assertEquals(Constants.ORG_APACHE_HIVE_JDBC_HIVE_DRIVER, hiveDriverClass);
String sparkDriverClass = new SparkDataSource().driverClassSelector();
Assert.assertEquals(Constants.ORG_APACHE_HIVE_JDBC_HIVE_DRIVER, sparkDriverClass);
}
@Test
public void testGetJdbcUrl() {
BaseDataSource hiveDataSource = new HiveDataSource();
hiveDataSource.setAddress("jdbc:hive2://127.0.0.1:10000");
hiveDataSource.setDatabase("test");
hiveDataSource.setPassword("123456");
hiveDataSource.setUser("test");
Assert.assertEquals("jdbc:hive2://127.0.0.1:10000/test", hiveDataSource.getJdbcUrl());
//set principal
hiveDataSource.setPrincipal("hive/test.com@TEST.COM");
Assert.assertEquals("jdbc:hive2://127.0.0.1:10000/test;principal=hive/test.com@TEST.COM",
hiveDataSource.getJdbcUrl());
//set fake other
hiveDataSource.setOther("charset=UTF-8");
Assert.assertEquals(
"jdbc:hive2://127.0.0.1:10000/test;principal=hive/test.com@TEST.COM;charset=UTF-8",
hiveDataSource.getJdbcUrl());
BaseDataSource clickHouseDataSource = new ClickHouseDataSource();
clickHouseDataSource.setAddress("jdbc:clickhouse://127.0.0.1:8123");
clickHouseDataSource.setDatabase("test");
clickHouseDataSource.setPassword("123456");
clickHouseDataSource.setUser("test");
Assert.assertEquals("jdbc:clickhouse://127.0.0.1:8123/test", clickHouseDataSource.getJdbcUrl());
//set fake principal
clickHouseDataSource.setPrincipal("fake principal");
Assert.assertEquals("jdbc:clickhouse://127.0.0.1:8123/test", clickHouseDataSource.getJdbcUrl());
//set fake other
clickHouseDataSource.setOther("charset=UTF-8");
Assert.assertEquals("jdbc:clickhouse://127.0.0.1:8123/test?charset=UTF-8",
clickHouseDataSource.getJdbcUrl());
BaseDataSource sqlServerDataSource = new SQLServerDataSource();
sqlServerDataSource.setAddress("jdbc:sqlserver://127.0.0.1:1433");
sqlServerDataSource.setDatabase("test");
sqlServerDataSource.setPassword("123456");
sqlServerDataSource.setUser("test");
Assert.assertEquals("jdbc:sqlserver://127.0.0.1:1433;databaseName=test",
sqlServerDataSource.getJdbcUrl());
//set fake principal
sqlServerDataSource.setPrincipal("fake principal");
Assert.assertEquals("jdbc:sqlserver://127.0.0.1:1433;databaseName=test",
sqlServerDataSource.getJdbcUrl());
//set fake other
sqlServerDataSource.setOther("charset=UTF-8");
Assert.assertEquals("jdbc:sqlserver://127.0.0.1:1433;databaseName=test;charset=UTF-8",
sqlServerDataSource.getJdbcUrl());
BaseDataSource db2DataSource = new DB2ServerDataSource();
db2DataSource.setAddress("jdbc:db2://127.0.0.1:50000");
db2DataSource.setDatabase("test");
db2DataSource.setPassword("123456");
db2DataSource.setUser("test");
Assert.assertEquals("jdbc:db2://127.0.0.1:50000/test", db2DataSource.getJdbcUrl());
//set fake principal
db2DataSource.setPrincipal("fake principal");
Assert.assertEquals("jdbc:db2://127.0.0.1:50000/test", db2DataSource.getJdbcUrl());
//set fake other
db2DataSource.setOther("charset=UTF-8");
Assert.assertEquals("jdbc:db2://127.0.0.1:50000/test:charset=UTF-8", db2DataSource.getJdbcUrl());
}
}

2
dolphinscheduler-dao/src/test/java/org/apache/dolphinscheduler/dao/mapper/ConnectionFactoryTest.java

@ -31,7 +31,7 @@ public class ConnectionFactoryTest {
*/ */
@Test @Test
public void testConnection()throws Exception{ public void testConnection()throws Exception{
Connection connection = ConnectionFactory.getInstance().getDataSource().getPooledConnection().getConnection(); Connection connection = ConnectionFactory.getInstance().getDataSource().getConnection();
Assert.assertTrue(connection != null); Assert.assertTrue(connection != null);
} }
} }

6
dolphinscheduler-dao/src/test/java/org/apache/dolphinscheduler/dao/mapper/ProcessInstanceMapMapperTest.java

@ -60,7 +60,7 @@ public class ProcessInstanceMapMapperTest {
//update //update
processInstanceMap.setParentProcessInstanceId(1); processInstanceMap.setParentProcessInstanceId(1);
int update = processInstanceMapMapper.updateById(processInstanceMap); int update = processInstanceMapMapper.updateById(processInstanceMap);
Assert.assertEquals(update, 1); Assert.assertEquals(1, update);
processInstanceMapMapper.deleteById(processInstanceMap.getId()); processInstanceMapMapper.deleteById(processInstanceMap.getId());
} }
@ -71,7 +71,7 @@ public class ProcessInstanceMapMapperTest {
public void testDelete(){ public void testDelete(){
ProcessInstanceMap processInstanceMap = insertOne(); ProcessInstanceMap processInstanceMap = insertOne();
int delete = processInstanceMapMapper.deleteById(processInstanceMap.getId()); int delete = processInstanceMapMapper.deleteById(processInstanceMap.getId());
Assert.assertEquals(delete, 1); Assert.assertEquals(1, delete);
} }
/** /**
@ -132,7 +132,7 @@ public class ProcessInstanceMapMapperTest {
int delete = processInstanceMapMapper.deleteByParentProcessId( int delete = processInstanceMapMapper.deleteByParentProcessId(
processInstanceMap.getParentProcessInstanceId() processInstanceMap.getParentProcessInstanceId()
); );
Assert.assertEquals(delete, 1); Assert.assertEquals(1, delete);
} }
/** /**

14
dolphinscheduler-dao/src/test/java/org/apache/dolphinscheduler/dao/mapper/ProcessInstanceMapperTest.java

@ -74,7 +74,7 @@ public class ProcessInstanceMapperTest {
ProcessInstance processInstanceMap = insertOne(); ProcessInstance processInstanceMap = insertOne();
//update //update
int update = processInstanceMapper.updateById(processInstanceMap); int update = processInstanceMapper.updateById(processInstanceMap);
Assert.assertEquals(update, 1); Assert.assertEquals(1, update);
processInstanceMapper.deleteById(processInstanceMap.getId()); processInstanceMapper.deleteById(processInstanceMap.getId());
} }
@ -85,7 +85,7 @@ public class ProcessInstanceMapperTest {
public void testDelete(){ public void testDelete(){
ProcessInstance processInstanceMap = insertOne(); ProcessInstance processInstanceMap = insertOne();
int delete = processInstanceMapper.deleteById(processInstanceMap.getId()); int delete = processInstanceMapper.deleteById(processInstanceMap.getId());
Assert.assertEquals(delete, 1); Assert.assertEquals(1, delete);
} }
/** /**
@ -197,7 +197,7 @@ public class ProcessInstanceMapperTest {
Assert.assertNotEquals(update, 0); Assert.assertNotEquals(update, 0);
processInstance = processInstanceMapper.selectById(processInstance.getId()); processInstance = processInstanceMapper.selectById(processInstance.getId());
Assert.assertEquals(processInstance.getHost(), null); Assert.assertNull(processInstance.getHost());
processInstanceMapper.deleteById(processInstance.getId()); processInstanceMapper.deleteById(processInstance.getId());
} }
@ -217,7 +217,7 @@ public class ProcessInstanceMapperTest {
ProcessInstance processInstance1 = processInstanceMapper.selectById(processInstance.getId()); ProcessInstance processInstance1 = processInstanceMapper.selectById(processInstance.getId());
processInstanceMapper.deleteById(processInstance.getId()); processInstanceMapper.deleteById(processInstance.getId());
Assert.assertEquals(processInstance1.getState(), ExecutionStatus.SUCCESS); Assert.assertEquals(ExecutionStatus.SUCCESS, processInstance1.getState());
} }
@ -261,10 +261,10 @@ public class ProcessInstanceMapperTest {
List<ProcessInstance> processInstances = processInstanceMapper.queryByProcessDefineId(processInstance.getProcessDefinitionId(), 1); List<ProcessInstance> processInstances = processInstanceMapper.queryByProcessDefineId(processInstance.getProcessDefinitionId(), 1);
Assert.assertEquals(processInstances.size(), 1); Assert.assertEquals(1, processInstances.size());
processInstances = processInstanceMapper.queryByProcessDefineId(processInstance.getProcessDefinitionId(), 2); processInstances = processInstanceMapper.queryByProcessDefineId(processInstance.getProcessDefinitionId(), 2);
Assert.assertEquals(processInstances.size(), 2); Assert.assertEquals(2, processInstances.size());
processInstanceMapper.deleteById(processInstance.getId()); processInstanceMapper.deleteById(processInstance.getId());
processInstanceMapper.deleteById(processInstance1.getId()); processInstanceMapper.deleteById(processInstance1.getId());
@ -320,7 +320,7 @@ public class ProcessInstanceMapperTest {
start = new Date(2019-1900, 1-1, 01, 1, 0, 0); start = new Date(2019-1900, 1-1, 01, 1, 0, 0);
processInstance1 = processInstanceMapper.queryLastManualProcess(processInstance.getProcessDefinitionId(),start, end processInstance1 = processInstanceMapper.queryLastManualProcess(processInstance.getProcessDefinitionId(),start, end
); );
Assert.assertEquals(processInstance1, null); Assert.assertNull(processInstance1);
processInstanceMapper.deleteById(processInstance.getId()); processInstanceMapper.deleteById(processInstance.getId());

4
dolphinscheduler-dao/src/test/java/org/apache/dolphinscheduler/dao/mapper/TaskInstanceMapperTest.java

@ -78,7 +78,7 @@ public class TaskInstanceMapperTest {
TaskInstance taskInstance = insertOne(); TaskInstance taskInstance = insertOne();
//update //update
int update = taskInstanceMapper.updateById(taskInstance); int update = taskInstanceMapper.updateById(taskInstance);
Assert.assertEquals(update, 1); Assert.assertEquals(1, update);
taskInstanceMapper.deleteById(taskInstance.getId()); taskInstanceMapper.deleteById(taskInstance.getId());
} }
@ -89,7 +89,7 @@ public class TaskInstanceMapperTest {
public void testDelete(){ public void testDelete(){
TaskInstance taskInstance = insertOne(); TaskInstance taskInstance = insertOne();
int delete = taskInstanceMapper.deleteById(taskInstance.getId()); int delete = taskInstanceMapper.deleteById(taskInstance.getId());
Assert.assertEquals(delete, 1); Assert.assertEquals(1, delete);
} }
/** /**

4
dolphinscheduler-dao/src/test/java/org/apache/dolphinscheduler/dao/mapper/TenantMapperTest.java

@ -64,7 +64,7 @@ public class TenantMapperTest {
tenant.setUpdateTime(new Date()); tenant.setUpdateTime(new Date());
//update //update
int update = tenantMapper.updateById(tenant); int update = tenantMapper.updateById(tenant);
Assert.assertEquals(update, 1); Assert.assertEquals(1, update);
tenantMapper.deleteById(tenant.getId()); tenantMapper.deleteById(tenant.getId());
} }
@ -75,7 +75,7 @@ public class TenantMapperTest {
public void testDelete(){ public void testDelete(){
Tenant tenant = insertOne(); Tenant tenant = insertOne();
int delete = tenantMapper.deleteById(tenant.getId()); int delete = tenantMapper.deleteById(tenant.getId());
Assert.assertEquals(delete, 1); Assert.assertEquals(1, delete);
} }
/** /**

4
dolphinscheduler-dao/src/test/java/org/apache/dolphinscheduler/dao/mapper/WorkerGroupMapperTest.java

@ -65,7 +65,7 @@ public class WorkerGroupMapperTest {
workerGroup.setName("workerGroup11"); workerGroup.setName("workerGroup11");
int update = workerGroupMapper.updateById(workerGroup); int update = workerGroupMapper.updateById(workerGroup);
workerGroupMapper.deleteById(workerGroup.getId()); workerGroupMapper.deleteById(workerGroup.getId());
Assert.assertEquals(update, 1); Assert.assertEquals(1, update);
} }
/** /**
@ -77,7 +77,7 @@ public class WorkerGroupMapperTest {
WorkerGroup workerGroup = insertOne(); WorkerGroup workerGroup = insertOne();
//delete //delete
int delete = workerGroupMapper.deleteById(workerGroup.getId()); int delete = workerGroupMapper.deleteById(workerGroup.getId());
Assert.assertEquals(delete, 1); Assert.assertEquals(1, delete);
} }
/** /**

2
dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/master/runner/MasterExecThread.java

@ -937,7 +937,7 @@ public class MasterExecThread implements Runnable {
// submit start node // submit start node
submitPostNode(null); submitPostNode(null);
boolean sendTimeWarning = false; boolean sendTimeWarning = false;
while(!processInstance.IsProcessInstanceStop()){ while(!processInstance.isProcessInstanceStop()){
// send warning email if process time out. // send warning email if process time out.
if( !sendTimeWarning && checkProcessTimeOut(processInstance) ){ if( !sendTimeWarning && checkProcessTimeOut(processInstance) ){

18
dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/worker/WorkerServer.java

@ -52,7 +52,6 @@ import org.springframework.context.annotation.FilterType;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy; import javax.annotation.PreDestroy;
import java.util.Set; import java.util.Set;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@ -255,7 +254,7 @@ public class WorkerServer implements IStoppable {
*/ */
private Runnable heartBeatThread(){ private Runnable heartBeatThread(){
logger.info("start worker heart beat thread..."); logger.info("start worker heart beat thread...");
Runnable heartBeatThread = new Runnable() { return new Runnable() {
@Override @Override
public void run() { public void run() {
// send heartbeat to zk // send heartbeat to zk
@ -266,7 +265,6 @@ public class WorkerServer implements IStoppable {
zkWorkerClient.heartBeatForZk(zkWorkerClient.getWorkerZNode() , Constants.WORKER_PREFIX); zkWorkerClient.heartBeatForZk(zkWorkerClient.getWorkerZNode() , Constants.WORKER_PREFIX);
} }
}; };
return heartBeatThread;
} }
@ -276,7 +274,7 @@ public class WorkerServer implements IStoppable {
* @return kill process thread * @return kill process thread
*/ */
private Runnable getKillProcessThread(){ private Runnable getKillProcessThread(){
Runnable killProcessThread = new Runnable() { return new Runnable() {
@Override @Override
public void run() { public void run() {
logger.info("start listening kill process thread..."); logger.info("start listening kill process thread...");
@ -297,7 +295,6 @@ public class WorkerServer implements IStoppable {
} }
} }
}; };
return killProcessThread;
} }
/** /**
@ -307,17 +304,17 @@ public class WorkerServer implements IStoppable {
* @param pd process dao * @param pd process dao
*/ */
private void killTask(String taskInfo, ProcessService pd) { private void killTask(String taskInfo, ProcessService pd) {
logger.info("get one kill command from tasks kill queue: " + taskInfo); logger.info("get one kill command from tasks kill queue: {}" , taskInfo);
String[] taskInfoArray = taskInfo.split("-"); String[] taskInfoArray = taskInfo.split("-");
if(taskInfoArray.length != 2){ if(taskInfoArray.length != 2){
logger.error("error format kill info: " + taskInfo); logger.error("error format kill info: {}", taskInfo);
return ; return ;
} }
String host = taskInfoArray[0]; String host = taskInfoArray[0];
int taskInstanceId = Integer.parseInt(taskInfoArray[1]); int taskInstanceId = Integer.parseInt(taskInfoArray[1]);
TaskInstance taskInstance = pd.getTaskInstanceDetailByTaskId(taskInstanceId); TaskInstance taskInstance = pd.getTaskInstanceDetailByTaskId(taskInstanceId);
if(taskInstance == null){ if(taskInstance == null){
logger.error("cannot find the kill task :" + taskInfo); logger.error("cannot find the kill task : {}", taskInfo);
return; return;
} }
@ -332,8 +329,7 @@ public class WorkerServer implements IStoppable {
}else if(!taskInstance.getState().typeIsFinished()){ }else if(!taskInstance.getState().typeIsFinished()){
ProcessUtils.kill(taskInstance); ProcessUtils.kill(taskInstance);
}else{ }else{
logger.info("the task aleady finish: task id: " + taskInstance.getId() logger.info("the task aleady finish: task id: {} state: {}", taskInstance.getId(), taskInstance.getState());
+ " state: " + taskInstance.getState().toString());
} }
} }
} }
@ -347,7 +343,7 @@ public class WorkerServer implements IStoppable {
private void deleteTaskFromQueue(TaskInstance taskInstance, ProcessService pd){ private void deleteTaskFromQueue(TaskInstance taskInstance, ProcessService pd){
// creating distributed locks, lock path /dolphinscheduler/lock/worker // creating distributed locks, lock path /dolphinscheduler/lock/worker
InterProcessMutex mutex = null; InterProcessMutex mutex = null;
logger.info("delete task from tasks queue: " + taskInstance.getId()); logger.info("delete task from tasks queue: {}", taskInstance.getId());
try { try {
mutex = zkWorkerClient.acquireZkLock(zkWorkerClient.getZkClient(), mutex = zkWorkerClient.acquireZkLock(zkWorkerClient.getZkClient(),

2
dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/worker/runner/TaskScheduleThread.java

@ -230,7 +230,7 @@ public class TaskScheduleThread implements Runnable {
taskInstance.getId() + ".log"; taskInstance.getId() + ".log";
} }
}catch (Exception e){ }catch (Exception e){
logger.error("logger" + e); logger.error("logger {}", e.getMessage(), e);
logPath = ""; logPath = "";
} }
return logPath; return logPath;

9
dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/worker/task/shell/ShellTask.java

@ -134,7 +134,6 @@ public class ShellTask extends AbstractTask {
String script = shellParameters.getRawScript().replaceAll("\\r\\n", "\n"); String script = shellParameters.getRawScript().replaceAll("\\r\\n", "\n");
/** /**
* combining local and global parameters * combining local and global parameters
*/ */
@ -143,13 +142,9 @@ public class ShellTask extends AbstractTask {
shellParameters.getLocalParametersMap(), shellParameters.getLocalParametersMap(),
taskProps.getCmdTypeIfComplement(), taskProps.getCmdTypeIfComplement(),
taskProps.getScheduleTime()); taskProps.getScheduleTime());
// if (paramsMap != null){
// script = ParameterUtils.convertParameterPlaceholders(script, ParamUtils.convert(paramsMap));
// }
//new
// replace variable TIME with $[YYYYmmddd...] in shell file when history run job and batch complement job // replace variable TIME with $[YYYYmmddd...] in shell file when history run job and batch complement job
if (paramsMap != null) { if(paramsMap != null && taskProps.getScheduleTime()!=null) {
String dateTime = DateUtils.format(taskProps.getScheduleTime(), Constants.PARAMETER_FORMAT_TIME); String dateTime = DateUtils.format(taskProps.getScheduleTime(), Constants.PARAMETER_FORMAT_TIME);
Property p = new Property(); Property p = new Property();
p.setValue(dateTime); p.setValue(dateTime);
@ -182,6 +177,4 @@ public class ShellTask extends AbstractTask {
return shellParameters; return shellParameters;
} }
} }

22
dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/worker/task/sql/SqlTask.java

@ -140,7 +140,6 @@ public class SqlTask extends AbstractTask {
dataSource.getUserId(), dataSource.getUserId(),
dataSource.getConnectionParams()); dataSource.getConnectionParams());
Connection con = null;
List<String> createFuncs = null; List<String> createFuncs = null;
try { try {
// load class // load class
@ -178,18 +177,10 @@ public class SqlTask extends AbstractTask {
} }
// execute sql task // execute sql task
con = executeFuncAndSql(mainSqlBinds, preStatementSqlBinds, postStatementSqlBinds, createFuncs); executeFuncAndSql(mainSqlBinds, preStatementSqlBinds, postStatementSqlBinds, createFuncs);
} catch (Exception e) { } catch (Exception e) {
logger.error(e.getMessage(), e); logger.error(e.getMessage(), e);
throw e; throw e;
} finally {
if (con != null) {
try {
con.close();
} catch (SQLException e) {
logger.error(e.getMessage(),e);
}
}
} }
} }
@ -249,9 +240,8 @@ public class SqlTask extends AbstractTask {
* @param preStatementsBinds pre statements binds * @param preStatementsBinds pre statements binds
* @param postStatementsBinds post statements binds * @param postStatementsBinds post statements binds
* @param createFuncs create functions * @param createFuncs create functions
* @return Connection
*/ */
public Connection executeFuncAndSql(SqlBinds mainSqlBinds, public void executeFuncAndSql(SqlBinds mainSqlBinds,
List<SqlBinds> preStatementsBinds, List<SqlBinds> preStatementsBinds,
List<SqlBinds> postStatementsBinds, List<SqlBinds> postStatementsBinds,
List<String> createFuncs){ List<String> createFuncs){
@ -343,13 +333,9 @@ public class SqlTask extends AbstractTask {
logger.error(e.getMessage(),e); logger.error(e.getMessage(),e);
throw new RuntimeException(e.getMessage()); throw new RuntimeException(e.getMessage());
} finally { } finally {
try { ConnectionUtils.releaseResource(connection);
connection.close();
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
} }
return connection;
} }
/** /**

6
dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/queue/TaskQueueZkImpl.java

@ -18,6 +18,7 @@ package org.apache.dolphinscheduler.service.queue;
import org.apache.dolphinscheduler.common.Constants; import org.apache.dolphinscheduler.common.Constants;
import org.apache.dolphinscheduler.common.utils.CollectionUtils;
import org.apache.dolphinscheduler.common.utils.IpUtils; import org.apache.dolphinscheduler.common.utils.IpUtils;
import org.apache.dolphinscheduler.common.utils.OSUtils; import org.apache.dolphinscheduler.common.utils.OSUtils;
import org.apache.dolphinscheduler.service.zk.ZookeeperOperator; import org.apache.dolphinscheduler.service.zk.ZookeeperOperator;
@ -67,8 +68,7 @@ public class TaskQueueZkImpl implements ITaskQueue {
@Override @Override
public List<String> getAllTasks(String key) { public List<String> getAllTasks(String key) {
try { try {
List<String> list = zookeeperOperator.getChildrenKeys(getTasksPath(key)); return zookeeperOperator.getChildrenKeys(getTasksPath(key));
return list;
} catch (Exception e) { } catch (Exception e) {
logger.error("get all tasks from tasks queue exception",e); logger.error("get all tasks from tasks queue exception",e);
} }
@ -141,7 +141,7 @@ public class TaskQueueZkImpl implements ITaskQueue {
try{ try{
List<String> list = zookeeperOperator.getChildrenKeys(getTasksPath(key)); List<String> list = zookeeperOperator.getChildrenKeys(getTasksPath(key));
if(list != null && list.size() > 0){ if(CollectionUtils.isNotEmpty(list)){
String workerIp = OSUtils.getHost(); String workerIp = OSUtils.getHost();
String workerIpLongStr = String.valueOf(IpUtils.ipToLong(workerIp)); String workerIpLongStr = String.valueOf(IpUtils.ipToLong(workerIp));

24
dolphinscheduler-service/src/test/java/org/apache/dolphinscheduler/service/queue/TaskQueueZKImplTest.java

@ -58,11 +58,11 @@ public class TaskQueueZKImplTest extends BaseTaskQueueTest {
init(); init();
// get all // get all
List<String> allTasks = tasksQueue.getAllTasks(Constants.DOLPHINSCHEDULER_TASKS_QUEUE); List<String> allTasks = tasksQueue.getAllTasks(Constants.DOLPHINSCHEDULER_TASKS_QUEUE);
assertEquals(allTasks.size(),2); assertEquals(2, allTasks.size());
//delete all //delete all
tasksQueue.delete(); tasksQueue.delete();
allTasks = tasksQueue.getAllTasks(Constants.DOLPHINSCHEDULER_TASKS_QUEUE); allTasks = tasksQueue.getAllTasks(Constants.DOLPHINSCHEDULER_TASKS_QUEUE);
assertEquals(allTasks.size(),0); assertEquals(0, allTasks.size());
} }
@Test @Test
public void hasTask(){ public void hasTask(){
@ -126,10 +126,10 @@ public class TaskQueueZKImplTest extends BaseTaskQueueTest {
//add //add
init(); init();
List<String> taskList = tasksQueue.poll(Constants.DOLPHINSCHEDULER_TASKS_QUEUE, 2); List<String> taskList = tasksQueue.poll(Constants.DOLPHINSCHEDULER_TASKS_QUEUE, 2);
assertEquals(taskList.size(),2); assertEquals(2, taskList.size());
assertEquals(taskList.get(0),"0_1_1_1_-1"); assertEquals("0_1_1_1_-1", taskList.get(0));
assertEquals(taskList.get(1),"1_0_1_1_-1"); assertEquals("1_0_1_1_-1", taskList.get(1));
} }
/** /**
@ -153,7 +153,7 @@ public class TaskQueueZKImplTest extends BaseTaskQueueTest {
String task = "1_0_1_1_-1"; String task = "1_0_1_1_-1";
tasksQueue.sadd(Constants.DOLPHINSCHEDULER_TASKS_QUEUE,task); tasksQueue.sadd(Constants.DOLPHINSCHEDULER_TASKS_QUEUE,task);
//check size //check size
assertEquals(tasksQueue.smembers(Constants.DOLPHINSCHEDULER_TASKS_QUEUE).size(),1); assertEquals(1, tasksQueue.smembers(Constants.DOLPHINSCHEDULER_TASKS_QUEUE).size());
} }
@ -166,10 +166,10 @@ public class TaskQueueZKImplTest extends BaseTaskQueueTest {
String task = "1_0_1_1_-1"; String task = "1_0_1_1_-1";
tasksQueue.sadd(Constants.DOLPHINSCHEDULER_TASKS_QUEUE,task); tasksQueue.sadd(Constants.DOLPHINSCHEDULER_TASKS_QUEUE,task);
//check size //check size
assertEquals(tasksQueue.smembers(Constants.DOLPHINSCHEDULER_TASKS_QUEUE).size(),1); assertEquals(1, tasksQueue.smembers(Constants.DOLPHINSCHEDULER_TASKS_QUEUE).size());
//remove and get size //remove and get size
tasksQueue.srem(Constants.DOLPHINSCHEDULER_TASKS_QUEUE,task); tasksQueue.srem(Constants.DOLPHINSCHEDULER_TASKS_QUEUE,task);
assertEquals(tasksQueue.smembers(Constants.DOLPHINSCHEDULER_TASKS_QUEUE).size(),0); assertEquals(0, tasksQueue.smembers(Constants.DOLPHINSCHEDULER_TASKS_QUEUE).size());
} }
/** /**
@ -179,17 +179,17 @@ public class TaskQueueZKImplTest extends BaseTaskQueueTest {
public void smembers(){ public void smembers(){
//first init //first init
assertEquals(tasksQueue.smembers(Constants.DOLPHINSCHEDULER_TASKS_QUEUE).size(),0); assertEquals(0, tasksQueue.smembers(Constants.DOLPHINSCHEDULER_TASKS_QUEUE).size());
//add //add
String task = "1_0_1_1_-1"; String task = "1_0_1_1_-1";
tasksQueue.sadd(Constants.DOLPHINSCHEDULER_TASKS_QUEUE,task); tasksQueue.sadd(Constants.DOLPHINSCHEDULER_TASKS_QUEUE,task);
//check size //check size
assertEquals(tasksQueue.smembers(Constants.DOLPHINSCHEDULER_TASKS_QUEUE).size(),1); assertEquals(1, tasksQueue.smembers(Constants.DOLPHINSCHEDULER_TASKS_QUEUE).size());
//add //add
task = "0_1_1_1_"; task = "0_1_1_1_";
tasksQueue.sadd(Constants.DOLPHINSCHEDULER_TASKS_QUEUE,task); tasksQueue.sadd(Constants.DOLPHINSCHEDULER_TASKS_QUEUE,task);
//check size //check size
assertEquals(tasksQueue.smembers(Constants.DOLPHINSCHEDULER_TASKS_QUEUE).size(),2); assertEquals(2, tasksQueue.smembers(Constants.DOLPHINSCHEDULER_TASKS_QUEUE).size());
} }
@ -222,7 +222,7 @@ public class TaskQueueZKImplTest extends BaseTaskQueueTest {
} }
String node1 = tasksQueue.poll(Constants.DOLPHINSCHEDULER_TASKS_QUEUE, 1).get(0); String node1 = tasksQueue.poll(Constants.DOLPHINSCHEDULER_TASKS_QUEUE, 1).get(0);
assertEquals(node1,"0"); assertEquals("0", node1);
} }

8
e2e/src/main/java/org/apache/dolphinscheduler/constant/TestConstant.java

@ -20,18 +20,16 @@ public class TestConstant {
/** /**
* 1000 * 1000
*/ */
public static final int ONE_THOUSANG = 1000; public static final int ONE_THOUSAND = 1000;
/** /**
* 3000 * 3000
*/ */
public static final int THREE_THOUSANG = 3000; public static final int THREE_THOUSAND = 3000;
/** /**
* 10000 * 10000
*/ */
public static final int TEN_THOUSANG = 10000; public static final int TEN_THOUSAND = 10000;
} }

4
e2e/src/main/java/org/apache/dolphinscheduler/util/RedisUtil.java

@ -115,9 +115,9 @@ public class RedisUtil {
try { try {
System.out.println("redis init"); System.out.println("redis init");
if (redisPwd.isEmpty()) if (redisPwd.isEmpty())
jedisPool = new JedisPool(jedisPoolConfig, redisIp, redisPort, TestConstant.THREE_THOUSANG); jedisPool = new JedisPool(jedisPoolConfig, redisIp, redisPort, TestConstant.THREE_THOUSAND);
else { else {
jedisPool = new JedisPool(jedisPoolConfig, redisIp, redisPort, TestConstant.TEN_THOUSANG, redisPwd); jedisPool = new JedisPool(jedisPoolConfig, redisIp, redisPort, TestConstant.TEN_THOUSAND, redisPwd);
} }
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();

16
e2e/src/test/java/org/apache/dolphinscheduler/base/BaseDriver.java

@ -19,14 +19,14 @@ package org.apache.dolphinscheduler.base;
import org.apache.dolphinscheduler.constant.TestConstant; import org.apache.dolphinscheduler.constant.TestConstant;
import org.apache.dolphinscheduler.util.PropertiesReader; import org.apache.dolphinscheduler.util.PropertiesReader;
import org.openqa.selenium.Cookie; import org.openqa.selenium.PageLoadStrategy;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.remote.CapabilityType;
import java.io.IOException; import java.io.IOException;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import org.openqa.selenium.PageLoadStrategy;
/** /**
@ -83,6 +83,7 @@ public class BaseDriver {
* start chrome browser * start chrome browser
*/ */
public void startBrowser() throws Exception { public void startBrowser() throws Exception {
System.out.println("===================test start===================");
// set chrome driver // set chrome driver
System.setProperty("webdriver.chrome.driver", chromeDriverPath); System.setProperty("webdriver.chrome.driver", chromeDriverPath);
ChromeOptions chromeOptions = new ChromeOptions(); ChromeOptions chromeOptions = new ChromeOptions();
@ -104,9 +105,6 @@ public class BaseDriver {
// page load timeout // page load timeout
driver.manage().timeouts().pageLoadTimeout(pageLoadTimeout, TimeUnit.SECONDS); driver.manage().timeouts().pageLoadTimeout(pageLoadTimeout, TimeUnit.SECONDS);
// page load timeout
driver.manage().timeouts().pageLoadTimeout(pageLoadTimeout, TimeUnit.SECONDS);
// script timeout // script timeout
driver.manage().timeouts().setScriptTimeout(setScriptTimeout, TimeUnit.SECONDS); driver.manage().timeouts().setScriptTimeout(setScriptTimeout, TimeUnit.SECONDS);
@ -141,12 +139,10 @@ public class BaseDriver {
* close browser * close browser
*/ */
public void closeBrowser() throws InterruptedException { public void closeBrowser() throws InterruptedException {
// JS Show a pop-up box to indicate the end of the test Thread.sleep(TestConstant.THREE_THOUSAND);
Thread.sleep(TestConstant.ONE_THOUSANG);
// ((JavascriptExecutor) driver).executeScript("alert('Test completed, browser closes after 3s')");
Thread.sleep(TestConstant.THREE_THOUSANG);
if (driver != null) { if (driver != null) {
driver.quit(); driver.quit();
System.out.println("===================test end===================");
} }
} }
} }

34
e2e/src/test/java/org/apache/dolphinscheduler/common/BrowserCommon.java

@ -126,6 +126,18 @@ public class BrowserCommon {
return buttonElement; return buttonElement;
} }
/**
* Click Navigation Bar element
* @param locator By
* @return clickButton
*/
public void clickTopElement(By locator) {
WebElement element = driver.findElement(locator);
JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", element);
}
/** /**
* Click element * Click element
* *
@ -138,6 +150,7 @@ public class BrowserCommon {
return clickElement; return clickElement;
} }
/** /**
* input element * input element
* *
@ -236,12 +249,16 @@ public class BrowserCommon {
return driver; return driver;
} }
/**
* Multi-window switch handle, according to the handle number passed in
*
* @param num Number starts from 1
* @return driver /**
*/ * Multi-window switch handle, according to the handle number passed in
*
* @param num Number starts from 1
* @return driver
*/
public WebDriver switchHandle(int num) { public WebDriver switchHandle(int num) {
// current handle // current handle
String currentHandle = driver.getWindowHandle(); String currentHandle = driver.getWindowHandle();
@ -314,9 +331,8 @@ public class BrowserCommon {
executeScript("window.scrollTo(0, document.body.scrollHeight)"); executeScript("window.scrollTo(0, document.body.scrollHeight)");
} }
public void scrollToElementBottom() { public void scrollToElementBottom(By locator) {
WebElement webElement = locateElement(locator);
WebElement webElement = driver.findElement(By.xpath("/html/body/div[4]/div/div[2]/div/div[2]/div/div[7]/div[3]"));
((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", webElement); ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", webElement);
} }

46
e2e/src/test/java/org/apache/dolphinscheduler/data/project/CreatWorkflowData.java

@ -1,46 +0,0 @@
/*
* 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 org.apache.dolphinscheduler.data.project;
public class CreatWorkflowData {
//input shell task name
public static final String SHELL_TASK_NAME = "shell task description test1";
//input shell task description
public static final String SHELL_TASK_DESCRIPTION = "shell task description test";
//input timeout
public static final String INPUT_TIMEOUT = "60";
//input shell script
public static final String SHELL_SCRIPT = "echo 1111111";
//input custom parameters
public static final String INPUT_CUSTOM_PARAMETERS = "selenium_parameter";
//input custom parameters value
public static final String INPUT_CUSTOM_PARAMETERS_VALUE = "selenium_parameter_123";
//input add custom parameters
public static final String INPUT_ADD_CUSTOM_PARAMETERS = "selenium_parameter_delete";
//input add custom parameters value
public static final String INPUT_ADD_CUSTOM_PARAMETERS_VALUE = "selenium_parameter_delete_456";
//create workflow title
public static final String WORKFLOW_TITLE = "创建流程定义 - DolphinScheduler";
}

2
e2e/src/test/java/org/apache/dolphinscheduler/data/project/CreateProjectData.java

@ -18,7 +18,7 @@ package org.apache.dolphinscheduler.data.project;
public class CreateProjectData { public class CreateProjectData {
// create project name // create project name
public static final String PROJECT_NAME = "selenium_project_3"; public static final String PROJECT_NAME = "selenium_project_1";
// create project description // create project description
public static final String DESCRIPTION = "test create project description"; public static final String DESCRIPTION = "test create project description";
// project page title // project page title

8
e2e/src/test/java/org/apache/dolphinscheduler/data/project/CreateWorkflowData.java

@ -21,7 +21,7 @@ public class CreateWorkflowData {
* create workflow data * create workflow data
*/ */
//input shell task name //input shell task name
public static final String SHELL_TASK_NAME = "shell_task_selenium_5"; public static final String SHELL_TASK_NAME = "shell_task_selenium_1";
//input shell task description //input shell task description
public static final String SHELL_TASK_DESCRIPTION = "shell task description test"; public static final String SHELL_TASK_DESCRIPTION = "shell task description test";
@ -44,8 +44,12 @@ public class CreateWorkflowData {
//input add custom parameters value //input add custom parameters value
public static final String INPUT_ADD_CUSTOM_PARAMETERS_VALUE = "selenium_parameter_delete_456"; public static final String INPUT_ADD_CUSTOM_PARAMETERS_VALUE = "selenium_parameter_delete_456";
//workflow define title
public static final String WORKFLOW_TITLE = "工作流定义 - DolphinScheduler";
//create workflow title //create workflow title
public static final String WORKFLOW_TITLE = "创建流程定义 - DolphinScheduler"; public static final String CREATE_WORKFLOW_TITLE = "创建流程定义 - DolphinScheduler";
/** /**
* save workflow data * save workflow data

8
e2e/src/test/java/org/apache/dolphinscheduler/data/security/TenantManageData.java

@ -25,12 +25,12 @@ public class TenantManageData {
/** /**
* Tenant Code * Tenant Code
*/ */
public static final String TENANAT_CODE = "dolphinscheduler_tenant_code15"; public static final String TENANT_CODE = "selenium_tenant_code_1";
/** /**
* Tenant Name * Tenant Name
*/ */
public static final String TENANAT_NAME = "dolphinscheduler_tenant_Name"; public static final String TENANT_NAME = "selenium_tenant_Name";
/** /**
* Queue * Queue
@ -40,9 +40,9 @@ public class TenantManageData {
/** /**
* Description * Description
*/ */
public static final String DESCRIPTION = "creat tenant test"; public static final String DESCRIPTION = "create tenant test";
public static final String TENANAT_MANAGE = "租户管理 - DolphinScheduler"; public static final String TENANT_MANAGE = "租户管理 - DolphinScheduler";

2
e2e/src/test/java/org/apache/dolphinscheduler/data/security/UserManageData.java

@ -18,7 +18,7 @@ package org.apache.dolphinscheduler.data.security;
public class UserManageData { public class UserManageData {
public static final String USERNAME = "selenium_5"; public static final String USERNAME = "selenium_user_1";
public static final String PASSWORD = "123456qwe"; public static final String PASSWORD = "123456qwe";

15
e2e/src/test/java/org/apache/dolphinscheduler/locator/project/CreateProjectLocator.java

@ -20,10 +20,15 @@ import org.openqa.selenium.By;
public class CreateProjectLocator { public class CreateProjectLocator {
//click project manage //click project manage
public static final By PROJECT_MANAGE = By.xpath("//div[2]/div/a/span"); // public static final By PROJECT_MANAGE = By.xpath("//div[@class='clearfix list'][2]");
public static final By PROJECT_MANAGE = By.xpath("//div[2]/div[2]/div/a/span");
// public static final By SECURITY_MANAGE = By.xpath("//div[@class='m-top']/div/div[2]/dev[@class='clearfix list'][6]");
public static final By SECURITY_MANAGE = By.xpath("//div[2]/div[6]/div/a/span");
//click create project button //click create project button
public static final By CREATE_PROJECT_BUTTON = By.xpath("//button/span"); public static final By CREATE_PROJECT_BUTTON = By.xpath("//div[2]/div/div[1]/button/span");
//input project name //input project name
public static final By PROJECT_NAME = By.xpath("//div[2]/div/div/div[2]/div/input"); public static final By PROJECT_NAME = By.xpath("//div[2]/div/div/div[2]/div/input");
@ -33,4 +38,10 @@ public class CreateProjectLocator {
//submit button //submit button
public static final By SUBMIT_BUTTON = By.xpath("//div[3]/button[2]/span"); public static final By SUBMIT_BUTTON = By.xpath("//div[3]/button[2]/span");
//delete project button
public static final By DELETE_PROJECT_BUTTON = By.xpath("//div[3]/div[1]/div/table/tr[2]/td[9]/span/button");
//confirm delete project button
public static final By CONFIRM_DELETE_PROJECT_BUTTON = By.xpath("//div[2]/div/button[2]/span");
} }

11
e2e/src/test/java/org/apache/dolphinscheduler/locator/project/CreateWorkflowLocator.java

@ -169,4 +169,15 @@ public class CreateWorkflowLocator {
//click add button //click add button
public static final By CLICK_ADD_BUTTON = By.xpath("//button[2]/span"); public static final By CLICK_ADD_BUTTON = By.xpath("//button[2]/span");
//scroll to element bottom
public static final By SCROLL_BOTTOM = By.xpath("//span/a/em");
/**
* delete workflow
*/
//click delete workflow button
public static final By DELETE_WORKFLOW_BOTTOM = By.xpath("//span/button/i");
//click confirm delete workflow button
public static final By CONFIRM_DELETE_WORKFLOW_BOTTOM = By.xpath("//div[2]/div/button[2]/span");
} }

2
e2e/src/test/java/org/apache/dolphinscheduler/locator/security/TenantManageLocator.java

@ -19,6 +19,8 @@ package org.apache.dolphinscheduler.locator.security;
import org.openqa.selenium.By; import org.openqa.selenium.By;
public class TenantManageLocator{ public class TenantManageLocator{
public static final By SECURITY_CENTER = By.xpath("//div[2]/div[6]/div/a/span/em");
public static final By TENANT_MANAGE = By.xpath("//div[2]/div/a/div/a/span"); public static final By TENANT_MANAGE = By.xpath("//div[2]/div/a/div/a/span");
public static final By CREATE_TENANT_BUTTON = By.xpath("//button/span"); public static final By CREATE_TENANT_BUTTON = By.xpath("//button/span");

3
e2e/src/test/java/org/apache/dolphinscheduler/page/LoginPage.java

@ -17,10 +17,8 @@
package org.apache.dolphinscheduler.page; package org.apache.dolphinscheduler.page;
import org.apache.dolphinscheduler.common.PageCommon; import org.apache.dolphinscheduler.common.PageCommon;
import org.apache.dolphinscheduler.constant.TestConstant;
import org.apache.dolphinscheduler.data.LoginData; import org.apache.dolphinscheduler.data.LoginData;
import org.apache.dolphinscheduler.locator.LoginLocator; import org.apache.dolphinscheduler.locator.LoginLocator;
import org.apache.dolphinscheduler.util.RedisUtil;
import org.openqa.selenium.Cookie; import org.openqa.selenium.Cookie;
import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebDriver;
@ -49,7 +47,6 @@ public class LoginPage extends PageCommon {
public void jumpPageChinese() { public void jumpPageChinese() {
super.jumpPage(LoginData.URL); super.jumpPage(LoginData.URL);
Cookie cookie = new Cookie("language", "zh_CN", "/", null); Cookie cookie = new Cookie("language", "zh_CN", "/", null);
driver.manage().addCookie(cookie); driver.manage().addCookie(cookie);
} }
/** /**

33
e2e/src/test/java/org/apache/dolphinscheduler/page/project/CreateProjectPage.java

@ -28,23 +28,22 @@ public class CreateProjectPage extends PageCommon {
} }
/** /**
* jump page * jump to ProjectManagePage
*/ */
public void jumpProjectManagePage() throws InterruptedException { public boolean jumpProjectManagePage() throws InterruptedException {
Thread.sleep(TestConstant.ONE_THOUSANG); Thread.sleep(TestConstant.THREE_THOUSAND);
clickElement(CreateProjectLocator.PROJECT_MANAGE); clickTopElement(CreateProjectLocator.PROJECT_MANAGE);
Thread.sleep(TestConstant.ONE_THOUSANG); Thread.sleep(TestConstant.ONE_THOUSAND);
return ifTitleContains(CreateProjectData.PROJECT_TITLE);
} }
/** /**
* createTenant * create project
* *
* @return Whether to enter the specified page after creat tenant * @return Whether to enter the specified page after create project
*/ */
public boolean createProject() throws InterruptedException { public boolean createProject() throws InterruptedException {
//click create project
clickElement(CreateProjectLocator.CREATE_PROJECT_BUTTON); clickElement(CreateProjectLocator.CREATE_PROJECT_BUTTON);
Thread.sleep(TestConstant.ONE_THOUSANG);
// input create project data // input create project data
sendInput(CreateProjectLocator.PROJECT_NAME, CreateProjectData.PROJECT_NAME); sendInput(CreateProjectLocator.PROJECT_NAME, CreateProjectData.PROJECT_NAME);
@ -56,4 +55,20 @@ public class CreateProjectPage extends PageCommon {
// Whether to enter the specified page after submit // Whether to enter the specified page after submit
return ifTitleContains(CreateProjectData.PROJECT_TITLE); return ifTitleContains(CreateProjectData.PROJECT_TITLE);
} }
/**
* delete project
*
* @return Whether to enter the specified page after delete project
*/
public boolean deleteProject() throws InterruptedException {
//click delete project
clickElement(CreateProjectLocator.DELETE_PROJECT_BUTTON);
//click confirm delete project
clickElement(CreateProjectLocator.CONFIRM_DELETE_PROJECT_BUTTON);
// Whether to enter the specified page after submit
return ifTitleContains(CreateProjectData.PROJECT_TITLE);
}
} }

41
e2e/src/test/java/org/apache/dolphinscheduler/page/project/CreateWorkflowPage.java

@ -30,22 +30,23 @@ public class CreateWorkflowPage extends PageCommon {
/** /**
* jump create workflow page * jump create workflow page
*/ */
public boolean createWorkflow() throws InterruptedException {
System.out.println("Click on the project name to jump to the project homepage"); public boolean jumpWorkflowPage() throws InterruptedException {
// click project name // click project name
clickElement(CreateWorkflowLocator.CLICK_PROJECT_NAME); clickElement(CreateWorkflowLocator.CLICK_PROJECT_NAME);
Thread.sleep(TestConstant.ONE_THOUSANG); Thread.sleep(TestConstant.ONE_THOUSAND);
System.out.println("Click on workflow define"); System.out.println("Click on workflow define to jump to workflow define page");
// click workflow define // click workflow define
clickElement(CreateWorkflowLocator.CLICK_WORKFLOW_DEFINE); clickElement(CreateWorkflowLocator.CLICK_WORKFLOW_DEFINE);
Thread.sleep(TestConstant.ONE_THOUSANG);
return ifTitleContains(CreateWorkflowData.WORKFLOW_TITLE);
}
public boolean createWorkflow() throws InterruptedException {
System.out.println("Click create workflow button"); System.out.println("Click create workflow button");
// click create workflow button // click create workflow button
clickElement(CreateWorkflowLocator.CLICK_CREATE_WORKFLOW_BUTTON); clickElement(CreateWorkflowLocator.CLICK_CREATE_WORKFLOW_BUTTON);
Thread.sleep(TestConstant.ONE_THOUSANG);
System.out.println("drag shell task"); System.out.println("drag shell task");
//drag shell_task //drag shell_task
@ -98,8 +99,7 @@ public class CreateWorkflowPage extends PageCommon {
//click codeMirror and input script //click codeMirror and input script
inputCodeMirror(CreateWorkflowLocator.CLICK_CODE_MIRROR, CreateWorkflowLocator.INPUT_SCRIPT, CreateWorkflowData.SHELL_SCRIPT); inputCodeMirror(CreateWorkflowLocator.CLICK_CODE_MIRROR, CreateWorkflowLocator.INPUT_SCRIPT, CreateWorkflowData.SHELL_SCRIPT);
scrollToElementBottom(); scrollToElementBottom(CreateWorkflowLocator.SCROLL_BOTTOM);
Thread.sleep(TestConstant.ONE_THOUSANG);
//click custom parameters //click custom parameters
clickElement(CreateWorkflowLocator.CLICK_CUSTOM_PARAMETERS); clickElement(CreateWorkflowLocator.CLICK_CUSTOM_PARAMETERS);
@ -113,8 +113,7 @@ public class CreateWorkflowPage extends PageCommon {
//click add custom parameters //click add custom parameters
clickElement(CreateWorkflowLocator.CLICK_ADD_CUSTOM_PARAMETERS); clickElement(CreateWorkflowLocator.CLICK_ADD_CUSTOM_PARAMETERS);
scrollToElementBottom(); scrollToElementBottom(CreateWorkflowLocator.SCROLL_BOTTOM);
Thread.sleep(TestConstant.ONE_THOUSANG);
//input add custom parameters //input add custom parameters
sendInput(CreateWorkflowLocator.INPUT_ADD_CUSTOM_PARAMETERS, CreateWorkflowData.INPUT_ADD_CUSTOM_PARAMETERS); sendInput(CreateWorkflowLocator.INPUT_ADD_CUSTOM_PARAMETERS, CreateWorkflowData.INPUT_ADD_CUSTOM_PARAMETERS);
@ -124,16 +123,15 @@ public class CreateWorkflowPage extends PageCommon {
//click delete custom parameters //click delete custom parameters
clickElement(CreateWorkflowLocator.CLICK_DELETE_CUSTOM_PARAMETERS); clickElement(CreateWorkflowLocator.CLICK_DELETE_CUSTOM_PARAMETERS);
Thread.sleep(TestConstant.ONE_THOUSANG);
//click submit button //click submit button
clickElement(CreateWorkflowLocator.CLICK_SUBMIT_BUTTON); clickElement(CreateWorkflowLocator.CLICK_SUBMIT_BUTTON);
Thread.sleep(TestConstant.ONE_THOUSANG); Thread.sleep(TestConstant.ONE_THOUSAND);
System.out.println("Task node set up successfully"); System.out.println("Task node set up successfully");
System.out.println("move to Dag Element "); System.out.println("move to Dag Element ");
moveToDragElement(CreateWorkflowLocator.MOUSE_MOVE_SHELL_AT_DAG,-300,-100); moveToDragElement(CreateWorkflowLocator.MOUSE_MOVE_SHELL_AT_DAG,-300,-100);
return ifTitleContains(CreateWorkflowData.WORKFLOW_TITLE); return ifTitleContains(CreateWorkflowData.CREATE_WORKFLOW_TITLE);
} }
/** /**
@ -182,11 +180,22 @@ public class CreateWorkflowPage extends PageCommon {
//delete workflow global parameters value //delete workflow global parameters value
clickElement(CreateWorkflowLocator.CLICK_DELETE_WORKFLOW_GLOBAL_PARAMETERS); clickElement(CreateWorkflowLocator.CLICK_DELETE_WORKFLOW_GLOBAL_PARAMETERS);
Thread.sleep(TestConstant.ONE_THOUSANG); Thread.sleep(TestConstant.ONE_THOUSAND);
//click add button //click add button
clickElement(CreateWorkflowLocator.CLICK_ADD_BUTTON); clickButton(CreateWorkflowLocator.CLICK_ADD_BUTTON);
System.out.println("submit workflow"); System.out.println("submit workflow");
return ifTitleContains(CreateWorkflowData.CREATE_WORKFLOW_TITLE);
}
public boolean deleteWorkflow() throws InterruptedException {
//click delete project
clickButton(CreateWorkflowLocator.DELETE_WORKFLOW_BOTTOM);
//click confirm delete project
clickButton(CreateWorkflowLocator.CONFIRM_DELETE_WORKFLOW_BOTTOM);
// Whether to enter the specified page after submit
return ifTitleContains(CreateWorkflowData.WORKFLOW_TITLE); return ifTitleContains(CreateWorkflowData.WORKFLOW_TITLE);
} }
} }

28
e2e/src/test/java/org/apache/dolphinscheduler/page/security/TenantManagePage.java

@ -17,12 +17,8 @@
package org.apache.dolphinscheduler.page.security; package org.apache.dolphinscheduler.page.security;
import org.apache.dolphinscheduler.common.PageCommon; import org.apache.dolphinscheduler.common.PageCommon;
import org.apache.dolphinscheduler.constant.TestConstant;
import org.apache.dolphinscheduler.data.LoginData;
import org.apache.dolphinscheduler.data.security.TenantManageData; import org.apache.dolphinscheduler.data.security.TenantManageData;
import org.apache.dolphinscheduler.locator.LoginLocator;
import org.apache.dolphinscheduler.locator.security.TenantManageLocator; import org.apache.dolphinscheduler.locator.security.TenantManageLocator;
import org.apache.dolphinscheduler.util.RedisUtil;
import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebDriver;
public class TenantManagePage extends PageCommon { public class TenantManagePage extends PageCommon {
@ -34,21 +30,30 @@ public class TenantManagePage extends PageCommon {
super(driver); super(driver);
} }
/**
* jump security page
*
* @return Whether to enter the specified page after create tenant
*/
public boolean jumpSecurity() throws InterruptedException {
clickTopElement(TenantManageLocator.SECURITY_CENTER);
return ifTitleContains(TenantManageData.TENANT_MANAGE);
}
/** /**
* createTenant * createTenant
* *
* @return Whether to enter the specified page after creat tenant * @return Whether to enter the specified page after create tenant
*/ */
public boolean createTenant() throws InterruptedException { public boolean createTenant() throws InterruptedException {
Thread.sleep(TestConstant.ONE_THOUSANG);
clickButton(TenantManageLocator.TENANT_MANAGE); clickButton(TenantManageLocator.TENANT_MANAGE);
//create tenant //create tenant
clickButton(TenantManageLocator.CREATE_TENANT_BUTTON); clickButton(TenantManageLocator.CREATE_TENANT_BUTTON);
// tenant data // tenant data
sendInput(TenantManageLocator.TENANT_INPUT_CODE, TenantManageData.TENANAT_CODE); sendInput(TenantManageLocator.TENANT_INPUT_CODE, TenantManageData.TENANT_CODE);
sendInput(TenantManageLocator.TENANT_INPUT_NAME, TenantManageData.TENANAT_NAME); sendInput(TenantManageLocator.TENANT_INPUT_NAME, TenantManageData.TENANT_NAME);
sendInput(TenantManageLocator.QUEUE, TenantManageData.QUEUE); sendInput(TenantManageLocator.QUEUE, TenantManageData.QUEUE);
sendInput(TenantManageLocator.DESCRIPTION, TenantManageData.DESCRIPTION); sendInput(TenantManageLocator.DESCRIPTION, TenantManageData.DESCRIPTION);
@ -56,22 +61,19 @@ public class TenantManagePage extends PageCommon {
clickButton(TenantManageLocator.SUBMIT_BUTTON); clickButton(TenantManageLocator.SUBMIT_BUTTON);
// Whether to enter the specified page after submit // Whether to enter the specified page after submit
return ifTitleContains(TenantManageData.TENANAT_MANAGE); return ifTitleContains(TenantManageData.TENANT_MANAGE);
} }
public boolean deleteTenant() throws InterruptedException { public boolean deleteTenant() throws InterruptedException {
Thread.sleep(TestConstant.ONE_THOUSANG);
clickButton(TenantManageLocator.TENANT_MANAGE); clickButton(TenantManageLocator.TENANT_MANAGE);
Thread.sleep(TestConstant.ONE_THOUSANG);
// click delete button // click delete button
clickButton(TenantManageLocator.DELETE_TENANT_BUTTON); clickButton(TenantManageLocator.DELETE_TENANT_BUTTON);
Thread.sleep(TestConstant.ONE_THOUSANG);
//click confirm delete button //click confirm delete button
clickButton(TenantManageLocator.CONFIRM_DELETE_TENANT_BUTTON); clickButton(TenantManageLocator.CONFIRM_DELETE_TENANT_BUTTON);
// Whether to enter the specified page after submit // Whether to enter the specified page after submit
return ifTitleContains(TenantManageData.TENANAT_MANAGE); return ifTitleContains(TenantManageData.TENANT_MANAGE);
} }
} }

6
e2e/src/test/java/org/apache/dolphinscheduler/page/security/UserManagePage.java

@ -17,7 +17,6 @@
package org.apache.dolphinscheduler.page.security; package org.apache.dolphinscheduler.page.security;
import org.apache.dolphinscheduler.common.PageCommon; import org.apache.dolphinscheduler.common.PageCommon;
import org.apache.dolphinscheduler.constant.TestConstant;
import org.apache.dolphinscheduler.data.security.UserManageData; import org.apache.dolphinscheduler.data.security.UserManageData;
import org.apache.dolphinscheduler.locator.security.UserManageLocator; import org.apache.dolphinscheduler.locator.security.UserManageLocator;
import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebDriver;
@ -33,10 +32,8 @@ public class UserManagePage extends PageCommon {
* @return Whether to enter the specified page after creat tenant * @return Whether to enter the specified page after creat tenant
*/ */
public boolean createUser() throws InterruptedException { public boolean createUser() throws InterruptedException {
Thread.sleep(TestConstant.ONE_THOUSANG);
// click user manage // click user manage
clickElement(UserManageLocator.CLICK_USER_MANAGE); clickElement(UserManageLocator.CLICK_USER_MANAGE);
Thread.sleep(TestConstant.ONE_THOUSANG);
// click create user button // click create user button
clickButton(UserManageLocator.CLICK_CREATE_USER_BUTTON); clickButton(UserManageLocator.CLICK_CREATE_USER_BUTTON);
@ -59,10 +56,9 @@ public class UserManagePage extends PageCommon {
} }
public boolean deleteUser() throws InterruptedException { public boolean deleteUser() throws InterruptedException {
Thread.sleep(TestConstant.ONE_THOUSANG);
// click user manage // click user manage
clickElement(UserManageLocator.CLICK_USER_MANAGE); clickElement(UserManageLocator.CLICK_USER_MANAGE);
Thread.sleep(TestConstant.ONE_THOUSANG);
// click delete user button // click delete user button
clickButton(UserManageLocator.DELETE_USER_BUTTON ); clickButton(UserManageLocator.DELETE_USER_BUTTON );

1
e2e/src/test/java/org/apache/dolphinscheduler/testcase/LoginTest.java

@ -17,7 +17,6 @@
package org.apache.dolphinscheduler.testcase; package org.apache.dolphinscheduler.testcase;
import org.apache.dolphinscheduler.page.LoginPage; import org.apache.dolphinscheduler.page.LoginPage;
import org.testng.Assert;
import org.testng.annotations.Test; import org.testng.annotations.Test;
import static org.apache.dolphinscheduler.base.BaseTest.driver; import static org.apache.dolphinscheduler.base.BaseTest.driver;

39
e2e/src/test/java/org/apache/dolphinscheduler/testcase/deleteData/DeleteProjectTest.java

@ -0,0 +1,39 @@
/*
* 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 org.apache.dolphinscheduler.testcase.deleteData;
import org.apache.dolphinscheduler.base.BaseTest;
import org.apache.dolphinscheduler.page.project.CreateProjectPage;
import org.testng.annotations.Test;
public class DeleteProjectTest extends BaseTest {
private CreateProjectPage createProjectPage;
@Test(groups={"functionTests"},dependsOnGroups = { "login","project"},description = "DeleteProjectTest",priority=7)
public void testDeleteProject() throws InterruptedException {
createProjectPage = new CreateProjectPage(driver);
//jump to project manage page
System.out.println("jump to the project manage page to delete project");
createProjectPage.jumpProjectManagePage();
//assert tenant manage page
System.out.println("start delete project");
assert createProjectPage.deleteProject();
System.out.println("end delete project");
System.out.println("===================================");
}
}

7
e2e/src/test/java/org/apache/dolphinscheduler/testcase/deleteData/DeleteTenantTest.java

@ -23,15 +23,16 @@ import org.testng.annotations.Test;
public class DeleteTenantTest extends BaseTest { public class DeleteTenantTest extends BaseTest {
private TenantManagePage tenantManagePage; private TenantManagePage tenantManagePage;
@Test(groups={"functionTests"},dependsOnGroups = { "login","createTenant"},description = "DeleteTenantTest") @Test(groups={"functionTests"},dependsOnGroups = { "login","createTenant"},description = "DeleteTenantTest",priority=9)
public void testDeleteTenant() throws InterruptedException { public void testDeleteTenant() throws InterruptedException {
tenantManagePage = new TenantManagePage(driver); tenantManagePage = new TenantManagePage(driver);
//assert tenant manage page //assert tenant manage page
System.out.println("jump to security to delete tenant");
tenantManagePage.jumpSecurity();
System.out.println("start delete tenant"); System.out.println("start delete tenant");
assert tenantManagePage.deleteTenant(); assert tenantManagePage.deleteTenant();
System.out.println("end delete tenant"); System.out.println("end delete tenant");
System.out.println("==================================="); System.out.println("===================================");
} }
} }

8
e2e/src/test/java/org/apache/dolphinscheduler/testcase/deleteData/DeleteUserTest.java

@ -17,14 +17,20 @@
package org.apache.dolphinscheduler.testcase.deleteData; package org.apache.dolphinscheduler.testcase.deleteData;
import org.apache.dolphinscheduler.base.BaseTest; import org.apache.dolphinscheduler.base.BaseTest;
import org.apache.dolphinscheduler.page.security.TenantManagePage;
import org.apache.dolphinscheduler.page.security.UserManagePage; import org.apache.dolphinscheduler.page.security.UserManagePage;
import org.testng.annotations.Test; import org.testng.annotations.Test;
public class DeleteUserTest extends BaseTest { public class DeleteUserTest extends BaseTest {
private UserManagePage userManagePage; private UserManagePage userManagePage;
private TenantManagePage tenantManagePage;
@Test(groups={"functionTests"},dependsOnGroups = { "login","user" },description = "DeleteUserTest") @Test(groups={"functionTests"},dependsOnGroups = { "login","user" },description = "DeleteUserTest",priority=8)
public void testDeleteUser() throws InterruptedException { public void testDeleteUser() throws InterruptedException {
tenantManagePage = new TenantManagePage(driver);
System.out.println("jump to security to delete user");
tenantManagePage.jumpSecurity();
userManagePage = new UserManagePage(driver); userManagePage = new UserManagePage(driver);
//assert user manage page //assert user manage page
System.out.println("start delete user"); System.out.println("start delete user");

43
e2e/src/test/java/org/apache/dolphinscheduler/testcase/deleteData/DeleteWorkflowTest.java

@ -0,0 +1,43 @@
/*
* 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 org.apache.dolphinscheduler.testcase.deleteData;
import org.apache.dolphinscheduler.base.BaseTest;
import org.apache.dolphinscheduler.page.project.CreateProjectPage;
import org.apache.dolphinscheduler.page.project.CreateWorkflowPage;
import org.testng.annotations.Test;
public class DeleteWorkflowTest extends BaseTest {
private CreateWorkflowPage createWorkflowPage;
private CreateProjectPage createProjectPage;
@Test(groups={"functionTests"},dependsOnGroups = { "login","workflow"},description = "DeleteWorkflowTest",priority=6)
public void testDeleteWorkflow() throws InterruptedException {
createProjectPage = new CreateProjectPage(driver);
//jump to project manage page
System.out.println("jump to the project manage page to delete workflow");
createProjectPage.jumpProjectManagePage();
createWorkflowPage = new CreateWorkflowPage(driver);
createWorkflowPage.jumpWorkflowPage();
//assert tenant manage page
System.out.println("start delete workflow");
assert createWorkflowPage.deleteWorkflow();
System.out.println("end delete workflow");
System.out.println("===================================");
}
}

3
e2e/src/test/java/org/apache/dolphinscheduler/testcase/project/CreateProjectTest.java

@ -23,10 +23,11 @@ import org.testng.annotations.Test;
public class CreateProjectTest extends BaseTest { public class CreateProjectTest extends BaseTest {
private CreateProjectPage createProjectPage; private CreateProjectPage createProjectPage;
@Test(groups={"functionTests"},dependsOnGroups = { "login" },description = "CreateProjectTest",priority=4) @Test(groups={"functionTests","project"},dependsOnGroups = { "login" },description = "CreateProjectTest",priority=4)
public void testCreateProject() throws InterruptedException { public void testCreateProject() throws InterruptedException {
createProjectPage = new CreateProjectPage(driver); createProjectPage = new CreateProjectPage(driver);
// enter user manage page // enter user manage page
System.out.println("jump to the projectManage page to create project ");
createProjectPage.jumpProjectManagePage(); createProjectPage.jumpProjectManagePage();
//assert user manage page //assert user manage page
System.out.println("start create project"); System.out.println("start create project");

6
e2e/src/test/java/org/apache/dolphinscheduler/testcase/project/CreateWorkflowTest.java

@ -26,12 +26,16 @@ public class CreateWorkflowTest extends BaseTest {
private CreateProjectPage createProjectPage; private CreateProjectPage createProjectPage;
@Test(groups={"functionTests"},dependsOnGroups = { "login" },description = "CreateWorkflowTest",priority=5) @Test(groups={"functionTests","workflow"},dependsOnGroups = { "login" },description = "CreateWorkflowTest",priority=5)
public void testCreateWorkflow() throws InterruptedException { public void testCreateWorkflow() throws InterruptedException {
createProjectPage = new CreateProjectPage(driver); createProjectPage = new CreateProjectPage(driver);
System.out.println("jump to the projectManage page to create workflow");
createProjectPage.jumpProjectManagePage(); createProjectPage.jumpProjectManagePage();
createWorkflowPage = new CreateWorkflowPage(driver); createWorkflowPage = new CreateWorkflowPage(driver);
System.out.println("Click on the project name to jump to the project homepage");
createWorkflowPage.jumpWorkflowPage();
System.out.println("start create workflow"); System.out.println("start create workflow");
assert createWorkflowPage.createWorkflow(); assert createWorkflowPage.createWorkflow();
assert createWorkflowPage.saveWorkflow(); assert createWorkflowPage.saveWorkflow();

5
e2e/src/test/java/org/apache/dolphinscheduler/testcase/security/TenantManageTest.java

@ -24,7 +24,7 @@ import org.testng.annotations.Test;
public class TenantManageTest extends BaseTest { public class TenantManageTest extends BaseTest {
private TenantManagePage tenantManagePage; private TenantManagePage tenantManagePage;
@Test(groups={"functionTests","createTenant"},dependsOnGroups = { "login" },description = "TenantManageTest") @Test(groups={"functionTests","createTenant"},dependsOnGroups = { "login" },description = "TenantManageTest",priority=2)
public void testTenantManage() throws InterruptedException { public void testTenantManage() throws InterruptedException {
tenantManagePage = new TenantManagePage(driver); tenantManagePage = new TenantManagePage(driver);
//assert tenant manage page //assert tenant manage page
@ -32,8 +32,5 @@ public class TenantManageTest extends BaseTest {
assert tenantManagePage.createTenant(); assert tenantManagePage.createTenant();
System.out.println("end create tenant"); System.out.println("end create tenant");
System.out.println("==================================="); System.out.println("===================================");
} }
} }

2
e2e/src/test/java/org/apache/dolphinscheduler/testcase/security/UserManageTest.java

@ -23,7 +23,7 @@ import org.testng.annotations.Test;
public class UserManageTest extends BaseTest { public class UserManageTest extends BaseTest {
private UserManagePage userManagePage; private UserManagePage userManagePage;
@Test(groups={"functionTests","user"},dependsOnGroups = { "login" },description = "UserManageTest") @Test(groups={"functionTests","user"},dependsOnGroups = { "login" },description = "UserManageTest",priority=3)
public void testUserManage() throws InterruptedException { public void testUserManage() throws InterruptedException {
userManagePage = new UserManagePage(driver); userManagePage = new UserManagePage(driver);
//assert user manage page //assert user manage page

10
e2e/testng.xml

@ -20,7 +20,7 @@
<test name="dolphinscheduler_test" preserve-order="true"> <test name="dolphinscheduler_test" preserve-order="true">
<groups> <groups>
<run> <run>
<include name="functionTests" /> <include name="functionTests"/>
</run> </run>
</groups> </groups>
@ -28,10 +28,12 @@
<class name="org.apache.dolphinscheduler.testcase.LoginTest"></class> <class name="org.apache.dolphinscheduler.testcase.LoginTest"></class>
<class name="org.apache.dolphinscheduler.testcase.security.TenantManageTest"></class> <class name="org.apache.dolphinscheduler.testcase.security.TenantManageTest"></class>
<class name="org.apache.dolphinscheduler.testcase.security.UserManageTest"></class> <class name="org.apache.dolphinscheduler.testcase.security.UserManageTest"></class>
<!--<class name="org.apache.dolphinscheduler.testcase.project.CreateProjectTest"></class>--> <class name="org.apache.dolphinscheduler.testcase.project.CreateProjectTest"></class>
<!--&lt;!&ndash;<class name="org.apache.dolphinscheduler.testcase.project.CreateWorkflowTest"></class>&ndash;&gt;--> <class name="org.apache.dolphinscheduler.testcase.project.CreateWorkflowTest"></class>
<class name="org.apache.dolphinscheduler.testcase.deleteData.DeleteTenantTest"></class> <class name="org.apache.dolphinscheduler.testcase.deleteData.DeleteWorkflowTest"></class>
<class name="org.apache.dolphinscheduler.testcase.deleteData.DeleteProjectTest"></class>
<class name="org.apache.dolphinscheduler.testcase.deleteData.DeleteUserTest"></class> <class name="org.apache.dolphinscheduler.testcase.deleteData.DeleteUserTest"></class>
<class name="org.apache.dolphinscheduler.testcase.deleteData.DeleteTenantTest"></class>
</classes> </classes>
</test> </test>

1
pom.xml

@ -741,6 +741,7 @@
<include>**/server/worker/task/sqoop/SqoopTaskTest.java</include> <include>**/server/worker/task/sqoop/SqoopTaskTest.java</include>
<include>**/server/utils/DataxUtilsTest.java</include> <include>**/server/utils/DataxUtilsTest.java</include>
<include>**/service/zk/DefaultEnsembleProviderTest.java</include> <include>**/service/zk/DefaultEnsembleProviderTest.java</include>
<include>**/dao/datasource/BaseDataSourceTest.java</include>
<include>**/alert/utils/MailUtilsTest.java</include> <include>**/alert/utils/MailUtilsTest.java</include>
<include>**/dao/AlertDaoTest.java</include> <include>**/dao/AlertDaoTest.java</include>
</includes> </includes>

Loading…
Cancel
Save