Skip to content

Commit 825cd2e

Browse files
committed
wip
Signed-off-by: Attila Mészáros <[email protected]>
1 parent 6d84d08 commit 825cd2e

File tree

7 files changed

+70
-27
lines changed

7 files changed

+70
-27
lines changed

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerMode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@
22

33
public enum ControllerMode {
44
DEFAULT,
5-
ALL_EVENT_MODE
5+
RECONCILE_ALL_EVENT
66
}

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -465,6 +465,13 @@ public void run() {
465465
try {
466466
var actualResource = cache.get(resourceID);
467467
if (actualResource.isEmpty()) {
468+
if (isAllEventMode()) {
469+
var state = resourceStateManager.get(resourceID);
470+
actualResource =
471+
(Optional<P>)
472+
state.filter(s -> s.deleteEventPresent()).map(s -> s.getLastKnownResource());
473+
}
474+
468475
log.debug("Skipping execution; primary resource missing from cache: {}", resourceID);
469476
return;
470477
}
@@ -504,6 +511,6 @@ public synchronized boolean isRunning() {
504511
}
505512

506513
private boolean isAllEventMode() {
507-
return controllerConfiguration.getMode() == ControllerMode.ALL_EVENT_MODE;
514+
return controllerConfiguration.getMode() == ControllerMode.RECONCILE_ALL_EVENT;
508515
}
509516
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.util.List;
44
import java.util.Map;
5+
import java.util.Optional;
56
import java.util.concurrent.ConcurrentHashMap;
67
import java.util.stream.Collectors;
78

@@ -15,6 +16,10 @@ public ResourceState getOrCreate(ResourceID resourceID) {
1516
return states.computeIfAbsent(resourceID, ResourceState::new);
1617
}
1718

19+
public Optional<ResourceState> get(ResourceID resourceID) {
20+
return Optional.ofNullable(states.get(resourceID));
21+
}
22+
1823
public ResourceState remove(ResourceID resourceID) {
1924
return states.remove(resourceID);
2025
}

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/controller/ControllerEventSource.java

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,8 @@ public synchronized void start() {
6262
}
6363
}
6464

65-
public void eventReceived(ResourceAction action, T resource, T oldResource) {
65+
public void eventReceived(
66+
ResourceAction action, T resource, T oldResource, Boolean deletedFinalStateUnknown) {
6667
try {
6768
if (log.isDebugEnabled()) {
6869
log.debug(
@@ -76,8 +77,18 @@ public void eventReceived(ResourceAction action, T resource, T oldResource) {
7677
MDCUtils.addResourceInfo(resource);
7778
controller.getEventSourceManager().broadcastOnResourceEvent(action, resource, oldResource);
7879
if (isAcceptedByFilters(action, resource, oldResource)) {
79-
getEventHandler()
80-
.handleEvent(new ResourceEvent(action, ResourceID.fromResource(resource), resource));
80+
if (deletedFinalStateUnknown != null) {
81+
getEventHandler()
82+
.handleEvent(
83+
new ResourceDeleteEvent(
84+
action,
85+
ResourceID.fromResource(resource),
86+
resource,
87+
deletedFinalStateUnknown));
88+
} else {
89+
getEventHandler()
90+
.handleEvent(new ResourceEvent(action, ResourceID.fromResource(resource), resource));
91+
}
8192
} else {
8293
log.debug("Skipping event handling resource {}", ResourceID.fromResource(resource));
8394
}
@@ -103,19 +114,19 @@ private boolean isAcceptedByFilters(ResourceAction action, T resource, T oldReso
103114
@Override
104115
public void onAdd(T resource) {
105116
super.onAdd(resource);
106-
eventReceived(ResourceAction.ADDED, resource, null);
117+
eventReceived(ResourceAction.ADDED, resource, null, null);
107118
}
108119

109120
@Override
110121
public void onUpdate(T oldCustomResource, T newCustomResource) {
111122
super.onUpdate(oldCustomResource, newCustomResource);
112-
eventReceived(ResourceAction.UPDATED, newCustomResource, oldCustomResource);
123+
eventReceived(ResourceAction.UPDATED, newCustomResource, oldCustomResource, null);
113124
}
114125

115126
@Override
116127
public void onDelete(T resource, boolean b) {
117128
super.onDelete(resource, b);
118-
eventReceived(ResourceAction.DELETED, resource, null);
129+
eventReceived(ResourceAction.DELETED, resource, null, b);
119130
}
120131

121132
@Override
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package io.javaoperatorsdk.operator.processing.event.source.controller;
2+
3+
import io.fabric8.kubernetes.api.model.HasMetadata;
4+
import io.javaoperatorsdk.operator.processing.event.ResourceID;
5+
6+
public class ResourceDeleteEvent extends ResourceEvent {
7+
8+
private final boolean deletedFinalStateUnknown;
9+
10+
public ResourceDeleteEvent(
11+
ResourceAction action,
12+
ResourceID resourceID,
13+
HasMetadata resource,
14+
boolean deletedFinalStateUnknown) {
15+
super(action, resourceID, resource);
16+
this.deletedFinalStateUnknown = deletedFinalStateUnknown;
17+
}
18+
}

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import org.junit.jupiter.api.BeforeEach;
55
import org.junit.jupiter.api.Test;
66

7+
import io.javaoperatorsdk.operator.TestUtils;
8+
79
import static org.assertj.core.api.Assertions.assertThat;
810

911
class ResourceStateManagerTest {
@@ -38,7 +40,7 @@ public void marksEvent() {
3840

3941
@Test
4042
public void marksDeleteEvent() {
41-
state.markDeleteEventReceived();
43+
state.markDeleteEventReceived(TestUtils.testCustomResource());
4244

4345
assertThat(state.deleteEventPresent()).isTrue();
4446
assertThat(state.eventPresent()).isFalse();
@@ -48,7 +50,7 @@ public void marksDeleteEvent() {
4850
public void afterDeleteEventMarkEventIsNotRelevant() {
4951
state.markEventReceived();
5052

51-
state.markDeleteEventReceived();
53+
state.markDeleteEventReceived(TestUtils.testCustomResource());
5254

5355
assertThat(state.deleteEventPresent()).isTrue();
5456
assertThat(state.eventPresent()).isFalse();
@@ -57,7 +59,7 @@ public void afterDeleteEventMarkEventIsNotRelevant() {
5759
@Test
5860
public void cleansUp() {
5961
state.markEventReceived();
60-
state.markDeleteEventReceived();
62+
state.markDeleteEventReceived(TestUtils.testCustomResource());
6163

6264
manager.remove(sampleResourceID);
6365

@@ -71,7 +73,7 @@ public void cannotMarkEventAfterDeleteEventReceived() {
7173
Assertions.assertThrows(
7274
IllegalStateException.class,
7375
() -> {
74-
state.markDeleteEventReceived();
76+
state.markDeleteEventReceived(TestUtils.testCustomResource());
7577
state.markEventReceived();
7678
});
7779
}

operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/source/controller/ControllerEventSourceTest.java

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -53,35 +53,35 @@ void skipsEventHandlingIfGenerationNotIncreased() {
5353
TestCustomResource oldCustomResource = TestUtils.testCustomResource();
5454
oldCustomResource.getMetadata().setFinalizers(List.of(FINALIZER));
5555

56-
source.eventReceived(ResourceAction.UPDATED, customResource, oldCustomResource);
56+
source.eventReceived(ResourceAction.UPDATED, customResource, oldCustomResource, null);
5757
verify(eventHandler, times(1)).handleEvent(any());
5858

59-
source.eventReceived(ResourceAction.UPDATED, customResource, customResource);
59+
source.eventReceived(ResourceAction.UPDATED, customResource, customResource, null);
6060
verify(eventHandler, times(1)).handleEvent(any());
6161
}
6262

6363
@Test
6464
void dontSkipEventHandlingIfMarkedForDeletion() {
6565
TestCustomResource customResource1 = TestUtils.testCustomResource();
6666

67-
source.eventReceived(ResourceAction.UPDATED, customResource1, customResource1);
67+
source.eventReceived(ResourceAction.UPDATED, customResource1, customResource1, null);
6868
verify(eventHandler, times(1)).handleEvent(any());
6969

7070
// mark for deletion
7171
customResource1.getMetadata().setDeletionTimestamp(LocalDateTime.now().toString());
72-
source.eventReceived(ResourceAction.UPDATED, customResource1, customResource1);
72+
source.eventReceived(ResourceAction.UPDATED, customResource1, customResource1, null);
7373
verify(eventHandler, times(2)).handleEvent(any());
7474
}
7575

7676
@Test
7777
void normalExecutionIfGenerationChanges() {
7878
TestCustomResource customResource1 = TestUtils.testCustomResource();
7979

80-
source.eventReceived(ResourceAction.UPDATED, customResource1, customResource1);
80+
source.eventReceived(ResourceAction.UPDATED, customResource1, customResource1, null);
8181
verify(eventHandler, times(1)).handleEvent(any());
8282

8383
customResource1.getMetadata().setGeneration(2L);
84-
source.eventReceived(ResourceAction.UPDATED, customResource1, customResource1);
84+
source.eventReceived(ResourceAction.UPDATED, customResource1, customResource1, null);
8585
verify(eventHandler, times(2)).handleEvent(any());
8686
}
8787

@@ -92,18 +92,18 @@ void handlesAllEventIfNotGenerationAware() {
9292

9393
TestCustomResource customResource1 = TestUtils.testCustomResource();
9494

95-
source.eventReceived(ResourceAction.UPDATED, customResource1, customResource1);
95+
source.eventReceived(ResourceAction.UPDATED, customResource1, customResource1, null);
9696
verify(eventHandler, times(1)).handleEvent(any());
9797

98-
source.eventReceived(ResourceAction.UPDATED, customResource1, customResource1);
98+
source.eventReceived(ResourceAction.UPDATED, customResource1, customResource1, null);
9999
verify(eventHandler, times(2)).handleEvent(any());
100100
}
101101

102102
@Test
103103
void eventWithNoGenerationProcessedIfNoFinalizer() {
104104
TestCustomResource customResource1 = TestUtils.testCustomResource();
105105

106-
source.eventReceived(ResourceAction.UPDATED, customResource1, customResource1);
106+
source.eventReceived(ResourceAction.UPDATED, customResource1, customResource1, null);
107107

108108
verify(eventHandler, times(1)).handleEvent(any());
109109
}
@@ -112,7 +112,7 @@ void eventWithNoGenerationProcessedIfNoFinalizer() {
112112
void callsBroadcastsOnResourceEvents() {
113113
TestCustomResource customResource1 = TestUtils.testCustomResource();
114114

115-
source.eventReceived(ResourceAction.UPDATED, customResource1, customResource1);
115+
source.eventReceived(ResourceAction.UPDATED, customResource1, customResource1, null);
116116

117117
verify(testController.getEventSourceManager(), times(1))
118118
.broadcastOnResourceEvent(
@@ -128,8 +128,8 @@ void filtersOutEventsOnAddAndUpdate() {
128128
source = new ControllerEventSource<>(new TestController(onAddFilter, onUpdatePredicate, null));
129129
setUpSource(source, true, controllerConfig);
130130

131-
source.eventReceived(ResourceAction.ADDED, cr, null);
132-
source.eventReceived(ResourceAction.UPDATED, cr, cr);
131+
source.eventReceived(ResourceAction.ADDED, cr, null, null);
132+
source.eventReceived(ResourceAction.UPDATED, cr, cr, null);
133133

134134
verify(eventHandler, never()).handleEvent(any());
135135
}
@@ -141,9 +141,9 @@ void genericFilterFiltersOutAddUpdateAndDeleteEvents() {
141141
source = new ControllerEventSource<>(new TestController(null, null, res -> false));
142142
setUpSource(source, true, controllerConfig);
143143

144-
source.eventReceived(ResourceAction.ADDED, cr, null);
145-
source.eventReceived(ResourceAction.UPDATED, cr, cr);
146-
source.eventReceived(ResourceAction.DELETED, cr, cr);
144+
source.eventReceived(ResourceAction.ADDED, cr, null, null);
145+
source.eventReceived(ResourceAction.UPDATED, cr, cr, null);
146+
source.eventReceived(ResourceAction.DELETED, cr, cr, true);
147147

148148
verify(eventHandler, never()).handleEvent(any());
149149
}

0 commit comments

Comments
 (0)