Browse Source
* fix: the executor api, projectName change to projectCode * fix checkstyle * fix: when process definition is null, return error message Co-authored-by: wen-hemin <wenhemin@apache.com>2.0.7-release
wen-hemin
3 years ago
committed by
GitHub
8 changed files with 385 additions and 412 deletions
@ -1,309 +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.api.service; |
|
||||||
|
|
||||||
import static org.mockito.ArgumentMatchers.any; |
|
||||||
import static org.mockito.Mockito.times; |
|
||||||
import static org.mockito.Mockito.verify; |
|
||||||
|
|
||||||
import org.apache.dolphinscheduler.api.enums.ExecuteType; |
|
||||||
import org.apache.dolphinscheduler.api.enums.Status; |
|
||||||
import org.apache.dolphinscheduler.api.service.impl.ExecutorServiceImpl; |
|
||||||
import org.apache.dolphinscheduler.api.service.impl.ProjectServiceImpl; |
|
||||||
import org.apache.dolphinscheduler.common.Constants; |
|
||||||
import org.apache.dolphinscheduler.common.enums.CommandType; |
|
||||||
import org.apache.dolphinscheduler.common.enums.ExecutionStatus; |
|
||||||
import org.apache.dolphinscheduler.common.enums.Priority; |
|
||||||
import org.apache.dolphinscheduler.common.enums.ReleaseState; |
|
||||||
import org.apache.dolphinscheduler.common.enums.RunMode; |
|
||||||
import org.apache.dolphinscheduler.common.model.Server; |
|
||||||
import org.apache.dolphinscheduler.dao.entity.Command; |
|
||||||
import org.apache.dolphinscheduler.dao.entity.ProcessDefinition; |
|
||||||
import org.apache.dolphinscheduler.dao.entity.ProcessInstance; |
|
||||||
import org.apache.dolphinscheduler.dao.entity.Project; |
|
||||||
import org.apache.dolphinscheduler.dao.entity.Schedule; |
|
||||||
import org.apache.dolphinscheduler.dao.entity.Tenant; |
|
||||||
import org.apache.dolphinscheduler.dao.entity.User; |
|
||||||
import org.apache.dolphinscheduler.dao.mapper.ProcessDefinitionMapper; |
|
||||||
import org.apache.dolphinscheduler.dao.mapper.ProjectMapper; |
|
||||||
import org.apache.dolphinscheduler.service.process.ProcessService; |
|
||||||
|
|
||||||
import java.util.ArrayList; |
|
||||||
import java.util.Collections; |
|
||||||
import java.util.HashMap; |
|
||||||
import java.util.LinkedList; |
|
||||||
import java.util.List; |
|
||||||
import java.util.Map; |
|
||||||
|
|
||||||
import org.junit.Assert; |
|
||||||
import org.junit.Before; |
|
||||||
import org.junit.Test; |
|
||||||
import org.junit.runner.RunWith; |
|
||||||
import org.mockito.InjectMocks; |
|
||||||
import org.mockito.Mock; |
|
||||||
import org.mockito.Mockito; |
|
||||||
import org.mockito.junit.MockitoJUnitRunner; |
|
||||||
|
|
||||||
/** |
|
||||||
* executor service 2 test |
|
||||||
*/ |
|
||||||
@RunWith(MockitoJUnitRunner.Silent.class) |
|
||||||
public class ExecutorService2Test { |
|
||||||
|
|
||||||
@InjectMocks |
|
||||||
private ExecutorServiceImpl executorService; |
|
||||||
|
|
||||||
@Mock |
|
||||||
private ProcessService processService; |
|
||||||
|
|
||||||
@Mock |
|
||||||
private ProcessDefinitionMapper processDefinitionMapper; |
|
||||||
|
|
||||||
@Mock |
|
||||||
private ProjectMapper projectMapper; |
|
||||||
|
|
||||||
@Mock |
|
||||||
private ProjectServiceImpl projectService; |
|
||||||
|
|
||||||
@Mock |
|
||||||
private MonitorService monitorService; |
|
||||||
|
|
||||||
private int processDefinitionId = 1; |
|
||||||
|
|
||||||
private int processInstanceId = 1; |
|
||||||
|
|
||||||
private int tenantId = 1; |
|
||||||
|
|
||||||
private int userId = 1; |
|
||||||
|
|
||||||
private ProcessDefinition processDefinition = new ProcessDefinition(); |
|
||||||
|
|
||||||
private ProcessInstance processInstance = new ProcessInstance(); |
|
||||||
|
|
||||||
private User loginUser = new User(); |
|
||||||
|
|
||||||
private String projectName = "projectName"; |
|
||||||
|
|
||||||
private Project project = new Project(); |
|
||||||
|
|
||||||
private String cronTime; |
|
||||||
|
|
||||||
@Before |
|
||||||
public void init() { |
|
||||||
// user
|
|
||||||
loginUser.setId(userId); |
|
||||||
|
|
||||||
// processDefinition
|
|
||||||
processDefinition.setId(processDefinitionId); |
|
||||||
processDefinition.setReleaseState(ReleaseState.ONLINE); |
|
||||||
processDefinition.setTenantId(tenantId); |
|
||||||
processDefinition.setUserId(userId); |
|
||||||
processDefinition.setVersion(1); |
|
||||||
processDefinition.setCode(1L); |
|
||||||
|
|
||||||
// processInstance
|
|
||||||
processInstance.setId(processInstanceId); |
|
||||||
processInstance.setState(ExecutionStatus.FAILURE); |
|
||||||
processInstance.setExecutorId(userId); |
|
||||||
processInstance.setTenantId(tenantId); |
|
||||||
processInstance.setProcessDefinitionVersion(1); |
|
||||||
processInstance.setProcessDefinitionCode(1L); |
|
||||||
|
|
||||||
// project
|
|
||||||
project.setName(projectName); |
|
||||||
|
|
||||||
// cronRangeTime
|
|
||||||
cronTime = "2020-01-01 00:00:00,2020-01-31 23:00:00"; |
|
||||||
|
|
||||||
// mock
|
|
||||||
Mockito.when(projectMapper.queryByName(projectName)).thenReturn(project); |
|
||||||
Mockito.when(projectService.checkProjectAndAuth(loginUser, project, projectName)).thenReturn(checkProjectAndAuth()); |
|
||||||
Mockito.when(processDefinitionMapper.selectById(processDefinitionId)).thenReturn(processDefinition); |
|
||||||
Mockito.when(processService.getTenantForProcess(tenantId, userId)).thenReturn(new Tenant()); |
|
||||||
Mockito.when(processService.createCommand(any(Command.class))).thenReturn(1); |
|
||||||
Mockito.when(monitorService.getServerListFromRegistry(true)).thenReturn(getMasterServersList()); |
|
||||||
Mockito.when(processService.findProcessInstanceDetailById(processInstanceId)).thenReturn(processInstance); |
|
||||||
Mockito.when(processService.findProcessDefinition(1L, 1)).thenReturn(processDefinition); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* not complement |
|
||||||
*/ |
|
||||||
@Test |
|
||||||
public void testNoComplement() { |
|
||||||
|
|
||||||
Mockito.when(processService.queryReleaseSchedulerListByProcessDefinitionId(processDefinitionId)).thenReturn(zeroSchedulerList()); |
|
||||||
Map<String, Object> result = executorService.execProcessInstance(loginUser, projectName, |
|
||||||
processDefinitionId, cronTime, CommandType.START_PROCESS, |
|
||||||
null, null, |
|
||||||
null, null, 0, |
|
||||||
RunMode.RUN_MODE_SERIAL, |
|
||||||
Priority.LOW, Constants.DEFAULT_WORKER_GROUP, 110, null); |
|
||||||
Assert.assertEquals(Status.SUCCESS, result.get(Constants.STATUS)); |
|
||||||
verify(processService, times(1)).createCommand(any(Command.class)); |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* not complement |
|
||||||
*/ |
|
||||||
@Test |
|
||||||
public void testComplementWithStartNodeList() { |
|
||||||
|
|
||||||
Mockito.when(processService.queryReleaseSchedulerListByProcessDefinitionId(processDefinitionId)).thenReturn(zeroSchedulerList()); |
|
||||||
Map<String, Object> result = executorService.execProcessInstance(loginUser, projectName, |
|
||||||
processDefinitionId, cronTime, CommandType.START_PROCESS, |
|
||||||
null, "n1,n2", |
|
||||||
null, null, 0, |
|
||||||
RunMode.RUN_MODE_SERIAL, |
|
||||||
Priority.LOW, Constants.DEFAULT_WORKER_GROUP, 110, null); |
|
||||||
Assert.assertEquals(Status.SUCCESS, result.get(Constants.STATUS)); |
|
||||||
verify(processService, times(1)).createCommand(any(Command.class)); |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* date error |
|
||||||
*/ |
|
||||||
@Test |
|
||||||
public void testDateError() { |
|
||||||
|
|
||||||
Mockito.when(processService.queryReleaseSchedulerListByProcessDefinitionId(processDefinitionId)).thenReturn(zeroSchedulerList()); |
|
||||||
Map<String, Object> result = executorService.execProcessInstance(loginUser, projectName, |
|
||||||
processDefinitionId, "2020-01-31 23:00:00,2020-01-01 00:00:00", CommandType.COMPLEMENT_DATA, |
|
||||||
null, null, |
|
||||||
null, null, 0, |
|
||||||
RunMode.RUN_MODE_SERIAL, |
|
||||||
Priority.LOW, Constants.DEFAULT_WORKER_GROUP, 110, null); |
|
||||||
Assert.assertEquals(Status.START_PROCESS_INSTANCE_ERROR, result.get(Constants.STATUS)); |
|
||||||
verify(processService, times(0)).createCommand(any(Command.class)); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* serial |
|
||||||
*/ |
|
||||||
@Test |
|
||||||
public void testSerial() { |
|
||||||
|
|
||||||
Mockito.when(processService.queryReleaseSchedulerListByProcessDefinitionId(processDefinitionId)).thenReturn(zeroSchedulerList()); |
|
||||||
Map<String, Object> result = executorService.execProcessInstance(loginUser, projectName, |
|
||||||
processDefinitionId, cronTime, CommandType.COMPLEMENT_DATA, |
|
||||||
null, null, |
|
||||||
null, null, 0, |
|
||||||
RunMode.RUN_MODE_SERIAL, |
|
||||||
Priority.LOW, Constants.DEFAULT_WORKER_GROUP, 110, null); |
|
||||||
Assert.assertEquals(Status.SUCCESS, result.get(Constants.STATUS)); |
|
||||||
verify(processService, times(1)).createCommand(any(Command.class)); |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* without schedule |
|
||||||
*/ |
|
||||||
@Test |
|
||||||
public void testParallelWithOutSchedule() { |
|
||||||
|
|
||||||
Mockito.when(processService.queryReleaseSchedulerListByProcessDefinitionId(processDefinitionId)).thenReturn(zeroSchedulerList()); |
|
||||||
Map<String, Object> result = executorService.execProcessInstance(loginUser, projectName, |
|
||||||
processDefinitionId, cronTime, CommandType.COMPLEMENT_DATA, |
|
||||||
null, null, |
|
||||||
null, null, 0, |
|
||||||
RunMode.RUN_MODE_PARALLEL, |
|
||||||
Priority.LOW, Constants.DEFAULT_WORKER_GROUP, 110, null); |
|
||||||
Assert.assertEquals(Status.SUCCESS, result.get(Constants.STATUS)); |
|
||||||
verify(processService, times(31)).createCommand(any(Command.class)); |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* with schedule |
|
||||||
*/ |
|
||||||
@Test |
|
||||||
public void testParallelWithSchedule() { |
|
||||||
|
|
||||||
Mockito.when(processService.queryReleaseSchedulerListByProcessDefinitionId(processDefinitionId)).thenReturn(oneSchedulerList()); |
|
||||||
Map<String, Object> result = executorService.execProcessInstance(loginUser, projectName, |
|
||||||
processDefinitionId, cronTime, CommandType.COMPLEMENT_DATA, |
|
||||||
null, null, |
|
||||||
null, null, 0, |
|
||||||
RunMode.RUN_MODE_PARALLEL, |
|
||||||
Priority.LOW, Constants.DEFAULT_WORKER_GROUP, 110, null); |
|
||||||
Assert.assertEquals(Status.SUCCESS, result.get(Constants.STATUS)); |
|
||||||
verify(processService, times(15)).createCommand(any(Command.class)); |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
@Test |
|
||||||
public void testNoMsterServers() { |
|
||||||
Mockito.when(monitorService.getServerListFromRegistry(true)).thenReturn(new ArrayList<>()); |
|
||||||
|
|
||||||
Map<String, Object> result = executorService.execProcessInstance(loginUser, projectName, |
|
||||||
processDefinitionId, cronTime, CommandType.COMPLEMENT_DATA, |
|
||||||
null, null, |
|
||||||
null, null, 0, |
|
||||||
RunMode.RUN_MODE_PARALLEL, |
|
||||||
Priority.LOW, Constants.DEFAULT_WORKER_GROUP, 110, null); |
|
||||||
Assert.assertEquals(result.get(Constants.STATUS), Status.MASTER_NOT_EXISTS); |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
@Test |
|
||||||
public void testExecuteRepeatRunning() { |
|
||||||
Mockito.when(processService.verifyIsNeedCreateCommand(any(Command.class))).thenReturn(true); |
|
||||||
|
|
||||||
Map<String, Object> result = executorService.execute(loginUser, projectName, processInstanceId, ExecuteType.REPEAT_RUNNING); |
|
||||||
Assert.assertEquals(Status.SUCCESS, result.get(Constants.STATUS)); |
|
||||||
} |
|
||||||
|
|
||||||
private List<Server> getMasterServersList() { |
|
||||||
List<Server> masterServerList = new ArrayList<>(); |
|
||||||
Server masterServer1 = new Server(); |
|
||||||
masterServer1.setId(1); |
|
||||||
masterServer1.setHost("192.168.220.188"); |
|
||||||
masterServer1.setPort(1121); |
|
||||||
masterServerList.add(masterServer1); |
|
||||||
|
|
||||||
Server masterServer2 = new Server(); |
|
||||||
masterServer2.setId(2); |
|
||||||
masterServer2.setHost("192.168.220.189"); |
|
||||||
masterServer2.setPort(1122); |
|
||||||
masterServerList.add(masterServer2); |
|
||||||
|
|
||||||
return masterServerList; |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
private List zeroSchedulerList() { |
|
||||||
return Collections.EMPTY_LIST; |
|
||||||
} |
|
||||||
|
|
||||||
private List<Schedule> oneSchedulerList() { |
|
||||||
List<Schedule> schedulerList = new LinkedList<>(); |
|
||||||
Schedule schedule = new Schedule(); |
|
||||||
schedule.setCrontab("0 0 0 1/2 * ?"); |
|
||||||
schedulerList.add(schedule); |
|
||||||
return schedulerList; |
|
||||||
} |
|
||||||
|
|
||||||
private Map<String, Object> checkProjectAndAuth() { |
|
||||||
Map<String, Object> result = new HashMap<>(); |
|
||||||
result.put(Constants.STATUS, Status.SUCCESS); |
|
||||||
return result; |
|
||||||
} |
|
||||||
} |
|
Loading…
Reference in new issue