Skip to content

Commit

Permalink
control-service: unit tests for data job persistence classes (#2935)
Browse files Browse the repository at this point in the history
what: added unit tests and improved coverage for the following classes -
DataJobsSynchronizer, DeploymentServiceV2, and JobImageDeployerV2

why: Easier issue identification

testing: n/a

---------

Signed-off-by: mrMoZ1 <[email protected]>
Co-authored-by: github-actions <>
Co-authored-by: dakodakov <[email protected]>
  • Loading branch information
Momchil Z and dakodakov authored Dec 4, 2023
1 parent 240eb69 commit b67ce66
Show file tree
Hide file tree
Showing 3 changed files with 278 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
/*
* Copyright 2021-2023 VMware, Inc.
* SPDX-License-Identifier: Apache-2.0
*/

package com.vmware.taurus.service.deploy;

import com.vmware.taurus.ControlplaneApplication;
import com.vmware.taurus.controlplane.model.data.DataJobResources;
import com.vmware.taurus.datajobs.TestUtils;
import com.vmware.taurus.datajobs.ToModelApiConverter;
import com.vmware.taurus.service.kubernetes.ControlKubernetesService;
import com.vmware.taurus.service.model.ActualDataJobDeployment;
import com.vmware.taurus.service.model.DataJobDeploymentResources;
import com.vmware.taurus.service.model.JobDeployment;
import com.vmware.taurus.service.repository.ActualJobDeploymentRepository;
import com.vmware.taurus.service.repository.DesiredJobDeploymentRepository;
import com.vmware.taurus.service.repository.JobsRepository;
import java.time.OffsetDateTime;
import java.util.Set;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.boot.test.mock.mockito.SpyBean;
import org.springframework.test.context.TestPropertySource;

@SpringBootTest(classes = ControlplaneApplication.class)
@TestPropertySource(
properties = {
"datajobs.deployment.configuration.persistence.writeTos=DB",
"datajobs.deployment.configuration.persistence.readDataSource=DB",
"datajobs.deployment.configuration.synchronization.task.enabled:true"
})
public class DataJobsSynchronizerWriteTest {

@SpyBean DeploymentServiceV2 deploymentServiceV2;
@SpyBean JobImageBuilder jobImageBuilder;
@MockBean JobImageDeployerV2 jobImageDeployer;
@MockBean ControlKubernetesService controlKubernetesService;
@Autowired JobsRepository jobsRepository;
@Autowired DesiredJobDeploymentRepository desiredJobDeploymentRepository;
@Autowired DataJobsSynchronizer dataJobsSynchronizer;
@Autowired ActualJobDeploymentRepository actualJobDeploymentRepository;

@BeforeEach
public void setup() throws Exception {
Mockito.doReturn(Set.of("jobName"))
.when(deploymentServiceV2)
.findAllActualDeploymentNamesFromKubernetes();
Mockito.doReturn(true)
.when(jobImageBuilder)
.buildImage(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any());
Mockito.doReturn(getTestDeployment())
.when(jobImageDeployer)
.scheduleJob(
Mockito.any(),
Mockito.any(),
Mockito.any(),
Mockito.anyBoolean(),
Mockito.anyBoolean(),
Mockito.anyString());
}

@AfterEach
public void cleanup() {
jobsRepository.deleteAll();
}

@Test
public void testUpdateDesiredDeployment_expectNewDeployment() {
var dataJob = ToModelApiConverter.toDataJob(TestUtils.getDataJob("teamName", "jobName"));
jobsRepository.save(dataJob);
JobDeployment jobDeployment = generateTestDeployment();
deploymentServiceV2.updateDesiredDbDeployment(dataJob, jobDeployment, "user");

Assertions.assertEquals(0, actualJobDeploymentRepository.findAll().size());

dataJobsSynchronizer.synchronizeDataJobs();

var actualDataJobDeployment = actualJobDeploymentRepository.findById(dataJob.getName()).get();

Assertions.assertEquals(
jobDeployment.getDataJobName(), actualDataJobDeployment.getDataJobName());
Assertions.assertEquals(
jobDeployment.getGitCommitSha(), actualDataJobDeployment.getGitCommitSha());
Assertions.assertEquals(
jobDeployment.getPythonVersion(), actualDataJobDeployment.getPythonVersion());
Assertions.assertEquals("user", actualDataJobDeployment.getLastDeployedBy());
}

@Test
public void testUpdateDesiredDeployment_expectNoDeployment() {
Mockito.doReturn(Set.of())
.when(deploymentServiceV2)
.findAllActualDeploymentNamesFromKubernetes();

Assertions.assertEquals(0, actualJobDeploymentRepository.findAll().size());

dataJobsSynchronizer.synchronizeDataJobs();

Assertions.assertEquals(0, actualJobDeploymentRepository.findAll().size());
}

private JobDeployment generateTestDeployment() {
JobDeployment jobDeployment = new JobDeployment();
jobDeployment.setSchedule("testSched");
jobDeployment.setDataJobName("jobName");
jobDeployment.setDataJobTeam("teamName");
jobDeployment.setPythonVersion("testPython");
jobDeployment.setGitCommitSha("testSha");
jobDeployment.setEnabled(true);
var resources = new DataJobResources();
resources.setCpuLimit(1f);
resources.setCpuRequest(1f);
resources.setMemoryLimit(1);
resources.setMemoryRequest(1);
jobDeployment.setResources(resources);
return jobDeployment;
}

private ActualDataJobDeployment getTestDeployment() {
var testDeployment = new ActualDataJobDeployment();
var testJob = generateTestDeployment();
testDeployment.setDataJobName(testJob.getDataJobName());
testDeployment.setDeploymentVersionSha(testJob.getGitCommitSha());
testDeployment.setPythonVersion(testJob.getPythonVersion());
testDeployment.setGitCommitSha(testJob.getGitCommitSha());
testDeployment.setLastDeployedDate(OffsetDateTime.now());
testDeployment.setResources(new DataJobDeploymentResources());
testDeployment.setLastDeployedBy("user");
return testDeployment;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,11 @@
import com.vmware.taurus.controlplane.model.data.DataJobResources;
import com.vmware.taurus.datajobs.TestUtils;
import com.vmware.taurus.datajobs.ToModelApiConverter;
import com.vmware.taurus.service.model.ActualDataJobDeployment;
import com.vmware.taurus.service.model.DeploymentStatus;
import com.vmware.taurus.service.model.DesiredDataJobDeployment;
import com.vmware.taurus.service.model.JobDeployment;
import com.vmware.taurus.service.repository.ActualJobDeploymentRepository;
import com.vmware.taurus.service.repository.DesiredJobDeploymentRepository;
import com.vmware.taurus.service.repository.JobsRepository;
import org.junit.jupiter.api.AfterEach;
Expand All @@ -21,11 +23,12 @@
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest(classes = ControlplaneApplication.class)
public class DeploymentServiceV2WriteTest {
public class DeploymentServiceV2Test {

@Autowired JobsRepository jobsRepository;
@Autowired DesiredJobDeploymentRepository desiredJobDeploymentRepository;
@Autowired DeploymentServiceV2 deploymentServiceV2;
@Autowired ActualJobDeploymentRepository actualJobDeploymentRepository;

@Test
public void testUpdateDesiredDeployment_expectNewDeployment() {
Expand Down Expand Up @@ -53,10 +56,66 @@ public void testPatchDesiredDeployment_expectMergedDeployment() {
compareSavedDeploymentWithTestDeployment(jobDeployment, savedDeployment, "user");
}

@Test
public void testUpdateDeploymentEnabledStatus() {

var dataJob = ToModelApiConverter.toDataJob(TestUtils.getDataJob("teamName", "jobName"));
jobsRepository.save(dataJob);
var initialDeployment = new DesiredDataJobDeployment();
initialDeployment.setDataJob(dataJob);
initialDeployment.setDataJobName(dataJob.getName());
initialDeployment.setEnabled(false);
desiredJobDeploymentRepository.save(initialDeployment);

var desiredDeployment = desiredJobDeploymentRepository.findById(dataJob.getName()).get();

Assertions.assertFalse(desiredDeployment.getEnabled());

deploymentServiceV2.updateDeploymentEnabledStatus(dataJob.getName(), true);

desiredDeployment = desiredJobDeploymentRepository.findById(dataJob.getName()).get();

Assertions.assertTrue(desiredDeployment.getEnabled());
}

@Test
public void testFindAllDesiredDataJobDeployments() {
Assertions.assertEquals(
0, deploymentServiceV2.findAllDesiredDataJobDeployments().keySet().size());

var dataJob = ToModelApiConverter.toDataJob(TestUtils.getDataJob("teamName", "jobName"));
jobsRepository.save(dataJob);
var initialDeployment = new DesiredDataJobDeployment();
initialDeployment.setDataJob(dataJob);
initialDeployment.setDataJobName(dataJob.getName());
desiredJobDeploymentRepository.save(initialDeployment);

Assertions.assertEquals(
1, deploymentServiceV2.findAllDesiredDataJobDeployments().keySet().size());
}

@Test
public void testFindAllActualDataJobDeployments() {

Assertions.assertEquals(
0, deploymentServiceV2.findAllActualDataJobDeployments().keySet().size());
var deployment = new ActualDataJobDeployment();

var dataJob = ToModelApiConverter.toDataJob(TestUtils.getDataJob("teamName", "jobName"));
deployment.setDataJobName(dataJob.getName());

jobsRepository.save(dataJob);
actualJobDeploymentRepository.save(deployment);

Assertions.assertEquals(
1, deploymentServiceV2.findAllActualDataJobDeployments().keySet().size());
}

@AfterEach
public void cleanup() {
desiredJobDeploymentRepository.deleteAll();
jobsRepository.deleteAll();
actualJobDeploymentRepository.deleteAll();
}

private void compareSavedDeploymentWithTestDeployment(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
/*
* Copyright 2021-2023 VMware, Inc.
* SPDX-License-Identifier: Apache-2.0
*/

package com.vmware.taurus.service.deploy;

import com.vmware.taurus.ControlplaneApplication;
import com.vmware.taurus.datajobs.TestUtils;
import com.vmware.taurus.datajobs.ToModelApiConverter;
import com.vmware.taurus.service.kubernetes.DataJobsKubernetesService;
import com.vmware.taurus.service.model.ActualDataJobDeployment;
import com.vmware.taurus.service.model.DataJob;
import com.vmware.taurus.service.model.DataJobDeploymentResources;
import com.vmware.taurus.service.model.DesiredDataJobDeployment;
import io.kubernetes.client.openapi.ApiException;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.SpyBean;

@SpringBootTest(classes = ControlplaneApplication.class)
public class JobImageDeployerV2Test {

@Autowired private JobImageDeployerV2 jobImageDeployerV2;
@SpyBean private DataJobsKubernetesService dataJobsKubernetesService;

@Test
public void testScheduleJob() throws ApiException {
var dataJob = ToModelApiConverter.toDataJob(TestUtils.getDataJob("teamName", "jobName"));
Mockito.doNothing().when(dataJobsKubernetesService).createCronJob(Mockito.any());

var actualDeployment =
jobImageDeployerV2.scheduleJob(
dataJob, getDesiredDeployment(dataJob), null, false, false, "test-job");

verifyActualDeployment(actualDeployment);
}

@Test
public void testScheduleJob_presentInK8S() throws ApiException {
var dataJob = ToModelApiConverter.toDataJob(TestUtils.getDataJob("teamName", "jobName"));
Mockito.doNothing().when(dataJobsKubernetesService).updateCronJob(Mockito.any());

var actualDeployment =
jobImageDeployerV2.scheduleJob(
dataJob, getDesiredDeployment(dataJob), null, false, true, "test-job");

verifyActualDeployment(actualDeployment);
}

private void verifyActualDeployment(ActualDataJobDeployment actualDeployment) {
Assertions.assertNotNull(actualDeployment);
Assertions.assertNotNull(actualDeployment.getDeploymentVersionSha());
Assertions.assertEquals("jobName", actualDeployment.getDataJobName());
Assertions.assertEquals("testPython", actualDeployment.getPythonVersion());
Assertions.assertEquals("testSha", actualDeployment.getGitCommitSha());
Assertions.assertEquals("testSched", actualDeployment.getSchedule());
Assertions.assertNotNull(actualDeployment.getResources());
Assertions.assertEquals("user", actualDeployment.getLastDeployedBy());
Assertions.assertTrue(actualDeployment.getEnabled());
}

private DesiredDataJobDeployment getDesiredDeployment(DataJob dataJob) {
var initialDeployment = new DesiredDataJobDeployment();
initialDeployment.setDataJob(dataJob);
initialDeployment.setDataJobName(dataJob.getName());
initialDeployment.setEnabled(true);
initialDeployment.setResources(new DataJobDeploymentResources());
initialDeployment.setSchedule("testSched");
initialDeployment.setUserInitiated(true);
initialDeployment.setGitCommitSha("testSha");
initialDeployment.setPythonVersion("testPython");
initialDeployment.setLastDeployedBy("user");

return initialDeployment;
}
}

0 comments on commit b67ce66

Please sign in to comment.