Browse Source
* Feature :Refactor org.apache.dolphinscheduler.api.controller.TaskInstanceController3.2.0-release
Zzih
2 years ago
committed by
GitHub
10 changed files with 410 additions and 44 deletions
@ -0,0 +1,130 @@ |
|||||||
|
/* |
||||||
|
* 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.controller; |
||||||
|
|
||||||
|
import static org.apache.dolphinscheduler.api.enums.Status.FORCE_TASK_SUCCESS_ERROR; |
||||||
|
import static org.apache.dolphinscheduler.api.enums.Status.QUERY_TASK_LIST_PAGING_ERROR; |
||||||
|
|
||||||
|
import org.apache.dolphinscheduler.api.aspect.AccessLogAnnotation; |
||||||
|
import org.apache.dolphinscheduler.api.dto.taskInstance.TaskInstanceListPagingResponse; |
||||||
|
import org.apache.dolphinscheduler.api.dto.taskInstance.TaskInstanceQueryRequest; |
||||||
|
import org.apache.dolphinscheduler.api.dto.taskInstance.TaskInstanceSuccessResponse; |
||||||
|
import org.apache.dolphinscheduler.api.exceptions.ApiException; |
||||||
|
import org.apache.dolphinscheduler.api.service.TaskInstanceService; |
||||||
|
import org.apache.dolphinscheduler.api.utils.Result; |
||||||
|
import org.apache.dolphinscheduler.common.constants.Constants; |
||||||
|
import org.apache.dolphinscheduler.dao.entity.User; |
||||||
|
import org.apache.dolphinscheduler.plugin.task.api.enums.TaskExecutionStatus; |
||||||
|
import org.apache.dolphinscheduler.plugin.task.api.utils.ParameterUtils; |
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||||
|
import org.springframework.http.HttpStatus; |
||||||
|
import org.springframework.web.bind.annotation.GetMapping; |
||||||
|
import org.springframework.web.bind.annotation.PathVariable; |
||||||
|
import org.springframework.web.bind.annotation.PostMapping; |
||||||
|
import org.springframework.web.bind.annotation.RequestAttribute; |
||||||
|
import org.springframework.web.bind.annotation.RequestMapping; |
||||||
|
import org.springframework.web.bind.annotation.ResponseStatus; |
||||||
|
import org.springframework.web.bind.annotation.RestController; |
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.Operation; |
||||||
|
import io.swagger.v3.oas.annotations.Parameter; |
||||||
|
import io.swagger.v3.oas.annotations.Parameters; |
||||||
|
import io.swagger.v3.oas.annotations.media.Schema; |
||||||
|
import io.swagger.v3.oas.annotations.tags.Tag; |
||||||
|
|
||||||
|
/** |
||||||
|
* task instance controller |
||||||
|
*/ |
||||||
|
@Tag(name = "TASK_INSTANCE_TAG") |
||||||
|
@RestController |
||||||
|
@RequestMapping("/v2/projects/{projectCode}/task-instances") |
||||||
|
public class TaskInstanceV2Controller extends BaseController { |
||||||
|
|
||||||
|
@Autowired |
||||||
|
private TaskInstanceService taskInstanceService; |
||||||
|
|
||||||
|
/** |
||||||
|
* query task list paging |
||||||
|
* |
||||||
|
* @param loginUser login user |
||||||
|
* @param projectCode project code |
||||||
|
* @param taskInstanceQueryReq taskInstanceQueryReq |
||||||
|
* @return task list page |
||||||
|
*/ |
||||||
|
@Operation(summary = "queryTaskListPaging", description = "QUERY_TASK_INSTANCE_LIST_PAGING_NOTES") |
||||||
|
@Parameters({ |
||||||
|
@Parameter(name = "processInstanceId", description = "PROCESS_INSTANCE_ID", schema = @Schema(implementation = int.class), example = "100"), |
||||||
|
@Parameter(name = "processInstanceName", description = "PROCESS_INSTANCE_NAME", schema = @Schema(implementation = String.class)), |
||||||
|
@Parameter(name = "searchVal", description = "SEARCH_VAL", schema = @Schema(implementation = String.class)), |
||||||
|
@Parameter(name = "taskName", description = "TASK_NAME", schema = @Schema(implementation = String.class)), |
||||||
|
@Parameter(name = "executorName", description = "EXECUTOR_NAME", schema = @Schema(implementation = String.class)), |
||||||
|
@Parameter(name = "stateType", description = "EXECUTION_STATUS", schema = @Schema(implementation = TaskExecutionStatus.class)), |
||||||
|
@Parameter(name = "host", description = "HOST", schema = @Schema(implementation = String.class)), |
||||||
|
@Parameter(name = "startDate", description = "START_DATE", schema = @Schema(implementation = String.class)), |
||||||
|
@Parameter(name = "endDate", description = "END_DATE", schema = @Schema(implementation = String.class)), |
||||||
|
@Parameter(name = "taskExecuteType", description = "TASK_EXECUTE_TYPE", schema = @Schema(implementation = int.class), example = "STREAM"), |
||||||
|
@Parameter(name = "pageNo", description = "PAGE_NO", required = true, schema = @Schema(implementation = int.class), example = "1"), |
||||||
|
@Parameter(name = "pageSize", description = "PAGE_SIZE", required = true, schema = @Schema(implementation = int.class), example = "20"), |
||||||
|
}) |
||||||
|
@GetMapping(consumes = {"application/json"}) |
||||||
|
@ResponseStatus(HttpStatus.OK) |
||||||
|
@ApiException(QUERY_TASK_LIST_PAGING_ERROR) |
||||||
|
@AccessLogAnnotation(ignoreRequestArgs = "loginUser") |
||||||
|
public TaskInstanceListPagingResponse queryTaskListPaging(@Parameter(hidden = true) @RequestAttribute(value = Constants.SESSION_USER) User loginUser, |
||||||
|
@Parameter(name = "projectCode", description = "PROJECT_CODE", required = true) @PathVariable long projectCode, |
||||||
|
TaskInstanceQueryRequest taskInstanceQueryReq) { |
||||||
|
Result result = checkPageParams(taskInstanceQueryReq.getPageNo(), taskInstanceQueryReq.getPageSize()); |
||||||
|
if (!result.checkResult()) { |
||||||
|
return new TaskInstanceListPagingResponse(result); |
||||||
|
} |
||||||
|
String searchVal = ParameterUtils.handleEscapes(taskInstanceQueryReq.getSearchVal()); |
||||||
|
result = taskInstanceService.queryTaskListPaging(loginUser, projectCode, |
||||||
|
taskInstanceQueryReq.getProcessInstanceId(), taskInstanceQueryReq.getProcessInstanceName(), |
||||||
|
taskInstanceQueryReq.getProcessDefinitionName(), |
||||||
|
taskInstanceQueryReq.getTaskName(), taskInstanceQueryReq.getExecutorName(), |
||||||
|
taskInstanceQueryReq.getStartTime(), taskInstanceQueryReq.getEndTime(), searchVal, |
||||||
|
taskInstanceQueryReq.getStateType(), taskInstanceQueryReq.getHost(), |
||||||
|
taskInstanceQueryReq.getTaskExecuteType(), taskInstanceQueryReq.getPageNo(), |
||||||
|
taskInstanceQueryReq.getPageSize()); |
||||||
|
return new TaskInstanceListPagingResponse(result); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* change one task instance's state from FAILURE to FORCED_SUCCESS |
||||||
|
* |
||||||
|
* @param loginUser login user |
||||||
|
* @param projectCode project code |
||||||
|
* @param id task instance id |
||||||
|
* @return the result code and msg |
||||||
|
*/ |
||||||
|
@Operation(summary = "force-success", description = "FORCE_TASK_SUCCESS") |
||||||
|
@Parameters({ |
||||||
|
@Parameter(name = "id", description = "TASK_INSTANCE_ID", required = true, schema = @Schema(implementation = int.class), example = "12") |
||||||
|
}) |
||||||
|
@PostMapping(value = "/{id}/force-success", consumes = {"application/json"}) |
||||||
|
@ResponseStatus(HttpStatus.OK) |
||||||
|
@ApiException(FORCE_TASK_SUCCESS_ERROR) |
||||||
|
@AccessLogAnnotation(ignoreRequestArgs = "loginUser") |
||||||
|
public TaskInstanceSuccessResponse forceTaskSuccess(@Parameter(hidden = true) @RequestAttribute(value = Constants.SESSION_USER) User loginUser, |
||||||
|
@Parameter(name = "projectCode", description = "PROJECT_CODE", required = true) @PathVariable long projectCode, |
||||||
|
@PathVariable(value = "id") Integer id) { |
||||||
|
Result result = taskInstanceService.forceTaskSuccess(loginUser, projectCode, id); |
||||||
|
return new TaskInstanceSuccessResponse(result); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,40 @@ |
|||||||
|
/* |
||||||
|
* 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.dto.taskInstance; |
||||||
|
|
||||||
|
import org.apache.dolphinscheduler.api.utils.PageInfo; |
||||||
|
import org.apache.dolphinscheduler.api.utils.Result; |
||||||
|
import org.apache.dolphinscheduler.dao.entity.TaskInstance; |
||||||
|
|
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
/** |
||||||
|
* task instance list paging response |
||||||
|
*/ |
||||||
|
@Data |
||||||
|
public class TaskInstanceListPagingResponse extends Result { |
||||||
|
|
||||||
|
private PageInfo<TaskInstance> data; |
||||||
|
|
||||||
|
public TaskInstanceListPagingResponse(Result result) { |
||||||
|
super(); |
||||||
|
this.setCode(result.getCode()); |
||||||
|
this.setMsg(result.getMsg()); |
||||||
|
this.setData(result.getData()); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,70 @@ |
|||||||
|
/* |
||||||
|
* 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.dto.taskInstance; |
||||||
|
|
||||||
|
import org.apache.dolphinscheduler.api.dto.PageQueryDto; |
||||||
|
import org.apache.dolphinscheduler.common.enums.TaskExecuteType; |
||||||
|
import org.apache.dolphinscheduler.plugin.task.api.enums.TaskExecutionStatus; |
||||||
|
|
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; |
||||||
|
import com.fasterxml.jackson.annotation.JsonInclude; |
||||||
|
import io.swagger.v3.oas.annotations.media.Schema; |
||||||
|
|
||||||
|
/** |
||||||
|
* task instance request |
||||||
|
*/ |
||||||
|
@JsonIgnoreProperties(ignoreUnknown = true) |
||||||
|
@JsonInclude(JsonInclude.Include.NON_NULL) |
||||||
|
@Data |
||||||
|
public class TaskInstanceQueryRequest extends PageQueryDto { |
||||||
|
|
||||||
|
@Schema(name = "processInstanceId", example = "PROCESS_INSTANCE_ID", defaultValue = "0") |
||||||
|
Integer processInstanceId; |
||||||
|
|
||||||
|
@Schema(name = "processInstanceName", example = "PROCESS-INSTANCE-NAME") |
||||||
|
String processInstanceName; |
||||||
|
|
||||||
|
@Schema(name = "processDefinitionName", example = "PROCESS-DEFINITION-NAME") |
||||||
|
String processDefinitionName; |
||||||
|
|
||||||
|
@Schema(name = "searchVal", example = "SEARCH-VAL") |
||||||
|
String searchVal; |
||||||
|
|
||||||
|
@Schema(name = "taskName", example = "TASK-NAME") |
||||||
|
String taskName; |
||||||
|
|
||||||
|
@Schema(name = "executorName", example = "EXECUTOR-NAME") |
||||||
|
String executorName; |
||||||
|
|
||||||
|
@Schema(name = "stateType", example = "STATE-TYPE") |
||||||
|
TaskExecutionStatus stateType; |
||||||
|
|
||||||
|
@Schema(name = "host", example = "HOST") |
||||||
|
String host; |
||||||
|
|
||||||
|
@Schema(name = "startDate", example = "START-TIME") |
||||||
|
String startTime; |
||||||
|
|
||||||
|
@Schema(name = "endDate", example = "END-DATE") |
||||||
|
String endTime; |
||||||
|
|
||||||
|
@Schema(name = "taskExecuteType", example = "EXECUTE-TYPE", defaultValue = "BATCH") |
||||||
|
TaskExecuteType taskExecuteType; |
||||||
|
} |
@ -0,0 +1,36 @@ |
|||||||
|
/* |
||||||
|
* 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.dto.taskInstance; |
||||||
|
|
||||||
|
import org.apache.dolphinscheduler.api.utils.Result; |
||||||
|
|
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
/** |
||||||
|
* task instance success response |
||||||
|
*/ |
||||||
|
@Data |
||||||
|
public class TaskInstanceSuccessResponse extends Result { |
||||||
|
|
||||||
|
public TaskInstanceSuccessResponse(Result result) { |
||||||
|
super(); |
||||||
|
this.setCode(result.getCode()); |
||||||
|
this.setMsg(result.getMsg()); |
||||||
|
this.setData(result.getData()); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,95 @@ |
|||||||
|
/* |
||||||
|
* 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.controller; |
||||||
|
|
||||||
|
import static org.mockito.ArgumentMatchers.*; |
||||||
|
import static org.mockito.Mockito.when; |
||||||
|
|
||||||
|
import org.apache.dolphinscheduler.api.dto.taskInstance.TaskInstanceQueryRequest; |
||||||
|
import org.apache.dolphinscheduler.api.enums.Status; |
||||||
|
import org.apache.dolphinscheduler.api.service.TaskInstanceService; |
||||||
|
import org.apache.dolphinscheduler.api.utils.PageInfo; |
||||||
|
import org.apache.dolphinscheduler.api.utils.Result; |
||||||
|
import org.apache.dolphinscheduler.common.enums.TaskExecuteType; |
||||||
|
import org.apache.dolphinscheduler.dao.entity.TaskInstance; |
||||||
|
import org.apache.dolphinscheduler.plugin.task.api.enums.TaskExecutionStatus; |
||||||
|
|
||||||
|
import java.util.Collections; |
||||||
|
|
||||||
|
import org.junit.jupiter.api.Assertions; |
||||||
|
import org.junit.jupiter.api.Test; |
||||||
|
import org.mockito.InjectMocks; |
||||||
|
import org.mockito.Mock; |
||||||
|
import org.mockito.Mockito; |
||||||
|
|
||||||
|
public class TaskInstanceV2ControllerTest extends AbstractControllerTest { |
||||||
|
|
||||||
|
@InjectMocks |
||||||
|
private TaskInstanceV2Controller taskInstanceV2Controller; |
||||||
|
|
||||||
|
@Mock |
||||||
|
private TaskInstanceService taskInstanceService; |
||||||
|
|
||||||
|
@Test |
||||||
|
public void testQueryTaskListPaging() { |
||||||
|
|
||||||
|
TaskInstanceQueryRequest taskInstanceQueryReq = new TaskInstanceQueryRequest(); |
||||||
|
taskInstanceQueryReq.setProcessInstanceId(1); |
||||||
|
taskInstanceQueryReq.setProcessInstanceName(""); |
||||||
|
taskInstanceQueryReq.setProcessDefinitionName(""); |
||||||
|
taskInstanceQueryReq.setTaskName(""); |
||||||
|
taskInstanceQueryReq.setExecutorName(""); |
||||||
|
taskInstanceQueryReq.setStartTime("2022-06-01 00:00:00"); |
||||||
|
taskInstanceQueryReq.setEndTime("2022-09-01 00:00:00"); |
||||||
|
taskInstanceQueryReq.setSearchVal(""); |
||||||
|
taskInstanceQueryReq.setStateType(TaskExecutionStatus.SUCCESS); |
||||||
|
taskInstanceQueryReq.setHost("127.0.0.1"); |
||||||
|
taskInstanceQueryReq.setTaskExecuteType(TaskExecuteType.BATCH); |
||||||
|
taskInstanceQueryReq.setPageNo(1); |
||||||
|
taskInstanceQueryReq.setPageSize(20); |
||||||
|
|
||||||
|
Result result = new Result(); |
||||||
|
PageInfo<TaskInstance> pageInfo = |
||||||
|
new PageInfo<>(taskInstanceQueryReq.getPageNo(), taskInstanceQueryReq.getPageSize()); |
||||||
|
pageInfo.setTotalList(Collections.singletonList(new TaskInstance())); |
||||||
|
result.setData(pageInfo); |
||||||
|
putMsg(result, Status.SUCCESS); |
||||||
|
|
||||||
|
when(taskInstanceService.queryTaskListPaging(any(), eq(1L), eq(taskInstanceQueryReq.getProcessInstanceId()), |
||||||
|
eq(taskInstanceQueryReq.getProcessInstanceName()), eq(taskInstanceQueryReq.getProcessInstanceName()), |
||||||
|
eq(taskInstanceQueryReq.getTaskName()), eq(taskInstanceQueryReq.getExecutorName()), any(), any(), |
||||||
|
eq(taskInstanceQueryReq.getSearchVal()), Mockito.any(), eq(taskInstanceQueryReq.getHost()), |
||||||
|
eq(taskInstanceQueryReq.getTaskExecuteType()), any(), any())).thenReturn(result); |
||||||
|
Result taskResult = taskInstanceV2Controller.queryTaskListPaging(null, 1L, taskInstanceQueryReq); |
||||||
|
Assertions.assertEquals(Integer.valueOf(Status.SUCCESS.getCode()), taskResult.getCode()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void testForceTaskSuccess() { |
||||||
|
|
||||||
|
Result mockResult = new Result(); |
||||||
|
putMsg(mockResult, Status.SUCCESS); |
||||||
|
|
||||||
|
when(taskInstanceService.forceTaskSuccess(any(), Mockito.anyLong(), Mockito.anyInt())).thenReturn(mockResult); |
||||||
|
|
||||||
|
Result taskResult = taskInstanceV2Controller.forceTaskSuccess(null, 1L, 1); |
||||||
|
Assertions.assertEquals(Integer.valueOf(Status.SUCCESS.getCode()), taskResult.getCode()); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
} |
Loading…
Reference in new issue