Skip to content

Commit b67ce66

Browse files
Momchil Zdakodakov
andauthored
control-service: unit tests for data job persistence classes (#2935)
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]>
1 parent 240eb69 commit b67ce66

File tree

3 files changed

+278
-1
lines changed

3 files changed

+278
-1
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
/*
2+
* Copyright 2021-2023 VMware, Inc.
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package com.vmware.taurus.service.deploy;
7+
8+
import com.vmware.taurus.ControlplaneApplication;
9+
import com.vmware.taurus.controlplane.model.data.DataJobResources;
10+
import com.vmware.taurus.datajobs.TestUtils;
11+
import com.vmware.taurus.datajobs.ToModelApiConverter;
12+
import com.vmware.taurus.service.kubernetes.ControlKubernetesService;
13+
import com.vmware.taurus.service.model.ActualDataJobDeployment;
14+
import com.vmware.taurus.service.model.DataJobDeploymentResources;
15+
import com.vmware.taurus.service.model.JobDeployment;
16+
import com.vmware.taurus.service.repository.ActualJobDeploymentRepository;
17+
import com.vmware.taurus.service.repository.DesiredJobDeploymentRepository;
18+
import com.vmware.taurus.service.repository.JobsRepository;
19+
import java.time.OffsetDateTime;
20+
import java.util.Set;
21+
import org.junit.jupiter.api.AfterEach;
22+
import org.junit.jupiter.api.Assertions;
23+
import org.junit.jupiter.api.BeforeEach;
24+
import org.junit.jupiter.api.Test;
25+
import org.mockito.Mockito;
26+
import org.springframework.beans.factory.annotation.Autowired;
27+
import org.springframework.boot.test.context.SpringBootTest;
28+
import org.springframework.boot.test.mock.mockito.MockBean;
29+
import org.springframework.boot.test.mock.mockito.SpyBean;
30+
import org.springframework.test.context.TestPropertySource;
31+
32+
@SpringBootTest(classes = ControlplaneApplication.class)
33+
@TestPropertySource(
34+
properties = {
35+
"datajobs.deployment.configuration.persistence.writeTos=DB",
36+
"datajobs.deployment.configuration.persistence.readDataSource=DB",
37+
"datajobs.deployment.configuration.synchronization.task.enabled:true"
38+
})
39+
public class DataJobsSynchronizerWriteTest {
40+
41+
@SpyBean DeploymentServiceV2 deploymentServiceV2;
42+
@SpyBean JobImageBuilder jobImageBuilder;
43+
@MockBean JobImageDeployerV2 jobImageDeployer;
44+
@MockBean ControlKubernetesService controlKubernetesService;
45+
@Autowired JobsRepository jobsRepository;
46+
@Autowired DesiredJobDeploymentRepository desiredJobDeploymentRepository;
47+
@Autowired DataJobsSynchronizer dataJobsSynchronizer;
48+
@Autowired ActualJobDeploymentRepository actualJobDeploymentRepository;
49+
50+
@BeforeEach
51+
public void setup() throws Exception {
52+
Mockito.doReturn(Set.of("jobName"))
53+
.when(deploymentServiceV2)
54+
.findAllActualDeploymentNamesFromKubernetes();
55+
Mockito.doReturn(true)
56+
.when(jobImageBuilder)
57+
.buildImage(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any());
58+
Mockito.doReturn(getTestDeployment())
59+
.when(jobImageDeployer)
60+
.scheduleJob(
61+
Mockito.any(),
62+
Mockito.any(),
63+
Mockito.any(),
64+
Mockito.anyBoolean(),
65+
Mockito.anyBoolean(),
66+
Mockito.anyString());
67+
}
68+
69+
@AfterEach
70+
public void cleanup() {
71+
jobsRepository.deleteAll();
72+
}
73+
74+
@Test
75+
public void testUpdateDesiredDeployment_expectNewDeployment() {
76+
var dataJob = ToModelApiConverter.toDataJob(TestUtils.getDataJob("teamName", "jobName"));
77+
jobsRepository.save(dataJob);
78+
JobDeployment jobDeployment = generateTestDeployment();
79+
deploymentServiceV2.updateDesiredDbDeployment(dataJob, jobDeployment, "user");
80+
81+
Assertions.assertEquals(0, actualJobDeploymentRepository.findAll().size());
82+
83+
dataJobsSynchronizer.synchronizeDataJobs();
84+
85+
var actualDataJobDeployment = actualJobDeploymentRepository.findById(dataJob.getName()).get();
86+
87+
Assertions.assertEquals(
88+
jobDeployment.getDataJobName(), actualDataJobDeployment.getDataJobName());
89+
Assertions.assertEquals(
90+
jobDeployment.getGitCommitSha(), actualDataJobDeployment.getGitCommitSha());
91+
Assertions.assertEquals(
92+
jobDeployment.getPythonVersion(), actualDataJobDeployment.getPythonVersion());
93+
Assertions.assertEquals("user", actualDataJobDeployment.getLastDeployedBy());
94+
}
95+
96+
@Test
97+
public void testUpdateDesiredDeployment_expectNoDeployment() {
98+
Mockito.doReturn(Set.of())
99+
.when(deploymentServiceV2)
100+
.findAllActualDeploymentNamesFromKubernetes();
101+
102+
Assertions.assertEquals(0, actualJobDeploymentRepository.findAll().size());
103+
104+
dataJobsSynchronizer.synchronizeDataJobs();
105+
106+
Assertions.assertEquals(0, actualJobDeploymentRepository.findAll().size());
107+
}
108+
109+
private JobDeployment generateTestDeployment() {
110+
JobDeployment jobDeployment = new JobDeployment();
111+
jobDeployment.setSchedule("testSched");
112+
jobDeployment.setDataJobName("jobName");
113+
jobDeployment.setDataJobTeam("teamName");
114+
jobDeployment.setPythonVersion("testPython");
115+
jobDeployment.setGitCommitSha("testSha");
116+
jobDeployment.setEnabled(true);
117+
var resources = new DataJobResources();
118+
resources.setCpuLimit(1f);
119+
resources.setCpuRequest(1f);
120+
resources.setMemoryLimit(1);
121+
resources.setMemoryRequest(1);
122+
jobDeployment.setResources(resources);
123+
return jobDeployment;
124+
}
125+
126+
private ActualDataJobDeployment getTestDeployment() {
127+
var testDeployment = new ActualDataJobDeployment();
128+
var testJob = generateTestDeployment();
129+
testDeployment.setDataJobName(testJob.getDataJobName());
130+
testDeployment.setDeploymentVersionSha(testJob.getGitCommitSha());
131+
testDeployment.setPythonVersion(testJob.getPythonVersion());
132+
testDeployment.setGitCommitSha(testJob.getGitCommitSha());
133+
testDeployment.setLastDeployedDate(OffsetDateTime.now());
134+
testDeployment.setResources(new DataJobDeploymentResources());
135+
testDeployment.setLastDeployedBy("user");
136+
return testDeployment;
137+
}
138+
}

projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/deploy/DeploymentServiceV2WriteTest.java renamed to projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/deploy/DeploymentServiceV2Test.java

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,11 @@
99
import com.vmware.taurus.controlplane.model.data.DataJobResources;
1010
import com.vmware.taurus.datajobs.TestUtils;
1111
import com.vmware.taurus.datajobs.ToModelApiConverter;
12+
import com.vmware.taurus.service.model.ActualDataJobDeployment;
1213
import com.vmware.taurus.service.model.DeploymentStatus;
1314
import com.vmware.taurus.service.model.DesiredDataJobDeployment;
1415
import com.vmware.taurus.service.model.JobDeployment;
16+
import com.vmware.taurus.service.repository.ActualJobDeploymentRepository;
1517
import com.vmware.taurus.service.repository.DesiredJobDeploymentRepository;
1618
import com.vmware.taurus.service.repository.JobsRepository;
1719
import org.junit.jupiter.api.AfterEach;
@@ -21,11 +23,12 @@
2123
import org.springframework.boot.test.context.SpringBootTest;
2224

2325
@SpringBootTest(classes = ControlplaneApplication.class)
24-
public class DeploymentServiceV2WriteTest {
26+
public class DeploymentServiceV2Test {
2527

2628
@Autowired JobsRepository jobsRepository;
2729
@Autowired DesiredJobDeploymentRepository desiredJobDeploymentRepository;
2830
@Autowired DeploymentServiceV2 deploymentServiceV2;
31+
@Autowired ActualJobDeploymentRepository actualJobDeploymentRepository;
2932

3033
@Test
3134
public void testUpdateDesiredDeployment_expectNewDeployment() {
@@ -53,10 +56,66 @@ public void testPatchDesiredDeployment_expectMergedDeployment() {
5356
compareSavedDeploymentWithTestDeployment(jobDeployment, savedDeployment, "user");
5457
}
5558

59+
@Test
60+
public void testUpdateDeploymentEnabledStatus() {
61+
62+
var dataJob = ToModelApiConverter.toDataJob(TestUtils.getDataJob("teamName", "jobName"));
63+
jobsRepository.save(dataJob);
64+
var initialDeployment = new DesiredDataJobDeployment();
65+
initialDeployment.setDataJob(dataJob);
66+
initialDeployment.setDataJobName(dataJob.getName());
67+
initialDeployment.setEnabled(false);
68+
desiredJobDeploymentRepository.save(initialDeployment);
69+
70+
var desiredDeployment = desiredJobDeploymentRepository.findById(dataJob.getName()).get();
71+
72+
Assertions.assertFalse(desiredDeployment.getEnabled());
73+
74+
deploymentServiceV2.updateDeploymentEnabledStatus(dataJob.getName(), true);
75+
76+
desiredDeployment = desiredJobDeploymentRepository.findById(dataJob.getName()).get();
77+
78+
Assertions.assertTrue(desiredDeployment.getEnabled());
79+
}
80+
81+
@Test
82+
public void testFindAllDesiredDataJobDeployments() {
83+
Assertions.assertEquals(
84+
0, deploymentServiceV2.findAllDesiredDataJobDeployments().keySet().size());
85+
86+
var dataJob = ToModelApiConverter.toDataJob(TestUtils.getDataJob("teamName", "jobName"));
87+
jobsRepository.save(dataJob);
88+
var initialDeployment = new DesiredDataJobDeployment();
89+
initialDeployment.setDataJob(dataJob);
90+
initialDeployment.setDataJobName(dataJob.getName());
91+
desiredJobDeploymentRepository.save(initialDeployment);
92+
93+
Assertions.assertEquals(
94+
1, deploymentServiceV2.findAllDesiredDataJobDeployments().keySet().size());
95+
}
96+
97+
@Test
98+
public void testFindAllActualDataJobDeployments() {
99+
100+
Assertions.assertEquals(
101+
0, deploymentServiceV2.findAllActualDataJobDeployments().keySet().size());
102+
var deployment = new ActualDataJobDeployment();
103+
104+
var dataJob = ToModelApiConverter.toDataJob(TestUtils.getDataJob("teamName", "jobName"));
105+
deployment.setDataJobName(dataJob.getName());
106+
107+
jobsRepository.save(dataJob);
108+
actualJobDeploymentRepository.save(deployment);
109+
110+
Assertions.assertEquals(
111+
1, deploymentServiceV2.findAllActualDataJobDeployments().keySet().size());
112+
}
113+
56114
@AfterEach
57115
public void cleanup() {
58116
desiredJobDeploymentRepository.deleteAll();
59117
jobsRepository.deleteAll();
118+
actualJobDeploymentRepository.deleteAll();
60119
}
61120

62121
private void compareSavedDeploymentWithTestDeployment(
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
/*
2+
* Copyright 2021-2023 VMware, Inc.
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package com.vmware.taurus.service.deploy;
7+
8+
import com.vmware.taurus.ControlplaneApplication;
9+
import com.vmware.taurus.datajobs.TestUtils;
10+
import com.vmware.taurus.datajobs.ToModelApiConverter;
11+
import com.vmware.taurus.service.kubernetes.DataJobsKubernetesService;
12+
import com.vmware.taurus.service.model.ActualDataJobDeployment;
13+
import com.vmware.taurus.service.model.DataJob;
14+
import com.vmware.taurus.service.model.DataJobDeploymentResources;
15+
import com.vmware.taurus.service.model.DesiredDataJobDeployment;
16+
import io.kubernetes.client.openapi.ApiException;
17+
import org.junit.jupiter.api.Assertions;
18+
import org.junit.jupiter.api.Test;
19+
import org.mockito.Mockito;
20+
import org.springframework.beans.factory.annotation.Autowired;
21+
import org.springframework.boot.test.context.SpringBootTest;
22+
import org.springframework.boot.test.mock.mockito.SpyBean;
23+
24+
@SpringBootTest(classes = ControlplaneApplication.class)
25+
public class JobImageDeployerV2Test {
26+
27+
@Autowired private JobImageDeployerV2 jobImageDeployerV2;
28+
@SpyBean private DataJobsKubernetesService dataJobsKubernetesService;
29+
30+
@Test
31+
public void testScheduleJob() throws ApiException {
32+
var dataJob = ToModelApiConverter.toDataJob(TestUtils.getDataJob("teamName", "jobName"));
33+
Mockito.doNothing().when(dataJobsKubernetesService).createCronJob(Mockito.any());
34+
35+
var actualDeployment =
36+
jobImageDeployerV2.scheduleJob(
37+
dataJob, getDesiredDeployment(dataJob), null, false, false, "test-job");
38+
39+
verifyActualDeployment(actualDeployment);
40+
}
41+
42+
@Test
43+
public void testScheduleJob_presentInK8S() throws ApiException {
44+
var dataJob = ToModelApiConverter.toDataJob(TestUtils.getDataJob("teamName", "jobName"));
45+
Mockito.doNothing().when(dataJobsKubernetesService).updateCronJob(Mockito.any());
46+
47+
var actualDeployment =
48+
jobImageDeployerV2.scheduleJob(
49+
dataJob, getDesiredDeployment(dataJob), null, false, true, "test-job");
50+
51+
verifyActualDeployment(actualDeployment);
52+
}
53+
54+
private void verifyActualDeployment(ActualDataJobDeployment actualDeployment) {
55+
Assertions.assertNotNull(actualDeployment);
56+
Assertions.assertNotNull(actualDeployment.getDeploymentVersionSha());
57+
Assertions.assertEquals("jobName", actualDeployment.getDataJobName());
58+
Assertions.assertEquals("testPython", actualDeployment.getPythonVersion());
59+
Assertions.assertEquals("testSha", actualDeployment.getGitCommitSha());
60+
Assertions.assertEquals("testSched", actualDeployment.getSchedule());
61+
Assertions.assertNotNull(actualDeployment.getResources());
62+
Assertions.assertEquals("user", actualDeployment.getLastDeployedBy());
63+
Assertions.assertTrue(actualDeployment.getEnabled());
64+
}
65+
66+
private DesiredDataJobDeployment getDesiredDeployment(DataJob dataJob) {
67+
var initialDeployment = new DesiredDataJobDeployment();
68+
initialDeployment.setDataJob(dataJob);
69+
initialDeployment.setDataJobName(dataJob.getName());
70+
initialDeployment.setEnabled(true);
71+
initialDeployment.setResources(new DataJobDeploymentResources());
72+
initialDeployment.setSchedule("testSched");
73+
initialDeployment.setUserInitiated(true);
74+
initialDeployment.setGitCommitSha("testSha");
75+
initialDeployment.setPythonVersion("testPython");
76+
initialDeployment.setLastDeployedBy("user");
77+
78+
return initialDeployment;
79+
}
80+
}

0 commit comments

Comments
 (0)