diff --git a/conductor-client/src/main/java/com/netflix/conductor/common/metadata/workflow/WorkflowTask.java b/conductor-client/src/main/java/com/netflix/conductor/common/metadata/workflow/WorkflowTask.java index a530b43d..9a4571f9 100644 --- a/conductor-client/src/main/java/com/netflix/conductor/common/metadata/workflow/WorkflowTask.java +++ b/conductor-client/src/main/java/com/netflix/conductor/common/metadata/workflow/WorkflowTask.java @@ -84,8 +84,10 @@ public static class WorkflowTaskList { private List> forkTasks = new LinkedList<>(); - private int // No. of seconds (at-least) to wait before starting a task. - startDelay; + /** + * No. of seconds (at-least) to wait before starting a task. + */ + private int startDelay; private SubWorkflowParams subWorkflowParam; diff --git a/orkes-client/src/main/java/io/orkes/conductor/client/http/OrkesWorkflowClient.java b/orkes-client/src/main/java/io/orkes/conductor/client/http/OrkesWorkflowClient.java index b3ff235e..0b87ea7f 100644 --- a/orkes-client/src/main/java/io/orkes/conductor/client/http/OrkesWorkflowClient.java +++ b/orkes-client/src/main/java/io/orkes/conductor/client/http/OrkesWorkflowClient.java @@ -30,6 +30,9 @@ import com.netflix.conductor.client.http.ConductorClient; import com.netflix.conductor.client.http.WorkflowClient; +import com.netflix.conductor.common.metadata.tasks.Task; +import com.netflix.conductor.common.metadata.workflow.RerunWorkflowRequest; +import com.netflix.conductor.common.metadata.workflow.SkipTaskRequest; import com.netflix.conductor.common.metadata.workflow.StartWorkflowRequest; import com.netflix.conductor.common.metadata.workflow.UpgradeWorkflowRequest; import com.netflix.conductor.common.model.BulkResponse; @@ -324,4 +327,65 @@ public CompletableFuture executeWorkflowWithReturnStrategy( return future; } + + public SearchResult getExecutionStatusTaskList(String workflowId, + Integer start, + Integer count, + List status) { + return workflowResource.getExecutionStatusTaskList(workflowId, start, count, status); + } + + public Map> getWorkflows(String name, + List correlationIds, + Boolean includeClosed, + Boolean includeTasks) { + return workflowResource.getWorkflows(name, correlationIds, includeClosed, includeTasks); + } + + public List getWorkflows(String name, + String correlationId, + Boolean includeClosed, + Boolean includeTasks) { + return workflowResource.getWorkflows(name, correlationId, includeClosed, includeTasks); + } + + public SearchResult search(Integer start, + Integer size, + String sort, + String freeText, + String query, + Boolean skipCache) { + return workflowResource.search(start, size, sort, freeText, query, skipCache); + } + + public String rerun(String workflowId, RerunWorkflowRequest rerunRequest) { + return workflowResource.rerun(workflowId, rerunRequest); + } + /** + * Resets callback times of all non-terminal SIMPLE tasks to 0 + * @param workflowId the workflow id to reset callbacks for + */ + public void resetWorkflow(String workflowId) { + workflowResource.resetWorkflow(workflowId); + } + + public void retryWorkflow(String workflowId, Boolean resumeSubworkflowTasks, Boolean retryIfRetriedByParent) { + workflowResource.retryWorkflow(workflowId, resumeSubworkflowTasks, retryIfRetriedByParent); + } + + public void restartWorkflow(String workflowId, Boolean useLatestDefinitions) { + workflowResource.restartWorkflow(workflowId, useLatestDefinitions); + } + + public void skipTaskFromWorkflow(String workflowId, String taskReferenceName, SkipTaskRequest request) { + workflowResource.skipTaskFromWorkflow(workflowId, taskReferenceName, request); + } + + public List getRunningWorkflow(String name, Integer version, Long startTime, Long endTime) { + return workflowResource.getRunningWorkflow(name, version, startTime, endTime); + } + + public void decide(String workflowId) { + workflowResource.decide(workflowId); + } } \ No newline at end of file diff --git a/orkes-client/src/main/java/io/orkes/conductor/client/http/WorkflowResource.java b/orkes-client/src/main/java/io/orkes/conductor/client/http/WorkflowResource.java index 06073e47..3120e2e4 100644 --- a/orkes-client/src/main/java/io/orkes/conductor/client/http/WorkflowResource.java +++ b/orkes-client/src/main/java/io/orkes/conductor/client/http/WorkflowResource.java @@ -14,14 +14,21 @@ import java.util.List; import java.util.Map; +import java.util.Objects; import com.netflix.conductor.client.http.ConductorClient; import com.netflix.conductor.client.http.ConductorClientRequest; import com.netflix.conductor.client.http.ConductorClientRequest.Method; import com.netflix.conductor.client.http.ConductorClientResponse; +import com.netflix.conductor.common.metadata.tasks.Task; +import com.netflix.conductor.common.metadata.workflow.RerunWorkflowRequest; +import com.netflix.conductor.common.metadata.workflow.SkipTaskRequest; import com.netflix.conductor.common.metadata.workflow.StartWorkflowRequest; import com.netflix.conductor.common.metadata.workflow.UpgradeWorkflowRequest; +import com.netflix.conductor.common.run.SearchResult; import com.netflix.conductor.common.run.Workflow; +import com.netflix.conductor.common.run.WorkflowSummary; +import com.netflix.conductor.common.run.WorkflowTestRequest; import io.orkes.conductor.client.enums.Consistency; import io.orkes.conductor.client.enums.ReturnStrategy; @@ -135,6 +142,25 @@ WorkflowStatus getWorkflowStatusSummary(String workflowId, Boolean includeOutput return resp.getData(); } + SearchResult getExecutionStatusTaskList(String workflowId, + Integer start, + Integer count, + List status) { + ConductorClientRequest request = ConductorClientRequest.builder() + .method(Method.GET) + .path("/workflow/{workflowId}/tasks") + .addPathParam("workflowId", workflowId) + .addQueryParam("start", start) + .addQueryParam("count", count) + .addQueryParams("status", status.stream().map(Objects::toString).toList()) + .build(); + + ConductorClientResponse> resp = client.execute(request, new TypeReference<>() { + }); + + return resp.getData(); + } + Map> getWorkflowsByNamesAndCorrelationIds(CorrelationIdsSearchRequest searchRequest, Boolean includeClosed, Boolean includeTasks) { @@ -152,6 +178,44 @@ Map> getWorkflowsByNamesAndCorrelationIds(CorrelationIdsS return resp.getData(); } + Map> getWorkflows(String name, + List correlationIds, + Boolean includeClosed, + Boolean includeTasks) { + ConductorClientRequest request = ConductorClientRequest.builder() + .method(Method.POST) + .path("/workflow/{name}/correlated") + .addPathParam("name", name) + .addQueryParam("includeClosed", includeClosed) + .addQueryParam("includeTasks", includeTasks) + .body(correlationIds) + .build(); + + ConductorClientResponse>> resp = client.execute(request, new TypeReference<>() { + }); + + return resp.getData(); + } + + List getWorkflows(String name, + String correlationId, + Boolean includeClosed, + Boolean includeTasks) { + ConductorClientRequest request = ConductorClientRequest.builder() + .method(Method.GET) + .path("/workflow/{name}/correlated/{correlationId}") + .addPathParam("name", name) + .addPathParam("correlationId", correlationId) + .addQueryParam("includeClosed", includeClosed) + .addQueryParam("includeTasks", includeTasks) + .build(); + + ConductorClientResponse> resp = client.execute(request, new TypeReference<>() { + }); + + return resp.getData(); + } + void uploadCompletedWorkflows() { ConductorClientRequest request = ConductorClientRequest.builder() .method(Method.POST) @@ -252,4 +316,174 @@ SignalResponse executeWorkflowWithReturnStrategy(StartWorkflowRequest req, return resp.getData(); } + + void decide(String workflowId) { + ConductorClientRequest request = ConductorClientRequest.builder() + .method(Method.PUT) + .path("/workflow/decide/{workflowId}") + .addPathParam("workflowId", workflowId) + .build(); + + client.execute(request); + } + + String startWorkflow(StartWorkflowRequest req) { + ConductorClientRequest request = ConductorClientRequest.builder() + .method(Method.POST) + .path("/workflow") + .body(req) + .build(); + + ConductorClientResponse resp = client.execute(request, new TypeReference<>() { + }); + + return resp.getData(); + } + + List getRunningWorkflow(String name, Integer version, Long startTime, Long endTime) { + ConductorClientRequest request = ConductorClientRequest.builder() + .method(Method.GET) + .path("/workflow/running/{name}") + .addPathParam("name", name) + .addQueryParam("version", version) + .addQueryParam("startTime", startTime) + .addQueryParam("endTime", endTime) + .build(); + + ConductorClientResponse> resp = client.execute(request, new TypeReference<>() { + }); + + return resp.getData(); + } + + SearchResult search(Integer start, + Integer size, + String sort, + String freeText, + String query, + Boolean skipCache) { + ConductorClientRequest request = ConductorClientRequest.builder() + .method(Method.GET) + .path("/workflow/search") + .addQueryParam("start", start) + .addQueryParam("size", size) + .addQueryParam("sort", sort) + .addQueryParam("freeText", freeText) + .addQueryParam("query", query) + .addQueryParam("skipCache", skipCache) + .build(); + + ConductorClientResponse> resp = client.execute(request, new TypeReference<>() { + }); + + return resp.getData(); + } + + Workflow testWorkflow(WorkflowTestRequest req) { + ConductorClientRequest request = ConductorClientRequest.builder() + .method(Method.POST) + .path("/workflow/test") + .body(req) + .build(); + + ConductorClientResponse resp = client.execute(request, new TypeReference<>() { + }); + + return resp.getData(); + } + + void deleteWorkflow(String workflowId, Boolean archiveWorkflow) { + ConductorClientRequest request = ConductorClientRequest.builder() + .method(Method.DELETE) + .path("/workflow/{workflowId}/remove") + .addPathParam("workflowId", workflowId) + .addQueryParam("archiveWorkflow", archiveWorkflow) + .build(); + + client.execute(request); + } + + String rerun(String workflowId, RerunWorkflowRequest rerunRequest) { + ConductorClientRequest request = ConductorClientRequest.builder() + .method(Method.POST) + .path("/workflow/{workflowId}/rerun") + .addPathParam("workflowId", workflowId) + .body(rerunRequest) + .build(); + + ConductorClientResponse resp = client.execute(request, new TypeReference<>() { + }); + + return resp.getData(); + } + + /** + * Resets callback times of all non-terminal SIMPLE tasks to 0 + * @param workflowId the workflow id to reset callbacks for + */ + void resetWorkflow(String workflowId) { + ConductorClientRequest request = ConductorClientRequest.builder() + .method(Method.POST) + .path("/workflow/{workflowId}/resetcallbacks") + .addPathParam("workflowId", workflowId) + .build(); + + client.execute(request); + } + + void retryWorkflow(String workflowId, Boolean resumeSubworkflowTasks, Boolean retryIfRetriedByParent) { + ConductorClientRequest request = ConductorClientRequest.builder() + .method(Method.POST) + .path("/workflow/{workflowId}/retry") + .addPathParam("workflowId", workflowId) + .addQueryParam("resumeSubworkflowTasks", resumeSubworkflowTasks) + .addQueryParam("retryIfRetriedByParent", retryIfRetriedByParent) + .build(); + + client.execute(request); + } + + void restartWorkflow(String workflowId, Boolean useLatestDefinitions) { + ConductorClientRequest request = ConductorClientRequest.builder() + .method(Method.POST) + .path("/workflow/{workflowId}/restart") + .addPathParam("workflowId", workflowId) + .addQueryParam("useLatestDefinitions", useLatestDefinitions) + .build(); + + client.execute(request); + } + + void resumeWorkflow(String workflowId) { + ConductorClientRequest request = ConductorClientRequest.builder() + .method(Method.PUT) + .path("/workflow/{workflowId}/resume") + .addPathParam("workflowId", workflowId) + .build(); + + client.execute(request); + } + + void pauseWorkflow(String workflowId) { + ConductorClientRequest request = ConductorClientRequest.builder() + .method(Method.PUT) + .path("/workflow/{workflowId}/pause") + .addPathParam("workflowId", workflowId) + .build(); + + client.execute(request); + } + + void skipTaskFromWorkflow(String workflowId, String taskReferenceName, SkipTaskRequest requestBody) { + ConductorClientRequest request = ConductorClientRequest.builder() + .method(Method.PUT) + .path("/workflow/{workflowId}/skiptask/{taskReferenceName}") + .addPathParam("workflowId", workflowId) + .addPathParam("taskReferenceName", taskReferenceName) + .body(requestBody) + .build(); + + client.execute(request); + } + } diff --git a/tests/src/test/java/io/orkes/conductor/client/http/WorkflowClientTests.java b/tests/src/test/java/io/orkes/conductor/client/http/WorkflowClientTests.java index 43187fdd..12760b2e 100644 --- a/tests/src/test/java/io/orkes/conductor/client/http/WorkflowClientTests.java +++ b/tests/src/test/java/io/orkes/conductor/client/http/WorkflowClientTests.java @@ -16,15 +16,16 @@ import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; +import com.netflix.conductor.common.metadata.tasks.Task; +import com.netflix.conductor.common.metadata.tasks.TaskType; +import com.netflix.conductor.common.metadata.workflow.*; +import lombok.SneakyThrows; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import com.netflix.conductor.common.metadata.tasks.TaskDef; import com.netflix.conductor.common.metadata.tasks.TaskResult; -import com.netflix.conductor.common.metadata.workflow.StartWorkflowRequest; -import com.netflix.conductor.common.metadata.workflow.WorkflowDef; -import com.netflix.conductor.common.metadata.workflow.WorkflowTask; import com.netflix.conductor.common.run.Workflow; import com.netflix.conductor.common.run.WorkflowTestRequest; import com.netflix.conductor.sdk.workflow.def.ConductorWorkflow; @@ -88,8 +89,7 @@ public void testSearchByCorrelationIds() { Assertions.assertEquals(correlationIds.size(), result.size()); for (String correlationId : correlationIds) { Assertions.assertEquals(5, result.get(correlationId).size()); - Set ids = result.get(correlationId).stream().map(Workflow::getWorkflowId) - .collect(Collectors.toSet()); + Set ids = result.get(correlationId).stream().map(Workflow::getWorkflowId).collect(Collectors.toSet()); Assertions.assertEquals(correlationIdToWorkflows.get(correlationId), ids); } } @@ -97,8 +97,7 @@ public void testSearchByCorrelationIds() { @Test public void testWorkflowTerminate() { String workflowId = workflowClient.startWorkflow(getStartWorkflowRequest()); - workflowClient.terminateWorkflowWithFailure( - workflowId, "testing out some stuff", true); + workflowClient.terminateWorkflowWithFailure(workflowId, "testing out some stuff", true); var workflow = workflowClient.getWorkflow(workflowId, false); Assertions.assertEquals(Workflow.WorkflowStatus.TERMINATED, workflow.getStatus()); } @@ -116,29 +115,24 @@ public void testSkipTaskFromWorkflow() throws Exception { taskDef2.setRetryCount(0); taskDef2.setOwnerEmail("test@orkes.io"); - TestUtil.retryMethodCall( - () -> metadataClient.registerTaskDefs(List.of(taskDef1, taskDef2))); + TestUtil.retryMethodCall(() -> metadataClient.registerTaskDefs(List.of(taskDef1, taskDef2))); var wf = new ConductorWorkflow<>(workflowExecutor); wf.setName(workflowName); wf.setVersion(1); wf.add(new SimpleTask(taskName1, taskName1)); wf.add(new SimpleTask(taskName2, taskName2)); - TestUtil.retryMethodCall( - () -> wf.registerWorkflow(true)); + TestUtil.retryMethodCall(() -> wf.registerWorkflow(true)); StartWorkflowRequest startWorkflowRequest = new StartWorkflowRequest(); startWorkflowRequest.setName(workflowName); startWorkflowRequest.setVersion(1); startWorkflowRequest.setInput(new HashMap<>()); - var workflowId = (String) TestUtil.retryMethodCall( - () -> workflowClient.startWorkflow(startWorkflowRequest)); + var workflowId = (String) TestUtil.retryMethodCall(() -> workflowClient.startWorkflow(startWorkflowRequest)); System.out.println("workflowId: " + workflowId); - TestUtil.retryMethodCall( - () -> workflowClient.skipTaskFromWorkflow(workflowId, taskName2)); - TestUtil.retryMethodCall( - () -> workflowClient.terminateWorkflowsWithFailure(List.of(workflowId), null, false)); + TestUtil.retryMethodCall(() -> workflowClient.skipTaskFromWorkflow(workflowId, taskName2)); + TestUtil.retryMethodCall(() -> workflowClient.terminateWorkflowsWithFailure(List.of(workflowId), null, false)); } @Test @@ -200,15 +194,120 @@ void testWorkflow() { WorkflowTestRequest testRequest = new WorkflowTestRequest(); testRequest.setName("testable-flow"); testRequest.setWorkflowDef(workflowDef); - testRequest.setTaskRefToMockOutput(Map.of( - "testable-task-ref", - List.of(new WorkflowTestRequest.TaskMock(TaskResult.Status.COMPLETED, Map.of("result", "ok"))) - )); + testRequest.setTaskRefToMockOutput(Map.of("testable-task-ref", List.of(new WorkflowTestRequest.TaskMock(TaskResult.Status.COMPLETED, Map.of("result", "ok"))))); Workflow workflow = workflowClient.testWorkflow(testRequest); Assertions.assertEquals("ok", workflow.getOutput().get("result")); } + @Test + void restartWorkflowTest() { + String workflowId = workflowClient.startWorkflow(getDefaultWorkflowWithDefinition()); + workflowClient.terminateWorkflowWithFailure(workflowId, "testing out some stuff", true); + var workflow = workflowClient.getWorkflow(workflowId, false); + Assertions.assertEquals(Workflow.WorkflowStatus.TERMINATED, workflow.getStatus()); + workflowClient.restartWorkflow(workflowId, false); + var restartedWorkflow = workflowClient.getWorkflow(workflowId, false); + Assertions.assertEquals(Workflow.WorkflowStatus.RUNNING, restartedWorkflow.getStatus()); + Assertions.assertEquals(workflowId, restartedWorkflow.getWorkflowId()); + } + + @Test + @SneakyThrows + void decideEndpointTest() { + String workflowId = workflowClient.startWorkflow(getDefaultWorkflowWithDefinition()); + + workflowClient.decide(workflowId); + // TODO: there is no good way to test it, the workflow should stuck first. + } + + @Test + @SneakyThrows + void rerunWorkflowTest() { + var future = workflowClient.executeWorkflow(getDefaultWorkflowWithDefinition(), "", 2000); + var workflowRun = future.get(); + Assertions.assertEquals(Workflow.WorkflowStatus.COMPLETED, workflowRun.getStatus()); + + var workflow = workflowClient.getWorkflow(workflowRun.getWorkflowId(), true); + var rerunRequest = RerunWorkflowRequest.builder().reRunFromTaskId(workflow.getTasks().getFirst().getTaskId()).build(); + workflowClient.rerun(workflowRun.getWorkflowId(), rerunRequest); + var rerunedWorkflow = workflowClient.getWorkflow(workflowRun.getWorkflowId(), false); + Assertions.assertEquals(Workflow.WorkflowStatus.RUNNING, rerunedWorkflow.getStatus()); + } + + @Test + @SneakyThrows + void getExecutionStatusTaskListTest() { + var workflowId = workflowClient.startWorkflow(getDefaultWorkflowWithDefinition()); + + Thread.sleep(50); // make sure the workflow is really started. + + var taskList = workflowClient.getExecutionStatusTaskList(workflowId, 0, 10, List.of(Task.Status.COMPLETED, Task.Status.IN_PROGRESS, Task.Status.SCHEDULED)); + Assertions.assertEquals(2, taskList.getResults().size()); + } + + @Test + @SneakyThrows + void searchTest() { + var now = System.currentTimeMillis(); + var workflowId = workflowClient.startWorkflow(getDefaultWorkflowWithDefinition()); + Thread.sleep(50); // make sure the workflow is really started. + var result = workflowClient.search(0, 10, "", "", "startTime > " + now, false); + Assertions.assertTrue(result.getResults().stream().anyMatch(w -> w.getWorkflowId().equals(workflowId))); + } + + @Test + @SneakyThrows + void resetWorkflowCallbacksTest() { + final String simpleTaskName = "java_sdk_test_simple_inline-"+ UUID.randomUUID(); + var taskClient = ClientTestUtil.getOrkesClients().getTaskClient(); + + var request = getDefaultWorkflowWithDefinition(); + request.getWorkflowDef().setTasks(List.of(getSimpleTaskWithDelay(simpleTaskName))); + var workflowId = workflowClient.startWorkflow(request); + + Thread.sleep(50); + var workerId = UUID.randomUUID().toString(); + var task = taskClient.pollTask(simpleTaskName, workerId, null); + Assertions.assertNull(task); + + workflowClient.resetWorkflow(workflowId); + Thread.sleep(50); + var taskAfterReset = taskClient.pollTask(simpleTaskName, workerId, null); + + Assertions.assertNotNull(taskAfterReset); + + // sending results to make workflow complete + TaskResult taskResult = new TaskResult(taskAfterReset); + taskResult.setStatus(TaskResult.Status.COMPLETED); + taskClient.updateTask(taskResult); + + + } + + @Test + @SneakyThrows + void retryWorkflowTest() { + var workflow = workflowClient.executeWorkflow(getFailingWorkflowWithDefinition(), "", 2000).get(); + Assertions.assertEquals(Workflow.WorkflowStatus.FAILED, workflow.getStatus()); + + workflowClient.retryWorkflow(workflow.getWorkflowId(), true, true); + + var workflowAfterRetry = workflowClient.getWorkflow(workflow.getWorkflowId(), false); + Assertions.assertEquals(Workflow.WorkflowStatus.RUNNING, workflowAfterRetry.getStatus()); + Assertions.assertEquals(workflow.getWorkflowId(), workflowAfterRetry.getWorkflowId()); + + Thread.sleep(100); // It should fail quickly again + + var workflowAfterRetryAndTimeout = workflowClient.getWorkflow(workflowAfterRetry.getWorkflowId(), false); + // Assertions.assertEquals(Workflow.WorkflowStatus.FAILED, workflowAfterRetryAndTimeout.getStatus()); // !!FAIL!! + + workflowClient.decide(workflowAfterRetry.getWorkflowId()); + + var workflowAfterDecide = workflowClient.getWorkflow(workflowAfterRetry.getWorkflowId(), false); + Assertions.assertEquals(Workflow.WorkflowStatus.FAILED, workflowAfterDecide.getStatus()); + } + StartWorkflowRequest getStartWorkflowRequest() { StartWorkflowRequest startWorkflowRequest = new StartWorkflowRequest(); startWorkflowRequest.setName(Commons.WORKFLOW_NAME); @@ -216,4 +315,67 @@ StartWorkflowRequest getStartWorkflowRequest() { startWorkflowRequest.setInput(new HashMap<>()); return startWorkflowRequest; } + + StartWorkflowRequest getFailingWorkflowWithDefinition() { + WorkflowTask awaitTask = getAwaitTask(); + + WorkflowTask task = new WorkflowTask(); + task.setName("test_exception"); + task.setTaskReferenceName("test_exception-ref"); + task.setType(TaskType.INLINE.toString()); + task.setInputParameters(Map.of("expression", "(function () { throw new Error('test error');})();", + "evaluatorType", "graaljs")); + + WorkflowDef workflowDef = new WorkflowDef(); + workflowDef.setName("test_failing_workflow"); + workflowDef.setTasks(List.of(awaitTask, task)); + + StartWorkflowRequest startWorkflowRequest = new StartWorkflowRequest(); + startWorkflowRequest.setName("test_failing_workflow"); + startWorkflowRequest.setVersion(1); + startWorkflowRequest.setWorkflowDef(workflowDef); + + return startWorkflowRequest; + } + + StartWorkflowRequest getDefaultWorkflowWithDefinition() { + WorkflowTask awaitTask = getAwaitTask(); + + WorkflowTask task = new WorkflowTask(); + task.setName("test_simple_inline"); + task.setTaskReferenceName("test_simple_inline-ref"); + task.setType(TaskType.INLINE.toString()); + task.setInputParameters(Map.of("expression", "(function () { return 42;})();", + "evaluatorType", "graaljs")); + + WorkflowDef workflowDef = new WorkflowDef(); + workflowDef.setName("test_java_sdk_default_workflow"); + workflowDef.setTasks(List.of(task, awaitTask)); + + StartWorkflowRequest startWorkflowRequest = new StartWorkflowRequest(); + startWorkflowRequest.setName("test_java_sdk_default_workflow"); + startWorkflowRequest.setVersion(1); + startWorkflowRequest.setWorkflowDef(workflowDef); + + return startWorkflowRequest; + } + + WorkflowTask getAwaitTask() { + WorkflowTask awaitTask = new WorkflowTask(); + awaitTask.setName("test_await"); + var uuid = UUID.randomUUID().toString(); + awaitTask.setTaskReferenceName("test_await-ref-" + uuid); + awaitTask.setType(TaskType.WAIT.toString()); + awaitTask.setInputParameters(Map.of("duration", "1 seconds")); + return awaitTask; + } + + WorkflowTask getSimpleTaskWithDelay(String name){ + WorkflowTask simpleTask = new WorkflowTask(); + simpleTask.setName(name); + simpleTask.setTaskReferenceName(name + "-ref"); + simpleTask.setType(TaskType.SIMPLE.toString()); + simpleTask.setStartDelay(600); // 10 minutes + return simpleTask; + } } \ No newline at end of file