Skip to content

Commit e82a7b8

Browse files
base impl extended timer
1 parent a0069d9 commit e82a7b8

File tree

7 files changed

+105
-64
lines changed

7 files changed

+105
-64
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package io.javaoperatorsdk.operator.processing.event.internal;
2+
3+
import io.javaoperatorsdk.operator.processing.event.AbstractEvent;
4+
import io.javaoperatorsdk.operator.processing.event.Event;
5+
import io.javaoperatorsdk.operator.processing.event.EventSource;
6+
7+
import java.util.Collections;
8+
import java.util.List;
9+
10+
public class OneTimerEvent extends AbstractEvent {
11+
12+
private final List<Event> events;
13+
14+
public OneTimerEvent(String relatedCustomResourceUid, EventSource eventSource, List<Event> events) {
15+
super(relatedCustomResourceUid, eventSource);
16+
this.events = events;
17+
}
18+
19+
public List<Event> getEvents() {
20+
if (events == null) {
21+
return Collections.EMPTY_LIST;
22+
}
23+
return events;
24+
}
25+
}

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/internal/TimerEvent.java renamed to operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/internal/RepeatedTimerEvent.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22

33
import io.javaoperatorsdk.operator.processing.event.AbstractEvent;
44

5-
public class TimerEvent extends AbstractEvent {
5+
public class RepeatedTimerEvent extends AbstractEvent {
66

7-
public TimerEvent(String relatedCustomResourceUid, TimerEventSource eventSource) {
7+
public RepeatedTimerEvent(String relatedCustomResourceUid, TimerEventSource eventSource) {
88
super(relatedCustomResourceUid, eventSource);
99
}
1010
}

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/internal/TimerEventSource.java

Lines changed: 64 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -3,74 +3,90 @@
33
import io.fabric8.kubernetes.client.CustomResource;
44
import io.javaoperatorsdk.operator.processing.KubernetesResourceUtils;
55
import io.javaoperatorsdk.operator.processing.event.AbstractEventSource;
6+
7+
import java.util.List;
68
import java.util.Map;
79
import java.util.Timer;
810
import java.util.TimerTask;
911
import java.util.concurrent.ConcurrentHashMap;
12+
13+
import io.javaoperatorsdk.operator.processing.event.Event;
1014
import org.slf4j.Logger;
1115
import org.slf4j.LoggerFactory;
1216

1317
public class TimerEventSource extends AbstractEventSource {
1418

15-
private Logger log = LoggerFactory.getLogger(TimerEventSource.class);
19+
private Logger log = LoggerFactory.getLogger(TimerEventSource.class);
1620

17-
private final Timer timer = new Timer();
21+
private final Timer timer = new Timer();
1822

19-
private final Map<String, EventProducerTimeTask> onceTasks = new ConcurrentHashMap<>();
20-
private final Map<String, EventProducerTimeTask> timerTasks = new ConcurrentHashMap<>();
23+
private final Map<String, EventProducerTimeTask> onceTasks = new ConcurrentHashMap<>();
24+
private final Map<String, EventProducerTimeTask> timerTasks = new ConcurrentHashMap<>();
2125

22-
public void schedule(CustomResource customResource, long delay, long period) {
23-
String resourceUid = KubernetesResourceUtils.getUID(customResource);
24-
if (timerTasks.containsKey(resourceUid)) {
25-
return;
26-
}
27-
EventProducerTimeTask task = new EventProducerTimeTask(resourceUid);
28-
timerTasks.put(resourceUid, task);
29-
timer.schedule(task, delay, period);
30-
}
31-
32-
public void scheduleOnce(CustomResource customResource, long delay) {
33-
String resourceUid = KubernetesResourceUtils.getUID(customResource);
34-
if (onceTasks.containsKey(resourceUid)) {
35-
cancelOnceSchedule(resourceUid);
26+
public void schedule(CustomResource customResource, long delay, long period) {
27+
String resourceUid = KubernetesResourceUtils.getUID(customResource);
28+
if (timerTasks.containsKey(resourceUid)) {
29+
return;
30+
}
31+
EventProducerTimeTask task = new EventProducerTimeTask(resourceUid, true, null);
32+
timerTasks.put(resourceUid, task);
33+
timer.schedule(task, delay, period);
3634
}
37-
EventProducerTimeTask task = new EventProducerTimeTask(resourceUid);
38-
onceTasks.put(resourceUid, task);
39-
timer.schedule(task, delay);
40-
}
41-
42-
@Override
43-
public void eventSourceDeRegisteredForResource(String customResourceUid) {
44-
cancelSchedule(customResourceUid);
45-
cancelOnceSchedule(customResourceUid);
46-
}
47-
48-
public void cancelSchedule(String customResourceUid) {
49-
TimerTask timerTask = timerTasks.remove(customResourceUid);
50-
if (timerTask != null) {
51-
timerTask.cancel();
35+
36+
public void scheduleOnce(CustomResource customResource, long delay) {
37+
scheduleOnce(customResource, delay, null);
5238
}
53-
}
5439

55-
public void cancelOnceSchedule(String customResourceUid) {
56-
TimerTask timerTask = onceTasks.remove(customResourceUid);
57-
if (timerTask != null) {
58-
timerTask.cancel();
40+
public void scheduleOnce(CustomResource customResource, long delay, List<Event> events) {
41+
String resourceUid = KubernetesResourceUtils.getUID(customResource);
42+
if (onceTasks.containsKey(resourceUid)) {
43+
cancelOnceSchedule(resourceUid);
44+
}
45+
EventProducerTimeTask task = new EventProducerTimeTask(resourceUid, false, events);
46+
onceTasks.put(resourceUid, task);
47+
timer.schedule(task, delay);
5948
}
60-
}
6149

62-
public class EventProducerTimeTask extends TimerTask {
50+
@Override
51+
public void eventSourceDeRegisteredForResource(String customResourceUid) {
52+
cancelSchedule(customResourceUid);
53+
cancelOnceSchedule(customResourceUid);
54+
}
6355

64-
protected final String customResourceUid;
56+
public void cancelSchedule(String customResourceUid) {
57+
TimerTask timerTask = timerTasks.remove(customResourceUid);
58+
if (timerTask != null) {
59+
timerTask.cancel();
60+
}
61+
}
6562

66-
public EventProducerTimeTask(String customResourceUid) {
67-
this.customResourceUid = customResourceUid;
63+
public void cancelOnceSchedule(String customResourceUid) {
64+
TimerTask timerTask = onceTasks.remove(customResourceUid);
65+
if (timerTask != null) {
66+
timerTask.cancel();
67+
}
6868
}
6969

70-
@Override
71-
public void run() {
72-
log.debug("Producing event for custom resource id: {}", customResourceUid);
73-
eventHandler.handleEvent(new TimerEvent(customResourceUid, TimerEventSource.this));
70+
public class EventProducerTimeTask extends TimerTask {
71+
72+
protected final String customResourceUid;
73+
private final boolean repeated;
74+
private final List<Event> events;
75+
76+
private EventProducerTimeTask(String customResourceUid, boolean repeated, List<Event> events) {
77+
this.customResourceUid = customResourceUid;
78+
this.repeated = repeated;
79+
this.events = events;
80+
}
81+
82+
@Override
83+
public void run() {
84+
log.debug("Producing event for custom resource id: {}", customResourceUid);
85+
if (repeated) {
86+
eventHandler.handleEvent(new RepeatedTimerEvent(customResourceUid, TimerEventSource.this));
87+
} else {
88+
eventHandler.handleEvent(new OneTimerEvent(customResourceUid, TimerEventSource.this, events));
89+
}
90+
}
7491
}
75-
}
7692
}

operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/DefaultEventHandlerTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
import io.javaoperatorsdk.operator.processing.event.DefaultEventSourceManager;
1616
import io.javaoperatorsdk.operator.processing.event.Event;
1717
import io.javaoperatorsdk.operator.processing.event.internal.CustomResourceEvent;
18-
import io.javaoperatorsdk.operator.processing.event.internal.TimerEvent;
18+
import io.javaoperatorsdk.operator.processing.event.internal.RepeatedTimerEvent;
1919
import io.javaoperatorsdk.operator.processing.event.internal.TimerEventSource;
2020
import io.javaoperatorsdk.operator.processing.retry.GenericRetry;
2121
import io.javaoperatorsdk.operator.sample.simple.TestCustomResource;
@@ -98,7 +98,7 @@ public void buffersAllIncomingEventsWhileControllerInExecution() {
9898
.handleExecution(captor.capture());
9999
List<Event> events = captor.getAllValues().get(1).getEvents();
100100
assertThat(events).hasSize(2);
101-
assertThat(events.get(0)).isInstanceOf(TimerEvent.class);
101+
assertThat(events.get(0)).isInstanceOf(RepeatedTimerEvent.class);
102102
assertThat(events.get(1)).isInstanceOf(CustomResourceEvent.class);
103103
}
104104

@@ -236,7 +236,7 @@ private CustomResourceEvent prepareCREvent(String uid) {
236236
}
237237

238238
private Event nonCREvent(String relatedCustomResourceUid) {
239-
TimerEvent timerEvent = new TimerEvent(relatedCustomResourceUid, null);
240-
return timerEvent;
239+
RepeatedTimerEvent repeatedTimerEvent = new RepeatedTimerEvent(relatedCustomResourceUid, null);
240+
return repeatedTimerEvent;
241241
}
242242
}

operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/EventBufferTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import static org.assertj.core.api.Assertions.assertThat;
44

55
import io.javaoperatorsdk.operator.processing.event.Event;
6-
import io.javaoperatorsdk.operator.processing.event.internal.TimerEvent;
6+
import io.javaoperatorsdk.operator.processing.event.internal.RepeatedTimerEvent;
77
import java.util.List;
88
import java.util.UUID;
99
import org.junit.jupiter.api.Test;
@@ -13,8 +13,8 @@ class EventBufferTest {
1313
private EventBuffer eventBuffer = new EventBuffer();
1414

1515
String uid = UUID.randomUUID().toString();
16-
Event testEvent1 = new TimerEvent(uid, null);
17-
Event testEvent2 = new TimerEvent(uid, null);
16+
Event testEvent1 = new RepeatedTimerEvent(uid, null);
17+
Event testEvent2 = new RepeatedTimerEvent(uid, null);
1818

1919
@Test
2020
public void storesEvents() {

operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/EventListTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,19 @@
33
import static org.assertj.core.api.Assertions.assertThat;
44
import static org.mockito.Mockito.mock;
55

6-
import io.javaoperatorsdk.operator.processing.event.internal.TimerEvent;
6+
import io.javaoperatorsdk.operator.processing.event.internal.RepeatedTimerEvent;
77
import java.util.Arrays;
88
import org.junit.jupiter.api.Test;
99

1010
class EventListTest {
1111

1212
@Test
1313
public void returnsLatestOfEventType() {
14-
TimerEvent event2 = new TimerEvent("1", null);
14+
RepeatedTimerEvent event2 = new RepeatedTimerEvent("1", null);
1515
EventList eventList =
1616
new EventList(
17-
Arrays.asList(mock(Event.class), new TimerEvent("2", null), event2, mock(Event.class)));
17+
Arrays.asList(mock(Event.class), new RepeatedTimerEvent("2", null), event2, mock(Event.class)));
1818

19-
assertThat(eventList.getLatestOfType(TimerEvent.class).get()).isEqualTo(event2);
19+
assertThat(eventList.getLatestOfType(RepeatedTimerEvent.class).get()).isEqualTo(event2);
2020
}
2121
}
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121

2222
@Disabled(
2323
"Currently very flaky, will fix in https://github.com/java-operator-sdk/java-operator-sdk/issues/293")
24-
class TimerEventSourceTest {
24+
class RepeatedTimerEventSourceTest {
2525

2626
public static final int INITIAL_DELAY = 50;
2727
public static final int PERIOD = 50;
@@ -42,10 +42,10 @@ public void producesEventsPeriodically() {
4242

4343
timerEventSource.schedule(customResource, INITIAL_DELAY, PERIOD);
4444

45-
ArgumentCaptor<TimerEvent> argumentCaptor = ArgumentCaptor.forClass(TimerEvent.class);
45+
ArgumentCaptor<RepeatedTimerEvent> argumentCaptor = ArgumentCaptor.forClass(RepeatedTimerEvent.class);
4646
verify(eventHandlerMock, timeout(INITIAL_DELAY + PERIOD + TESTING_TIME_SLACK).times(2))
4747
.handleEvent(argumentCaptor.capture());
48-
List<TimerEvent> events = argumentCaptor.getAllValues();
48+
List<RepeatedTimerEvent> events = argumentCaptor.getAllValues();
4949
assertThat(events)
5050
.allMatch(e -> e.getRelatedCustomResourceUid().equals(getUID(customResource)));
5151
assertThat(events).allMatch(e -> e.getEventSource().equals(timerEventSource));

0 commit comments

Comments
 (0)