From aee059643ff338b06e6c11bb3babaf67359938af Mon Sep 17 00:00:00 2001 From: richardwang98 Date: Wed, 17 May 2023 09:34:26 -0400 Subject: [PATCH] workflow log --- parodos-model-api/pom.xml | 6 +- .../workflow/enums/WorkFlowLogLevel.java | 17 ++ .../workflow/task/BaseWorkFlowTask.java | 31 +- .../parodos/workflow/task/WorkFlowTask.java | 7 + .../workflow/task/log/WorkFlowTaskLogger.java | 56 ++++ .../task/log/dto/WorkFlowTaskLog.java | 47 +++ .../task/log/service/WorkFlowLogService.java | 45 +++ .../workflow/task/WorkFlowTaskTest.java | 16 +- .../log/service/WorkFlowTaskLoggerTest.java | 67 +++++ .../azure/AzureCreateVirtualMachineTask.java | 16 +- .../tasks/kubeapi/KubeapiWorkFlowTask.java | 20 +- .../CreateApplicationTask.java | 8 +- .../migrationtoolkit/GetAnalysisTask.java | 10 +- .../migrationtoolkit/GetApplicationTask.java | 8 +- .../migrationtoolkit/SubmitAnalysisTask.java | 8 +- .../NotificationWorkFlowTask.java | 10 +- .../parodos/tasks/rest/RestWorkFlowTask.java | 12 +- .../tasks/tibco/TibcoWorkFlowTask.java | 4 +- .../AzureCreateVirtualMachineTaskTest.java | 11 +- .../kubeapi/KubeapiWorkFlowTaskTest.java | 16 ++ .../CreateApplicationTaskTest.java | 16 +- .../migrationtoolkit/GetAnalysisTaskTest.java | 16 +- .../GetApplicationTaskTest.java | 16 +- .../SubmitAnalysisTaskTest.java | 13 +- .../NotificationWorkFlowTaskTest.java | 20 +- .../tasks/tibco/TibcoWorkFlowTaskTest.java | 10 + workflow-examples/pom.xml | 10 +- ...JiraTicketApprovalWorkFlowCheckerTask.java | 4 +- ...aTicketApprovalEscalationWorkFlowTask.java | 2 +- .../AppLinkEmailNotificationWorkFlowTask.java | 2 +- .../task/JiraTicketCreationWorkFlowTask.java | 13 +- ...raTicketEmailNotificationWorkFlowTask.java | 2 +- .../task/NotificationWorkFlowTask.java | 4 +- .../task/OcpAppDeploymentWorkFlowTask.java | 6 +- .../OnboardingOcpAssessmentTask.java | 2 +- .../simple/task/LoggingWorkFlowTask.java | 4 +- .../simple/task/RestAPIWorkFlowTask.java | 2 +- .../simple/task/SecureAPIGetTestTask.java | 6 +- ...ketApprovalEscalationWorkFlowTaskTest.java | 2 +- ...LinkEmailNotificationWorkFlowTaskTest.java | 2 +- .../JiraTicketCreationWorkFlowTaskTest.java | 21 +- ...cketEmailNotificationWorkFlowTaskTest.java | 2 +- .../task/NotificationWorkFlowTaskTest.java | 6 +- .../simple/task/LoggingWorkFlowTaskTest.java | 4 + .../simple/task/RestAPIWorkFlowTaskTest.java | 9 +- .../simple/task/SecureAPIGetTestTaskTest.java | 12 +- workflow-service-sdk/README.md | 1 + workflow-service-sdk/api/openapi.yaml | 52 ++++ workflow-service-sdk/docs/WorkflowApi.md | 68 +++++ .../redhat/parodos/sdk/api/WorkflowApi.java | 270 ++++++++++++++++++ .../generated/openapi/openapi.json | 71 +++++ .../common/exceptions/ResourceType.java | 4 +- .../aspect/WorkFlowTaskExecutionAspect.java | 16 +- .../controller/WorkFlowController.java | 20 +- .../execution/dto/WorkFlowLogResponseDTO.java | 41 +++ .../entity/WorkFlowTaskExecution.java | 7 +- .../entity/WorkFlowTaskExecutionLog.java | 55 ++++ .../repository/WorkFlowRepository.java | 4 +- .../service/WorkFlowLogServiceImpl.java | 101 +++++++ .../service/WorkFlowServiceDelegate.java | 11 +- .../main/resources/db/changelog/tables.xml | 13 + .../WorkFlowTaskExecutionAspectTest.java | 7 +- .../controller/WorkFlowControllerTest.java | 19 ++ .../service/WorkFlowLogServiceImplTest.java | 129 +++++++++ .../service/WorkFlowServiceDelegateTest.java | 8 +- .../service/WorkFlowServiceImplTest.java | 8 +- 66 files changed, 1368 insertions(+), 158 deletions(-) create mode 100644 parodos-model-api/src/main/java/com/redhat/parodos/workflow/enums/WorkFlowLogLevel.java create mode 100644 parodos-model-api/src/main/java/com/redhat/parodos/workflow/task/log/WorkFlowTaskLogger.java create mode 100644 parodos-model-api/src/main/java/com/redhat/parodos/workflow/task/log/dto/WorkFlowTaskLog.java create mode 100644 parodos-model-api/src/main/java/com/redhat/parodos/workflow/task/log/service/WorkFlowLogService.java create mode 100644 parodos-model-api/src/test/java/com/redhat/parodos/workflow/task/log/service/WorkFlowTaskLoggerTest.java create mode 100644 workflow-service/src/main/java/com/redhat/parodos/workflow/execution/dto/WorkFlowLogResponseDTO.java create mode 100644 workflow-service/src/main/java/com/redhat/parodos/workflow/execution/entity/WorkFlowTaskExecutionLog.java create mode 100644 workflow-service/src/main/java/com/redhat/parodos/workflow/execution/service/WorkFlowLogServiceImpl.java create mode 100644 workflow-service/src/test/java/com/redhat/parodos/workflow/execution/service/WorkFlowLogServiceImplTest.java diff --git a/parodos-model-api/pom.xml b/parodos-model-api/pom.xml index 53ef2bba4..71e989d86 100644 --- a/parodos-model-api/pom.xml +++ b/parodos-model-api/pom.xml @@ -63,7 +63,11 @@ org.junit.jupiter junit-jupiter-api - 5.8.2 + test + + + org.mockito + mockito-core test diff --git a/parodos-model-api/src/main/java/com/redhat/parodos/workflow/enums/WorkFlowLogLevel.java b/parodos-model-api/src/main/java/com/redhat/parodos/workflow/enums/WorkFlowLogLevel.java new file mode 100644 index 000000000..fedbeb3d6 --- /dev/null +++ b/parodos-model-api/src/main/java/com/redhat/parodos/workflow/enums/WorkFlowLogLevel.java @@ -0,0 +1,17 @@ +package com.redhat.parodos.workflow.enums; + +import lombok.Getter; + +public enum WorkFlowLogLevel { + + INFO("\u001B[32m"), WARNING("\u001B[33m"), ERROR("\u001B[34m"); + + // Ansi code + @Getter + private final String code; + + WorkFlowLogLevel(String code) { + this.code = code; + } + +} 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..127317556 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 @@ -20,13 +20,17 @@ import java.util.UUID; import com.redhat.parodos.workflow.exception.MissingParameterException; +import com.redhat.parodos.workflow.task.log.WorkFlowTaskLogger; +import com.redhat.parodos.workflow.task.log.service.WorkFlowLogService; import com.redhat.parodos.workflow.utils.WorkContextUtils; import com.redhat.parodos.workflows.work.WorkContext; import com.redhat.parodos.workflows.workflow.WorkFlow; import lombok.Getter; import lombok.extern.slf4j.Slf4j; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.BeanNameAware; +import org.springframework.beans.factory.annotation.Autowired; /** * Base Class for a WorkFlowTask. @@ -44,11 +48,25 @@ public abstract class BaseWorkFlowTask implements WorkFlowTask, BeanNameAware { @Getter private String name; + @Autowired + private WorkFlowLogService workFlowLogService; + + private WorkContext workContext; + + protected WorkFlowTaskLogger taskLogger; + @Override public void setBeanName(String name) { this.name = name; } + @Override + public void preExecute(WorkContext workContext) { + this.workContext = workContext; + taskLogger = new WorkFlowTaskLogger(getMainExecutionId(), name, workFlowLogService, + LoggerFactory.getLogger(this.getClass())); + } + // WorkFlowChecker check a process that has been initiated by a WorkFlow to see if its // been completed private List workFlowCheckers; @@ -65,11 +83,11 @@ public UUID getProjectId(WorkContext workContext) { return WorkContextUtils.getProjectId(workContext); } - public UUID getMainExecutionId(WorkContext workContext) { + public UUID getMainExecutionId() { return WorkContextUtils.getMainExecutionId(workContext); } - public void addParameter(WorkContext workContext, String key, String value) { + public void addParameter(String key, String value) { WorkContextUtils.addParameter(workContext, key, value); } @@ -79,13 +97,11 @@ public Map getAllParameters(WorkContext workContext) { /** * Get Parameters specific to this WorkFlowTask, this is a required parameter - * @param workContext * @param parameterName * @return String value for the Parameter name * @throws MissingParameterException */ - public String getRequiredParameterValue(WorkContext workContext, String parameterName) - throws MissingParameterException { + public String getRequiredParameterValue(String parameterName) throws MissingParameterException { Map parameters = getAllParameters(workContext); return parameters.entrySet().stream().filter(entry -> parameterName.equals(entry.getKey())) .map(Map.Entry::getValue).findFirst().orElseThrow(() -> { @@ -96,16 +112,15 @@ public String getRequiredParameterValue(WorkContext workContext, String paramete /** * Gets an optional parameter. Returns the defaultValue if not found - * @param workContext * @param parameterName * @param defaultValue * @return * @throws MissingParameterException */ - public String getOptionalParameterValue(WorkContext workContext, String parameterName, String defaultValue) { + public String getOptionalParameterValue(String parameterName, String defaultValue) { Map parameters = getAllParameters(workContext); return parameters.entrySet().stream().filter(entry -> parameterName.equals(entry.getKey())) .map(Map.Entry::getValue).findFirst().orElse(defaultValue); } -} \ No newline at end of file +} diff --git a/parodos-model-api/src/main/java/com/redhat/parodos/workflow/task/WorkFlowTask.java b/parodos-model-api/src/main/java/com/redhat/parodos/workflow/task/WorkFlowTask.java index 60a91b7d7..f79ee8da6 100644 --- a/parodos-model-api/src/main/java/com/redhat/parodos/workflow/task/WorkFlowTask.java +++ b/parodos-model-api/src/main/java/com/redhat/parodos/workflow/task/WorkFlowTask.java @@ -23,6 +23,7 @@ import com.redhat.parodos.workflow.parameter.WorkParameter; import com.redhat.parodos.workflow.task.enums.WorkFlowTaskOutput; import com.redhat.parodos.workflows.work.Work; +import com.redhat.parodos.workflows.work.WorkContext; import lombok.NonNull; /** @@ -33,6 +34,12 @@ */ public interface WorkFlowTask extends Work { + /** + * method runs before @see execute() + * @param workContext + */ + void preExecute(WorkContext workContext); + /** * Parameters required for the Task to execute. These are generally obtained from * the @see WorkContext. The @see BaseWorkFlowTask has a method to simplify getting diff --git a/parodos-model-api/src/main/java/com/redhat/parodos/workflow/task/log/WorkFlowTaskLogger.java b/parodos-model-api/src/main/java/com/redhat/parodos/workflow/task/log/WorkFlowTaskLogger.java new file mode 100644 index 000000000..582caea7f --- /dev/null +++ b/parodos-model-api/src/main/java/com/redhat/parodos/workflow/task/log/WorkFlowTaskLogger.java @@ -0,0 +1,56 @@ +package com.redhat.parodos.workflow.task.log; + +import java.util.UUID; + +import com.redhat.parodos.workflow.enums.WorkFlowLogLevel; +import com.redhat.parodos.workflow.task.log.dto.WorkFlowTaskLog; +import com.redhat.parodos.workflow.task.log.service.WorkFlowLogService; +import lombok.AllArgsConstructor; +import org.slf4j.Logger; +import org.slf4j.helpers.MessageFormatter; + +@AllArgsConstructor +public class WorkFlowTaskLogger { + + private UUID mainWorkFlowId; + + private String taskName; + + private WorkFlowLogService workFlowLogService; + + private Logger log; + + public void logInfo(String logText, String... value) { + logWithLogLevel(WorkFlowLogLevel.INFO, logText, value); + } + + public void logInfoWithSlf4j(String logText, String... value) { + logInfo(logText, value); + log.info(logText, (Object[]) value); + } + + public void logError(String logText, String... value) { + logWithLogLevel(WorkFlowLogLevel.ERROR, logText, value); + } + + public void logErrorWithSlf4j(String logText, String... value) { + logError(logText, value); + log.error(logText, (Object[]) value); + } + + public void logWarn(String logText, String... value) { + logWithLogLevel(WorkFlowLogLevel.WARNING, logText, value); + } + + public void logWarnWithSlf4j(String logText, String... value) { + logWarn(logText, value); + log.warn(logText, (Object[]) value); + } + + private void logWithLogLevel(WorkFlowLogLevel workFlowLoglevel, String logText, String... value) { + String formattedLog = value.length > 0 ? MessageFormatter.arrayFormat(logText, value).getMessage() : logText; + workFlowLogService.writeLog(mainWorkFlowId, taskName, + WorkFlowTaskLog.builder().logText(formattedLog).workFlowLoglevel(workFlowLoglevel).build()); + } + +} diff --git a/parodos-model-api/src/main/java/com/redhat/parodos/workflow/task/log/dto/WorkFlowTaskLog.java b/parodos-model-api/src/main/java/com/redhat/parodos/workflow/task/log/dto/WorkFlowTaskLog.java new file mode 100644 index 000000000..352872636 --- /dev/null +++ b/parodos-model-api/src/main/java/com/redhat/parodos/workflow/task/log/dto/WorkFlowTaskLog.java @@ -0,0 +1,47 @@ +/* + * 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.task.log.dto; + +import java.time.Instant; + +import com.redhat.parodos.workflow.enums.WorkFlowLogLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * dto to represent workFlow tasks' log objects + * + * @author Richard Wang (Github: richardW98) + */ +@Builder +@Data +@AllArgsConstructor +@NoArgsConstructor +public class WorkFlowTaskLog { + + private String logText; + + private WorkFlowLogLevel workFlowLoglevel = WorkFlowLogLevel.INFO; + + @Override + public String toString() { + return Instant.now().toString() + " " + workFlowLoglevel.getCode() + workFlowLoglevel.name() + "\u001B[39m " + + logText; + } + +} diff --git a/parodos-model-api/src/main/java/com/redhat/parodos/workflow/task/log/service/WorkFlowLogService.java b/parodos-model-api/src/main/java/com/redhat/parodos/workflow/task/log/service/WorkFlowLogService.java new file mode 100644 index 000000000..5207727e4 --- /dev/null +++ b/parodos-model-api/src/main/java/com/redhat/parodos/workflow/task/log/service/WorkFlowLogService.java @@ -0,0 +1,45 @@ +/* + * 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.task.log.service; + +import java.util.UUID; + +import com.redhat.parodos.workflow.task.log.dto.WorkFlowTaskLog; + +/** + * Service interface for recording workFlow tasks' log + * + * @author Richard Wang (Github: richardW98) + */ +public interface WorkFlowLogService { + + /** + * contract to get log for a task execution + * @param workFlowExecutionId main WorkFlow Execution's ID + * @param taskName task name for the log + * @return log of the task execution + */ + String getLog(UUID workFlowExecutionId, String taskName); + + /** + * contract to add log to a task execution + * @param workFlowExecutionId main WorkFlow Execution's ID + * @param taskName task name for the log + * @param log log dto object of the task execution + */ + void writeLog(UUID workFlowExecutionId, String taskName, WorkFlowTaskLog log); + +} diff --git a/parodos-model-api/src/test/java/com/redhat/parodos/workflow/task/WorkFlowTaskTest.java b/parodos-model-api/src/test/java/com/redhat/parodos/workflow/task/WorkFlowTaskTest.java index 2e76d5549..a9df9ada8 100644 --- a/parodos-model-api/src/test/java/com/redhat/parodos/workflow/task/WorkFlowTaskTest.java +++ b/parodos-model-api/src/test/java/com/redhat/parodos/workflow/task/WorkFlowTaskTest.java @@ -18,6 +18,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.UUID; import com.redhat.parodos.workflow.context.WorkContextDelegate; import com.redhat.parodos.workflow.exception.MissingParameterException; @@ -85,13 +86,17 @@ public void checkTask() throws MissingParameterException { public void verifyParameter() throws MissingParameterException { TestTask task = new TestTask(); WorkContext context = new WorkContext(); + WorkContextDelegate.write(context, WorkContextDelegate.ProcessType.WORKFLOW_EXECUTION, + WorkContextDelegate.Resource.ID, UUID.randomUUID()); + + task.preExecute(context); Map map = Map.of("username", "test"); WorkContextDelegate.write(context, WorkContextDelegate.ProcessType.WORKFLOW_TASK_EXECUTION, "Test", WorkContextDelegate.Resource.ARGUMENTS, map); task.setBeanName("Test"); - assertEquals("test", task.getRequiredParameterValue(context, "username")); + assertEquals("test", task.getRequiredParameterValue("username")); } @Test(expected = MissingParameterException.class) @@ -100,9 +105,16 @@ public void noParameters() throws MissingParameterException { WorkContextDelegate.write(context, WorkContextDelegate.ProcessType.WORKFLOW_TASK_EXECUTION, "Test", WorkContextDelegate.Resource.ARGUMENTS, new HashMap()); + WorkContextDelegate.write(context, WorkContextDelegate.ProcessType.WORKFLOW_EXECUTION, "Test", + WorkContextDelegate.Resource.ID, UUID.randomUUID()); + + WorkContextDelegate.write(context, WorkContextDelegate.ProcessType.WORKFLOW_EXECUTION, + WorkContextDelegate.Resource.ID, UUID.randomUUID()); + BaseWorkFlowTask flowTask = new TestTask(); + flowTask.preExecute(context); flowTask.setBeanName("Test"); - assertEquals("Test", flowTask.getRequiredParameterValue(context, "username")); + assertEquals("Test", flowTask.getRequiredParameterValue("username")); } @Test diff --git a/parodos-model-api/src/test/java/com/redhat/parodos/workflow/task/log/service/WorkFlowTaskLoggerTest.java b/parodos-model-api/src/test/java/com/redhat/parodos/workflow/task/log/service/WorkFlowTaskLoggerTest.java new file mode 100644 index 000000000..c3b0fe83d --- /dev/null +++ b/parodos-model-api/src/test/java/com/redhat/parodos/workflow/task/log/service/WorkFlowTaskLoggerTest.java @@ -0,0 +1,67 @@ +package com.redhat.parodos.workflow.task.log.service; + +import java.util.UUID; + +import com.redhat.parodos.workflow.task.log.WorkFlowTaskLogger; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.slf4j.Logger; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +public class WorkFlowTaskLoggerTest { + + private WorkFlowTaskLogger workFlowTaskLogger; + + private WorkFlowLogService workFlowLogService; + + private Logger log; + + @BeforeEach + public void init() { + workFlowLogService = mock(WorkFlowLogService.class); + log = mock(Logger.class); + workFlowTaskLogger = new WorkFlowTaskLogger(UUID.randomUUID(), "test-task", workFlowLogService, log); + } + + @Test + void testLogInfo() { + workFlowTaskLogger.logInfo("test {}", "test"); + verify(workFlowLogService, times(1)).writeLog(any(), any(), any()); + } + + @Test + void testLogInfoWithSlf4j() { + workFlowTaskLogger.logInfoWithSlf4j("test"); + verify(log, times(1)).info(anyString(), any(Object[].class)); + } + + @Test + void testLogError() { + workFlowTaskLogger.logError("test {}", "test"); + verify(workFlowLogService, times(1)).writeLog(any(), any(), any()); + } + + @Test + void testLogErrorWithSlf4j() { + workFlowTaskLogger.logErrorWithSlf4j("test"); + verify(log, times(1)).error(anyString(), any(Object[].class)); + } + + @Test + void testLogWarn() { + workFlowTaskLogger.logWarn("test {}", "test"); + verify(workFlowLogService, times(1)).writeLog(any(), any(), any()); + } + + @Test + void testLogWarnWithSlf4j() { + workFlowTaskLogger.logWarnWithSlf4j("test"); + verify(log, times(1)).warn(anyString(), any(Object[].class)); + } + +} diff --git a/prebuilt-tasks/src/main/java/com/redhat/parodos/tasks/azure/AzureCreateVirtualMachineTask.java b/prebuilt-tasks/src/main/java/com/redhat/parodos/tasks/azure/AzureCreateVirtualMachineTask.java index 8648c69ac..6e1402012 100644 --- a/prebuilt-tasks/src/main/java/com/redhat/parodos/tasks/azure/AzureCreateVirtualMachineTask.java +++ b/prebuilt-tasks/src/main/java/com/redhat/parodos/tasks/azure/AzureCreateVirtualMachineTask.java @@ -76,14 +76,14 @@ public AzureCreateVirtualMachineTask() { */ public WorkReport execute(WorkContext context) { try { - final String userName = getRequiredParameterValue(context, VM_USER_NAME_KEY); - final String sshKey = getRequiredParameterValue(context, VM_SSH_PUBLIC_KEY_KEY); - - final String azureTenantId = getRequiredParameterValue(context, AZURE_TENANT_ID_KEY); - final String azureSubscriptionId = getRequiredParameterValue(context, AZURE_SUBSCRIPTION_ID_KEY); - final String azureClientId = getRequiredParameterValue(context, AZURE_CLIENT_ID_KEY); - final String azureClientSecret = getRequiredParameterValue(context, AZURE_CLIENT_SECRET_KEY); - final String resourcesPrefix = getRequiredParameterValue(context, AZURE_RESOURCES_PREFIX_KEY); + final String userName = getRequiredParameterValue(VM_USER_NAME_KEY); + final String sshKey = getRequiredParameterValue(VM_SSH_PUBLIC_KEY_KEY); + + final String azureTenantId = getRequiredParameterValue(AZURE_TENANT_ID_KEY); + final String azureSubscriptionId = getRequiredParameterValue(AZURE_SUBSCRIPTION_ID_KEY); + final String azureClientId = getRequiredParameterValue(AZURE_CLIENT_ID_KEY); + final String azureClientSecret = getRequiredParameterValue(AZURE_CLIENT_SECRET_KEY); + final String resourcesPrefix = getRequiredParameterValue(AZURE_RESOURCES_PREFIX_KEY); this.azureResourceClient.init(azureTenantId, azureClientId, azureClientSecret, azureSubscriptionId); diff --git a/prebuilt-tasks/src/main/java/com/redhat/parodos/tasks/kubeapi/KubeapiWorkFlowTask.java b/prebuilt-tasks/src/main/java/com/redhat/parodos/tasks/kubeapi/KubeapiWorkFlowTask.java index 908cf467f..33913ef72 100644 --- a/prebuilt-tasks/src/main/java/com/redhat/parodos/tasks/kubeapi/KubeapiWorkFlowTask.java +++ b/prebuilt-tasks/src/main/java/com/redhat/parodos/tasks/kubeapi/KubeapiWorkFlowTask.java @@ -83,11 +83,11 @@ public WorkReport execute(WorkContext workContext) { try { // Get the required parameters - String kubeconfigJson = getRequiredParameterValue(workContext, "kubeconfig-json"); - String apiGroup = getRequiredParameterValue(workContext, "api-group"); - String apiVersion = getRequiredParameterValue(workContext, "api-version"); - String kindPluralName = getRequiredParameterValue(workContext, "kind-plural-name"); - operation = getRequiredParameterValue(workContext, "operation"); + String kubeconfigJson = getRequiredParameterValue("kubeconfig-json"); + String apiGroup = getRequiredParameterValue("api-group"); + String apiVersion = getRequiredParameterValue("api-version"); + String kindPluralName = getRequiredParameterValue("kind-plural-name"); + operation = getRequiredParameterValue("operation"); String kubeconfig = new YAMLMapper().writeValueAsString(new ObjectMapper().readTree(kubeconfigJson)); OperationType operationType = OperationType.valueOf(operation.toUpperCase()); @@ -114,9 +114,9 @@ public WorkReport execute(WorkContext workContext) { private void get(WorkContext ctx, String kubeconfig, String apiGroup, String apiVersion, String kindPluralName) throws MissingParameterException, ApiException, IOException { - String resourceName = getRequiredParameterValue(ctx, "resource-name"); - String resourceNamespace = getRequiredParameterValue(ctx, "resource-namespace"); - String workCtxKey = getRequiredParameterValue(ctx, "work-ctx-key"); + String resourceName = getRequiredParameterValue("resource-name"); + String resourceNamespace = getRequiredParameterValue("resource-namespace"); + String workCtxKey = getRequiredParameterValue("work-ctx-key"); DynamicKubernetesObject obj = api.get(kubeconfig, apiGroup, apiVersion, kindPluralName, resourceNamespace, resourceName); @@ -126,14 +126,14 @@ private void get(WorkContext ctx, String kubeconfig, String apiGroup, String api private void create(WorkContext ctx, String kubeconfig, String apiGroup, String apiVersion, String kindPluralName) throws MissingParameterException, ApiException, IOException { - String resourceJson = getRequiredParameterValue(ctx, "resource-json"); + String resourceJson = getRequiredParameterValue("resource-json"); DynamicKubernetesObject obj = Dynamics.newFromJson(resourceJson); api.create(kubeconfig, apiGroup, apiVersion, kindPluralName, obj); } private void update(WorkContext ctx, String kubeconfig, String apiGroup, String apiVersion, String kindPluralName) throws MissingParameterException, ApiException, IOException { - String resourceJson = getRequiredParameterValue(ctx, "resource-json"); + String resourceJson = getRequiredParameterValue("resource-json"); DynamicKubernetesObject newObj = Dynamics.newFromJson(resourceJson); String resourceNamespace = newObj.getMetadata().getNamespace(); String resourceName = newObj.getMetadata().getName(); diff --git a/prebuilt-tasks/src/main/java/com/redhat/parodos/tasks/migrationtoolkit/CreateApplicationTask.java b/prebuilt-tasks/src/main/java/com/redhat/parodos/tasks/migrationtoolkit/CreateApplicationTask.java index 0bd53394f..b2286211e 100644 --- a/prebuilt-tasks/src/main/java/com/redhat/parodos/tasks/migrationtoolkit/CreateApplicationTask.java +++ b/prebuilt-tasks/src/main/java/com/redhat/parodos/tasks/migrationtoolkit/CreateApplicationTask.java @@ -60,11 +60,11 @@ public CreateApplicationTask(URI serverURL, String bearerToken) { public WorkReport execute(WorkContext workContext) { String appName, repo; try { - appName = getOptionalParameterValue(workContext, "applicationName", ""); - repo = getRequiredParameterValue(workContext, "repositoryURL"); + appName = getOptionalParameterValue("applicationName", ""); + repo = getRequiredParameterValue("repositoryURL"); if (mtaClient == null) { - var serverUrl = getOptionalParameterValue(workContext, "serverURL", null); - var bearerToken = getOptionalParameterValue(workContext, "bearerToken", null); + var serverUrl = getOptionalParameterValue("serverURL", null); + var bearerToken = getOptionalParameterValue("bearerToken", null); this.mtaClient = new MTAClient(URI.create(serverUrl), bearerToken); } } diff --git a/prebuilt-tasks/src/main/java/com/redhat/parodos/tasks/migrationtoolkit/GetAnalysisTask.java b/prebuilt-tasks/src/main/java/com/redhat/parodos/tasks/migrationtoolkit/GetAnalysisTask.java index 5a9079162..14547f25e 100644 --- a/prebuilt-tasks/src/main/java/com/redhat/parodos/tasks/migrationtoolkit/GetAnalysisTask.java +++ b/prebuilt-tasks/src/main/java/com/redhat/parodos/tasks/migrationtoolkit/GetAnalysisTask.java @@ -62,8 +62,8 @@ public GetAnalysisTask(URI serverURL, String bearerToken, Consumer mess @Override public WorkReport execute(WorkContext workContext) { if (mtaClient == null) { - serverUrl = URI.create(getOptionalParameterValue(workContext, "serverURL", null)); - var bearerToken = getOptionalParameterValue(workContext, "bearerToken", null); + serverUrl = URI.create(getOptionalParameterValue("serverURL", null)); + var bearerToken = getOptionalParameterValue("bearerToken", null); if (serverUrl == null) { log.error( "serverURL is empty. Either pass it while creating the instance of the task or in the context"); @@ -74,7 +74,7 @@ public WorkReport execute(WorkContext workContext) { int taskGroupID; try { - taskGroupID = Integer.parseInt(getRequiredParameterValue(workContext, "taskGroupID")); + taskGroupID = Integer.parseInt(getRequiredParameterValue("taskGroupID")); } catch (MissingParameterException | NumberFormatException e) { return new DefaultWorkReport(WorkStatus.FAILED, workContext, e); @@ -95,8 +95,8 @@ else if (result instanceof Result.Success success) { && success.value().tasks()[0].state().equals("Succeeded")) { String reportURL = String.format("%s/hub/applications/%d/bucket/%s", serverUrl, success.value().tasks()[0].application().id(), success.value().data().output()); - sendEmail(reportURL, getOptionalParameterValue(workContext, "email", null)); - addParameter(workContext, "reportURL", reportURL); + sendEmail(reportURL, getOptionalParameterValue("email", null)); + addParameter("reportURL", reportURL); return new DefaultWorkReport(WorkStatus.COMPLETED, workContext); } else if ("Failed".equals(success.value().state())) { diff --git a/prebuilt-tasks/src/main/java/com/redhat/parodos/tasks/migrationtoolkit/GetApplicationTask.java b/prebuilt-tasks/src/main/java/com/redhat/parodos/tasks/migrationtoolkit/GetApplicationTask.java index b2d40f3f6..e3a7f7156 100644 --- a/prebuilt-tasks/src/main/java/com/redhat/parodos/tasks/migrationtoolkit/GetApplicationTask.java +++ b/prebuilt-tasks/src/main/java/com/redhat/parodos/tasks/migrationtoolkit/GetApplicationTask.java @@ -61,11 +61,11 @@ public WorkReport execute(WorkContext workContext) { String applicationName = ""; try { if (mtaClient == null) { - var serverUrl = getOptionalParameterValue(workContext, "serverURL", null); - var bearerToken = getOptionalParameterValue(workContext, "bearerToken", null); + var serverUrl = getOptionalParameterValue("serverURL", null); + var bearerToken = getOptionalParameterValue("bearerToken", null); mtaClient = new MTAClient(URI.create(serverUrl), bearerToken); } - applicationName = getRequiredParameterValue(workContext, "applicationName"); + applicationName = getRequiredParameterValue("applicationName"); } catch (MissingParameterException e) { return new DefaultWorkReport(WorkStatus.FAILED, workContext, e); @@ -82,7 +82,7 @@ else if (result instanceof Result.Failure failure) { return new DefaultWorkReport(WorkStatus.FAILED, workContext, failure.t()); } else if (result instanceof Result.Success success) { - addParameter(workContext, "applicationID", String.valueOf(success.value().id())); + addParameter("applicationID", String.valueOf(success.value().id())); return new DefaultWorkReport(WorkStatus.COMPLETED, workContext); } throw new IllegalArgumentException(); diff --git a/prebuilt-tasks/src/main/java/com/redhat/parodos/tasks/migrationtoolkit/SubmitAnalysisTask.java b/prebuilt-tasks/src/main/java/com/redhat/parodos/tasks/migrationtoolkit/SubmitAnalysisTask.java index 3e9f34200..0bf01f9a8 100644 --- a/prebuilt-tasks/src/main/java/com/redhat/parodos/tasks/migrationtoolkit/SubmitAnalysisTask.java +++ b/prebuilt-tasks/src/main/java/com/redhat/parodos/tasks/migrationtoolkit/SubmitAnalysisTask.java @@ -62,10 +62,10 @@ public SubmitAnalysisTask(URI serverURL, String bearerToken) { public WorkReport execute(WorkContext workContext) { int applicationID; try { - applicationID = Integer.parseInt(getRequiredParameterValue(workContext, "applicationID")); + applicationID = Integer.parseInt(getRequiredParameterValue("applicationID")); if (mtaClient == null) { - var serverUrl = getOptionalParameterValue(workContext, "serverURL", null); - var bearerToken = getOptionalParameterValue(workContext, "bearerToken", null); + var serverUrl = getOptionalParameterValue("serverURL", null); + var bearerToken = getOptionalParameterValue("bearerToken", null); this.mtaClient = new MTAClient(URI.create(serverUrl), bearerToken); } } @@ -84,7 +84,7 @@ else if (result instanceof Result.Failure failure) { return new DefaultWorkReport(WorkStatus.FAILED, workContext, failure.t()); } else if (result instanceof Result.Success success) { - addParameter(workContext, "taskGroupID", String.valueOf(success.value().id())); + addParameter("taskGroupID", String.valueOf(success.value().id())); return new DefaultWorkReport(WorkStatus.COMPLETED, workContext); } throw new IllegalArgumentException(); diff --git a/prebuilt-tasks/src/main/java/com/redhat/parodos/tasks/notification/NotificationWorkFlowTask.java b/prebuilt-tasks/src/main/java/com/redhat/parodos/tasks/notification/NotificationWorkFlowTask.java index de7137784..6e8b13e16 100644 --- a/prebuilt-tasks/src/main/java/com/redhat/parodos/tasks/notification/NotificationWorkFlowTask.java +++ b/prebuilt-tasks/src/main/java/com/redhat/parodos/tasks/notification/NotificationWorkFlowTask.java @@ -81,11 +81,11 @@ public WorkReport execute(WorkContext workContext) { NotificationMessageCreateRequestDTO notificationMessageCreateRequestDTO = new NotificationMessageCreateRequestDTO(); try { - notificationMessageCreateRequestDTO.messageType(getRequiredParameterValue(workContext, "type")); - notificationMessageCreateRequestDTO.body(getRequiredParameterValue(workContext, "body")); - notificationMessageCreateRequestDTO.subject(getRequiredParameterValue(workContext, "subject")); - List userNames = toList(getOptionalParameterValue(workContext, "userNames", null)); - List groupNames = toList(getOptionalParameterValue(workContext, "groupNames", null)); + notificationMessageCreateRequestDTO.messageType(getRequiredParameterValue("type")); + notificationMessageCreateRequestDTO.body(getRequiredParameterValue("body")); + notificationMessageCreateRequestDTO.subject(getRequiredParameterValue("subject")); + List userNames = toList(getOptionalParameterValue("userNames", null)); + List groupNames = toList(getOptionalParameterValue("groupNames", null)); if (CollectionUtils.isEmpty(userNames) && CollectionUtils.isEmpty(groupNames)) { throw new MissingParameterException("User Names or Group Names must be provided"); } diff --git a/prebuilt-tasks/src/main/java/com/redhat/parodos/tasks/rest/RestWorkFlowTask.java b/prebuilt-tasks/src/main/java/com/redhat/parodos/tasks/rest/RestWorkFlowTask.java index aab856cf7..ce8346d43 100644 --- a/prebuilt-tasks/src/main/java/com/redhat/parodos/tasks/rest/RestWorkFlowTask.java +++ b/prebuilt-tasks/src/main/java/com/redhat/parodos/tasks/rest/RestWorkFlowTask.java @@ -63,8 +63,8 @@ public RestWorkFlowTask() { public WorkReport execute(WorkContext workContext) { String url = ""; try { - url = getRequiredParameterValue(workContext, "url"); - String method = getRequiredParameterValue(workContext, "method"); + url = getRequiredParameterValue("url"); + String method = getRequiredParameterValue("method"); HttpMethod httpMethod = HttpMethod.valueOf(method.toUpperCase()); @@ -89,7 +89,7 @@ public WorkReport execute(WorkContext workContext) { protected void processResponseEntity(WorkContext workContext, ResponseEntity responseEntity) throws RestClientException { - String responseKey = getOptionalParameterValue(workContext, "response-key", ""); + String responseKey = getOptionalParameterValue("response-key", ""); if (responseKey.isEmpty()) { return; @@ -99,7 +99,7 @@ protected void processResponseEntity(WorkContext workContext, ResponseEntity buildRequestEntity(WorkContext workContext) throws RestClientException { - String content = getOptionalParameterValue(workContext, "content", ""); + String content = getOptionalParameterValue("content", ""); return new HttpEntity<>(content, buildHttpHeaders(workContext)); } @@ -109,12 +109,12 @@ protected HttpHeaders buildHttpHeaders(WorkContext workContext) throws RestClien httpHeaders.setContentType(MediaType.APPLICATION_JSON); httpHeaders.setAccept(List.of(MediaType.APPLICATION_JSON)); - String username = getOptionalParameterValue(workContext, "username", ""); + String username = getOptionalParameterValue("username", ""); String password; if (!username.isEmpty()) { try { - password = getRequiredParameterValue(workContext, "password"); + password = getRequiredParameterValue("password"); } catch (MissingParameterException e) { throw new RestClientException("Missing password", e); diff --git a/prebuilt-tasks/src/main/java/com/redhat/parodos/tasks/tibco/TibcoWorkFlowTask.java b/prebuilt-tasks/src/main/java/com/redhat/parodos/tasks/tibco/TibcoWorkFlowTask.java index 84764fe8b..5b0c7fc5e 100644 --- a/prebuilt-tasks/src/main/java/com/redhat/parodos/tasks/tibco/TibcoWorkFlowTask.java +++ b/prebuilt-tasks/src/main/java/com/redhat/parodos/tasks/tibco/TibcoWorkFlowTask.java @@ -57,8 +57,8 @@ public TibcoWorkFlowTask(String url, String caFile, String username, String pass @Override public WorkReport execute(WorkContext workContext) { try { - String topic = getRequiredParameterValue(workContext, "topic"); - String message = getRequiredParameterValue(workContext, "message"); + String topic = getRequiredParameterValue("topic"); + String message = getRequiredParameterValue("message"); service.sendMessage(url, caFile, username, password, topic, message); diff --git a/prebuilt-tasks/src/test/java/com/redhat/parodos/tasks/azure/AzureCreateVirtualMachineTaskTest.java b/prebuilt-tasks/src/test/java/com/redhat/parodos/tasks/azure/AzureCreateVirtualMachineTaskTest.java index 34b794d8f..d17ca0937 100644 --- a/prebuilt-tasks/src/test/java/com/redhat/parodos/tasks/azure/AzureCreateVirtualMachineTaskTest.java +++ b/prebuilt-tasks/src/test/java/com/redhat/parodos/tasks/azure/AzureCreateVirtualMachineTaskTest.java @@ -1,6 +1,7 @@ package com.redhat.parodos.tasks.azure; import java.util.HashMap; +import java.util.UUID; import com.azure.resourcemanager.compute.models.AvailabilitySet; import com.azure.resourcemanager.compute.models.VirtualMachine; @@ -95,7 +96,10 @@ public void testHappyFlow() { String publicIP = "11.11.11.11"; when(virtualMachine.getPrimaryPublicIPAddress()).thenReturn(publicIPAddress); when(publicIPAddress.ipAddress()).thenReturn(publicIP); + WorkContextDelegate.write(ctx, WorkContextDelegate.ProcessType.WORKFLOW_EXECUTION, + WorkContextDelegate.Resource.ID, UUID.randomUUID()); + underTest.preExecute(ctx); // when WorkReport result = underTest.execute(ctx); @@ -118,7 +122,9 @@ public void testVmMissingPublicIPErr() { // given String publicIP = "11.11.11.11"; when(virtualMachine.getPrimaryPublicIPAddress()).thenReturn(null); - + WorkContextDelegate.write(ctx, WorkContextDelegate.ProcessType.WORKFLOW_EXECUTION, + WorkContextDelegate.Resource.ID, UUID.randomUUID()); + underTest.preExecute(ctx); // when WorkReport result = underTest.execute(ctx); @@ -136,6 +142,9 @@ public void testMissingRequiredParamErr() { HashMap map = new HashMap<>(); for (String paramKey : requiredParamsKeys) { + WorkContextDelegate.write(ctx, WorkContextDelegate.ProcessType.WORKFLOW_EXECUTION, + WorkContextDelegate.Resource.ID, UUID.randomUUID()); + underTest.preExecute(ctx); // when WorkReport result = underTest.execute(ctx); diff --git a/prebuilt-tasks/src/test/java/com/redhat/parodos/tasks/kubeapi/KubeapiWorkFlowTaskTest.java b/prebuilt-tasks/src/test/java/com/redhat/parodos/tasks/kubeapi/KubeapiWorkFlowTaskTest.java index 31ab51ba7..a54f14e1f 100644 --- a/prebuilt-tasks/src/test/java/com/redhat/parodos/tasks/kubeapi/KubeapiWorkFlowTaskTest.java +++ b/prebuilt-tasks/src/test/java/com/redhat/parodos/tasks/kubeapi/KubeapiWorkFlowTaskTest.java @@ -2,6 +2,7 @@ import java.io.IOException; import java.util.HashMap; +import java.util.UUID; import com.redhat.parodos.workflow.context.WorkContextDelegate; import com.redhat.parodos.workflow.exception.MissingParameterException; @@ -30,6 +31,9 @@ public class KubeapiWorkFlowTaskTest { @Test public void missingArgs() { WorkContext ctx = createWorkContext(new HashMap<>()); + WorkContextDelegate.write(ctx, WorkContextDelegate.ProcessType.WORKFLOW_EXECUTION, + WorkContextDelegate.Resource.ID, UUID.randomUUID()); + task.preExecute(ctx); WorkReport result = task.execute(ctx); assertEquals(WorkStatus.FAILED, result.getStatus()); assertEquals(MissingParameterException.class, result.getError().getClass()); @@ -40,6 +44,9 @@ public void invalidOperationType() { HashMap map = new HashMap<>(); map.put("operation", "test"); WorkContext ctx = createWorkContext(map); + WorkContextDelegate.write(ctx, WorkContextDelegate.ProcessType.WORKFLOW_EXECUTION, + WorkContextDelegate.Resource.ID, UUID.randomUUID()); + task.preExecute(ctx); WorkReport result = task.execute(ctx); assertEquals(WorkStatus.FAILED, result.getStatus()); assertEquals(IllegalArgumentException.class, result.getError().getClass()); @@ -53,6 +60,9 @@ public void get() throws ApiException, IOException { DynamicKubernetesObject obj = Dynamics.newFromJson(objJson); WorkContext ctx = workContextGET(); doReturn(obj).when(api).get(any(), any(), any(), any(), any(), any()); + WorkContextDelegate.write(ctx, WorkContextDelegate.ProcessType.WORKFLOW_EXECUTION, + WorkContextDelegate.Resource.ID, UUID.randomUUID()); + task.preExecute(ctx); WorkReport result = task.execute(ctx); assertEquals(WorkStatus.COMPLETED, result.getStatus()); assertEquals(objJson, ctx.get("testkey")); @@ -63,6 +73,9 @@ public void create() throws ApiException, IOException { DynamicKubernetesObject expectedObj = Dynamics.newFromJson( "{\"apiVersion\": \"v1\",\"data\": {\"a\": \"vala\",\"b\": \"valb\"},\"kind\": \"ConfigMap\",\"metadata\": {\"name\": \"my-cm-create\",\"namespace\": \"test\"}}"); WorkContext ctx = workContextCREATE(); + WorkContextDelegate.write(ctx, WorkContextDelegate.ProcessType.WORKFLOW_EXECUTION, + WorkContextDelegate.Resource.ID, UUID.randomUUID()); + task.preExecute(ctx); WorkReport result = task.execute(ctx); assertEquals(WorkStatus.COMPLETED, result.getStatus()); verify(api, times(1)).create(any(), any(), any(), any(), eq(expectedObj)); @@ -75,6 +88,9 @@ public void update() throws ApiException, IOException { DynamicKubernetesObject getReturnValue = Dynamics.newFromJson( "{\"apiVersion\": \"v1\",\"data\": {\"a\": \"vala\",\"b\": \"valb\"},\"kind\": \"ConfigMap\",\"metadata\": {\"resourceVersion\": \"1000\", \"name\": \"my-cm-create\",\"namespace\": \"test\"}}"); WorkContext ctx = workContextUPDATE(); + WorkContextDelegate.write(ctx, WorkContextDelegate.ProcessType.WORKFLOW_EXECUTION, + WorkContextDelegate.Resource.ID, UUID.randomUUID()); + task.preExecute(ctx); doReturn(getReturnValue).when(api).get(any(), any(), any(), any(), any(), any()); WorkReport result = task.execute(ctx); assertEquals(WorkStatus.COMPLETED, result.getStatus()); diff --git a/prebuilt-tasks/src/test/java/com/redhat/parodos/tasks/migrationtoolkit/CreateApplicationTaskTest.java b/prebuilt-tasks/src/test/java/com/redhat/parodos/tasks/migrationtoolkit/CreateApplicationTaskTest.java index eab8d916d..c60c80ad7 100644 --- a/prebuilt-tasks/src/test/java/com/redhat/parodos/tasks/migrationtoolkit/CreateApplicationTaskTest.java +++ b/prebuilt-tasks/src/test/java/com/redhat/parodos/tasks/migrationtoolkit/CreateApplicationTaskTest.java @@ -1,5 +1,8 @@ package com.redhat.parodos.tasks.migrationtoolkit; +import java.util.UUID; + +import com.redhat.parodos.workflow.context.WorkContextDelegate; import com.redhat.parodos.workflow.exception.MissingParameterException; import com.redhat.parodos.workflows.work.WorkContext; import com.redhat.parodos.workflows.work.WorkReport; @@ -40,6 +43,9 @@ public void setUp() { @Test @SneakyThrows public void missingMandatoryParameters() { + WorkContextDelegate.write(ctx, WorkContextDelegate.ProcessType.WORKFLOW_EXECUTION, + WorkContextDelegate.Resource.ID, UUID.randomUUID()); + underTest.preExecute(ctx); WorkReport execute = underTest.execute(ctx); assertThat(execute.getError()).isInstanceOf(MissingParameterException.class); @@ -54,7 +60,9 @@ public void createFails() { when(mockClient.create(any(App.class))).thenReturn(new Result.Failure<>(new Exception("some error from MTA"))); ctx.put("applicationName", APP_NAME); ctx.put("repositoryURL", REPO_URL); - + WorkContextDelegate.write(ctx, WorkContextDelegate.ProcessType.WORKFLOW_EXECUTION, + WorkContextDelegate.Resource.ID, UUID.randomUUID()); + underTest.preExecute(ctx); WorkReport execute = underTest.execute(ctx); assertThat(execute.getError()).isInstanceOf(Exception.class); @@ -71,7 +79,9 @@ public void createCompletes() { when(mockClient.create(any())) .thenReturn(new Result.Success<>(new App(APP_ID, APP_NAME, new Repository("git", REPO_URL)))); - + WorkContextDelegate.write(ctx, WorkContextDelegate.ProcessType.WORKFLOW_EXECUTION, + WorkContextDelegate.Resource.ID, UUID.randomUUID()); + underTest.preExecute(ctx); WorkReport execute = underTest.execute(ctx); assertThat(execute.getError()).isNull(); @@ -84,4 +94,4 @@ public void createCompletes() { verify(mockClient, Mockito.times(1)).create(new App(0, APP_NAME, new Repository("git", REPO_URL))); } -} \ No newline at end of file +} diff --git a/prebuilt-tasks/src/test/java/com/redhat/parodos/tasks/migrationtoolkit/GetAnalysisTaskTest.java b/prebuilt-tasks/src/test/java/com/redhat/parodos/tasks/migrationtoolkit/GetAnalysisTaskTest.java index b7b0f6c9c..b74b67bfb 100644 --- a/prebuilt-tasks/src/test/java/com/redhat/parodos/tasks/migrationtoolkit/GetAnalysisTaskTest.java +++ b/prebuilt-tasks/src/test/java/com/redhat/parodos/tasks/migrationtoolkit/GetAnalysisTaskTest.java @@ -1,5 +1,8 @@ package com.redhat.parodos.tasks.migrationtoolkit; +import java.util.UUID; + +import com.redhat.parodos.workflow.context.WorkContextDelegate; import com.redhat.parodos.workflow.exception.MissingParameterException; import com.redhat.parodos.workflows.work.WorkContext; import com.redhat.parodos.workflows.work.WorkReport; @@ -40,6 +43,9 @@ public void setUp() { @Test @SneakyThrows public void missingMandatoryParams() { + WorkContextDelegate.write(ctx, WorkContextDelegate.ProcessType.WORKFLOW_EXECUTION, + WorkContextDelegate.Resource.ID, UUID.randomUUID()); + underTest.preExecute(ctx); WorkReport execute = underTest.execute(ctx); assertThat(execute.getError()).isInstanceOf(MissingParameterException.class); @@ -54,7 +60,9 @@ public void failsGetTaskGroup() { when(mockClient.get(anyInt())).thenReturn(new Result.Failure<>(new Exception("not found"))); ctx.put("taskGroupID", "123"); - + WorkContextDelegate.write(ctx, WorkContextDelegate.ProcessType.WORKFLOW_EXECUTION, + WorkContextDelegate.Resource.ID, UUID.randomUUID()); + underTest.preExecute(ctx); WorkReport execute = underTest.execute(ctx); assertThat(execute.getError()).isNotInstanceOf(MissingParameterException.class); @@ -69,7 +77,9 @@ public void getByID() { var taskGroupID = "1"; ctx.put("taskGroupID", taskGroupID); when(mockClient.get(Integer.parseInt(taskGroupID))).thenReturn(new Result.Success<>(successfulGet())); - + WorkContextDelegate.write(ctx, WorkContextDelegate.ProcessType.WORKFLOW_EXECUTION, + WorkContextDelegate.Resource.ID, UUID.randomUUID()); + underTest.preExecute(ctx); WorkReport execute = underTest.execute(ctx); assertThat(execute.getError()).isNull(); @@ -88,4 +98,4 @@ static TaskGroup successfulGet() { String.format("parodos.%s.windup", APP_ID), null, null, null) }); } -} \ No newline at end of file +} diff --git a/prebuilt-tasks/src/test/java/com/redhat/parodos/tasks/migrationtoolkit/GetApplicationTaskTest.java b/prebuilt-tasks/src/test/java/com/redhat/parodos/tasks/migrationtoolkit/GetApplicationTaskTest.java index de1fe93a7..fd5304fd2 100644 --- a/prebuilt-tasks/src/test/java/com/redhat/parodos/tasks/migrationtoolkit/GetApplicationTaskTest.java +++ b/prebuilt-tasks/src/test/java/com/redhat/parodos/tasks/migrationtoolkit/GetApplicationTaskTest.java @@ -1,5 +1,8 @@ package com.redhat.parodos.tasks.migrationtoolkit; +import java.util.UUID; + +import com.redhat.parodos.workflow.context.WorkContextDelegate; import com.redhat.parodos.workflow.exception.MissingParameterException; import com.redhat.parodos.workflows.work.WorkContext; import com.redhat.parodos.workflows.work.WorkReport; @@ -42,6 +45,9 @@ public void setUp() { @Test @SneakyThrows public void missingMandatoryParams() { + WorkContextDelegate.write(ctx, WorkContextDelegate.ProcessType.WORKFLOW_EXECUTION, + WorkContextDelegate.Resource.ID, UUID.randomUUID()); + underTest.preExecute(ctx); WorkReport execute = underTest.execute(ctx); assertThat(execute.getError()).isInstanceOf(MissingParameterException.class); @@ -54,7 +60,9 @@ public void missingMandatoryParams() { public void failsGettingAppNotFound() { when(mockClient.get(anyString())).thenReturn(new Result.Failure<>(new Exception("not found"))); ctx.put("applicationName", APP_NAME); - + WorkContextDelegate.write(ctx, WorkContextDelegate.ProcessType.WORKFLOW_EXECUTION, + WorkContextDelegate.Resource.ID, UUID.randomUUID()); + underTest.preExecute(ctx); WorkReport execute = underTest.execute(ctx); assertThat(execute.getError()).isInstanceOf(Exception.class); @@ -69,7 +77,9 @@ public void getByName() { when(mockClient.get(anyString())) .thenReturn(new Result.Success<>(new App(APP_ID, APP_NAME, new Repository("git", REPO_URL)))); ctx.put("applicationName", APP_NAME); - + WorkContextDelegate.write(ctx, WorkContextDelegate.ProcessType.WORKFLOW_EXECUTION, + WorkContextDelegate.Resource.ID, UUID.randomUUID()); + underTest.preExecute(ctx); WorkReport execute = underTest.execute(ctx); assertThat(execute.getError()).isNull(); @@ -80,4 +90,4 @@ public void getByName() { } -} \ No newline at end of file +} diff --git a/prebuilt-tasks/src/test/java/com/redhat/parodos/tasks/migrationtoolkit/SubmitAnalysisTaskTest.java b/prebuilt-tasks/src/test/java/com/redhat/parodos/tasks/migrationtoolkit/SubmitAnalysisTaskTest.java index ff9385e97..4b412645a 100644 --- a/prebuilt-tasks/src/test/java/com/redhat/parodos/tasks/migrationtoolkit/SubmitAnalysisTaskTest.java +++ b/prebuilt-tasks/src/test/java/com/redhat/parodos/tasks/migrationtoolkit/SubmitAnalysisTaskTest.java @@ -1,5 +1,8 @@ package com.redhat.parodos.tasks.migrationtoolkit; +import java.util.UUID; + +import com.redhat.parodos.workflow.context.WorkContextDelegate; import com.redhat.parodos.workflow.exception.MissingParameterException; import com.redhat.parodos.workflows.work.WorkContext; import com.redhat.parodos.workflows.work.WorkReport; @@ -39,6 +42,9 @@ public void setUp() { @Test @SneakyThrows public void missingMandatoryParams() { + WorkContextDelegate.write(ctx, WorkContextDelegate.ProcessType.WORKFLOW_EXECUTION, + WorkContextDelegate.Resource.ID, UUID.randomUUID()); + underTest.preExecute(ctx); WorkReport execute = underTest.execute(ctx); assertThat(execute.getError()).isInstanceOf(MissingParameterException.class); @@ -52,6 +58,9 @@ public void missingMandatoryParams() { public void failsCreatingTaskGroup() { when(mockClient.create(anyInt())).thenReturn(new Result.Failure<>(new Exception("not found"))); ctx.put("applicationID", "123"); + WorkContextDelegate.write(ctx, WorkContextDelegate.ProcessType.WORKFLOW_EXECUTION, + WorkContextDelegate.Resource.ID, UUID.randomUUID()); + underTest.preExecute(ctx); WorkReport execute = underTest.execute(ctx); assertThat(execute.getError()).isNotInstanceOf(MissingParameterException.class); @@ -68,7 +77,9 @@ public void createCompletes() { int appID = 123; ctx.put("applicationID", Integer.toString(appID)); when(mockClient.create(appID)).thenReturn(new Result.Success<>(of(taskGroupID, appID))); - + WorkContextDelegate.write(ctx, WorkContextDelegate.ProcessType.WORKFLOW_EXECUTION, + WorkContextDelegate.Resource.ID, UUID.randomUUID()); + underTest.preExecute(ctx); WorkReport execute = underTest.execute(ctx); assertThat(execute.getError()).isNull(); diff --git a/prebuilt-tasks/src/test/java/com/redhat/parodos/tasks/notification/NotificationWorkFlowTaskTest.java b/prebuilt-tasks/src/test/java/com/redhat/parodos/tasks/notification/NotificationWorkFlowTaskTest.java index 4837c647a..7a37114fa 100644 --- a/prebuilt-tasks/src/test/java/com/redhat/parodos/tasks/notification/NotificationWorkFlowTaskTest.java +++ b/prebuilt-tasks/src/test/java/com/redhat/parodos/tasks/notification/NotificationWorkFlowTaskTest.java @@ -3,6 +3,7 @@ import java.util.Arrays; import java.util.HashMap; import java.util.List; +import java.util.UUID; import com.redhat.parodos.notification.sdk.api.ApiException; import com.redhat.parodos.notification.sdk.api.NotificationMessageApi; @@ -45,7 +46,7 @@ public void testExecuteSuccess() { "test-subject", Arrays.asList("test-user-1", "test-user-2"), Arrays.asList("test-group-1", "test-group-2")); putParamsToCtx(dto, ctx); - + underTest.preExecute(ctx); WorkReport result = underTest.execute(ctx); assertEquals(WorkStatus.COMPLETED, result.getStatus()); @@ -61,7 +62,7 @@ public void testExecuteApiCreateExceptionErr() { putParamsToCtx(dto, ctx); doThrow(ApiException.class).when(apiInstanceMock).create(dto); - + underTest.preExecute(ctx); WorkReport result = underTest.execute(ctx); assertEquals(WorkStatus.FAILED, result.getStatus()); @@ -76,7 +77,7 @@ public void testExecuteMissingTypeErr() { "test-subject", Arrays.asList("test-user-1", "test-user-2"), Arrays.asList("test-group-1", "test-group-2")); putParamsToCtx(dto, ctx); - + underTest.preExecute(ctx); WorkReport result = underTest.execute(ctx); assertEquals(WorkStatus.FAILED, result.getStatus()); @@ -91,7 +92,7 @@ public void testExecuteMissingBodyErr() { "test-subject", Arrays.asList("test-user-1", "test-user-2"), Arrays.asList("test-group-1", "test-group-2")); putParamsToCtx(dto, ctx); - + underTest.preExecute(ctx); WorkReport result = underTest.execute(ctx); assertEquals(WorkStatus.FAILED, result.getStatus()); @@ -105,7 +106,7 @@ public void testExecuteMissingSubjectErr() { NotificationMessageCreateRequestDTO dto = buildNotificationMessageCreateRequestDTO("test-type", "test-body", null, Arrays.asList("test-user-1", "test-user-2"), Arrays.asList("test-group-1", "test-group-2")); putParamsToCtx(dto, ctx); - + underTest.preExecute(ctx); WorkReport result = underTest.execute(ctx); assertEquals(WorkStatus.FAILED, result.getStatus()); @@ -119,7 +120,7 @@ public void testExecuteMissingUsernamesSuccess() { NotificationMessageCreateRequestDTO dto = buildNotificationMessageCreateRequestDTO("test-type", "test-body", "test-subject", null, Arrays.asList("test-group-1", "test-group-2")); putParamsToCtx(dto, ctx); - + underTest.preExecute(ctx); WorkReport result = underTest.execute(ctx); assertEquals(WorkStatus.COMPLETED, result.getStatus()); @@ -132,7 +133,7 @@ public void testExecuteMissingGroupNamesSuccess() { NotificationMessageCreateRequestDTO dto = buildNotificationMessageCreateRequestDTO("test-type", "test-body", "test-subject", Arrays.asList("test-user-1", "test-user-2"), null); putParamsToCtx(dto, ctx); - + underTest.preExecute(ctx); WorkReport result = underTest.execute(ctx); assertEquals(WorkStatus.COMPLETED, result.getStatus()); @@ -145,7 +146,7 @@ public void testExecuteMissingUsernamesAndGroupNamesErr() { NotificationMessageCreateRequestDTO dto = buildNotificationMessageCreateRequestDTO("test-type", "test-body", "test-subject", null, null); putParamsToCtx(dto, ctx); - + underTest.preExecute(ctx); WorkReport result = underTest.execute(ctx); assertEquals(WorkStatus.FAILED, result.getStatus()); @@ -179,6 +180,9 @@ private void putParamsToCtx(NotificationMessageCreateRequestDTO dto, WorkContext WorkContextDelegate.write(ctx, WorkContextDelegate.ProcessType.WORKFLOW_TASK_EXECUTION, underTest.getName(), WorkContextDelegate.Resource.ARGUMENTS, map); + + WorkContextDelegate.write(ctx, WorkContextDelegate.ProcessType.WORKFLOW_EXECUTION, + WorkContextDelegate.Resource.ID, UUID.randomUUID()); } private void putInMap(HashMap map, String key, String value) { diff --git a/prebuilt-tasks/src/test/java/com/redhat/parodos/tasks/tibco/TibcoWorkFlowTaskTest.java b/prebuilt-tasks/src/test/java/com/redhat/parodos/tasks/tibco/TibcoWorkFlowTaskTest.java index c4a7a6c7e..84e413b20 100644 --- a/prebuilt-tasks/src/test/java/com/redhat/parodos/tasks/tibco/TibcoWorkFlowTaskTest.java +++ b/prebuilt-tasks/src/test/java/com/redhat/parodos/tasks/tibco/TibcoWorkFlowTaskTest.java @@ -1,6 +1,7 @@ package com.redhat.parodos.tasks.tibco; import java.util.HashMap; +import java.util.UUID; import javax.jms.JMSException; @@ -45,6 +46,9 @@ public void setUp() { @Test public void executeMissingParameter() { WorkContext ctx = getWorkContext(false); + WorkContextDelegate.write(ctx, WorkContextDelegate.ProcessType.WORKFLOW_EXECUTION, + WorkContextDelegate.Resource.ID, UUID.randomUUID()); + task.preExecute(ctx); WorkReport result = task.execute(ctx); assertEquals(WorkStatus.FAILED, result.getStatus()); assertEquals(MissingParameterException.class, result.getError().getClass()); @@ -54,6 +58,9 @@ public void executeMissingParameter() { public void executeErrorInTibco() throws JMSException { WorkContext ctx = getWorkContext(true); doThrow(JMSException.class).when(tibjms).sendMessage(any(), any(), any(), any(), any(), any()); + WorkContextDelegate.write(ctx, WorkContextDelegate.ProcessType.WORKFLOW_EXECUTION, + WorkContextDelegate.Resource.ID, UUID.randomUUID()); + task.preExecute(ctx); WorkReport result = task.execute(ctx); assertEquals(WorkStatus.FAILED, result.getStatus()); assertEquals(JMSException.class, result.getError().getClass()); @@ -62,6 +69,9 @@ public void executeErrorInTibco() throws JMSException { @Test public void executeSuccess() throws JMSException { WorkContext ctx = getWorkContext(true); + WorkContextDelegate.write(ctx, WorkContextDelegate.ProcessType.WORKFLOW_EXECUTION, + WorkContextDelegate.Resource.ID, UUID.randomUUID()); + task.preExecute(ctx); WorkReport result = task.execute(ctx); assertEquals(WorkStatus.COMPLETED, result.getStatus()); verify(tibjms, times(1)).sendMessage(url, caFile, username, passowrd, topic, message); diff --git a/workflow-examples/pom.xml b/workflow-examples/pom.xml index 4ab00d27a..60939c1e3 100644 --- a/workflow-examples/pom.xml +++ b/workflow-examples/pom.xml @@ -66,8 +66,14 @@ provided - junit - junit + org.junit.jupiter + junit-jupiter + test + + + org.springframework + spring-test + test org.assertj diff --git a/workflow-examples/src/main/java/com/redhat/parodos/examples/ocponboarding/checker/JiraTicketApprovalWorkFlowCheckerTask.java b/workflow-examples/src/main/java/com/redhat/parodos/examples/ocponboarding/checker/JiraTicketApprovalWorkFlowCheckerTask.java index 5119f6e4c..4e3700702 100644 --- a/workflow-examples/src/main/java/com/redhat/parodos/examples/ocponboarding/checker/JiraTicketApprovalWorkFlowCheckerTask.java +++ b/workflow-examples/src/main/java/com/redhat/parodos/examples/ocponboarding/checker/JiraTicketApprovalWorkFlowCheckerTask.java @@ -74,7 +74,7 @@ public WorkReport checkWorkFlowStatus(WorkContext workContext) { log.info("Start jiraTicketApprovalWorkFlowCheckerTask..."); try { String urlString = jiraServiceBaseUrl + "/rest/servicedeskapi/request/"; - String issueKey = getRequiredParameterValue(workContext, ISSUE_KEY); + String issueKey = getRequiredParameterValue(ISSUE_KEY); log.info("Calling: urlString: {} username: {}", urlString, jiraUsername); ResponseEntity result = RestUtils.restExchange(urlString + issueKey, jiraUsername, @@ -96,7 +96,7 @@ public WorkReport checkWorkFlowStatus(WorkContext workContext) { .orElseThrow(() -> new MissingParameterException( "cluster token is not provided by approver!")) .toString(); - addParameter(workContext, CLUSTER_TOKEN, clusterToken); + addParameter(CLUSTER_TOKEN, clusterToken); return new DefaultWorkReport(WorkStatus.COMPLETED, workContext); case DECLINED: log.info("request {} is rejected", responseDto.getIssueKey()); diff --git a/workflow-examples/src/main/java/com/redhat/parodos/examples/ocponboarding/escalation/JiraTicketApprovalEscalationWorkFlowTask.java b/workflow-examples/src/main/java/com/redhat/parodos/examples/ocponboarding/escalation/JiraTicketApprovalEscalationWorkFlowTask.java index 81e4b37aa..9e76fc89e 100644 --- a/workflow-examples/src/main/java/com/redhat/parodos/examples/ocponboarding/escalation/JiraTicketApprovalEscalationWorkFlowTask.java +++ b/workflow-examples/src/main/java/com/redhat/parodos/examples/ocponboarding/escalation/JiraTicketApprovalEscalationWorkFlowTask.java @@ -69,7 +69,7 @@ public WorkReport execute(WorkContext workContext) { // jira ticket url to extract from workContext String jiraTicketUrl; try { - jiraTicketUrl = getRequiredParameterValue(workContext, ISSUE_LINK); + jiraTicketUrl = getRequiredParameterValue(ISSUE_LINK); log.info("Jira ticket url is: {}", jiraTicketUrl); } catch (MissingParameterException e) { diff --git a/workflow-examples/src/main/java/com/redhat/parodos/examples/ocponboarding/task/AppLinkEmailNotificationWorkFlowTask.java b/workflow-examples/src/main/java/com/redhat/parodos/examples/ocponboarding/task/AppLinkEmailNotificationWorkFlowTask.java index a7c479468..0aafc4af0 100644 --- a/workflow-examples/src/main/java/com/redhat/parodos/examples/ocponboarding/task/AppLinkEmailNotificationWorkFlowTask.java +++ b/workflow-examples/src/main/java/com/redhat/parodos/examples/ocponboarding/task/AppLinkEmailNotificationWorkFlowTask.java @@ -80,7 +80,7 @@ public WorkReport execute(WorkContext workContext) { Map messageData = new HashMap<>(); String appLink; try { - appLink = getRequiredParameterValue(workContext, APP_LINK_PARAMETER_NAME); + appLink = getRequiredParameterValue(APP_LINK_PARAMETER_NAME); messageData.put("appLink", appLink); log.info("App link is: {}", appLink); } 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..88a1a3693 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 @@ -70,13 +70,13 @@ public JiraTicketCreationWorkFlowTask(String jiraServiceBaseUrl, String jiraUser * Executed by the InfrastructureTask engine as part of the Workflow */ public WorkReport execute(WorkContext workContext) { - log.info("Start jiraTicketCreationWorkFlowTask..."); + taskLogger.logInfoWithSlf4j("Start {}...", "jiraTicketCreationWorkFlowTask"); try { String urlString = jiraServiceBaseUrl + "/rest/servicedeskapi/request"; String serviceDeskId = "1"; String requestTypeId = "35"; String projectId = getProjectId(workContext).toString(); - String namespace = getOptionalParameterValue(workContext, NAMESPACE, "demo"); + String namespace = getOptionalParameterValue(NAMESPACE, "demo"); log.info("Calling: urlString: {} username: {}", urlString, jiraUsername); CreateJiraTicketRequestDto request = CreateJiraTicketRequestDto.builder().serviceDeskId(serviceDeskId) @@ -91,16 +91,17 @@ public WorkReport execute(WorkContext workContext) { jiraUsername, jiraPassword, CreateJiraTicketResponseDto.class); if (response.getStatusCode().is2xxSuccessful()) { - log.info("Rest call completed: {}", Objects.requireNonNull(response.getBody()).getIssueId()); - addParameter(workContext, ISSUE_KEY, Objects.requireNonNull(response.getBody()).getIssueKey()); - addParameter(workContext, ISSUE_LINK, - Objects.requireNonNull(response.getBody()).getLinks().get(WEB_LINK)); + taskLogger.logInfoWithSlf4j("Rest call completed! jira ticket is created with id: {}", + Objects.requireNonNull(response.getBody()).getIssueId()); + addParameter(ISSUE_KEY, Objects.requireNonNull(response.getBody()).getIssueKey()); + addParameter(ISSUE_LINK, Objects.requireNonNull(response.getBody()).getLinks().get(WEB_LINK)); 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()); + taskLogger.logError("jiraTicketCreationWorkFlowTask is Failed"); } return new DefaultWorkReport(WorkStatus.FAILED, workContext); } diff --git a/workflow-examples/src/main/java/com/redhat/parodos/examples/ocponboarding/task/JiraTicketEmailNotificationWorkFlowTask.java b/workflow-examples/src/main/java/com/redhat/parodos/examples/ocponboarding/task/JiraTicketEmailNotificationWorkFlowTask.java index bac07fdb5..3efd7ce8d 100644 --- a/workflow-examples/src/main/java/com/redhat/parodos/examples/ocponboarding/task/JiraTicketEmailNotificationWorkFlowTask.java +++ b/workflow-examples/src/main/java/com/redhat/parodos/examples/ocponboarding/task/JiraTicketEmailNotificationWorkFlowTask.java @@ -66,7 +66,7 @@ public WorkReport execute(WorkContext workContext) { // jira ticket url to extract from workContext String jiraTicketUrl; try { - jiraTicketUrl = getRequiredParameterValue(workContext, ISSUE_LINK_PARAMETER_NAME); + jiraTicketUrl = getRequiredParameterValue(ISSUE_LINK_PARAMETER_NAME); log.info("Jira ticket url is: {}", jiraTicketUrl); } catch (MissingParameterException e) { diff --git a/workflow-examples/src/main/java/com/redhat/parodos/examples/ocponboarding/task/NotificationWorkFlowTask.java b/workflow-examples/src/main/java/com/redhat/parodos/examples/ocponboarding/task/NotificationWorkFlowTask.java index f993ead11..40c2ac2ef 100644 --- a/workflow-examples/src/main/java/com/redhat/parodos/examples/ocponboarding/task/NotificationWorkFlowTask.java +++ b/workflow-examples/src/main/java/com/redhat/parodos/examples/ocponboarding/task/NotificationWorkFlowTask.java @@ -62,9 +62,9 @@ public NotificationWorkFlowTask(String notificationServiceUrl) { */ public WorkReport execute(WorkContext workContext) { try { - String jiraTicketUrl = getRequiredParameterValue(workContext, JIRA_TICKET_URL_WORKFLOW_TASK_PARAMETER_NAME); + String jiraTicketUrl = getRequiredParameterValue(JIRA_TICKET_URL_WORKFLOW_TASK_PARAMETER_NAME); - String ocpAppLink = getRequiredParameterValue(workContext, OCP_APP_LINK_WORKFLOW_TASK_PARAMETER_NAME); + String ocpAppLink = getRequiredParameterValue(OCP_APP_LINK_WORKFLOW_TASK_PARAMETER_NAME); NotificationRequest request = NotificationRequest.builder().usernames(List.of(NOTIFICATION_USERNAME)) .subject(NOTIFICATION_SUBJECT).body(buildMessage(jiraTicketUrl, ocpAppLink)).build(); diff --git a/workflow-examples/src/main/java/com/redhat/parodos/examples/ocponboarding/task/OcpAppDeploymentWorkFlowTask.java b/workflow-examples/src/main/java/com/redhat/parodos/examples/ocponboarding/task/OcpAppDeploymentWorkFlowTask.java index 591441b41..40e3ae0d8 100644 --- a/workflow-examples/src/main/java/com/redhat/parodos/examples/ocponboarding/task/OcpAppDeploymentWorkFlowTask.java +++ b/workflow-examples/src/main/java/com/redhat/parodos/examples/ocponboarding/task/OcpAppDeploymentWorkFlowTask.java @@ -70,8 +70,8 @@ public OcpAppDeploymentWorkFlowTask(String clusterApiUrl) { public WorkReport execute(WorkContext workContext) { log.info("Start ocpAppDeploymentWorkFlowTask..."); try { - String namespace = getRequiredParameterValue(workContext, NAMESPACE); - String clusterToken = getRequiredParameterValue(workContext, CLUSTER_TOKEN); + String namespace = getRequiredParameterValue(NAMESPACE); + String clusterToken = getRequiredParameterValue(CLUSTER_TOKEN); Config config = new ConfigBuilder().withMasterUrl(clusterApiUrl).withOauthToken(clusterToken).build(); @@ -103,7 +103,7 @@ public WorkReport execute(WorkContext workContext) { .endSpec().build(); route = client.routes().inNamespace(namespace).resource(route).create(); - addParameter(workContext, APP_LINK, String.format("%s%s", ROUTE_PROTOCOl, route.getSpec().getHost())); + addParameter(APP_LINK, String.format("%s%s", ROUTE_PROTOCOl, route.getSpec().getHost())); log.info("deployment is successful"); } diff --git a/workflow-examples/src/main/java/com/redhat/parodos/examples/ocponboarding/task/assessment/OnboardingOcpAssessmentTask.java b/workflow-examples/src/main/java/com/redhat/parodos/examples/ocponboarding/task/assessment/OnboardingOcpAssessmentTask.java index 7e70acad9..05df13d48 100644 --- a/workflow-examples/src/main/java/com/redhat/parodos/examples/ocponboarding/task/assessment/OnboardingOcpAssessmentTask.java +++ b/workflow-examples/src/main/java/com/redhat/parodos/examples/ocponboarding/task/assessment/OnboardingOcpAssessmentTask.java @@ -50,7 +50,7 @@ public OnboardingOcpAssessmentTask(List workflowOptions) { @Override public WorkReport execute(WorkContext workContext) { try { - log.info("parameter {} value: {}", GIT_REPO_URL, getRequiredParameterValue(workContext, GIT_REPO_URL)); + log.info("parameter {} value: {}", GIT_REPO_URL, getRequiredParameterValue(GIT_REPO_URL)); } catch (MissingParameterException e) { log.error("can't get parameter {} value", GIT_REPO_URL); diff --git a/workflow-examples/src/main/java/com/redhat/parodos/examples/simple/task/LoggingWorkFlowTask.java b/workflow-examples/src/main/java/com/redhat/parodos/examples/simple/task/LoggingWorkFlowTask.java index 204483ecb..c7017a1d2 100644 --- a/workflow-examples/src/main/java/com/redhat/parodos/examples/simple/task/LoggingWorkFlowTask.java +++ b/workflow-examples/src/main/java/com/redhat/parodos/examples/simple/task/LoggingWorkFlowTask.java @@ -46,8 +46,8 @@ public class LoggingWorkFlowTask extends BaseInfrastructureWorkFlowTask { public WorkReport execute(WorkContext workContext) { log.info("Writing a message to the logs from: {}", getName()); try { - String userId = getRequiredParameterValue(workContext, "user-id"); - String apiServer = getRequiredParameterValue(workContext, "api-server"); + String userId = getRequiredParameterValue("user-id"); + String apiServer = getRequiredParameterValue("api-server"); log.info("task parameter 'api-server' value in {} is {}", getName(), apiServer); log.info("workflow parameter 'user-id' value in {} is {}", getName(), userId); return new DefaultWorkReport(WorkStatus.COMPLETED, workContext); diff --git a/workflow-examples/src/main/java/com/redhat/parodos/examples/simple/task/RestAPIWorkFlowTask.java b/workflow-examples/src/main/java/com/redhat/parodos/examples/simple/task/RestAPIWorkFlowTask.java index 5528c6449..635078372 100644 --- a/workflow-examples/src/main/java/com/redhat/parodos/examples/simple/task/RestAPIWorkFlowTask.java +++ b/workflow-examples/src/main/java/com/redhat/parodos/examples/simple/task/RestAPIWorkFlowTask.java @@ -48,7 +48,7 @@ public class RestAPIWorkFlowTask extends BaseInfrastructureWorkFlowTask { */ public WorkReport execute(WorkContext workContext) { try { - String urlString = getRequiredParameterValue(workContext, URL_KEY); + String urlString = getRequiredParameterValue(URL_KEY); log.info("Running Task REST API Call: urlString: {}", urlString); ResponseEntity result = RestUtils.executeGet(urlString); if (result.getStatusCode().is2xxSuccessful()) { diff --git a/workflow-examples/src/main/java/com/redhat/parodos/examples/simple/task/SecureAPIGetTestTask.java b/workflow-examples/src/main/java/com/redhat/parodos/examples/simple/task/SecureAPIGetTestTask.java index af4583370..6bbde192e 100644 --- a/workflow-examples/src/main/java/com/redhat/parodos/examples/simple/task/SecureAPIGetTestTask.java +++ b/workflow-examples/src/main/java/com/redhat/parodos/examples/simple/task/SecureAPIGetTestTask.java @@ -56,9 +56,9 @@ public class SecureAPIGetTestTask extends BaseInfrastructureWorkFlowTask { */ public WorkReport execute(WorkContext workContext) { try { - String urlString = getRequiredParameterValue(workContext, SECURED_URL); - String username = getRequiredParameterValue(workContext, USERNAME); - String password = getRequiredParameterValue(workContext, PASSWORD); + String urlString = getRequiredParameterValue(SECURED_URL); + String username = getRequiredParameterValue(USERNAME); + String password = getRequiredParameterValue(PASSWORD); log.info("Calling: urlString: {} username: {}", urlString, username); ResponseEntity result = RestUtils.restExchange(urlString, username, password); if (result.getStatusCode().is2xxSuccessful()) { diff --git a/workflow-examples/src/test/java/com/redhat/parodos/examples/ocponboarding/escalation/JiraTicketApprovalEscalationWorkFlowTaskTest.java b/workflow-examples/src/test/java/com/redhat/parodos/examples/ocponboarding/escalation/JiraTicketApprovalEscalationWorkFlowTaskTest.java index 79dbe6243..b023cefa5 100644 --- a/workflow-examples/src/test/java/com/redhat/parodos/examples/ocponboarding/escalation/JiraTicketApprovalEscalationWorkFlowTaskTest.java +++ b/workflow-examples/src/test/java/com/redhat/parodos/examples/ocponboarding/escalation/JiraTicketApprovalEscalationWorkFlowTaskTest.java @@ -51,7 +51,7 @@ public void setUp() { try { doReturn(JIRA_TICKET_URL_TEST).when(this.jiraTicketApprovalEscalationWorkFlowTask) - .getRequiredParameterValue(any(WorkContext.class), eq(ISSUE_LINK_PARAMETER_NAME)); + .getRequiredParameterValue(eq(ISSUE_LINK_PARAMETER_NAME)); } catch (MissingParameterException e) { throw new RuntimeException(e); diff --git a/workflow-examples/src/test/java/com/redhat/parodos/examples/ocponboarding/task/AppLinkEmailNotificationWorkFlowTaskTest.java b/workflow-examples/src/test/java/com/redhat/parodos/examples/ocponboarding/task/AppLinkEmailNotificationWorkFlowTaskTest.java index 6da1ae6b5..981d3355b 100644 --- a/workflow-examples/src/test/java/com/redhat/parodos/examples/ocponboarding/task/AppLinkEmailNotificationWorkFlowTaskTest.java +++ b/workflow-examples/src/test/java/com/redhat/parodos/examples/ocponboarding/task/AppLinkEmailNotificationWorkFlowTaskTest.java @@ -50,7 +50,7 @@ public void setUp() { (AppLinkEmailNotificationWorkFlowTask) getConcretePersonImplementation()); try { doReturn(APP_LINK_TEST).when(this.appLinkEmailNotificationWorkFlowTask) - .getRequiredParameterValue(any(WorkContext.class), eq(APP_LINK_PARAMETER_NAME)); + .getRequiredParameterValue(eq(APP_LINK_PARAMETER_NAME)); } catch (MissingParameterException e) { throw new RuntimeException(e); 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..3d6a9df47 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 @@ -10,6 +10,7 @@ import com.redhat.parodos.workflow.parameter.WorkParameter; import com.redhat.parodos.workflow.task.enums.WorkFlowTaskOutput; import com.redhat.parodos.workflow.task.infrastructure.BaseInfrastructureWorkFlowTask; +import com.redhat.parodos.workflow.task.log.service.WorkFlowLogService; import com.redhat.parodos.workflow.utils.WorkContextUtils; import com.redhat.parodos.workflows.work.WorkContext; import com.redhat.parodos.workflows.work.WorkReport; @@ -20,10 +21,12 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.test.util.ReflectionTestUtils; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.mockito.Mockito.any; +import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mockStatic; import static org.mockito.Mockito.spy; @@ -62,6 +65,9 @@ public class JiraTicketCreationWorkFlowTaskTest extends BaseInfrastructureWorkFl @Before public void setUp() { this.jiraTicketCreationWorkFlowTask = spy((JiraTicketCreationWorkFlowTask) getConcretePersonImplementation()); + WorkFlowLogService workFlowLogService = mock(WorkFlowLogService.class); + doNothing().when(workFlowLogService).writeLog(any(), any(), any()); + ReflectionTestUtils.setField(jiraTicketCreationWorkFlowTask, "workFlowLogService", workFlowLogService); } @Override @@ -89,6 +95,7 @@ public void executeSuccess() { workContextUtilsMockedStatic.when(() -> WorkContextUtils.getProjectId(any(WorkContext.class))) .thenReturn(PROJECT_ID_TEST); + jiraTicketCreationWorkFlowTask.preExecute(workContext); // when WorkReport workReport = jiraTicketCreationWorkFlowTask.execute(workContext); // then @@ -101,15 +108,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()); + jiraTicketCreationWorkFlowTask.preExecute(workContext); + // when + WorkReport workReport = jiraTicketCreationWorkFlowTask.execute(workContext); + // then + assertEquals(WorkStatus.FAILED, workReport.getStatus()); + } } } diff --git a/workflow-examples/src/test/java/com/redhat/parodos/examples/ocponboarding/task/JiraTicketEmailNotificationWorkFlowTaskTest.java b/workflow-examples/src/test/java/com/redhat/parodos/examples/ocponboarding/task/JiraTicketEmailNotificationWorkFlowTaskTest.java index 17c76cd26..6dc2f9efc 100644 --- a/workflow-examples/src/test/java/com/redhat/parodos/examples/ocponboarding/task/JiraTicketEmailNotificationWorkFlowTaskTest.java +++ b/workflow-examples/src/test/java/com/redhat/parodos/examples/ocponboarding/task/JiraTicketEmailNotificationWorkFlowTaskTest.java @@ -51,7 +51,7 @@ public void setUp() { try { doReturn(JIRA_TICKET_URL_TEST).when(this.jiraTicketEmailNotificationWorkFlowTask) - .getRequiredParameterValue(any(WorkContext.class), eq(ISSUE_LINK_PARAMETER_NAME)); + .getRequiredParameterValue(eq(ISSUE_LINK_PARAMETER_NAME)); } catch (MissingParameterException e) { throw new RuntimeException(e); diff --git a/workflow-examples/src/test/java/com/redhat/parodos/examples/ocponboarding/task/NotificationWorkFlowTaskTest.java b/workflow-examples/src/test/java/com/redhat/parodos/examples/ocponboarding/task/NotificationWorkFlowTaskTest.java index 79ec814d3..8252c6503 100644 --- a/workflow-examples/src/test/java/com/redhat/parodos/examples/ocponboarding/task/NotificationWorkFlowTaskTest.java +++ b/workflow-examples/src/test/java/com/redhat/parodos/examples/ocponboarding/task/NotificationWorkFlowTaskTest.java @@ -52,12 +52,10 @@ public void setUp() { this.notificationWorkFlowTask = spy((NotificationWorkFlowTask) getConcretePersonImplementation()); try { doReturn(JIRA_TICKET_URL_WORKFLOW_TASK_PARAMETER_VALUE_TEST).when(this.notificationWorkFlowTask) - .getRequiredParameterValue(any(WorkContext.class), - eq(JIRA_TICKET_URL_WORKFLOW_TASK_PARAMETER_NAME_TEST)); + .getRequiredParameterValue(eq(JIRA_TICKET_URL_WORKFLOW_TASK_PARAMETER_NAME_TEST)); doReturn(OCP_APP_LINK_WORKFLOW_TASK_PARAMETER_VALUE_TEST).when(this.notificationWorkFlowTask) - .getRequiredParameterValue(any(WorkContext.class), - eq(OCP_APP_LINK_WORKFLOW_TASK_PARAMETER_NAME_TEST)); + .getRequiredParameterValue(eq(OCP_APP_LINK_WORKFLOW_TASK_PARAMETER_NAME_TEST)); } catch (MissingParameterException e) { throw new RuntimeException(e); diff --git a/workflow-examples/src/test/java/com/redhat/parodos/examples/simple/task/LoggingWorkFlowTaskTest.java b/workflow-examples/src/test/java/com/redhat/parodos/examples/simple/task/LoggingWorkFlowTaskTest.java index e61285948..31ef6c846 100644 --- a/workflow-examples/src/test/java/com/redhat/parodos/examples/simple/task/LoggingWorkFlowTaskTest.java +++ b/workflow-examples/src/test/java/com/redhat/parodos/examples/simple/task/LoggingWorkFlowTaskTest.java @@ -2,6 +2,7 @@ import java.util.HashMap; import java.util.List; +import java.util.UUID; import com.redhat.parodos.examples.base.BaseInfrastructureWorkFlowTaskTest; import com.redhat.parodos.workflow.context.WorkContextDelegate; @@ -48,6 +49,9 @@ public class LoggingWorkFlowTaskTest extends BaseInfrastructureWorkFlowTaskTest public void setUp() { loggingWorkFlowTask = getConcretePersonImplementation(); workContext = new WorkContext(); + WorkContextDelegate.write(workContext, WorkContextDelegate.ProcessType.WORKFLOW_EXECUTION, + WorkContextDelegate.Resource.ID, UUID.randomUUID()); + loggingWorkFlowTask.preExecute(workContext); WorkContextDelegate.write(workContext, WorkContextDelegate.ProcessType.WORKFLOW_TASK_EXECUTION, WORKFLOW_TASK_NAME, WorkContextDelegate.Resource.ARGUMENTS, new HashMap<>() { { diff --git a/workflow-examples/src/test/java/com/redhat/parodos/examples/simple/task/RestAPIWorkFlowTaskTest.java b/workflow-examples/src/test/java/com/redhat/parodos/examples/simple/task/RestAPIWorkFlowTaskTest.java index 8bc0efdbf..76cb294b8 100644 --- a/workflow-examples/src/test/java/com/redhat/parodos/examples/simple/task/RestAPIWorkFlowTaskTest.java +++ b/workflow-examples/src/test/java/com/redhat/parodos/examples/simple/task/RestAPIWorkFlowTaskTest.java @@ -21,7 +21,6 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.any; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mockStatic; @@ -49,10 +48,8 @@ public void setUp() { this.restAPIWorkflowTask = spy((RestAPIWorkFlowTask) getConcretePersonImplementation()); try { - doReturn(valueUrl).when(this.restAPIWorkflowTask).getRequiredParameterValue(any(WorkContext.class), - eq(URL_KEY)); - doReturn(valuePayload).when(this.restAPIWorkflowTask).getRequiredParameterValue(any(WorkContext.class), - eq(PAYLOAD_KEY)); + doReturn(valueUrl).when(this.restAPIWorkflowTask).getRequiredParameterValue(eq(URL_KEY)); + doReturn(valuePayload).when(this.restAPIWorkflowTask).getRequiredParameterValue(eq(PAYLOAD_KEY)); } catch (MissingParameterException e) { @@ -122,4 +119,4 @@ public void testGetWorkFlowTaskOutputs() { assertEquals(WorkFlowTaskOutput.OTHER, workFlowTaskOutputs.get(1)); } -} \ No newline at end of file +} diff --git a/workflow-examples/src/test/java/com/redhat/parodos/examples/simple/task/SecureAPIGetTestTaskTest.java b/workflow-examples/src/test/java/com/redhat/parodos/examples/simple/task/SecureAPIGetTestTaskTest.java index 73bd07e39..9d162508d 100644 --- a/workflow-examples/src/test/java/com/redhat/parodos/examples/simple/task/SecureAPIGetTestTaskTest.java +++ b/workflow-examples/src/test/java/com/redhat/parodos/examples/simple/task/SecureAPIGetTestTaskTest.java @@ -28,7 +28,6 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.any; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mockStatic; @@ -57,12 +56,9 @@ public class SecureAPIGetTestTaskTest extends BaseInfrastructureWorkFlowTaskTest public void setUp() { this.secureAPIGetTestTask = spy((SecureAPIGetTestTask) getConcretePersonImplementation()); try { - doReturn(testUrl).when(this.secureAPIGetTestTask).getRequiredParameterValue(any(WorkContext.class), - eq(SECURED_URL)); - doReturn(testUsername).when(this.secureAPIGetTestTask).getRequiredParameterValue(any(WorkContext.class), - eq(USERNAME)); - doReturn(testPassword).when(this.secureAPIGetTestTask).getRequiredParameterValue(any(WorkContext.class), - eq(PASSWORD)); + doReturn(testUrl).when(this.secureAPIGetTestTask).getRequiredParameterValue(eq(SECURED_URL)); + doReturn(testUsername).when(this.secureAPIGetTestTask).getRequiredParameterValue(eq(USERNAME)); + doReturn(testPassword).when(this.secureAPIGetTestTask).getRequiredParameterValue(eq(PASSWORD)); } catch (MissingParameterException e) { throw new RuntimeException(e); @@ -164,4 +160,4 @@ public void getWorkFlowTaskOutputs() { assertEquals(WorkFlowTaskOutput.OTHER, workFlowTaskOutputs.get(1)); } -} \ No newline at end of file +} diff --git a/workflow-service-sdk/README.md b/workflow-service-sdk/README.md index c01deba0c..34f32ecde 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}/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 17cc65f7c..7c44b3abd 100644 --- a/workflow-service-sdk/api/openapi.yaml +++ b/workflow-service-sdk/api/openapi.yaml @@ -624,6 +624,58 @@ paths: tags: - Workflow x-accepts: application/json + /api/v1/workflows/{workFlowExecutionId}/log: + get: + operationId: getLog + parameters: + - explode: false + in: path + name: workFlowExecutionId + required: true + schema: + format: uuid + type: string + style: simple + - explode: true + in: query + name: taskName + required: false + schema: + type: string + style: form + 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" /api/v1/workflows/{workFlowExecutionId}/status: get: operationId: getStatus diff --git a/workflow-service-sdk/docs/WorkflowApi.md b/workflow-service-sdk/docs/WorkflowApi.md index 75ff230e8..570480adc 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}/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**| | [optional] | + +### 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 ace5d8009..c0fc7579a 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 @@ -335,6 +335,276 @@ public okhttp3.Call executeAsync(WorkFlowRequestDTO workFlowRequestDTO, return localVarCall; } + /** + * Build call for getLog + * @param workFlowExecutionId (required) + * @param taskName (optional) + * @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}/log".replace("{" + "workFlowExecutionId" + "}", + localVarApiClient.escapeString(workFlowExecutionId.toString())); + + List localVarQueryParams = new ArrayList(); + List localVarCollectionQueryParams = new ArrayList(); + Map localVarHeaderParams = new HashMap(); + Map localVarCookieParams = new HashMap(); + Map localVarFormParams = new HashMap(); + + if (taskName != null) { + localVarQueryParams.addAll(localVarApiClient.parameterToPair("taskName", taskName)); + } + + 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)"); + } + + return getLogCall(workFlowExecutionId, taskName, _callback); + + } + + /** + * Returns workflow execution log + * @param workFlowExecutionId (required) + * @param taskName (optional) + * @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 (optional) + * @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 (optional) + * @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 e5c81fa4d..9a28a0a3f 100644 --- a/workflow-service/generated/openapi/openapi.json +++ b/workflow-service/generated/openapi/openapi.json @@ -866,6 +866,77 @@ "tags" : [ "Workflow" ] } }, + "/api/v1/workflows/{workFlowExecutionId}/log" : { + "get" : { + "operationId" : "getLog", + "parameters" : [ { + "in" : "path", + "name" : "workFlowExecutionId", + "required" : true, + "schema" : { + "type" : "string", + "format" : "uuid" + } + }, { + "in" : "query", + "name" : "taskName", + "required" : false, + "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" ] + } + }, "/api/v1/workflows/{workFlowExecutionId}/status" : { "get" : { "operationId" : "getStatus", diff --git a/workflow-service/src/main/java/com/redhat/parodos/common/exceptions/ResourceType.java b/workflow-service/src/main/java/com/redhat/parodos/common/exceptions/ResourceType.java index 04f7fe1f3..c68b67fad 100644 --- a/workflow-service/src/main/java/com/redhat/parodos/common/exceptions/ResourceType.java +++ b/workflow-service/src/main/java/com/redhat/parodos/common/exceptions/ResourceType.java @@ -7,7 +7,9 @@ public enum ResourceType { USER("User"), ROLE("Role"), WORKFLOW_DEFINITION("Workflow definition"), - WORKFLOW_EXECUTION("Workflow execution"); + WORKFLOW_EXECUTION("Workflow execution"), + WORKFLOW_TASK("Workflow task"), + WORKFLOW_TASK_EXECUTION("Workflow task execution"); // @formatter:on private final String name; diff --git a/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/aspect/WorkFlowTaskExecutionAspect.java b/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/aspect/WorkFlowTaskExecutionAspect.java index 438fd47fc..0464e5484 100644 --- a/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/aspect/WorkFlowTaskExecutionAspect.java +++ b/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/aspect/WorkFlowTaskExecutionAspect.java @@ -30,7 +30,6 @@ import com.redhat.parodos.workflow.execution.scheduler.WorkFlowSchedulerServiceImpl; import com.redhat.parodos.workflow.execution.service.WorkFlowServiceImpl; import com.redhat.parodos.workflow.task.BaseWorkFlowTask; -import com.redhat.parodos.workflow.task.WorkFlowTask; import com.redhat.parodos.workflow.util.WorkFlowDTOUtil; import com.redhat.parodos.workflow.utils.WorkContextUtils; import com.redhat.parodos.workflows.work.DefaultWorkReport; @@ -79,7 +78,7 @@ public WorkFlowTaskExecutionAspect(WorkFlowRepository workFlowRepository, /** * the "execute()" method of all subclasses of WorkFlowTask are targeted */ - @Pointcut("execution(* com.redhat.parodos.workflow.task.WorkFlowTask+.execute(..))") + @Pointcut("execution(* com.redhat.parodos.workflow.task.BaseWorkFlowTask+.execute(..))") public void pointcutScopeTask() { } @@ -93,7 +92,8 @@ public void pointcutScopeTask() { @Around("pointcutScopeTask() && args(workContext)") public WorkReport executeAroundAdviceTask(ProceedingJoinPoint proceedingJoinPoint, WorkContext workContext) { WorkReport report; - String workFlowTaskName = ((WorkFlowTask) proceedingJoinPoint.getTarget()).getName(); + BaseWorkFlowTask workFlowTask = ((BaseWorkFlowTask) proceedingJoinPoint.getTarget()); + String workFlowTaskName = workFlowTask.getName(); log.info("Before invoking execute() on workflow task name: {}", workFlowTaskName); WorkFlowTaskDefinition workFlowTaskDefinition = workFlowTaskDefinitionRepository @@ -118,7 +118,7 @@ public WorkReport executeAroundAdviceTask(ProceedingJoinPoint proceedingJoinPoin WorkContextDelegate.Resource.ARGUMENTS)), workFlowTaskDefinition.getId(), workFlowExecution.getId(), - WorkStatus.IN_PROGRESS); + WorkStatus.IN_PROGRESS); // @formatter:on } else if (WorkStatus.FAILED != workFlowTaskExecution.getStatus()) { @@ -128,6 +128,7 @@ else if (WorkStatus.FAILED != workFlowTaskExecution.getStatus()) { return new DefaultWorkReport(WorkStatus.valueOf(workFlowTaskExecution.getStatus().name()), workContext); } try { + workFlowTask.preExecute(workContext); report = (WorkReport) proceedingJoinPoint.proceed(); if (report == null || report.getStatus() == null) { throw new NullPointerException("task execution not returns status: " + workFlowTaskName); @@ -151,14 +152,14 @@ else if (WorkStatus.FAILED != workFlowTaskExecution.getStatus()) { */ if (WorkStatus.COMPLETED.equals(report.getStatus()) && workFlowTaskDefinition.getWorkFlowCheckerMappingDefinition() != null) { - handleChecker(proceedingJoinPoint, workContext, workFlowTaskDefinition, mainWorkFlowExecution); + handleChecker(workFlowTask, workContext, workFlowTaskDefinition, mainWorkFlowExecution); return new DefaultWorkReport(WorkStatus.PENDING, workContext); } return report; } // Check the WorkFlow for Checkers - private void handleChecker(ProceedingJoinPoint proceedingJoinPoint, WorkContext workContext, + private void handleChecker(BaseWorkFlowTask workFlowTask, WorkContext workContext, WorkFlowTaskDefinition workFlowTaskDefinition, WorkFlowExecution mainWorkFlowExecution) { // if this task has no running checker @@ -167,8 +168,7 @@ private void handleChecker(ProceedingJoinPoint proceedingJoinPoint, WorkContext workFlowTaskDefinition.getWorkFlowCheckerMappingDefinition().getId(), mainWorkFlowExecution); if (checkerWorkFlowExecution == null) { // schedule workflow checker for dynamic run on cron expression - List checkerWorkFlows = ((BaseWorkFlowTask) proceedingJoinPoint.getTarget()) - .getWorkFlowCheckers(); + List checkerWorkFlows = workFlowTask.getWorkFlowCheckers(); startCheckerOnSchedule(mainWorkFlowExecution.getProjectId(), mainWorkFlowExecution.getUser().getId(), workFlowTaskDefinition.getWorkFlowCheckerMappingDefinition().getCheckWorkFlow().getName(), checkerWorkFlows, workFlowTaskDefinition.getWorkFlowCheckerMappingDefinition(), workContext); 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 3e656855d..4f1d90664 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 @@ -30,6 +30,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.task.log.service.WorkFlowLogService; import com.redhat.parodos.workflow.utils.WorkContextUtils; import com.redhat.parodos.workflows.work.WorkReport; import com.redhat.parodos.workflows.work.WorkStatus; @@ -41,6 +42,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; @@ -68,8 +70,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") @@ -150,4 +155,17 @@ 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}/log") + public ResponseEntity getLog(@PathVariable UUID workFlowExecutionId, + @RequestParam(required = false) 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..209ca4878 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 @@ -39,9 +39,11 @@ WorkFlowExecution findFirstByWorkFlowDefinitionIdAndMainWorkFlowExecution(UUID w List findByMainWorkFlowExecution(WorkFlowExecution mainWorkFlowExecution); + List findByMainWorkFlowExecutionId(UUID mainWorkFlowExecutionId); + 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..f8b3f212c --- /dev/null +++ b/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/service/WorkFlowLogServiceImpl.java @@ -0,0 +1,101 @@ +package com.redhat.parodos.workflow.execution.service; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; +import java.util.stream.Collectors; + +import com.redhat.parodos.common.exceptions.IDType; +import com.redhat.parodos.common.exceptions.ResourceNotFoundException; +import com.redhat.parodos.common.exceptions.ResourceType; +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.task.log.dto.WorkFlowTaskLog; +import com.redhat.parodos.workflow.task.log.service.WorkFlowLogService; +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) { + if (taskName == null) { + return workFlowRepository.findByMainWorkFlowExecutionId(mainWorkflowExecutionId).stream() + .map(workFlowExecution -> workFlowTaskRepository + .findByWorkFlowExecutionId(workFlowExecution.getId())) + .flatMap(List::stream).distinct() + .map(workFlowTaskExecution -> workFlowTaskExecution.getWorkFlowTaskExecutionLog().getLog()) + .collect(Collectors.joining(";")); + } + else { + return getTaskLog(mainWorkflowExecutionId, taskName); + } + } + + @Override + public void writeLog(UUID mainWorkflowExecutionId, String taskName, WorkFlowTaskLog workFlowTaskLog) { + WorkFlowTaskExecution workFlowTaskExecution = getWorkFlowTaskExecution(mainWorkflowExecutionId, taskName); + 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()); + } + } + + private WorkFlowTaskExecution getWorkFlowTaskExecution(UUID mainWorkflowExecutionId, String taskName) { + WorkFlowTaskDefinition workFlowTaskDefinition = Optional + .ofNullable(workFlowTaskDefinitionRepository.findFirstByName(taskName)) + .orElseThrow(() -> new ResourceNotFoundException(ResourceType.WORKFLOW_TASK, IDType.NAME, taskName)); + WorkFlowExecution workFlowExecution = Optional + .ofNullable(workFlowRepository.findFirstByMainWorkFlowExecutionIdAndWorkFlowDefinitionId( + mainWorkflowExecutionId, workFlowTaskDefinition.getWorkFlowDefinition().getId())) + .orElseThrow( + () -> new ResourceNotFoundException(ResourceType.WORKFLOW_EXECUTION, mainWorkflowExecutionId)); + return Optional + .ofNullable(workFlowTaskRepository.findByWorkFlowExecutionIdAndWorkFlowTaskDefinitionId( + workFlowExecution.getId(), workFlowTaskDefinition.getId())) + .filter(workFlowTaskExecutions -> !workFlowTaskExecutions.isEmpty()) + .map(workFlowTaskExecutions -> workFlowTaskExecutions.get(0)) + .orElseThrow(() -> new ResourceNotFoundException(ResourceType.WORKFLOW_TASK_EXECUTION, IDType.NAME, + taskName)); + } + + private String getTaskLog(UUID mainWorkflowExecutionId, String taskName) { + WorkFlowTaskExecution workFlowTaskExecution = getWorkFlowTaskExecution(mainWorkflowExecutionId, taskName); + return workFlowTaskExecution.getWorkFlowTaskExecutionLog().getLog(); + } + +} 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/aspect/WorkFlowTaskExecutionAspectTest.java b/workflow-service/src/test/java/com/redhat/parodos/workflow/execution/aspect/WorkFlowTaskExecutionAspectTest.java index 2ecfc4bef..af64edb68 100644 --- a/workflow-service/src/test/java/com/redhat/parodos/workflow/execution/aspect/WorkFlowTaskExecutionAspectTest.java +++ b/workflow-service/src/test/java/com/redhat/parodos/workflow/execution/aspect/WorkFlowTaskExecutionAspectTest.java @@ -12,6 +12,7 @@ import com.redhat.parodos.workflow.execution.repository.WorkFlowRepository; import com.redhat.parodos.workflow.execution.scheduler.WorkFlowSchedulerServiceImpl; import com.redhat.parodos.workflow.execution.service.WorkFlowServiceImpl; +import com.redhat.parodos.workflow.task.BaseWorkFlowTask; import com.redhat.parodos.workflow.task.WorkFlowTask; import com.redhat.parodos.workflows.work.DefaultWorkReport; import com.redhat.parodos.workflows.work.WorkContext; @@ -75,7 +76,7 @@ public void executeAroundAdviceTask() { // given UUID projectID = UUID.randomUUID(); WorkContext workContext = getSampleWorkContext(projectID, TEST_TASK); - WorkFlowTask workFlowTask = getSampleWorkFlowTask(TEST_TASK); + BaseWorkFlowTask workFlowTask = getSampleWorkFlowTask(TEST_TASK); ProceedingJoinPoint proceedingJoinPoint = mock(ProceedingJoinPoint.class); when(proceedingJoinPoint.getTarget()).thenReturn(workFlowTask); @@ -154,8 +155,8 @@ WorkContext getSampleWorkContext(UUID projectID, String taskName) { }; } - WorkFlowTask getSampleWorkFlowTask(String taskName) { - WorkFlowTask workFlowTask = mock(WorkFlowTask.class); + BaseWorkFlowTask getSampleWorkFlowTask(String taskName) { + BaseWorkFlowTask workFlowTask = mock(BaseWorkFlowTask.class); when(workFlowTask.getName()).thenReturn(taskName); return workFlowTask; } diff --git a/workflow-service/src/test/java/com/redhat/parodos/workflow/execution/controller/WorkFlowControllerTest.java b/workflow-service/src/test/java/com/redhat/parodos/workflow/execution/controller/WorkFlowControllerTest.java index f65839a53..cc931bc3e 100644 --- a/workflow-service/src/test/java/com/redhat/parodos/workflow/execution/controller/WorkFlowControllerTest.java +++ b/workflow-service/src/test/java/com/redhat/parodos/workflow/execution/controller/WorkFlowControllerTest.java @@ -12,6 +12,7 @@ import com.redhat.parodos.workflow.execution.dto.WorkFlowResponseDTO; import com.redhat.parodos.workflow.execution.dto.WorkFlowStatusResponseDTO; import com.redhat.parodos.workflow.execution.dto.WorkStatusResponseDTO; +import com.redhat.parodos.workflow.execution.service.WorkFlowLogServiceImpl; import com.redhat.parodos.workflow.execution.service.WorkFlowServiceImpl; import com.redhat.parodos.workflows.work.DefaultWorkReport; import com.redhat.parodos.workflows.work.WorkContext; @@ -56,6 +57,9 @@ class WorkFlowControllerTest extends ControllerMockClient { @MockBean private WorkFlowServiceImpl workFlowService; + @MockBean + private WorkFlowLogServiceImpl workFlowLogService; + @Test public void ExecuteWithoutAuth() throws Exception { // when @@ -254,6 +258,21 @@ void TestGetWorkFlowByProjectIdWithValidData() throws Exception { .jsonPath("$[0].workStatus", equalToIgnoringCase(WorkStatus.COMPLETED.name()))); } + @Test + void TestGetWorkFlowTaskLogWithValidData() throws Exception { + UUID workFlowExecutionId = UUID.randomUUID(); + String taskName = "test-task"; + String taskLog = "test-log"; + when(workFlowLogService.getLog(workFlowExecutionId, taskName)).thenReturn(taskLog); + // when + this.mockMvc + .perform(this.getRequestWithValidCredentials("/api/v1/workflows/" + workFlowExecutionId + "/log") + .param("taskName", taskName)) + .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(MockMvcResultMatchers.content().contentType("text/plain;charset=UTF-8")) + .andExpect(MockMvcResultMatchers.content().string(taskLog)); + } + private String getWorkFlowCheckerTaskRequestDTOJsonPayload() throws JsonProcessingException { ObjectMapper objectMapper = new ObjectMapper(); WorkFlowCheckerTaskRequestDTO workFlowCheckerTaskRequestDTO = WorkFlowCheckerTaskRequestDTO.builder() 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..20dad23fd --- /dev/null +++ b/workflow-service/src/test/java/com/redhat/parodos/workflow/execution/service/WorkFlowLogServiceImplTest.java @@ -0,0 +1,129 @@ +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.WorkFlowLogLevel; +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.task.log.dto.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.assertj.core.api.Assertions.assertThat; +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().workFlowLoglevel(WorkFlowLogLevel.INFO).logText("test-log1").build()); + + ArgumentCaptor argument = ArgumentCaptor.forClass(WorkFlowTaskExecution.class); + verify(workFlowTaskRepository, times(1)).save(argument.capture()); + assertThat(argument.getValue().getWorkFlowTaskExecutionLog().getLog()).startsWith("test-log\n") + .endsWith("\u001B[32mINFO\u001B[39m test-log1"); + + } + + 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 61bda6d55..20adf916e 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 @@ -552,8 +552,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)); @@ -728,8 +728,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));