diff --git a/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/datajobs/it/DataJobDeploymentCrudIT.java b/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/datajobs/it/DataJobDeploymentCrudIT.java index 980739ae8b..cba2437450 100644 --- a/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/datajobs/it/DataJobDeploymentCrudIT.java +++ b/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/datajobs/it/DataJobDeploymentCrudIT.java @@ -92,7 +92,8 @@ public void testDataJobDeploymentCrud() throws Exception { // Take the job zip as byte array byte[] jobZipBinary = - IOUtils.toByteArray(getClass().getClassLoader().getResourceAsStream("simple_job.zip")); + IOUtils.toByteArray( + getClass().getClassLoader().getResourceAsStream("data_jobs/simple_job.zip")); // Execute job upload with no user mockMvc @@ -376,7 +377,8 @@ public void cleanUp() throws Exception { @Test public void testDataJobDeleteSource() throws Exception { byte[] jobZipBinary = - IOUtils.toByteArray(getClass().getClassLoader().getResourceAsStream("simple_job.zip")); + IOUtils.toByteArray( + getClass().getClassLoader().getResourceAsStream("data_jobs/simple_job.zip")); mockMvc .perform( diff --git a/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/datajobs/it/DataJobEphemeralStorageIT.java b/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/datajobs/it/DataJobEphemeralStorageIT.java index debda7106f..48bfb58152 100644 --- a/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/datajobs/it/DataJobEphemeralStorageIT.java +++ b/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/datajobs/it/DataJobEphemeralStorageIT.java @@ -5,8 +5,6 @@ package com.vmware.taurus.datajobs.it; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import com.fasterxml.jackson.databind.ObjectMapper; import com.vmware.taurus.ControlplaneApplication; import com.vmware.taurus.controlplane.model.data.DataJobExecution; import com.vmware.taurus.datajobs.it.common.BaseIT; @@ -29,10 +27,6 @@ classes = ControlplaneApplication.class) public class DataJobEphemeralStorageIT extends BaseIT { - private final ObjectMapper objectMapper = - new ObjectMapper() - .registerModule(new JavaTimeModule()); // Used for converting to OffsetDateTime; - @RegisterExtension static DataJobDeploymentExtension dataJobDeploymentExtension = new DataJobDeploymentExtension("job_ephemeral_storage.zip"); diff --git a/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/datajobs/it/DataJobOOMIT.java b/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/datajobs/it/DataJobOOMIT.java new file mode 100644 index 0000000000..8beb55fcc7 --- /dev/null +++ b/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/datajobs/it/DataJobOOMIT.java @@ -0,0 +1,48 @@ +/* + * Copyright 2021 VMware, Inc. + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.vmware.taurus.datajobs.it; + +import com.vmware.taurus.ControlplaneApplication; +import com.vmware.taurus.controlplane.model.data.DataJobExecution; +import com.vmware.taurus.datajobs.it.common.BaseIT; +import com.vmware.taurus.datajobs.it.common.DataJobDeploymentExtension; +import com.vmware.taurus.datajobs.it.common.JobExecutionUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.tuple.ImmutablePair; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; +import org.springframework.boot.test.context.SpringBootTest; + +@Slf4j +@SpringBootTest( + webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, + classes = ControlplaneApplication.class) +public class DataJobOOMIT extends BaseIT { + + @RegisterExtension + static DataJobDeploymentExtension dataJobDeploymentExtension = + new DataJobDeploymentExtension("oom_job.zip"); + + @Test + public void testDataJob_causesOOM_shouldCompleteWithUserError( + String jobName, String teamName, String username, String deploymentId) throws Exception { + // manually start job execution + ImmutablePair executeDataJobResult = + JobExecutionUtil.executeDataJob(jobName, teamName, username, deploymentId, mockMvc); + String opId = executeDataJobResult.getLeft(); + String executionId = executeDataJobResult.getRight(); + + // Check the data job execution status + JobExecutionUtil.checkDataJobExecutionStatus( + executionId, + DataJobExecution.StatusEnum.USER_ERROR, + opId, + jobName, + teamName, + username, + mockMvc); + } +} diff --git a/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/datajobs/it/UploadSourceValidationIT.java b/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/datajobs/it/UploadSourceValidationIT.java index 28295963c3..9c252f15df 100644 --- a/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/datajobs/it/UploadSourceValidationIT.java +++ b/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/datajobs/it/UploadSourceValidationIT.java @@ -48,7 +48,8 @@ public void setup() throws Exception { @Test public void testDataJobUploadSource() throws Exception { byte[] jobZipBinary = - IOUtils.toByteArray(getClass().getClassLoader().getResourceAsStream("simple_job.zip")); + IOUtils.toByteArray( + getClass().getClassLoader().getResourceAsStream("data_jobs/simple_job.zip")); mockMvc .perform( diff --git a/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/datajobs/it/common/DataJobDeploymentExtension.java b/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/datajobs/it/common/DataJobDeploymentExtension.java index a172991580..acc88c5d69 100644 --- a/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/datajobs/it/common/DataJobDeploymentExtension.java +++ b/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/datajobs/it/common/DataJobDeploymentExtension.java @@ -70,6 +70,8 @@ public class DataJobDeploymentExtension private static final String DEPLOYMENT_ID = "NOT_USED"; private static final String TEAM_NAME = "test-team"; + private static final String JOB_SOURCE_PATH = "data_jobs/"; + protected final ObjectMapper MAPPER = new ObjectMapper(); private String jobName = @@ -124,7 +126,8 @@ public void beforeEach(ExtensionContext context) throws Exception { if (!initialized) { byte[] jobZipBinary = - IOUtils.toByteArray(getClass().getClassLoader().getResourceAsStream(jobSource)); + IOUtils.toByteArray( + getClass().getClassLoader().getResourceAsStream(JOB_SOURCE_PATH + jobSource)); // Upload the data job MvcResult uploadResult = diff --git a/projects/control-service/projects/pipelines_control_service/src/integration-test/resources/job_ephemeral_storage.zip b/projects/control-service/projects/pipelines_control_service/src/integration-test/resources/data_jobs/job_ephemeral_storage.zip similarity index 100% rename from projects/control-service/projects/pipelines_control_service/src/integration-test/resources/job_ephemeral_storage.zip rename to projects/control-service/projects/pipelines_control_service/src/integration-test/resources/data_jobs/job_ephemeral_storage.zip diff --git a/projects/control-service/projects/pipelines_control_service/src/integration-test/resources/data_jobs/oom_job.zip b/projects/control-service/projects/pipelines_control_service/src/integration-test/resources/data_jobs/oom_job.zip new file mode 100644 index 0000000000..c47d96bc08 Binary files /dev/null and b/projects/control-service/projects/pipelines_control_service/src/integration-test/resources/data_jobs/oom_job.zip differ diff --git a/projects/control-service/projects/pipelines_control_service/src/integration-test/resources/simple_job.zip b/projects/control-service/projects/pipelines_control_service/src/integration-test/resources/data_jobs/simple_job.zip similarity index 100% rename from projects/control-service/projects/pipelines_control_service/src/integration-test/resources/simple_job.zip rename to projects/control-service/projects/pipelines_control_service/src/integration-test/resources/data_jobs/simple_job.zip diff --git a/projects/control-service/projects/pipelines_control_service/src/integration-test/resources/simple_job_cancel.zip b/projects/control-service/projects/pipelines_control_service/src/integration-test/resources/data_jobs/simple_job_cancel.zip similarity index 100% rename from projects/control-service/projects/pipelines_control_service/src/integration-test/resources/simple_job_cancel.zip rename to projects/control-service/projects/pipelines_control_service/src/integration-test/resources/data_jobs/simple_job_cancel.zip diff --git a/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/KubernetesService.java b/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/KubernetesService.java index 49d87ae31f..999ed6fd68 100644 --- a/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/KubernetesService.java +++ b/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/KubernetesService.java @@ -1652,6 +1652,12 @@ Optional getJobExecutionStatus(V1Job job, JobStatusCondition jobSt jobExecutionStatusBuilder.succeeded( Optional.ofNullable(jobStatusCondition).map(JobStatusCondition::isSuccess).orElse(null)); + // omits events that come after the Data Job completion + if (jobExecutionStatusBuilder.succeeded != null + && StringUtils.isBlank(jobExecutionStatusBuilder.containerTerminationReason)) { + return Optional.empty(); + } + return Optional.of(jobExecutionStatusBuilder.build()); } diff --git a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/KubernetesServiceTest.java b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/KubernetesServiceTest.java index 80c98ca908..772b55cd00 100644 --- a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/KubernetesServiceTest.java +++ b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/KubernetesServiceTest.java @@ -174,7 +174,8 @@ public void testGetJobExecutionStatus_notEmptyJob_shouldReturnNotEmptyJobExecuti KubernetesService mock = Mockito.mock(KubernetesService.class); Mockito.when(mock.getK8sSupportsV1CronJob()).thenReturn(false); - Mockito.when(mock.getTerminationStatus(expectedJob)).thenReturn(Optional.empty()); + Mockito.when(mock.getTerminationStatus(expectedJob)) + .thenReturn(Optional.ofNullable(new V1ContainerStateTerminated().reason("test"))); Mockito.when(mock.getJobExecutionStatus(expectedJob, condition)).thenCallRealMethod(); Optional actualJobExecutionStatusOptional = mock.getJobExecutionStatus(expectedJob, condition);