Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

control-service: unit tests for data job persistence classes #2935

Merged
merged 4 commits into from
Dec 4, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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;
}
}