From 7bc23a8c3357053319d51beed43b23a52cd06983 Mon Sep 17 00:00:00 2001 From: Gloria Ciavarrini Date: Mon, 3 Apr 2023 12:22:20 +0200 Subject: [PATCH 1/4] Rewrite Complex Flow Signed-off-by: Gloria Ciavarrini --- .../examples/integration/ComplexWorkFlow.java | 169 ++++++++++++++++++ .../integration/utils/ExamplesUtils.java | 100 ++++++++++- 2 files changed, 267 insertions(+), 2 deletions(-) create mode 100644 workflow-examples/src/test/java/com/redhat/parodos/examples/integration/ComplexWorkFlow.java diff --git a/workflow-examples/src/test/java/com/redhat/parodos/examples/integration/ComplexWorkFlow.java b/workflow-examples/src/test/java/com/redhat/parodos/examples/integration/ComplexWorkFlow.java new file mode 100644 index 000000000..7de3928ce --- /dev/null +++ b/workflow-examples/src/test/java/com/redhat/parodos/examples/integration/ComplexWorkFlow.java @@ -0,0 +1,169 @@ +package com.redhat.parodos.examples.integration; + +import com.redhat.parodos.examples.integration.utils.ExamplesUtils; +import com.redhat.parodos.sdk.api.ProjectApi; +import com.redhat.parodos.sdk.api.WorkflowApi; +import com.redhat.parodos.sdk.api.WorkflowDefinitionApi; +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.model.ArgumentRequestDTO; +import com.redhat.parodos.sdk.model.ProjectRequestDTO; +import com.redhat.parodos.sdk.model.ProjectResponseDTO; +import com.redhat.parodos.sdk.model.WorkFlowDefinitionResponseDTO; +import com.redhat.parodos.sdk.model.WorkFlowRequestDTO; +import com.redhat.parodos.sdk.model.WorkFlowResponseDTO; +import com.redhat.parodos.sdk.model.WorkFlowResponseDTO.WorkStatusEnum; +import com.redhat.parodos.sdk.model.WorkFlowStatusResponseDTO; +import com.redhat.parodos.sdk.model.WorkRequestDTO; +import com.redhat.parodos.workflow.utils.CredUtils; +import lombok.extern.slf4j.Slf4j; +import org.junit.Before; +import org.junit.Test; +import org.springframework.http.HttpHeaders; + +import java.io.IOException; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; + +import static com.redhat.parodos.examples.integration.utils.ExamplesUtils.getProjectByNameAndDescription; +import static com.redhat.parodos.examples.integration.utils.ExamplesUtils.waitAsyncStatusResponse; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +/** + * @author Gloria Ciavarrini (Github: gciavarrini) + */ +@Slf4j +public class ComplexWorkFlow { + + private static final String projectName = "project-1"; + + private static final String projectDescription = "an example project"; + + private ApiClient apiClient; + + @Before + public void setUp() throws IOException { + apiClient = Configuration.getDefaultApiClient(); + apiClient.addDefaultHeader(HttpHeaders.AUTHORIZATION, "Basic " + CredUtils.getBase64Creds("test", "test")); + } + + @Test + public void runComplexWorkFlow() throws ApiException, InterruptedException { + log.info("Running complex flow"); + ProjectApi projectApi = new ProjectApi(apiClient); + + ExamplesUtils.waitProjectStart(projectApi); + log.info("Project is ✔️ on {}", apiClient.getBasePath()); + + ProjectResponseDTO testProject; + + // RETRIEVE ALL PROJECTS AVAILABLE + log.info("Get all available projects"); + List projects = projectApi.getProjects(); + + // CHECK IF testProject ALREADY EXISTS + testProject = getProjectByNameAndDescription(projects, projectName, projectDescription); + + // CREATE PROJECT "Test Project Name" IF NOT EXISTS + if (testProject == null) { + log.info("There are no projects. Creating project {}", projectName); + // DEFINE A TEST PROJECT REQUEST + ProjectRequestDTO projectRequestDTO = new ProjectRequestDTO(); + projectRequestDTO.setName(projectName); + projectRequestDTO.setDescription(projectDescription); + + ProjectResponseDTO projectResponseDTO = projectApi.createProject(projectRequestDTO); + assertNotNull(projectResponseDTO); + assertEquals(projectName, projectResponseDTO.getName()); + assertEquals(projectDescription, projectResponseDTO.getDescription()); + log.info("Project {} successfully created", projectName); + } + + // ASSERT PROJECT "testProject" IS PRESENT + projects = projectApi.getProjects(); + log.debug("PROJECTS: {}", projects); + assertTrue(projects.size() > 0); + testProject = getProjectByNameAndDescription(projects, projectName, projectDescription); + assertNotNull(testProject); + + WorkflowApi workflowApi = new WorkflowApi(); + log.info("******** Running The Complex WorkFlow ********"); + + log.info("Running the Assessment to see what WorkFlows are eligible for this situation:"); + + // Define WorkFlowRequest + WorkFlowRequestDTO workFlowRequestDTO = new WorkFlowRequestDTO(); + workFlowRequestDTO.setProjectId(testProject.getId()); + workFlowRequestDTO.setWorkFlowName("onboardingMasterAssessment_ASSESSMENT_WORKFLOW"); + workFlowRequestDTO.setWorks(List.of(WorkRequestDTO.builder() + .arguments(List.of(ArgumentRequestDTO.builder().key("GIT_REPO_URL").value("git_repo_url").build())) + .build())); + + WorkFlowResponseDTO workFlowResponseDTO = workflowApi.execute(workFlowRequestDTO); + assertEquals(WorkStatusEnum.COMPLETED, workFlowResponseDTO.getWorkStatus()); + log.info("workflow finished successfully with response: {}", workFlowResponseDTO); + if (workFlowResponseDTO.getWorkFlowOptions() == null + || workFlowResponseDTO.getWorkStatus() != WorkStatusEnum.COMPLETED) { + fail("There is no valid INFRASTRUCTURE_OPTION"); + } + + // log.info("The Following newOption : {}", + // workFlowResponseDTO.getWorkFlowOptions().getNewOptions()); + + String infrastructureOption = workFlowResponseDTO.getWorkFlowOptions().getNewOptions().get(0).getWorkFlowName(); + log.info("The Following Option Is Available: {}", infrastructureOption); + + log.info("Running the onboarding WorkFlow"); + log.info("executes 3 tasks in Parallel with a WorkFlowChecker"); + WorkflowDefinitionApi workflowDefinitionApi = new WorkflowDefinitionApi(); + List workFlowDefinitions = workflowDefinitionApi + .getWorkFlowDefinitions(infrastructureOption); + + assertNotNull(workFlowDefinitions); + assertTrue(workFlowDefinitions.size() > 0); + assertNotNull("There is no valid Onboarding workflow id", workFlowDefinitions.get(0).getId()); + assertEquals("There is no valid Onboarding workflow name", workFlowDefinitions.get(0).getName(), + infrastructureOption); + log.info("Onboarding workflow id {}", workFlowDefinitions.get(0).getId()); + log.info("Onboarding workflow name {}", workFlowDefinitions.get(0).getName()); + + WorkRequestDTO work1 = new WorkRequestDTO(); + work1.setWorkName("certWorkFlowTask"); + work1.setArguments(Arrays.asList(new ArgumentRequestDTO().key("user-id").value("test-user-id"), + new ArgumentRequestDTO().key("api-server").value("api.com"))); + + WorkRequestDTO work2 = new WorkRequestDTO(); + work2.setWorkName("adGroupWorkFlowTask"); + work2.setArguments(Arrays.asList(new ArgumentRequestDTO().key("user-id").value("test-user-id"), + new ArgumentRequestDTO().key("api-server").value("api.com"))); + + WorkRequestDTO work3 = new WorkRequestDTO(); + work3.setWorkName("dynatraceWorkFlowTask"); + work3.setArguments(Arrays.asList(new ArgumentRequestDTO().key("user-id").value("test-user-id"), + new ArgumentRequestDTO().key("api-server").value("api.com"))); + + workFlowRequestDTO.setProjectId(testProject.getId()); + workFlowRequestDTO.setWorkFlowName(workFlowDefinitions.get(0).getName()); + workFlowRequestDTO.setWorks(Arrays.asList(work1, work2, work3)); + workFlowResponseDTO = workflowApi.execute(workFlowRequestDTO); + + assertNotNull("There is no valid WorkFlowExecutionId", workFlowResponseDTO.getWorkFlowExecutionId()); + assertEquals(workFlowResponseDTO.getWorkStatus(), WorkStatusEnum.IN_PROGRESS); + log.info("Onboarding workflow execution id: {}", workFlowResponseDTO.getWorkFlowExecutionId()); + + WorkFlowStatusResponseDTO workFlowStatusResponseDTO = waitAsyncStatusResponse(workflowApi, + workFlowResponseDTO.getWorkFlowExecutionId()); + assertNotNull(workFlowStatusResponseDTO); + assertNotNull(workFlowStatusResponseDTO.getWorkFlowExecutionId()); + assertEquals(WorkStatusEnum.COMPLETED.toString(), workFlowStatusResponseDTO.getStatus()); + log.info("Onboarding workflow execution completed with status {}", workFlowStatusResponseDTO.getStatus()); + } + +} diff --git a/workflow-examples/src/test/java/com/redhat/parodos/examples/integration/utils/ExamplesUtils.java b/workflow-examples/src/test/java/com/redhat/parodos/examples/integration/utils/ExamplesUtils.java index ee154559d..5dff8c440 100644 --- a/workflow-examples/src/test/java/com/redhat/parodos/examples/integration/utils/ExamplesUtils.java +++ b/workflow-examples/src/test/java/com/redhat/parodos/examples/integration/utils/ExamplesUtils.java @@ -7,6 +7,8 @@ import com.redhat.parodos.sdk.invoker.ApiException; import com.redhat.parodos.sdk.model.ProjectRequestDTO; import com.redhat.parodos.sdk.model.ProjectResponseDTO; +import com.redhat.parodos.sdk.model.WorkFlowStatusResponseDTO; +import com.redhat.parodos.workflows.work.WorkStatus; import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.assertj.core.util.Strings; @@ -32,7 +34,7 @@ public final class ExamplesUtils { public static void waitProjectStart(ProjectApi projectApi) throws ApiException, InterruptedException { - AsyncResult asyncResult = new AsyncResult(); + AsyncWaitProjectResult asyncResult = new AsyncWaitProjectResult(); Lock lock = new ReentrantLock(); Condition response = lock.newCondition(); ApiCallback> apiCallback = new ApiCallback<>() { @@ -94,6 +96,89 @@ private void signal() { } } + public static WorkFlowStatusResponseDTO waitAsyncStatusResponse(WorkflowApi workflowApi, String workFlowExecutionId) + throws ApiException, InterruptedException { + AsyncStatusResult asyncResult = new AsyncStatusResult(); + Lock lock = new ReentrantLock(); + Condition response = lock.newCondition(); + ApiCallback apiCallback = new ApiCallback<>() { + AtomicInteger attemptCounter = new AtomicInteger(0); + + @Override + public void onFailure(ApiException e, int statusCode, Map> responseHeaders) { + int i = attemptCounter.incrementAndGet(); + if (i >= 100) { + asyncResult.setError(e.getMessage()); + signal(); + } + else { + try { + workflowApi.getStatusAsync(workFlowExecutionId, this); + } + catch (ApiException apie) { + asyncResult.setError(apie.getMessage()); + signal(); + } + } + } + + @Override + public void onSuccess(WorkFlowStatusResponseDTO result, int statusCode, + Map> responseHeaders) { + int i = attemptCounter.incrementAndGet(); + if (i >= 100) { + asyncResult.setError("Workflow status isn't COMPLETE"); + signal(); + } + else if (!result.getStatus().equals(WorkStatus.COMPLETED.toString())) { + try { + workflowApi.getStatusAsync(workFlowExecutionId, this); + } + catch (ApiException apie) { + asyncResult.setError(apie.getMessage()); + signal(); + } + } + else { + asyncResult.setStatusCode(statusCode); + asyncResult.setResult(result); + } + + } + + @Override + public void onUploadProgress(long bytesWritten, long contentLength, boolean done) { + } + + @Override + public void onDownloadProgress(long bytesRead, long contentLength, boolean done) { + } + + private void signal() { + lock.lock(); + try { + response.signal(); + } + finally { + lock.unlock(); + } + } + }; + workflowApi.getStatusAsync(workFlowExecutionId, apiCallback); + lock.lock(); + try { + // should be more than enough + response.await(60, TimeUnit.SECONDS); + if (asyncResult.getError() != null) { + fail("An error occurred while executing getProjectsAsync: " + asyncResult.getError()); + } + } + finally { + lock.unlock(); + } + return asyncResult.getResult(); + } + @Nullable public static ProjectResponseDTO getProjectByNameAndDescription(List projects, String projectName, String projectDescription) { @@ -104,7 +189,18 @@ public static ProjectResponseDTO getProjectByNameAndDescription(List Date: Fri, 14 Apr 2023 17:52:47 +0200 Subject: [PATCH 2/4] Fix: remove failure counter Since we're using a lock, there is no need anymore to stop retrying async call after 100 attempts. Signed-off-by: Gloria Ciavarrini --- .../integration/utils/ExamplesUtils.java | 53 ++++++------------- 1 file changed, 17 insertions(+), 36 deletions(-) diff --git a/workflow-examples/src/test/java/com/redhat/parodos/examples/integration/utils/ExamplesUtils.java b/workflow-examples/src/test/java/com/redhat/parodos/examples/integration/utils/ExamplesUtils.java index 5dff8c440..dc5c42dad 100644 --- a/workflow-examples/src/test/java/com/redhat/parodos/examples/integration/utils/ExamplesUtils.java +++ b/workflow-examples/src/test/java/com/redhat/parodos/examples/integration/utils/ExamplesUtils.java @@ -17,7 +17,6 @@ import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; @@ -38,23 +37,14 @@ public static void waitProjectStart(ProjectApi projectApi) throws ApiException, Lock lock = new ReentrantLock(); Condition response = lock.newCondition(); ApiCallback> apiCallback = new ApiCallback<>() { - AtomicInteger failureCounter = new AtomicInteger(0); - @Override public void onFailure(ApiException e, int statusCode, Map> responseHeaders) { - int i = failureCounter.incrementAndGet(); - if (i >= 100) { - asyncResult.setError(e.getMessage()); - signal(); + try { + projectApi.getProjectsAsync(this); } - else { - try { - projectApi.getProjectsAsync(this); - } - catch (ApiException apie) { - asyncResult.setError(apie.getMessage()); - signal(); - } + catch (ApiException apie) { + asyncResult.setError(apie.getMessage()); + signal(); } } @@ -88,7 +78,7 @@ private void signal() { // should be more than enough response.await(60, TimeUnit.SECONDS); if (asyncResult.getError() != null) { - fail("An error occurred while executing getProjectsAsync: " + asyncResult.getError()); + fail("An error occurred while executing getProjectAsync: " + asyncResult.getError()); } } finally { @@ -102,35 +92,23 @@ public static WorkFlowStatusResponseDTO waitAsyncStatusResponse(WorkflowApi work Lock lock = new ReentrantLock(); Condition response = lock.newCondition(); ApiCallback apiCallback = new ApiCallback<>() { - AtomicInteger attemptCounter = new AtomicInteger(0); @Override public void onFailure(ApiException e, int statusCode, Map> responseHeaders) { - int i = attemptCounter.incrementAndGet(); - if (i >= 100) { - asyncResult.setError(e.getMessage()); - signal(); + System.out.println("onFAILURE"); + try { + workflowApi.getStatusAsync(workFlowExecutionId, this); } - else { - try { - workflowApi.getStatusAsync(workFlowExecutionId, this); - } - catch (ApiException apie) { - asyncResult.setError(apie.getMessage()); - signal(); - } + catch (ApiException apie) { + asyncResult.setError(apie.getMessage()); + signal(); } } @Override public void onSuccess(WorkFlowStatusResponseDTO result, int statusCode, Map> responseHeaders) { - int i = attemptCounter.incrementAndGet(); - if (i >= 100) { - asyncResult.setError("Workflow status isn't COMPLETE"); - signal(); - } - else if (!result.getStatus().equals(WorkStatus.COMPLETED.toString())) { + if (!result.getStatus().equals(WorkStatus.COMPLETED.toString())) { try { workflowApi.getStatusAsync(workFlowExecutionId, this); } @@ -142,6 +120,8 @@ else if (!result.getStatus().equals(WorkStatus.COMPLETED.toString())) { else { asyncResult.setStatusCode(statusCode); asyncResult.setResult(result); + asyncResult.setError(null); + signal(); } } @@ -169,8 +149,9 @@ private void signal() { try { // should be more than enough response.await(60, TimeUnit.SECONDS); + if (asyncResult.getError() != null) { - fail("An error occurred while executing getProjectsAsync: " + asyncResult.getError()); + fail("An error occurred while executing waitAsyncStatusResponse: " + asyncResult.getError()); } } finally { From 59ade0571ab61a04734a3a8f7ff1acca1c6d9ab0 Mon Sep 17 00:00:00 2001 From: Gloria Ciavarrini Date: Mon, 17 Apr 2023 13:43:53 +0200 Subject: [PATCH 3/4] Refactor waitAsyncProject and witAsyncStatusResponse Merge these two method to avoid code duplication. Add two utility methods to ease the code readability. Signed-off-by: Gloria Ciavarrini --- .../examples/integration/ComplexWorkFlow.java | 27 +++- .../examples/integration/SimpleWorkFlow.java | 5 +- .../integration/utils/ExamplesUtils.java | 123 +++++------------- 3 files changed, 58 insertions(+), 97 deletions(-) diff --git a/workflow-examples/src/test/java/com/redhat/parodos/examples/integration/ComplexWorkFlow.java b/workflow-examples/src/test/java/com/redhat/parodos/examples/integration/ComplexWorkFlow.java index 7de3928ce..d25d74578 100644 --- a/workflow-examples/src/test/java/com/redhat/parodos/examples/integration/ComplexWorkFlow.java +++ b/workflow-examples/src/test/java/com/redhat/parodos/examples/integration/ComplexWorkFlow.java @@ -4,6 +4,7 @@ import com.redhat.parodos.sdk.api.ProjectApi; import com.redhat.parodos.sdk.api.WorkflowApi; import com.redhat.parodos.sdk.api.WorkflowDefinitionApi; +import com.redhat.parodos.sdk.invoker.ApiCallback; import com.redhat.parodos.sdk.invoker.ApiClient; import com.redhat.parodos.sdk.invoker.ApiException; import com.redhat.parodos.sdk.invoker.Configuration; @@ -17,6 +18,7 @@ import com.redhat.parodos.sdk.model.WorkFlowStatusResponseDTO; import com.redhat.parodos.sdk.model.WorkRequestDTO; import com.redhat.parodos.workflow.utils.CredUtils; +import com.redhat.parodos.workflows.work.WorkStatus; import lombok.extern.slf4j.Slf4j; import org.junit.Before; import org.junit.Test; @@ -24,13 +26,11 @@ import java.io.IOException; import java.util.Arrays; -import java.util.HashMap; import java.util.List; -import java.util.Map; -import java.util.concurrent.atomic.AtomicBoolean; import static com.redhat.parodos.examples.integration.utils.ExamplesUtils.getProjectByNameAndDescription; -import static com.redhat.parodos.examples.integration.utils.ExamplesUtils.waitAsyncStatusResponse; +import static com.redhat.parodos.examples.integration.utils.ExamplesUtils.waitAsyncResponse; +import static com.redhat.parodos.examples.integration.utils.ExamplesUtils.waitProjectStart; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; @@ -59,7 +59,7 @@ public void runComplexWorkFlow() throws ApiException, InterruptedException { log.info("Running complex flow"); ProjectApi projectApi = new ProjectApi(apiClient); - ExamplesUtils.waitProjectStart(projectApi); + waitProjectStart(projectApi); log.info("Project is ✔️ on {}", apiClient.getBasePath()); ProjectResponseDTO testProject; @@ -158,8 +158,21 @@ public void runComplexWorkFlow() throws ApiException, InterruptedException { assertEquals(workFlowResponseDTO.getWorkStatus(), WorkStatusEnum.IN_PROGRESS); log.info("Onboarding workflow execution id: {}", workFlowResponseDTO.getWorkFlowExecutionId()); - WorkFlowStatusResponseDTO workFlowStatusResponseDTO = waitAsyncStatusResponse(workflowApi, - workFlowResponseDTO.getWorkFlowExecutionId()); + WorkFlowResponseDTO finalWorkFlowResponseDTO = workFlowResponseDTO; + + WorkFlowStatusResponseDTO workFlowStatusResponseDTO = waitAsyncResponse( + new ExamplesUtils.FuncExecutor() { + @Override + public boolean check(WorkFlowStatusResponseDTO result) { + return !result.getStatus().equals(WorkStatus.COMPLETED.toString()); + } + + @Override + public void execute(ApiCallback callback) throws ApiException { + workflowApi.getStatusAsync(finalWorkFlowResponseDTO.getWorkFlowExecutionId(), callback); + } + }); + assertNotNull(workFlowStatusResponseDTO); assertNotNull(workFlowStatusResponseDTO.getWorkFlowExecutionId()); assertEquals(WorkStatusEnum.COMPLETED.toString(), workFlowStatusResponseDTO.getStatus()); diff --git a/workflow-examples/src/test/java/com/redhat/parodos/examples/integration/SimpleWorkFlow.java b/workflow-examples/src/test/java/com/redhat/parodos/examples/integration/SimpleWorkFlow.java index e304ae8b9..b7e5ec7c9 100644 --- a/workflow-examples/src/test/java/com/redhat/parodos/examples/integration/SimpleWorkFlow.java +++ b/workflow-examples/src/test/java/com/redhat/parodos/examples/integration/SimpleWorkFlow.java @@ -1,6 +1,5 @@ package com.redhat.parodos.examples.integration; -import com.redhat.parodos.examples.integration.utils.ExamplesUtils; import com.redhat.parodos.sdk.api.ProjectApi; import com.redhat.parodos.sdk.api.WorkflowApi; import com.redhat.parodos.sdk.api.WorkflowDefinitionApi; @@ -30,6 +29,7 @@ import java.util.List; import static com.redhat.parodos.examples.integration.utils.ExamplesUtils.getProjectByNameAndDescription; +import static com.redhat.parodos.examples.integration.utils.ExamplesUtils.waitProjectStart; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; @@ -59,8 +59,8 @@ public void runSimpleWorkFlow() throws ApiException, InterruptedException { log.info("Running simple flow"); ProjectApi projectApi = new ProjectApi(apiClient); + waitProjectStart(projectApi); - ExamplesUtils.waitProjectStart(projectApi); log.info("Project is ✔️ on {}", apiClient.getBasePath()); ProjectResponseDTO testProject; @@ -143,6 +143,7 @@ public void runSimpleWorkFlow() throws ApiException, InterruptedException { WorkflowApi workflowApi = new WorkflowApi(); log.info("******** Running The Simple Sequence Flow ********"); + WorkFlowResponseDTO workFlowResponseDTO = workflowApi.execute(workFlowRequestDTO); assertNotNull(workFlowResponseDTO.getWorkFlowExecutionId()); diff --git a/workflow-examples/src/test/java/com/redhat/parodos/examples/integration/utils/ExamplesUtils.java b/workflow-examples/src/test/java/com/redhat/parodos/examples/integration/utils/ExamplesUtils.java index dc5c42dad..55cdda7c1 100644 --- a/workflow-examples/src/test/java/com/redhat/parodos/examples/integration/utils/ExamplesUtils.java +++ b/workflow-examples/src/test/java/com/redhat/parodos/examples/integration/utils/ExamplesUtils.java @@ -1,30 +1,28 @@ package com.redhat.parodos.examples.integration.utils; -import com.redhat.parodos.sdk.api.ProjectApi; -import com.redhat.parodos.sdk.invoker.ApiCallback; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; import com.redhat.parodos.sdk.invoker.ApiClient; -import com.redhat.parodos.sdk.invoker.ApiException; import com.redhat.parodos.sdk.model.ProjectRequestDTO; -import com.redhat.parodos.sdk.model.ProjectResponseDTO; -import com.redhat.parodos.sdk.model.WorkFlowStatusResponseDTO; -import com.redhat.parodos.workflows.work.WorkStatus; -import lombok.Data; import lombok.extern.slf4j.Slf4j; -import org.assertj.core.util.Strings; -import javax.annotation.Nullable; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; +import javax.annotation.Nullable; -import static org.junit.Assert.fail; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; +import com.redhat.parodos.sdk.api.ProjectApi; +import com.redhat.parodos.sdk.invoker.ApiCallback; +import com.redhat.parodos.sdk.invoker.ApiException; +import org.assertj.core.util.Strings; +import com.redhat.parodos.sdk.model.ProjectResponseDTO; +import lombok.Data; /** * @author Gloria Ciavarrini (Github: gciavarrini) @@ -32,72 +30,17 @@ @Slf4j public final class ExamplesUtils { - public static void waitProjectStart(ProjectApi projectApi) throws ApiException, InterruptedException { - AsyncWaitProjectResult asyncResult = new AsyncWaitProjectResult(); - Lock lock = new ReentrantLock(); - Condition response = lock.newCondition(); - ApiCallback> apiCallback = new ApiCallback<>() { - @Override - public void onFailure(ApiException e, int statusCode, Map> responseHeaders) { - try { - projectApi.getProjectsAsync(this); - } - catch (ApiException apie) { - asyncResult.setError(apie.getMessage()); - signal(); - } - } - - @Override - public void onSuccess(List result, int statusCode, - Map> responseHeaders) { - signal(); - } - - @Override - public void onUploadProgress(long bytesWritten, long contentLength, boolean done) { - } - - @Override - public void onDownloadProgress(long bytesRead, long contentLength, boolean done) { - } - - private void signal() { - lock.lock(); - try { - response.signal(); - } - finally { - lock.unlock(); - } - } - }; - projectApi.getProjectsAsync(apiCallback); - lock.lock(); - try { - // should be more than enough - response.await(60, TimeUnit.SECONDS); - if (asyncResult.getError() != null) { - fail("An error occurred while executing getProjectAsync: " + asyncResult.getError()); - } - } - finally { - lock.unlock(); - } - } - - public static WorkFlowStatusResponseDTO waitAsyncStatusResponse(WorkflowApi workflowApi, String workFlowExecutionId) - throws ApiException, InterruptedException { - AsyncStatusResult asyncResult = new AsyncStatusResult(); + public static T waitAsyncResponse(FuncExecutor f) throws ApiException, InterruptedException { + AsyncResult asyncResult = new AsyncResult<>(); Lock lock = new ReentrantLock(); Condition response = lock.newCondition(); - ApiCallback apiCallback = new ApiCallback<>() { + ApiCallback apiCallback = new ApiCallback() { @Override public void onFailure(ApiException e, int statusCode, Map> responseHeaders) { - System.out.println("onFAILURE"); + try { - workflowApi.getStatusAsync(workFlowExecutionId, this); + f.execute(this); } catch (ApiException apie) { asyncResult.setError(apie.getMessage()); @@ -106,11 +49,10 @@ public void onFailure(ApiException e, int statusCode, Map> } @Override - public void onSuccess(WorkFlowStatusResponseDTO result, int statusCode, - Map> responseHeaders) { - if (!result.getStatus().equals(WorkStatus.COMPLETED.toString())) { + public void onSuccess(T result, int statusCode, Map> responseHeaders) { + if (f.check(result)) { try { - workflowApi.getStatusAsync(workFlowExecutionId, this); + f.execute(this); } catch (ApiException apie) { asyncResult.setError(apie.getMessage()); @@ -123,7 +65,6 @@ public void onSuccess(WorkFlowStatusResponseDTO result, int statusCode, asyncResult.setError(null); signal(); } - } @Override @@ -144,14 +85,13 @@ private void signal() { } } }; - workflowApi.getStatusAsync(workFlowExecutionId, apiCallback); + f.execute(apiCallback); lock.lock(); try { // should be more than enough response.await(60, TimeUnit.SECONDS); - if (asyncResult.getError() != null) { - fail("An error occurred while executing waitAsyncStatusResponse: " + asyncResult.getError()); + fail("An error occurred while executing waitAsyncResponse: " + asyncResult.getError()); } } finally { @@ -160,6 +100,10 @@ private void signal() { return asyncResult.getResult(); } + public static void waitProjectStart(ProjectApi projectApi) throws InterruptedException, ApiException { + waitAsyncResponse((FuncExecutor>) callback -> projectApi.getProjectsAsync(callback)); + } + @Nullable public static ProjectResponseDTO getProjectByNameAndDescription(List projects, String projectName, String projectDescription) { @@ -170,20 +114,23 @@ public static ProjectResponseDTO getProjectByNameAndDescription(List { private String error; - } + T result; - @Data - private static class AsyncStatusResult { + int statusCode; - WorkFlowStatusResponseDTO result; + } - int statusCode; + public interface FuncExecutor { - private String error; + void execute(ApiCallback callback) throws ApiException; + + default boolean check(T result) { + return true; + } } From 9c96d767f371b247e2313a73f5c4c3b3e676cd4e Mon Sep 17 00:00:00 2001 From: Gloria Ciavarrini Date: Mon, 17 Apr 2023 17:34:16 +0200 Subject: [PATCH 4/4] Use commonProjectAPI method Signed-off-by: Gloria Ciavarrini --- .../examples/integration/ComplexWorkFlow.java | 38 +------------------ .../examples/integration/SimpleWorkFlow.java | 36 +----------------- 2 files changed, 3 insertions(+), 71 deletions(-) diff --git a/workflow-examples/src/test/java/com/redhat/parodos/examples/integration/ComplexWorkFlow.java b/workflow-examples/src/test/java/com/redhat/parodos/examples/integration/ComplexWorkFlow.java index d25d74578..4a20d23fe 100644 --- a/workflow-examples/src/test/java/com/redhat/parodos/examples/integration/ComplexWorkFlow.java +++ b/workflow-examples/src/test/java/com/redhat/parodos/examples/integration/ComplexWorkFlow.java @@ -57,41 +57,8 @@ public void setUp() throws IOException { @Test public void runComplexWorkFlow() throws ApiException, InterruptedException { log.info("Running complex flow"); - ProjectApi projectApi = new ProjectApi(apiClient); - waitProjectStart(projectApi); - log.info("Project is ✔️ on {}", apiClient.getBasePath()); - - ProjectResponseDTO testProject; - - // RETRIEVE ALL PROJECTS AVAILABLE - log.info("Get all available projects"); - List projects = projectApi.getProjects(); - - // CHECK IF testProject ALREADY EXISTS - testProject = getProjectByNameAndDescription(projects, projectName, projectDescription); - - // CREATE PROJECT "Test Project Name" IF NOT EXISTS - if (testProject == null) { - log.info("There are no projects. Creating project {}", projectName); - // DEFINE A TEST PROJECT REQUEST - ProjectRequestDTO projectRequestDTO = new ProjectRequestDTO(); - projectRequestDTO.setName(projectName); - projectRequestDTO.setDescription(projectDescription); - - ProjectResponseDTO projectResponseDTO = projectApi.createProject(projectRequestDTO); - assertNotNull(projectResponseDTO); - assertEquals(projectName, projectResponseDTO.getName()); - assertEquals(projectDescription, projectResponseDTO.getDescription()); - log.info("Project {} successfully created", projectName); - } - - // ASSERT PROJECT "testProject" IS PRESENT - projects = projectApi.getProjects(); - log.debug("PROJECTS: {}", projects); - assertTrue(projects.size() > 0); - testProject = getProjectByNameAndDescription(projects, projectName, projectDescription); - assertNotNull(testProject); + ProjectResponseDTO testProject = ExamplesUtils.commonProjectAPI(apiClient, projectName, projectDescription); WorkflowApi workflowApi = new WorkflowApi(); log.info("******** Running The Complex WorkFlow ********"); @@ -114,9 +81,6 @@ public void runComplexWorkFlow() throws ApiException, InterruptedException { fail("There is no valid INFRASTRUCTURE_OPTION"); } - // log.info("The Following newOption : {}", - // workFlowResponseDTO.getWorkFlowOptions().getNewOptions()); - String infrastructureOption = workFlowResponseDTO.getWorkFlowOptions().getNewOptions().get(0).getWorkFlowName(); log.info("The Following Option Is Available: {}", infrastructureOption); diff --git a/workflow-examples/src/test/java/com/redhat/parodos/examples/integration/SimpleWorkFlow.java b/workflow-examples/src/test/java/com/redhat/parodos/examples/integration/SimpleWorkFlow.java index b7e5ec7c9..52aecd9a0 100644 --- a/workflow-examples/src/test/java/com/redhat/parodos/examples/integration/SimpleWorkFlow.java +++ b/workflow-examples/src/test/java/com/redhat/parodos/examples/integration/SimpleWorkFlow.java @@ -1,5 +1,6 @@ package com.redhat.parodos.examples.integration; +import com.redhat.parodos.examples.integration.utils.ExamplesUtils; import com.redhat.parodos.sdk.api.ProjectApi; import com.redhat.parodos.sdk.api.WorkflowApi; import com.redhat.parodos.sdk.api.WorkflowDefinitionApi; @@ -58,40 +59,7 @@ public void setUp() throws IOException { public void runSimpleWorkFlow() throws ApiException, InterruptedException { log.info("Running simple flow"); - ProjectApi projectApi = new ProjectApi(apiClient); - waitProjectStart(projectApi); - - log.info("Project is ✔️ on {}", apiClient.getBasePath()); - - ProjectResponseDTO testProject; - - // RETRIEVE ALL PROJECTS AVAILABLE - log.info("Get all available projects"); - List projects = projectApi.getProjects(); - // CHECK IF testProject ALREADY EXISTS - testProject = getProjectByNameAndDescription(projects, projectName, projectDescription); - - // CREATE PROJECT "Test Project Name" IF NOT EXISTS - if (testProject == null) { - log.info("There are no projects. Creating project {}", projectName); - // DEFINE A TEST PROJECT REQUEST - ProjectRequestDTO projectRequestDTO = new ProjectRequestDTO(); - projectRequestDTO.setName(projectName); - projectRequestDTO.setDescription(projectDescription); - - ProjectResponseDTO projectResponseDTO = projectApi.createProject(projectRequestDTO); - assertNotNull(projectResponseDTO); - assertEquals(projectName, projectResponseDTO.getName()); - assertEquals(projectDescription, projectResponseDTO.getDescription()); - log.info("Project {} successfully created", projectName); - } - - // ASSERT PROJECT "testProject" IS PRESENT - projects = projectApi.getProjects(); - log.debug("PROJECTS: {}", projects); - assertTrue(projects.size() > 0); - testProject = getProjectByNameAndDescription(projects, projectName, projectDescription); - assertNotNull(testProject); + ProjectResponseDTO testProject = ExamplesUtils.commonProjectAPI(apiClient, projectName, projectDescription); // GET simpleSequentialWorkFlow DEFINITIONS WorkflowDefinitionApi workflowDefinitionApi = new WorkflowDefinitionApi();