Skip to content

Commit d762a3a

Browse files
committed
improve: ensure unique name on event sources
Signed-off-by: Attila Mészáros <[email protected]>
1 parent b77905e commit d762a3a

File tree

4 files changed

+34
-29
lines changed

4 files changed

+34
-29
lines changed

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ public <R> List<ResourceEventSource<R, P>> getResourceEventSourcesFor(Class<R> d
210210
@Override
211211
public EventSource dynamicallyRegisterEventSource(EventSource eventSource) {
212212
synchronized (this) {
213-
var actual = eventSources.existingEventSourceOfSameNameAndType(eventSource);
213+
var actual = eventSources.existingEventSourceByName(eventSource.name());
214214
if (actual != null) {
215215
eventSource = actual;
216216
} else {

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

+27-26
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,37 @@ class EventSources<R extends HasMetadata> {
2121

2222
private final ConcurrentNavigableMap<String, Map<String, EventSource>> sources =
2323
new ConcurrentSkipListMap<>();
24+
private final Map<String, EventSource> sourceByName = new HashMap<>();
25+
2426
private final TimerEventSource<R> retryAndRescheduleTimerEventSource =
2527
new TimerEventSource<>("RetryAndRescheduleTimerEventSource");
2628
private ControllerResourceEventSource<R> controllerResourceEventSource;
2729

30+
public void add(EventSource eventSource) {
31+
final var name = eventSource.name();
32+
var existing = sourceByName.get(name);
33+
if (existing != null) {
34+
throw new IllegalArgumentException("Event source " + existing
35+
+ " is already registered with name: " + name);
36+
}
37+
sourceByName.put(name, eventSource);
38+
sources.computeIfAbsent(keyFor(eventSource), k -> new HashMap<>()).put(name, eventSource);
39+
}
40+
41+
public EventSource remove(String name) {
42+
var optionalMap = sources.values().stream().filter(m -> m.containsKey(name)).findFirst();
43+
sourceByName.remove(name);
44+
return optionalMap.map(m -> m.remove(name)).orElse(null);
45+
}
46+
47+
public void clear() {
48+
sources.clear();
49+
sourceByName.clear();
50+
}
51+
52+
public EventSource existingEventSourceByName(String name) {
53+
return sourceByName.get(name);
54+
}
2855

2956
void createControllerEventSource(Controller<R> controller) {
3057
controllerResourceEventSource = new ControllerResourceEventSource<>(controller);
@@ -54,28 +81,7 @@ Stream<EventSource> flatMappedSources() {
5481
return sources.values().stream().flatMap(c -> c.values().stream());
5582
}
5683

57-
public void clear() {
58-
sources.clear();
59-
}
6084

61-
public EventSource existingEventSourceOfSameNameAndType(EventSource source) {
62-
return existingEventSourceOfSameType(source).get(source.name());
63-
}
64-
65-
public Map<String, EventSource> existingEventSourceOfSameType(EventSource source) {
66-
return sources.getOrDefault(keyFor(source), Collections.emptyMap());
67-
}
68-
69-
public void add(EventSource eventSource) {
70-
final var name = eventSource.name();
71-
final var existing = existingEventSourceOfSameType(eventSource);
72-
if (existing.get(name) != null) {
73-
throw new IllegalArgumentException("Event source " + existing
74-
+ " is already registered with name: " + name);
75-
}
76-
77-
sources.computeIfAbsent(keyFor(eventSource), k -> new HashMap<>()).put(name, eventSource);
78-
}
7985

8086
@SuppressWarnings("rawtypes")
8187
private Class<?> getResourceType(EventSource source) {
@@ -158,9 +164,4 @@ public <S> List<ResourceEventSource<S, R>> getEventSources(Class<S> dependentTyp
158164
.map(es -> (ResourceEventSource<S, R>) es)
159165
.collect(Collectors.toList());
160166
}
161-
162-
public EventSource remove(String name) {
163-
var optionalMap = sources.values().stream().filter(m -> m.containsKey(name)).findFirst();
164-
return optionalMap.map(m -> m.remove(name)).orElse(null);
165-
}
166167
}

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

+4
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,9 @@ public void registersEventSource() {
4646
@Test
4747
public void closeShouldCascadeToEventSources() {
4848
EventSource eventSource = mock(EventSource.class);
49+
when(eventSource.name()).thenReturn("name1");
4950
EventSource eventSource2 = mock(TimerEventSource.class);
51+
when(eventSource2.name()).thenReturn("name2");
5052

5153
eventSourceManager.registerEventSource(eventSource);
5254
eventSourceManager.registerEventSource(eventSource2);
@@ -61,8 +63,10 @@ public void closeShouldCascadeToEventSources() {
6163
public void startCascadesToEventSources() {
6264
EventSource eventSource = mock(EventSource.class);
6365
when(eventSource.priority()).thenReturn(EventSourceStartPriority.DEFAULT);
66+
when(eventSource.name()).thenReturn("name1");
6467
EventSource eventSource2 = mock(TimerEventSource.class);
6568
when(eventSource2.priority()).thenReturn(EventSourceStartPriority.DEFAULT);
69+
when(eventSource2.name()).thenReturn("name2");
6670
eventSourceManager.registerEventSource(eventSource);
6771
eventSourceManager.registerEventSource(eventSource2);
6872

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -129,15 +129,15 @@ void getShouldWork() {
129129
eventSourceMockWithName(ResourceEventSource.class, "name1", HasMetadata.class);
130130
final var mock2 =
131131
eventSourceMockWithName(ResourceEventSource.class, "name2", HasMetadata.class);
132-
final var mock3 = eventSourceMockWithName(ResourceEventSource.class, "name2", ConfigMap.class);
132+
final var mock3 = eventSourceMockWithName(ResourceEventSource.class, "name3", ConfigMap.class);
133133

134134
eventSources.add(mock1);
135135
eventSources.add(mock2);
136136
eventSources.add(mock3);
137137

138138
assertEquals(mock1, eventSources.get(HasMetadata.class, "name1"));
139139
assertEquals(mock2, eventSources.get(HasMetadata.class, "name2"));
140-
assertEquals(mock3, eventSources.get(ConfigMap.class, "name2"));
140+
assertEquals(mock3, eventSources.get(ConfigMap.class, "name3"));
141141
assertEquals(mock3, eventSources.get(ConfigMap.class, null));
142142

143143

0 commit comments

Comments
 (0)