diff --git a/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/deploy/JobImageDeployer.java b/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/deploy/JobImageDeployer.java index 337556073a..318eecde0b 100644 --- a/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/deploy/JobImageDeployer.java +++ b/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/deploy/JobImageDeployer.java @@ -167,7 +167,9 @@ private void updateCronJob(DataJob dataJob, JobDeployment jobDeployment, String lastDeployedBy) throws ApiException { log.debug("Deploy cron job for data job {}", dataJob); - String schedule = dataJob.getJobConfig().getSchedule(); + + // Schedule defaults to Feb 30 (i.e. never) if no schedule has been given. + String schedule = StringUtils.isEmpty(dataJob.getJobConfig().getSchedule()) ? "0 0 30 2 *" : dataJob.getJobConfig().getSchedule(); var jobName = dataJob.getName(); var volume = KubernetesService.volume(VOLUME_NAME); @@ -291,6 +293,7 @@ private Map getJobAnnotations(DataJob dataJob, String deployedBy jobPodAnnotations.put(JobAnnotation.DEPLOYED_BY.getValue(), deployedBy); jobPodAnnotations.put(JobAnnotation.DEPLOYED_DATE.getValue(), OffsetDateTime.now().toString()); jobPodAnnotations.put(JobAnnotation.STARTED_BY.getValue(), "scheduled/runtime"); //TODO are those valid? + jobPodAnnotations.put(JobAnnotation.UNSCHEDULED.getValue(), (StringUtils.isEmpty(dataJob.getJobConfig().getSchedule()) ? "true" : "false")); return jobPodAnnotations; } diff --git a/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/model/JobAnnotation.java b/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/model/JobAnnotation.java index 7b6815ad16..0b7541beee 100644 --- a/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/model/JobAnnotation.java +++ b/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/model/JobAnnotation.java @@ -14,7 +14,8 @@ public enum JobAnnotation { DEPLOYED_DATE("deployed-date"), DEPLOYED_BY("deployed-by"), EXECUTION_TYPE("execution-type"), - OP_ID("op-id"); + OP_ID("op-id"), + UNSCHEDULED("unscheduled"); @Getter private String value; diff --git a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/JobImageDeployerTest.java b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/JobImageDeployerTest.java index 9ad596bd1e..1588405e04 100644 --- a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/JobImageDeployerTest.java +++ b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/JobImageDeployerTest.java @@ -98,7 +98,7 @@ public void testScheduleLabelsAnnotations() { var annotations = annotationCaptor.getValue(); //check everything was as expected Assertions.assertEquals(3, labels.size(), "Expecting three labels"); - Assertions.assertEquals(5, annotations.size(), "Expecting five annotations"); + Assertions.assertEquals(6, annotations.size(), "Expecting six annotations"); var jobName = labels.get(JobLabel.NAME.getValue()); var jobVersion = labels.get(JobLabel.VERSION.getValue()); @@ -113,6 +113,7 @@ public void testScheduleLabelsAnnotations() { var deployedDate = annotations.get(JobAnnotation.DEPLOYED_DATE.getValue()); var startedBy = annotations.get(JobAnnotation.STARTED_BY.getValue()); var executionType = annotations.get(JobAnnotation.EXECUTION_TYPE.getValue()); + var unscheduled = annotations.get(JobAnnotation.UNSCHEDULED.getValue()); Assertions.assertEquals("schedule string", schedule); Assertions.assertEquals("lastDeployedBy", deployedBy); @@ -120,6 +121,7 @@ public void testScheduleLabelsAnnotations() { "Testing if date is the same, we cannot be precise down to the millisecond."); Assertions.assertEquals("scheduled/runtime", startedBy); Assertions.assertEquals("scheduled", executionType); + Assertions.assertEquals("false", unscheduled); } catch (ApiException e) { e.printStackTrace(); diff --git a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/deploy/JobImageDeployerTest.java b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/deploy/JobImageDeployerTest.java index 6a34c30945..a3429a8ba8 100644 --- a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/deploy/JobImageDeployerTest.java +++ b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/deploy/JobImageDeployerTest.java @@ -146,4 +146,28 @@ public void testJobContainerName() throws ApiException { var jobContainer = containerCaptor.getValue(); Assertions.assertEquals(testDataJob.getName(), jobContainer.getName()); } + + @Test + public void testJobNoSchedule() throws ApiException { + JobConfig jobConfig = new JobConfig(); + jobConfig.setSchedule(""); + testDataJob = new DataJob(); + testDataJob.setName(TEST_JOB_NAME); + testDataJob.setJobConfig(jobConfig); + + var jobDeployment = new JobDeployment(); + jobDeployment.setDataJobName(TEST_JOB_NAME); + jobDeployment.setGitCommitSha("test-commit"); + jobDeployment.setEnabled(true); + jobDeployment.setImageName("image"); + + jobImageDeployer.scheduleJob(testDataJob, jobDeployment, true, TEST_PRINCIPAL_NAME); + + ArgumentCaptor scheduleCaptor = ArgumentCaptor.forClass(String.class); + verify(kubernetesService).createCronJob(anyString(), anyString(), anyMap(), scheduleCaptor.capture(), anyBoolean(), + anyList(), any(KubernetesService.Resources.class), any(KubernetesService.Resources.class), + any(V1Container.class), any(V1Container.class), anyList(), anyMap(), anyMap(), anyMap(), anyMap(), anyList()); + Assertions.assertEquals("0 0 30 2 *", scheduleCaptor.getValue()); + Assertions.assertEquals("", testDataJob.getJobConfig().getSchedule()); + } } diff --git a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/model/K8SAnnotationsLabelsTest.java b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/model/K8SAnnotationsLabelsTest.java index 0856f9bd0c..c71343a803 100644 --- a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/model/K8SAnnotationsLabelsTest.java +++ b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/model/K8SAnnotationsLabelsTest.java @@ -26,6 +26,7 @@ public void testAnnotations() { var deployedBy = JobAnnotation.DEPLOYED_BY.getValue(); var executionType = JobAnnotation.EXECUTION_TYPE.getValue(); var opId = JobAnnotation.OP_ID.getValue(); + var unscheduled = JobAnnotation.UNSCHEDULED.getValue(); Assertions.assertEquals("com.vmware.taurus/schedule", schedule, msg); Assertions.assertEquals("com.vmware.taurus/started-by", startedBy, msg); @@ -33,8 +34,9 @@ public void testAnnotations() { Assertions.assertEquals("com.vmware.taurus/deployed-by", deployedBy, msg); Assertions.assertEquals("com.vmware.taurus/execution-type", executionType, msg); Assertions.assertEquals("com.vmware.taurus/op-id", opId, msg); + Assertions.assertEquals("com.vmware.taurus/unscheduled", unscheduled, msg); - Assertions.assertEquals(6, JobAnnotation.values().length, msg); + Assertions.assertEquals(7, JobAnnotation.values().length, msg); } @Test