diff --git a/parodos-model-api/src/main/java/com/redhat/parodos/workflow/enums/LogType.java b/parodos-model-api/src/main/java/com/redhat/parodos/workflow/enums/LogType.java new file mode 100644 index 000000000..adfac4e5e --- /dev/null +++ b/parodos-model-api/src/main/java/com/redhat/parodos/workflow/enums/LogType.java @@ -0,0 +1,17 @@ +package com.redhat.parodos.workflow.enums; + +import lombok.Getter; + +public enum LogType { + + TEXT(""), INFO("\u001B[32m"), WARNING("\u001B[33m"), ERROR("\u001B[34m"), END("\u001B[39m"); + + // Ansi code + @Getter + private final String code; + + LogType(String code) { + this.code = code; + } + +} diff --git a/parodos-model-api/src/main/java/com/redhat/parodos/workflow/log/WorkFlowLogService.java b/parodos-model-api/src/main/java/com/redhat/parodos/workflow/log/WorkFlowLogService.java new file mode 100644 index 000000000..bc8b2ae70 --- /dev/null +++ b/parodos-model-api/src/main/java/com/redhat/parodos/workflow/log/WorkFlowLogService.java @@ -0,0 +1,11 @@ +package com.redhat.parodos.workflow.log; + +import java.util.UUID; + +public interface WorkFlowLogService { + + String getLog(UUID workflowExecutionId, String taskName); + + void writeLog(UUID workflowExecutionId, String taskName, WorkFlowTaskLog log); + +} diff --git a/parodos-model-api/src/main/java/com/redhat/parodos/workflow/log/WorkFlowTaskLog.java b/parodos-model-api/src/main/java/com/redhat/parodos/workflow/log/WorkFlowTaskLog.java new file mode 100644 index 000000000..ca5d99848 --- /dev/null +++ b/parodos-model-api/src/main/java/com/redhat/parodos/workflow/log/WorkFlowTaskLog.java @@ -0,0 +1,24 @@ +package com.redhat.parodos.workflow.log; + +import com.redhat.parodos.workflow.enums.LogType; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Builder +@Data +@AllArgsConstructor +@NoArgsConstructor +public class WorkFlowTaskLog { + + private String logText; + + private LogType logType = LogType.TEXT; + + @Override + public String toString() { + return logType.getCode() + logText + (logType.getCode().isEmpty() ? "" : LogType.END.getCode()); + } + +} diff --git a/parodos-model-api/src/main/java/com/redhat/parodos/workflow/task/BaseWorkFlowTask.java b/parodos-model-api/src/main/java/com/redhat/parodos/workflow/task/BaseWorkFlowTask.java index 08e5756dd..aad809059 100644 --- a/parodos-model-api/src/main/java/com/redhat/parodos/workflow/task/BaseWorkFlowTask.java +++ b/parodos-model-api/src/main/java/com/redhat/parodos/workflow/task/BaseWorkFlowTask.java @@ -19,7 +19,10 @@ import java.util.Map; import java.util.UUID; +import com.redhat.parodos.workflow.enums.LogType; import com.redhat.parodos.workflow.exception.MissingParameterException; +import com.redhat.parodos.workflow.log.WorkFlowLogService; +import com.redhat.parodos.workflow.log.WorkFlowTaskLog; import com.redhat.parodos.workflow.utils.WorkContextUtils; import com.redhat.parodos.workflows.work.WorkContext; import com.redhat.parodos.workflows.workflow.WorkFlow; @@ -27,6 +30,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.BeanNameAware; +import org.springframework.beans.factory.annotation.Autowired; /** * Base Class for a WorkFlowTask. @@ -44,6 +48,9 @@ public abstract class BaseWorkFlowTask implements WorkFlowTask, BeanNameAware { @Getter private String name; + @Autowired + private WorkFlowLogService workFlowLogService; + @Override public void setBeanName(String name) { this.name = name; @@ -108,4 +115,25 @@ public String getOptionalParameterValue(WorkContext workContext, String paramete .map(Map.Entry::getValue).findFirst().orElse(defaultValue); } + private void addTaskLogByLogType(WorkContext workContext, String logText, LogType logType) { + workFlowLogService.writeLog(getMainExecutionId(workContext), name, + WorkFlowTaskLog.builder().logText(logText).logType(logType).build()); + } + + public void addTaskLog(WorkContext workContext, String logText) { + addTaskLogByLogType(workContext, logText, LogType.TEXT); + } + + public void addInfoTaskLog(WorkContext workContext, String logText) { + addTaskLogByLogType(workContext, logText, LogType.INFO); + } + + public void addErrorTaskLog(WorkContext workContext, String logText) { + addTaskLogByLogType(workContext, logText, LogType.ERROR); + } + + public void addWarningTaskLog(WorkContext workContext, String logText) { + addTaskLogByLogType(workContext, logText, LogType.WARNING); + } + } \ No newline at end of file diff --git a/workflow-examples/src/main/java/com/redhat/parodos/examples/ocponboarding/task/JiraTicketCreationWorkFlowTask.java b/workflow-examples/src/main/java/com/redhat/parodos/examples/ocponboarding/task/JiraTicketCreationWorkFlowTask.java index 045e1d216..a30b61e89 100644 --- a/workflow-examples/src/main/java/com/redhat/parodos/examples/ocponboarding/task/JiraTicketCreationWorkFlowTask.java +++ b/workflow-examples/src/main/java/com/redhat/parodos/examples/ocponboarding/task/JiraTicketCreationWorkFlowTask.java @@ -71,6 +71,7 @@ public JiraTicketCreationWorkFlowTask(String jiraServiceBaseUrl, String jiraUser */ public WorkReport execute(WorkContext workContext) { log.info("Start jiraTicketCreationWorkFlowTask..."); + addTaskLog(workContext, "Start jiraTicketCreationWorkFlowTask..."); try { String urlString = jiraServiceBaseUrl + "/rest/servicedeskapi/request"; String serviceDeskId = "1"; @@ -95,12 +96,14 @@ public WorkReport execute(WorkContext workContext) { addParameter(workContext, ISSUE_KEY, Objects.requireNonNull(response.getBody()).getIssueKey()); addParameter(workContext, ISSUE_LINK, Objects.requireNonNull(response.getBody()).getLinks().get(WEB_LINK)); + addInfoTaskLog(workContext, "jiraTicketCreationWorkFlowTask is completed"); return new DefaultWorkReport(WorkStatus.COMPLETED, workContext); } log.error("Call to the API was not successful. Response: {}", response.getStatusCode()); } catch (Exception e) { log.error("There was an issue with the REST call: {}", e.getMessage()); + addErrorTaskLog(workContext, "jiraTicketCreationWorkFlowTask is Failed"); } return new DefaultWorkReport(WorkStatus.FAILED, workContext); } diff --git a/workflow-examples/src/test/java/com/redhat/parodos/examples/ocponboarding/task/JiraTicketCreationWorkFlowTaskTest.java b/workflow-examples/src/test/java/com/redhat/parodos/examples/ocponboarding/task/JiraTicketCreationWorkFlowTaskTest.java index 126a98211..786ae31e3 100644 --- a/workflow-examples/src/test/java/com/redhat/parodos/examples/ocponboarding/task/JiraTicketCreationWorkFlowTaskTest.java +++ b/workflow-examples/src/test/java/com/redhat/parodos/examples/ocponboarding/task/JiraTicketCreationWorkFlowTaskTest.java @@ -17,6 +17,7 @@ import org.junit.Before; import org.junit.Test; import org.mockito.MockedStatic; +import org.mockito.Mockito; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -62,6 +63,9 @@ public class JiraTicketCreationWorkFlowTaskTest extends BaseInfrastructureWorkFl @Before public void setUp() { this.jiraTicketCreationWorkFlowTask = spy((JiraTicketCreationWorkFlowTask) getConcretePersonImplementation()); + Mockito.doNothing().when(jiraTicketCreationWorkFlowTask).addInfoTaskLog(any(), any()); + Mockito.doNothing().when(jiraTicketCreationWorkFlowTask).addErrorTaskLog(any(), any()); + Mockito.doNothing().when(jiraTicketCreationWorkFlowTask).addTaskLog(any(), any()); } @Override @@ -101,15 +105,19 @@ public void executeSuccess() { public void executeFail() { // given WorkContext workContext = mock(WorkContext.class); - try (MockedStatic restUtilsMockedStatic = mockStatic(RestUtils.class)) { restUtilsMockedStatic.when( () -> RestUtils.executePost(any(String.class), any(), any(String.class), any(String.class), any())) .thenReturn(new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR)); - // when - WorkReport workReport = jiraTicketCreationWorkFlowTask.execute(workContext); - // then - assertEquals(WorkStatus.FAILED, workReport.getStatus()); + try (MockedStatic workContextUtilsMockedStatic = mockStatic(WorkContextUtils.class)) { + workContextUtilsMockedStatic.when(() -> WorkContextUtils.getMainExecutionId(any(WorkContext.class))) + .thenReturn(UUID.randomUUID()); + + // when + WorkReport workReport = jiraTicketCreationWorkFlowTask.execute(workContext); + // then + assertEquals(WorkStatus.FAILED, workReport.getStatus()); + } } } diff --git a/workflow-service-sdk/README.md b/workflow-service-sdk/README.md index fcf2391f4..4138ba7bb 100644 --- a/workflow-service-sdk/README.md +++ b/workflow-service-sdk/README.md @@ -118,6 +118,7 @@ Class | Method | HTTP request | Description *ProjectApi* | [**removeUsersFromProject**](docs/ProjectApi.md#removeUsersFromProject) | **DELETE** /api/v1/projects/{id}/users | Remove users from project *ProjectApi* | [**updateUserRolesToProject**](docs/ProjectApi.md#updateUserRolesToProject) | **POST** /api/v1/projects/{id}/users | Update user roles in project *WorkflowApi* | [**execute**](docs/WorkflowApi.md#execute) | **POST** /api/v1/workflows | Executes a workflow +*WorkflowApi* | [**getLog**](docs/WorkflowApi.md#getLog) | **GET** /api/v1/workflows/{workFlowExecutionId}/{taskName}/log | Returns workflow execution log *WorkflowApi* | [**getStatus**](docs/WorkflowApi.md#getStatus) | **GET** /api/v1/workflows/{workFlowExecutionId}/status | Returns a workflow status *WorkflowApi* | [**getStatusByProjectId**](docs/WorkflowApi.md#getStatusByProjectId) | **GET** /api/v1/workflows | Returns workflows by project id *WorkflowApi* | [**getWorkflowParameters**](docs/WorkflowApi.md#getWorkflowParameters) | **GET** /api/v1/workflows/{workFlowExecutionId}/context | Returns workflow context parameters diff --git a/workflow-service-sdk/api/openapi.yaml b/workflow-service-sdk/api/openapi.yaml index 53a4883e5..305b89916 100644 --- a/workflow-service-sdk/api/openapi.yaml +++ b/workflow-service-sdk/api/openapi.yaml @@ -669,6 +669,58 @@ paths: tags: - Workflow x-accepts: application/json + /api/v1/workflows/{workFlowExecutionId}/{taskName}/log: + get: + operationId: getLog + parameters: + - explode: false + in: path + name: workFlowExecutionId + required: true + schema: + format: uuid + type: string + style: simple + - explode: false + in: path + name: taskName + required: true + schema: + type: string + style: simple + responses: + "200": + content: + text/plain: + schema: + type: string + description: Succeeded + "400": + content: + '*/*': + schema: + $ref: '#/components/schemas/ErrorMessageDTO' + description: Bad Request + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + content: + '*/*': + schema: + $ref: '#/components/schemas/ErrorMessageDTO' + description: Not Found + "409": + content: + '*/*': + schema: + $ref: '#/components/schemas/ErrorMessageDTO' + description: Conflict + summary: Returns workflow execution log + tags: + - Workflow + x-accepts: "*/*,text/plain" components: schemas: ArgumentRequestDTO: diff --git a/workflow-service-sdk/docs/WorkflowApi.md b/workflow-service-sdk/docs/WorkflowApi.md index 130202b37..44c741bb5 100644 --- a/workflow-service-sdk/docs/WorkflowApi.md +++ b/workflow-service-sdk/docs/WorkflowApi.md @@ -5,6 +5,7 @@ All URIs are relative to *http://localhost:8080* | Method | HTTP request | Description | |------------- | ------------- | -------------| | [**execute**](WorkflowApi.md#execute) | **POST** /api/v1/workflows | Executes a workflow | +| [**getLog**](WorkflowApi.md#getLog) | **GET** /api/v1/workflows/{workFlowExecutionId}/{taskName}/log | Returns workflow execution log | | [**getStatus**](WorkflowApi.md#getStatus) | **GET** /api/v1/workflows/{workFlowExecutionId}/status | Returns a workflow status | | [**getStatusByProjectId**](WorkflowApi.md#getStatusByProjectId) | **GET** /api/v1/workflows | Returns workflows by project id | | [**getWorkflowParameters**](WorkflowApi.md#getWorkflowParameters) | **GET** /api/v1/workflows/{workFlowExecutionId}/context | Returns workflow context parameters | @@ -76,6 +77,73 @@ No authorization required | **404** | Not Found | - | | **409** | Conflict | - | + +# **getLog** +> String getLog(workFlowExecutionId, taskName) + +Returns workflow execution log + +### Example +```java +// Import classes: +import com.redhat.parodos.sdk.invoker.ApiClient; +import com.redhat.parodos.sdk.invoker.ApiException; +import com.redhat.parodos.sdk.invoker.Configuration; +import com.redhat.parodos.sdk.invoker.models.*; +import com.redhat.parodos.sdk.api.WorkflowApi; + +public class Example { + public static void main(String[] args) { + ApiClient defaultClient = Configuration.getDefaultApiClient(); + defaultClient.setBasePath("http://localhost:8080"); + + WorkflowApi apiInstance = new WorkflowApi(defaultClient); + UUID workFlowExecutionId = UUID.randomUUID(); // UUID | + String taskName = "taskName_example"; // String | + try { + String result = apiInstance.getLog(workFlowExecutionId, taskName); + System.out.println(result); + } catch (ApiException e) { + System.err.println("Exception when calling WorkflowApi#getLog"); + System.err.println("Status code: " + e.getCode()); + System.err.println("Reason: " + e.getResponseBody()); + System.err.println("Response headers: " + e.getResponseHeaders()); + e.printStackTrace(); + } + } +} +``` + +### Parameters + +| Name | Type | Description | Notes | +|------------- | ------------- | ------------- | -------------| +| **workFlowExecutionId** | **UUID**| | | +| **taskName** | **String**| | | + +### Return type + +**String** + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: text/plain, */* + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +| **200** | Succeeded | - | +| **400** | Bad Request | - | +| **401** | Unauthorized | - | +| **403** | Forbidden | - | +| **404** | Not Found | - | +| **409** | Conflict | - | + # **getStatus** > WorkFlowStatusResponseDTO getStatus(workFlowExecutionId) diff --git a/workflow-service-sdk/src/main/java/com/redhat/parodos/sdk/api/WorkflowApi.java b/workflow-service-sdk/src/main/java/com/redhat/parodos/sdk/api/WorkflowApi.java index 627162025..b81f7c477 100644 --- a/workflow-service-sdk/src/main/java/com/redhat/parodos/sdk/api/WorkflowApi.java +++ b/workflow-service-sdk/src/main/java/com/redhat/parodos/sdk/api/WorkflowApi.java @@ -334,6 +334,279 @@ public okhttp3.Call executeAsync(WorkFlowRequestDTO workFlowRequestDTO, return localVarCall; } + /** + * Build call for getLog + * @param workFlowExecutionId (required) + * @param taskName (required) + * @param _callback Callback for upload/download progress + * @return Call to execute + * @throws ApiException If fail to serialize the request body object + * @http.response.details + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Status CodeDescriptionResponse Headers
200Succeeded-
400Bad Request-
401Unauthorized-
403Forbidden-
404Not Found-
409Conflict-
+ */ + public okhttp3.Call getLogCall(UUID workFlowExecutionId, String taskName, final ApiCallback _callback) + throws ApiException { + String basePath = null; + // Operation Servers + String[] localBasePaths = new String[] {}; + + // Determine Base Path to Use + if (localCustomBaseUrl != null) { + basePath = localCustomBaseUrl; + } + else if (localBasePaths.length > 0) { + basePath = localBasePaths[localHostIndex]; + } + else { + basePath = null; + } + + Object localVarPostBody = null; + + // create path and map variables + String localVarPath = "/api/v1/workflows/{workFlowExecutionId}/{taskName}/log" + .replace("{" + "workFlowExecutionId" + "}", + localVarApiClient.escapeString(workFlowExecutionId.toString())) + .replace("{" + "taskName" + "}", localVarApiClient.escapeString(taskName.toString())); + + List localVarQueryParams = new ArrayList(); + List localVarCollectionQueryParams = new ArrayList(); + Map localVarHeaderParams = new HashMap(); + Map localVarCookieParams = new HashMap(); + Map localVarFormParams = new HashMap(); + + final String[] localVarAccepts = { "text/plain", "*/*" }; + final String localVarAccept = localVarApiClient.selectHeaderAccept(localVarAccepts); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } + + final String[] localVarContentTypes = {}; + final String localVarContentType = localVarApiClient.selectHeaderContentType(localVarContentTypes); + if (localVarContentType != null) { + localVarHeaderParams.put("Content-Type", localVarContentType); + } + + String[] localVarAuthNames = new String[] {}; + return localVarApiClient.buildCall(basePath, localVarPath, "GET", localVarQueryParams, + localVarCollectionQueryParams, localVarPostBody, localVarHeaderParams, localVarCookieParams, + localVarFormParams, localVarAuthNames, _callback); + } + + @SuppressWarnings("rawtypes") + private okhttp3.Call getLogValidateBeforeCall(UUID workFlowExecutionId, String taskName, + final ApiCallback _callback) throws ApiException { + // verify the required parameter 'workFlowExecutionId' is set + if (workFlowExecutionId == null) { + throw new ApiException("Missing the required parameter 'workFlowExecutionId' when calling getLog(Async)"); + } + + // verify the required parameter 'taskName' is set + if (taskName == null) { + throw new ApiException("Missing the required parameter 'taskName' when calling getLog(Async)"); + } + + return getLogCall(workFlowExecutionId, taskName, _callback); + + } + + /** + * Returns workflow execution log + * @param workFlowExecutionId (required) + * @param taskName (required) + * @return String + * @throws ApiException If fail to call the API, e.g. server error or cannot + * deserialize the response body + * @http.response.details + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Status CodeDescriptionResponse Headers
200Succeeded-
400Bad Request-
401Unauthorized-
403Forbidden-
404Not Found-
409Conflict-
+ */ + public String getLog(UUID workFlowExecutionId, String taskName) throws ApiException { + ApiResponse localVarResp = getLogWithHttpInfo(workFlowExecutionId, taskName); + return localVarResp.getData(); + } + + /** + * Returns workflow execution log + * @param workFlowExecutionId (required) + * @param taskName (required) + * @return ApiResponse<String> + * @throws ApiException If fail to call the API, e.g. server error or cannot + * deserialize the response body + * @http.response.details + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Status CodeDescriptionResponse Headers
200Succeeded-
400Bad Request-
401Unauthorized-
403Forbidden-
404Not Found-
409Conflict-
+ */ + public ApiResponse getLogWithHttpInfo(UUID workFlowExecutionId, String taskName) throws ApiException { + okhttp3.Call localVarCall = getLogValidateBeforeCall(workFlowExecutionId, taskName, null); + Type localVarReturnType = new TypeToken() { + }.getType(); + return localVarApiClient.execute(localVarCall, localVarReturnType); + } + + /** + * Returns workflow execution log (asynchronously) + * @param workFlowExecutionId (required) + * @param taskName (required) + * @param _callback The callback to be executed when the API call finishes + * @return The request call + * @throws ApiException If fail to process the API call, e.g. serializing the request + * body object + * @http.response.details + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Status CodeDescriptionResponse Headers
200Succeeded-
400Bad Request-
401Unauthorized-
403Forbidden-
404Not Found-
409Conflict-
+ */ + public okhttp3.Call getLogAsync(UUID workFlowExecutionId, String taskName, final ApiCallback _callback) + throws ApiException { + + okhttp3.Call localVarCall = getLogValidateBeforeCall(workFlowExecutionId, taskName, _callback); + Type localVarReturnType = new TypeToken() { + }.getType(); + localVarApiClient.executeAsync(localVarCall, localVarReturnType, _callback); + return localVarCall; + } + /** * Build call for getStatus * @param workFlowExecutionId (required) diff --git a/workflow-service/generated/openapi/openapi.json b/workflow-service/generated/openapi/openapi.json index 39962a3db..a4025c734 100644 --- a/workflow-service/generated/openapi/openapi.json +++ b/workflow-service/generated/openapi/openapi.json @@ -929,6 +929,77 @@ "summary" : "Returns a workflow status", "tags" : [ "Workflow" ] } + }, + "/api/v1/workflows/{workFlowExecutionId}/{taskName}/log" : { + "get" : { + "operationId" : "getLog", + "parameters" : [ { + "in" : "path", + "name" : "workFlowExecutionId", + "required" : true, + "schema" : { + "type" : "string", + "format" : "uuid" + } + }, { + "in" : "path", + "name" : "taskName", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "responses" : { + "200" : { + "content" : { + "text/plain" : { + "schema" : { + "type" : "string" + } + } + }, + "description" : "Succeeded" + }, + "400" : { + "content" : { + "*/*" : { + "schema" : { + "$ref" : "#/components/schemas/ErrorMessageDTO" + } + } + }, + "description" : "Bad Request" + }, + "401" : { + "description" : "Unauthorized" + }, + "403" : { + "description" : "Forbidden" + }, + "404" : { + "content" : { + "*/*" : { + "schema" : { + "$ref" : "#/components/schemas/ErrorMessageDTO" + } + } + }, + "description" : "Not Found" + }, + "409" : { + "content" : { + "*/*" : { + "schema" : { + "$ref" : "#/components/schemas/ErrorMessageDTO" + } + } + }, + "description" : "Conflict" + } + }, + "summary" : "Returns workflow execution log", + "tags" : [ "Workflow" ] + } } }, "components" : { diff --git a/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/controller/WorkFlowController.java b/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/controller/WorkFlowController.java index 3f14f460c..96c3d9e60 100644 --- a/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/controller/WorkFlowController.java +++ b/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/controller/WorkFlowController.java @@ -29,6 +29,7 @@ import com.redhat.parodos.workflow.execution.dto.WorkFlowStatusResponseDTO; import com.redhat.parodos.workflow.execution.service.WorkFlowService; import com.redhat.parodos.workflow.execution.validation.PubliclyVisible; +import com.redhat.parodos.workflow.log.WorkFlowLogService; import com.redhat.parodos.workflow.utils.WorkContextUtils; import com.redhat.parodos.workflows.work.WorkReport; import com.redhat.parodos.workflows.work.WorkStatus; @@ -40,6 +41,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.CrossOrigin; @@ -67,8 +69,11 @@ public class WorkFlowController { private final WorkFlowService workFlowService; - public WorkFlowController(WorkFlowService workFlowService) { + private final WorkFlowLogService workFlowLogService; + + public WorkFlowController(WorkFlowService workFlowService, WorkFlowLogService workFlowLogService) { this.workFlowService = workFlowService; + this.workFlowLogService = workFlowLogService; } @Operation(summary = "Executes a workflow") @@ -148,4 +153,16 @@ public ResponseEntity getWorkflowParameters(@PathVar return ResponseEntity.ok(responseDTO); } + @Operation(summary = "Returns workflow execution log") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "Succeeded", + content = { @Content(mediaType = MediaType.TEXT_PLAIN_VALUE, + schema = @Schema(implementation = String.class)) }), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content) }) + @GetMapping("/{workFlowExecutionId}/{taskName}/log") + public ResponseEntity getLog(@PathVariable UUID workFlowExecutionId, @PathVariable String taskName) { + return ResponseEntity.ok(workFlowLogService.getLog(workFlowExecutionId, taskName)); + } + } diff --git a/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/dto/WorkFlowLogResponseDTO.java b/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/dto/WorkFlowLogResponseDTO.java new file mode 100644 index 000000000..20c1ee834 --- /dev/null +++ b/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/dto/WorkFlowLogResponseDTO.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2022 Red Hat Developer + * + * Licensed 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 + * + * https://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 com.redhat.parodos.workflow.execution.dto; + +import java.util.UUID; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * Workflow log response dto + */ + +@Builder +@Data +@AllArgsConstructor +@NoArgsConstructor +public class WorkFlowLogResponseDTO { + + private UUID workFlowExecutionId; + + private String taskName; + + private String log; + +} diff --git a/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/entity/WorkFlowTaskExecution.java b/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/entity/WorkFlowTaskExecution.java index 5b8ccdf5f..3ad331dfb 100644 --- a/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/entity/WorkFlowTaskExecution.java +++ b/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/entity/WorkFlowTaskExecution.java @@ -18,8 +18,10 @@ import java.util.Date; import java.util.UUID; +import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; +import javax.persistence.OneToOne; import com.redhat.parodos.common.AbstractEntity; import com.redhat.parodos.workflows.work.WorkStatus; @@ -63,4 +65,7 @@ public class WorkFlowTaskExecution extends AbstractEntity { private Date lastUpdateDate; -} \ No newline at end of file + @OneToOne(mappedBy = "workFlowTaskExecution", cascade = { CascadeType.ALL }) + private WorkFlowTaskExecutionLog workFlowTaskExecutionLog; + +} diff --git a/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/entity/WorkFlowTaskExecutionLog.java b/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/entity/WorkFlowTaskExecutionLog.java new file mode 100644 index 000000000..8ea7dc4f9 --- /dev/null +++ b/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/entity/WorkFlowTaskExecutionLog.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2022 Red Hat Developer + * + * Licensed 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 + * + * https://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 com.redhat.parodos.workflow.execution.entity; + +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.JoinColumn; +import javax.persistence.OneToOne; + +import com.redhat.parodos.common.AbstractEntity; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +/** + * WorkFlow Context Entity + * + * @author Richard Wang (Github: richardw98) + * @author Annel Ketcha (Github: anludke) + */ + +@Entity(name = "prds_workflow_task_execution_log") +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Getter +@Setter +public class WorkFlowTaskExecutionLog extends AbstractEntity { + + @OneToOne(optional = false, fetch = FetchType.LAZY) + @JoinColumn(name = "workflow_task_execution_id") + private WorkFlowTaskExecution workFlowTaskExecution; + + private String log; + + public void addLog(String nextLog) { + log = log + "\n" + nextLog; + } + +} diff --git a/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/repository/WorkFlowRepository.java b/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/repository/WorkFlowRepository.java index 8d72ff902..4c76b3b9d 100644 --- a/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/repository/WorkFlowRepository.java +++ b/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/repository/WorkFlowRepository.java @@ -41,7 +41,7 @@ WorkFlowExecution findFirstByWorkFlowDefinitionIdAndMainWorkFlowExecution(UUID w List findAllByProjectId(UUID projectId); - WorkFlowExecution findFirstByMainWorkFlowExecutionAndWorkFlowDefinitionId(WorkFlowExecution mainWorkFlowExecution, + WorkFlowExecution findFirstByMainWorkFlowExecutionIdAndWorkFlowDefinitionId(UUID mainWorkFlowExecutionId, UUID workFlowDefinitionId); @Query("SELECT w FROM prds_workflow_execution w WHERE w.status IN :statuses AND w.mainWorkFlowExecution IS NULL") diff --git a/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/service/WorkFlowLogServiceImpl.java b/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/service/WorkFlowLogServiceImpl.java new file mode 100644 index 000000000..43347b04f --- /dev/null +++ b/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/service/WorkFlowLogServiceImpl.java @@ -0,0 +1,84 @@ +package com.redhat.parodos.workflow.execution.service; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +import com.redhat.parodos.common.exceptions.ResourceNotFoundException; +import com.redhat.parodos.workflow.definition.entity.WorkFlowTaskDefinition; +import com.redhat.parodos.workflow.definition.repository.WorkFlowTaskDefinitionRepository; +import com.redhat.parodos.workflow.exceptions.WorkflowPersistenceFailedException; +import com.redhat.parodos.workflow.execution.entity.WorkFlowExecution; +import com.redhat.parodos.workflow.execution.entity.WorkFlowTaskExecution; +import com.redhat.parodos.workflow.execution.entity.WorkFlowTaskExecutionLog; +import com.redhat.parodos.workflow.execution.repository.WorkFlowRepository; +import com.redhat.parodos.workflow.execution.repository.WorkFlowTaskRepository; +import com.redhat.parodos.workflow.log.WorkFlowLogService; +import com.redhat.parodos.workflow.log.WorkFlowTaskLog; +import lombok.extern.slf4j.Slf4j; + +import org.springframework.dao.DataAccessException; +import org.springframework.stereotype.Service; + +@Service +@Slf4j +public class WorkFlowLogServiceImpl implements WorkFlowLogService { + + private final WorkFlowRepository workFlowRepository; + + private final WorkFlowTaskRepository workFlowTaskRepository; + + private final WorkFlowTaskDefinitionRepository workFlowTaskDefinitionRepository; + + public WorkFlowLogServiceImpl(WorkFlowTaskRepository workFlowTaskRepository, + WorkFlowTaskDefinitionRepository workFlowTaskDefinitionRepository, WorkFlowRepository workFlowRepository) { + this.workFlowTaskRepository = workFlowTaskRepository; + this.workFlowTaskDefinitionRepository = workFlowTaskDefinitionRepository; + this.workFlowRepository = workFlowRepository; + } + + @Override + public String getLog(UUID mainWorkflowExecutionId, String taskName) { + WorkFlowTaskDefinition workFlowTaskDefinition = workFlowTaskDefinitionRepository.findFirstByName(taskName); + WorkFlowExecution workFlowExecution = workFlowRepository + .findFirstByMainWorkFlowExecutionIdAndWorkFlowDefinitionId(mainWorkflowExecutionId, + workFlowTaskDefinition.getWorkFlowDefinition().getId()); + List workFlowTaskExecutions = workFlowTaskRepository + .findByWorkFlowExecutionIdAndWorkFlowTaskDefinitionId(workFlowExecution.getId(), + workFlowTaskDefinition.getId()); + if (workFlowTaskExecutions == null || workFlowTaskExecutions.isEmpty()) { + throw new ResourceNotFoundException("task is not found!"); + } + return workFlowTaskExecutions.get(0).getWorkFlowTaskExecutionLog().getLog(); + } + + @Override + public void writeLog(UUID mainWorkflowExecutionId, String taskName, WorkFlowTaskLog workFlowTaskLog) { + WorkFlowTaskDefinition workFlowTaskDefinition = workFlowTaskDefinitionRepository.findFirstByName(taskName); + WorkFlowExecution workFlowExecution = workFlowRepository + .findFirstByMainWorkFlowExecutionIdAndWorkFlowDefinitionId(mainWorkflowExecutionId, + workFlowTaskDefinition.getWorkFlowDefinition().getId()); + WorkFlowTaskExecution workFlowTaskExecution = Optional + .ofNullable(workFlowTaskRepository.findByWorkFlowExecutionIdAndWorkFlowTaskDefinitionId( + workFlowExecution.getId(), workFlowTaskDefinition.getId())) + .filter(workFlowTaskExecutions -> !workFlowTaskExecutions.isEmpty()) + .map(workFlowTaskExecutions -> workFlowTaskExecutions.get(0)) + .orElseThrow(() -> new ResourceNotFoundException("task is not found!")); + if (workFlowTaskExecution.getWorkFlowTaskExecutionLog() == null) { + workFlowTaskExecution.setWorkFlowTaskExecutionLog(WorkFlowTaskExecutionLog.builder() + .workFlowTaskExecution(workFlowTaskExecution).log(workFlowTaskLog.toString()).build()); + } + else { + workFlowTaskExecution.getWorkFlowTaskExecutionLog().addLog(workFlowTaskLog.toString()); + } + try { + workFlowTaskRepository.save(workFlowTaskExecution); + } + catch (DataAccessException | IllegalArgumentException e) { + log.error("failed updating task execution for: {} in execution: {}. error Message: {}", + workFlowTaskExecution.getWorkFlowTaskDefinitionId(), workFlowTaskExecution.getId(), e.getMessage()); + throw new WorkflowPersistenceFailedException(e.getMessage()); + } + } + +} diff --git a/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/service/WorkFlowServiceDelegate.java b/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/service/WorkFlowServiceDelegate.java index fb4f072a8..96bd805ff 100644 --- a/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/service/WorkFlowServiceDelegate.java +++ b/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/service/WorkFlowServiceDelegate.java @@ -149,8 +149,8 @@ private WorkStatusResponseDTO getWorkStatusResponseDTOFromWorkFlow(WorkFlowWorkD WorkFlowDefinition workFlowDefinition = workFlowDefinitionRepository .findById(workFlowWorkDefinition.getWorkDefinitionId()).get(); - WorkFlowExecution workExecution = workFlowRepository.findFirstByMainWorkFlowExecutionAndWorkFlowDefinitionId( - workFlowExecution, workFlowWorkDefinition.getWorkDefinitionId()); + WorkFlowExecution workExecution = workFlowRepository.findFirstByWorkFlowDefinitionIdAndMainWorkFlowExecution( + workFlowWorkDefinition.getWorkDefinitionId(), workFlowExecution); /* * the workflow execution might be null when there is pending checker before it @@ -187,11 +187,10 @@ private WorkStatusResponseDTO getWorkStatusResponseDTOFromWorkFlowTask( workStatus = WorkStatus.valueOf(workFlowTaskExecutionOptional.get().getStatus().name()); if (workFlowTaskDefinition.getWorkFlowCheckerMappingDefinition() != null) { workStatus = Optional - .ofNullable(workFlowRepository.findFirstByMainWorkFlowExecutionAndWorkFlowDefinitionId( + .ofNullable(workFlowRepository.findFirstByWorkFlowDefinitionIdAndMainWorkFlowExecution( + workFlowTaskDefinition.getWorkFlowCheckerMappingDefinition().getCheckWorkFlow().getId(), Optional.ofNullable(workFlowExecution.getMainWorkFlowExecution()) - .orElse(workFlowExecution), - workFlowTaskDefinition - .getWorkFlowCheckerMappingDefinition().getCheckWorkFlow().getId())) + .orElse(workFlowExecution))) .map(WorkFlowExecution::getStatus) .map(checkerStatus -> WorkStatus.FAILED.equals(checkerStatus) ? WorkStatus.IN_PROGRESS : WorkStatus.valueOf(checkerStatus.name())) diff --git a/workflow-service/src/main/resources/db/changelog/tables.xml b/workflow-service/src/main/resources/db/changelog/tables.xml index 14d654bfa..52a9bb860 100644 --- a/workflow-service/src/main/resources/db/changelog/tables.xml +++ b/workflow-service/src/main/resources/db/changelog/tables.xml @@ -170,6 +170,19 @@ + + + + + + + + + + + + diff --git a/workflow-service/src/test/java/com/redhat/parodos/workflow/execution/service/WorkFlowLogServiceImplTest.java b/workflow-service/src/test/java/com/redhat/parodos/workflow/execution/service/WorkFlowLogServiceImplTest.java new file mode 100644 index 000000000..77a4e4790 --- /dev/null +++ b/workflow-service/src/test/java/com/redhat/parodos/workflow/execution/service/WorkFlowLogServiceImplTest.java @@ -0,0 +1,128 @@ +package com.redhat.parodos.workflow.execution.service; + +import java.util.List; +import java.util.UUID; + +import com.redhat.parodos.common.exceptions.ResourceNotFoundException; +import com.redhat.parodos.workflow.definition.entity.WorkFlowDefinition; +import com.redhat.parodos.workflow.definition.entity.WorkFlowTaskDefinition; +import com.redhat.parodos.workflow.definition.repository.WorkFlowTaskDefinitionRepository; +import com.redhat.parodos.workflow.enums.LogType; +import com.redhat.parodos.workflow.execution.entity.WorkFlowExecution; +import com.redhat.parodos.workflow.execution.entity.WorkFlowTaskExecution; +import com.redhat.parodos.workflow.execution.entity.WorkFlowTaskExecutionLog; +import com.redhat.parodos.workflow.execution.repository.WorkFlowRepository; +import com.redhat.parodos.workflow.execution.repository.WorkFlowTaskRepository; +import com.redhat.parodos.workflow.log.WorkFlowTaskLog; +import com.redhat.parodos.workflows.work.WorkStatus; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Mock; + +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@ExtendWith(SpringExtension.class) +class WorkFlowLogServiceImplTest { + + @Mock + private WorkFlowRepository workFlowRepository; + + @Mock + private WorkFlowTaskRepository workFlowTaskRepository; + + @Mock + private WorkFlowTaskDefinitionRepository workFlowTaskDefinitionRepository; + + private WorkFlowLogServiceImpl workFlowLogService; + + @BeforeEach + public void init() { + workFlowLogService = new WorkFlowLogServiceImpl(workFlowTaskRepository, workFlowTaskDefinitionRepository, + workFlowRepository); + } + + @Test + void getLog_when_workflowExecutionLogIsFound_then_return_log() { + UUID mainWorkflowExecutionId = UUID.randomUUID(); + WorkFlowDefinition workFlowDefinition = createTestWorkflowDefinition(); + WorkFlowTaskExecutionLog workFlowTaskExecutionLog = createTestTaskExecutionLog(); + when(workFlowTaskDefinitionRepository.findFirstByName(anyString())) + .thenReturn(createTestTaskDefinition(workFlowDefinition)); + when(workFlowRepository.findFirstByMainWorkFlowExecutionIdAndWorkFlowDefinitionId(any(), any())) + .thenReturn(createTestExecution(workFlowDefinition)); + when(workFlowTaskRepository.findByWorkFlowExecutionIdAndWorkFlowTaskDefinitionId(any(), any())).thenReturn( + List.of(createTestTaskExecution(UUID.randomUUID(), UUID.randomUUID(), workFlowTaskExecutionLog))); + assertEquals("test-log", workFlowLogService.getLog(mainWorkflowExecutionId, "test-task")); + } + + @Test + void getLog_when_workflowExecutionLogIsNotFound_then_throwException() { + UUID mainWorkflowExecutionId = UUID.randomUUID(); + WorkFlowDefinition workFlowDefinition = createTestWorkflowDefinition(); + when(workFlowTaskDefinitionRepository.findFirstByName(anyString())) + .thenReturn(createTestTaskDefinition(workFlowDefinition)); + when(workFlowRepository.findFirstByMainWorkFlowExecutionIdAndWorkFlowDefinitionId(any(), any())) + .thenReturn(createTestExecution(workFlowDefinition)); + when(workFlowTaskRepository.findByWorkFlowExecutionIdAndWorkFlowTaskDefinitionId(any(), any())) + .thenReturn(List.of()); + assertThrows(ResourceNotFoundException.class, + () -> workFlowLogService.getLog(mainWorkflowExecutionId, "test-task")); + } + + @Test + void writeLog_when_workflowExecutionLogIsFound_then_return_save() { + UUID mainWorkflowExecutionId = UUID.randomUUID(); + WorkFlowDefinition workFlowDefinition = createTestWorkflowDefinition(); + WorkFlowTaskExecutionLog workFlowTaskExecutionLog = createTestTaskExecutionLog(); + when(workFlowTaskDefinitionRepository.findFirstByName(anyString())) + .thenReturn(createTestTaskDefinition(workFlowDefinition)); + when(workFlowRepository.findFirstByMainWorkFlowExecutionIdAndWorkFlowDefinitionId(any(), any())) + .thenReturn(createTestExecution(workFlowDefinition)); + when(workFlowTaskRepository.findByWorkFlowExecutionIdAndWorkFlowTaskDefinitionId(any(), any())).thenReturn( + List.of(createTestTaskExecution(UUID.randomUUID(), UUID.randomUUID(), workFlowTaskExecutionLog))); + workFlowLogService.writeLog(mainWorkflowExecutionId, "test-task", + WorkFlowTaskLog.builder().logType(LogType.INFO).logText("test-log1").build()); + + ArgumentCaptor argument = ArgumentCaptor.forClass(WorkFlowTaskExecution.class); + verify(workFlowTaskRepository, times(1)).save(argument.capture()); + assertEquals("test-log\n\u001B[32mtest-log1\u001B[39m", + argument.getValue().getWorkFlowTaskExecutionLog().getLog()); + + } + + private WorkFlowDefinition createTestWorkflowDefinition() { + WorkFlowDefinition workFlowDefinition = WorkFlowDefinition.builder().name("test-workflow").build(); + workFlowDefinition.setId(UUID.randomUUID()); + return workFlowDefinition; + } + + private WorkFlowTaskDefinition createTestTaskDefinition(WorkFlowDefinition workFlowDefinition) { + return WorkFlowTaskDefinition.builder().workFlowDefinition(workFlowDefinition).name("test-task").build(); + } + + private WorkFlowTaskExecution createTestTaskExecution(UUID workflowExecutionId, UUID taskDefinitionId, + WorkFlowTaskExecutionLog workFlowTaskExecutionLog) { + return WorkFlowTaskExecution.builder().workFlowExecutionId(workflowExecutionId) + .workFlowTaskDefinitionId(taskDefinitionId).status(WorkStatus.COMPLETED) + .workFlowTaskExecutionLog(workFlowTaskExecutionLog).build(); + } + + private WorkFlowExecution createTestExecution(WorkFlowDefinition workFlowDefinition) { + return WorkFlowExecution.builder().workFlowDefinition(workFlowDefinition).build(); + } + + private WorkFlowTaskExecutionLog createTestTaskExecutionLog() { + return WorkFlowTaskExecutionLog.builder().workFlowTaskExecution(null).log("test-log").build(); + } + +} diff --git a/workflow-service/src/test/java/com/redhat/parodos/workflow/execution/service/WorkFlowServiceDelegateTest.java b/workflow-service/src/test/java/com/redhat/parodos/workflow/execution/service/WorkFlowServiceDelegateTest.java index 55f9f9a27..5297feafb 100644 --- a/workflow-service/src/test/java/com/redhat/parodos/workflow/execution/service/WorkFlowServiceDelegateTest.java +++ b/workflow-service/src/test/java/com/redhat/parodos/workflow/execution/service/WorkFlowServiceDelegateTest.java @@ -146,8 +146,8 @@ void testGetWorkFlowWorksStatus() { when(this.workFlowDefinitionRepository.findById(eq(testSubWorkFlowDefinitionId1))) .thenReturn(Optional.of(testSubWorkFlowDefinition1)); - when(this.workFlowRepository.findFirstByMainWorkFlowExecutionAndWorkFlowDefinitionId(eq(workFlowExecution), - eq(testSubWorkFlowDefinitionId1))).thenReturn(testSubWorkFlowExecution1); + when(this.workFlowRepository.findFirstByWorkFlowDefinitionIdAndMainWorkFlowExecution( + eq(testSubWorkFlowDefinitionId1), eq(workFlowExecution))).thenReturn(testSubWorkFlowExecution1); when(this.workFlowTaskDefinitionRepository.findById(eq(testSubWorkFlowTaskDefinitionId1))) .thenReturn(Optional.of(testSubWorkFlowTaskDefinition1)); @@ -277,8 +277,8 @@ void beforeEach() { when(workFlowWorkRepository.findByWorkFlowDefinitionIdOrderByCreateDateAsc(checkerWorkFlowDefinitionId)) .thenReturn(List.of(checkerWorkflowWorkDefinition)); - when(workFlowRepository.findFirstByMainWorkFlowExecutionAndWorkFlowDefinitionId( - nullable(WorkFlowExecution.class), eq(checkerWorkFlowDefinitionId))) + when(workFlowRepository.findFirstByWorkFlowDefinitionIdAndMainWorkFlowExecution( + eq(checkerWorkFlowDefinitionId), nullable(WorkFlowExecution.class))) .thenReturn(checkerWorkflowExecution); } diff --git a/workflow-service/src/test/java/com/redhat/parodos/workflow/execution/service/WorkFlowServiceImplTest.java b/workflow-service/src/test/java/com/redhat/parodos/workflow/execution/service/WorkFlowServiceImplTest.java index b3abcc63b..363e63658 100644 --- a/workflow-service/src/test/java/com/redhat/parodos/workflow/execution/service/WorkFlowServiceImplTest.java +++ b/workflow-service/src/test/java/com/redhat/parodos/workflow/execution/service/WorkFlowServiceImplTest.java @@ -549,8 +549,8 @@ void testGetWorkStatusWithValidData() { when(this.workFlowDefinitionRepository.findById(eq(testSubWorkFlow1DefinitionId))) .thenReturn(Optional.of(subWorkFlow1Definition)); - when(this.workFlowRepository.findFirstByMainWorkFlowExecutionAndWorkFlowDefinitionId(eq(workFlowExecution), - eq(testSubWorkFlow1DefinitionId))).thenReturn(subWorkFlow1Execution); + when(this.workFlowRepository.findFirstByWorkFlowDefinitionIdAndMainWorkFlowExecution( + eq(testSubWorkFlow1DefinitionId), eq(workFlowExecution))).thenReturn(subWorkFlow1Execution); when(this.workFlowTaskDefinitionRepository.findById(eq(subWorkFlow1Task1DefinitionId))) .thenReturn(Optional.of(subWorkFlow1Task1Definition)); @@ -725,8 +725,8 @@ void testGetWorkFlowStatusWhenSubWorkflowNotExecutedWithValidData() { when(this.workFlowDefinitionRepository.findById(eq(subWorkFlow1DefinitionId))) .thenReturn(Optional.of(subWorkFlow1Definition)); - when(this.workFlowRepository.findFirstByMainWorkFlowExecutionAndWorkFlowDefinitionId(eq(workFlowExecution), - eq(subWorkFlow1DefinitionId))).thenReturn(null); + when(this.workFlowRepository.findFirstByWorkFlowDefinitionIdAndMainWorkFlowExecution( + eq(subWorkFlow1DefinitionId), eq(workFlowExecution))).thenReturn(null); when(this.workFlowTaskDefinitionRepository.findById(eq(subWorkFlow1Task1DefinitionId))) .thenReturn(Optional.of(subWorkFlow1Task1Definition));