Skip to content

Commit f807a2c

Browse files
committed
chore: Add overwrite flag to jobs
Signed-off-by: Javier Aliaga <[email protected]>
1 parent 58d099c commit f807a2c

File tree

4 files changed

+105
-2
lines changed

4 files changed

+105
-2
lines changed

sdk-tests/src/test/java/io/dapr/it/testcontainers/jobs/DaprJobsIT.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ public void testJobScheduleCreationWithDueTime() {
9393
.withZone(ZoneOffset.UTC);
9494

9595
Instant currentTime = Instant.now();
96-
daprPreviewClient.scheduleJob(new ScheduleJobRequest("Job", currentTime)).block();
96+
daprPreviewClient.scheduleJob(new ScheduleJobRequest("Job", currentTime).setOverwrite(true)).block();
9797

9898
GetJobResponse getJobResponse =
9999
daprPreviewClient.getJob(new GetJobRequest("Job")).block();
@@ -108,7 +108,7 @@ public void testJobScheduleCreationWithSchedule() {
108108

109109
Instant currentTime = Instant.now();
110110
daprPreviewClient.scheduleJob(new ScheduleJobRequest("Job", JobSchedule.hourly())
111-
.setDueTime(currentTime)).block();
111+
.setDueTime(currentTime).setOverwrite(true)).block();
112112

113113
GetJobResponse getJobResponse =
114114
daprPreviewClient.getJob(new GetJobRequest("Job")).block();
@@ -129,6 +129,7 @@ public void testJobScheduleCreationWithAllParameters() {
129129
.setTtl(currentTime.plus(2, ChronoUnit.HOURS))
130130
.setData("Job data".getBytes())
131131
.setRepeat(3)
132+
.setOverwrite(true)
132133
.setSchedule(JobSchedule.fromString(cronExpression))).block();
133134

134135
GetJobResponse getJobResponse =
@@ -152,6 +153,7 @@ public void testDeleteJobRequest() {
152153
.setTtl(currentTime.plus(2, ChronoUnit.HOURS))
153154
.setData("Job data".getBytes())
154155
.setRepeat(3)
156+
.setOverwrite(true)
155157
.setSchedule(JobSchedule.fromString(cronExpression))).block();
156158

157159
daprPreviewClient.deleteJob(new DeleteJobRequest("Job")).block();

sdk/src/main/java/io/dapr/client/DaprClientImpl.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1336,6 +1336,8 @@ public Mono<Void> scheduleJob(ScheduleJobRequest scheduleJobRequest) {
13361336
scheduleJobRequestBuilder.setDueTime(iso8601Formatter.format(scheduleJobRequest.getDueTime()));
13371337
}
13381338

1339+
scheduleJobRequestBuilder.setOverwrite(scheduleJobRequest.getOverwrite());
1340+
13391341
Mono<DaprProtos.ScheduleJobResponse> scheduleJobResponseMono =
13401342
Mono.deferContextual(context -> this.createMono(
13411343
it -> intercept(context, asyncStub)

sdk/src/main/java/io/dapr/client/domain/ScheduleJobRequest.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ public class ScheduleJobRequest {
2525
private Instant dueTime;
2626
private Integer repeats;
2727
private Instant ttl;
28+
private boolean overwrite;
2829

2930
/**
3031
* Constructor to create ScheduleJobRequest.
@@ -165,4 +166,24 @@ public Integer getRepeats() {
165166
public Instant getTtl() {
166167
return ttl;
167168
}
169+
170+
/**
171+
* Gets the overwrite flag.
172+
*
173+
* @return The overwrite flag.
174+
*/
175+
public boolean getOverwrite() {
176+
return overwrite;
177+
}
178+
179+
/**
180+
* Sets the overwrite flag.
181+
*
182+
* @param overwrite The overwrite flag.
183+
* @return This builder instance.
184+
*/
185+
public ScheduleJobRequest setOverwrite(boolean overwrite) {
186+
this.overwrite = overwrite;
187+
return this;
188+
}
168189
}

sdk/src/test/java/io/dapr/client/DaprPreviewClientGrpcTest.java

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -817,6 +817,84 @@ public void scheduleJobShouldThrowWhenNameInRequestIsEmpty() {
817817
assertEquals("Name in the request cannot be null or empty", exception.getMessage());
818818
}
819819

820+
@Test
821+
public void scheduleJobShouldThrowWhenNameAlreadyExists() {
822+
AtomicInteger callCount = new AtomicInteger(0);
823+
824+
doAnswer(invocation -> {
825+
StreamObserver<DaprProtos.ScheduleJobResponse> observer = invocation.getArgument(1);
826+
if (callCount.incrementAndGet() == 1) {
827+
// First call succeeds
828+
observer.onCompleted();
829+
} else {
830+
// Second call fails with ALREADY_EXISTS
831+
observer.onError(newStatusRuntimeException("ALREADY_EXISTS", "Job with name 'testJob' already exists"));
832+
}
833+
return null;
834+
}).when(daprStub).scheduleJobAlpha1(any(DaprProtos.ScheduleJobRequest.class), any());
835+
836+
// First call should succeed
837+
ScheduleJobRequest firstRequest = new ScheduleJobRequest("testJob", Instant.now());
838+
assertDoesNotThrow(() -> previewClient.scheduleJob(firstRequest).block());
839+
840+
ArgumentCaptor<DaprProtos.ScheduleJobRequest> captor =
841+
ArgumentCaptor.forClass(DaprProtos.ScheduleJobRequest.class);
842+
843+
verify(daprStub, times(1)).scheduleJobAlpha1(captor.capture(), Mockito.any());
844+
DaprProtos.ScheduleJobRequest actualScheduleJobRequest = captor.getValue();
845+
DaprProtos.Job job = actualScheduleJobRequest.getJob();
846+
assertEquals("testJob", job.getName());
847+
assertFalse(job.hasData());
848+
assertEquals(0, job.getRepeats());
849+
assertFalse(job.hasTtl());
850+
851+
// Second call with same name should fail
852+
ScheduleJobRequest secondRequest = new ScheduleJobRequest("testJob", Instant.now());
853+
854+
assertThrowsDaprException(
855+
ExecutionException.class,
856+
"ALREADY_EXISTS",
857+
"ALREADY_EXISTS: Job with name 'testJob' already exists",
858+
() -> previewClient.scheduleJob(secondRequest).block());
859+
}
860+
861+
@Test
862+
public void scheduleJobShouldSucceedWhenNameAlreadyExistsWithOverwrite() {
863+
doAnswer(invocation -> {
864+
StreamObserver<DaprProtos.ScheduleJobResponse> observer = invocation.getArgument(1);
865+
observer.onCompleted(); // Simulate successful response for both calls
866+
return null;
867+
}).when(daprStub).scheduleJobAlpha1(any(DaprProtos.ScheduleJobRequest.class), any());
868+
869+
// First call should succeed
870+
ScheduleJobRequest firstRequest = new ScheduleJobRequest("testJob", Instant.now());
871+
assertDoesNotThrow(() -> previewClient.scheduleJob(firstRequest).block());
872+
873+
// Second call with same name but overwrite=true should also succeed
874+
ScheduleJobRequest secondRequest = new ScheduleJobRequest("testJob", Instant.now())
875+
.setOverwrite(true);
876+
assertDoesNotThrow(() -> previewClient.scheduleJob(secondRequest).block());
877+
878+
// Verify that both calls were made successfully
879+
ArgumentCaptor<DaprProtos.ScheduleJobRequest> captor =
880+
ArgumentCaptor.forClass(DaprProtos.ScheduleJobRequest.class);
881+
verify(daprStub, times(2)).scheduleJobAlpha1(captor.capture(), any());
882+
883+
// Verify the first call doesn't have overwrite set
884+
DaprProtos.ScheduleJobRequest firstActualRequest = captor.getAllValues().get(0);
885+
assertFalse(firstActualRequest.getJob().getOverwrite());
886+
assertEquals("testJob", firstActualRequest.getJob().getName());
887+
888+
// Verify the second call has overwrite set to true
889+
DaprProtos.ScheduleJobRequest secondActualRequest = captor.getAllValues().get(1);
890+
assertTrue(secondActualRequest.getJob().getOverwrite());
891+
assertEquals("testJob", secondActualRequest.getJob().getName());
892+
}
893+
894+
895+
896+
897+
820898
@Test
821899
public void getJobShouldReturnResponseWhenAllFieldsArePresentInRequest() {
822900
DateTimeFormatter iso8601Formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")

0 commit comments

Comments
 (0)