Skip to content

Commit c97cf02

Browse files
committed
refactor: reduce redundancy by removing duplicate configuration recording
1 parent 28aa164 commit c97cf02

File tree

5 files changed

+35
-59
lines changed

5 files changed

+35
-59
lines changed

Diff for: operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/controller/ControllerResourceEventSource.java

+2-14
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
package io.javaoperatorsdk.operator.processing.event.source.controller;
22

3-
import java.util.List;
4-
import java.util.Map;
53
import java.util.Optional;
64
import java.util.Set;
7-
import java.util.function.Function;
85

96
import org.slf4j.Logger;
107
import org.slf4j.LoggerFactory;
@@ -21,12 +18,8 @@
2118
import io.javaoperatorsdk.operator.processing.event.source.informer.ManagedInformerEventSource;
2219

2320
import static io.javaoperatorsdk.operator.ReconcilerUtils.handleKubernetesClientException;
24-
import static io.javaoperatorsdk.operator.processing.KubernetesResourceUtils.getName;
25-
import static io.javaoperatorsdk.operator.processing.KubernetesResourceUtils.getUID;
26-
import static io.javaoperatorsdk.operator.processing.KubernetesResourceUtils.getVersion;
27-
import static io.javaoperatorsdk.operator.processing.event.source.controller.InternalEventFilters.onUpdateFinalizerNeededAndApplied;
28-
import static io.javaoperatorsdk.operator.processing.event.source.controller.InternalEventFilters.onUpdateGenerationAware;
29-
import static io.javaoperatorsdk.operator.processing.event.source.controller.InternalEventFilters.onUpdateMarkedForDeletion;
21+
import static io.javaoperatorsdk.operator.processing.KubernetesResourceUtils.*;
22+
import static io.javaoperatorsdk.operator.processing.event.source.controller.InternalEventFilters.*;
3023

3124
public class ControllerResourceEventSource<T extends HasMetadata>
3225
extends ManagedInformerEventSource<T, T, ControllerConfiguration<T>>
@@ -137,9 +130,4 @@ public void setOnDeleteFilter(OnDeleteFilter<? super T> onDeleteFilter) {
137130
throw new IllegalStateException(
138131
"onDeleteFilter is not supported for controller resource event source");
139132
}
140-
141-
@Override
142-
public void addIndexers(Map<String, Function<T, List<String>>> indexers) {
143-
manager().addIndexers(indexers);
144-
}
145133
}

Diff for: operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/InformerEventSource.java

+14-14
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
11
package io.javaoperatorsdk.operator.processing.event.source.informer;
22

3-
import java.util.HashMap;
4-
import java.util.List;
5-
import java.util.Map;
6-
import java.util.Optional;
7-
import java.util.Set;
3+
import java.util.*;
84
import java.util.function.Function;
95
import java.util.stream.Collectors;
106

@@ -76,7 +72,6 @@ public class InformerEventSource<R extends HasMetadata, P extends HasMetadata>
7672

7773
private static final Logger log = LoggerFactory.getLogger(InformerEventSource.class);
7874

79-
private final InformerConfiguration<R> configuration;
8075
// always called from a synchronized method
8176
private final EventRecorder<R> eventRecorder = new EventRecorder<>();
8277
// we need direct control for the indexer to propagate the just update resource also to the index
@@ -91,8 +86,6 @@ public InformerEventSource(
9186

9287
public InformerEventSource(InformerConfiguration<R> configuration, KubernetesClient client) {
9388
super(client.resources(configuration.getResourceClass()), configuration);
94-
this.configuration = configuration;
95-
9689

9790
// If there is a primary to secondary mapper there is no need for primary to secondary index.
9891
primaryToSecondaryMapper = configuration.getPrimaryToSecondaryMapper();
@@ -193,7 +186,7 @@ private boolean temporaryCacheHasResourceWithSameVersionAs(R resource) {
193186

194187
private void propagateEvent(R object) {
195188
var primaryResourceIdSet =
196-
configuration.getSecondaryToPrimaryMapper().toPrimaryResourceIDs(object);
189+
configuration().getSecondaryToPrimaryMapper().toPrimaryResourceIDs(object);
197190
if (primaryResourceIdSet.isEmpty()) {
198191
return;
199192
}
@@ -217,8 +210,7 @@ public Set<R> getSecondaryResources(P primary) {
217210
Set<ResourceID> secondaryIDs;
218211
if (useSecondaryToPrimaryIndex()) {
219212
var primaryResourceID = ResourceID.fromResource(primary);
220-
secondaryIDs =
221-
primaryToSecondaryIndex.getSecondaryResources(primaryResourceID);
213+
secondaryIDs = primaryToSecondaryIndex.getSecondaryResources(primaryResourceID);
222214
log.debug(
223215
"Using PrimaryToSecondaryIndex to find secondary resources for primary: {}. Found secondary ids: {} ",
224216
primaryResourceID, secondaryIDs);
@@ -232,8 +224,16 @@ public Set<R> getSecondaryResources(P primary) {
232224
.collect(Collectors.toSet());
233225
}
234226

227+
/**
228+
* Returns the configuration object for the informer.
229+
*
230+
* @return the informer configuration object
231+
*
232+
* @deprecated Use {@link #configuration()} instead
233+
*/
234+
@Deprecated(forRemoval = true)
235235
public InformerConfiguration<R> getConfiguration() {
236-
return configuration;
236+
return configuration();
237237
}
238238

239239
@Override
@@ -334,7 +334,7 @@ public synchronized void cleanupOnCreateOrUpdateEventFiltering(ResourceID resour
334334

335335
@Override
336336
public boolean allowsNamespaceChanges() {
337-
return getConfiguration().followControllerNamespaceChanges();
337+
return configuration().followControllerNamespaceChanges();
338338
}
339339

340340

@@ -364,7 +364,7 @@ private boolean acceptedByDeleteFilters(R resource, boolean b) {
364364
public void setConfigurationService(ConfigurationService configurationService) {
365365
super.setConfigurationService(configurationService);
366366

367-
cache.addIndexers(indexerBuffer);
367+
super.addIndexers(indexerBuffer);
368368
indexerBuffer = new HashMap<>();
369369
}
370370

Diff for: operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/InformerManager.java

+8-13
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,6 @@
11
package io.javaoperatorsdk.operator.processing.event.source.informer;
22

3-
import java.util.Collections;
4-
import java.util.HashMap;
5-
import java.util.List;
6-
import java.util.Map;
7-
import java.util.Optional;
8-
import java.util.Set;
3+
import java.util.*;
94
import java.util.concurrent.ConcurrentHashMap;
105
import java.util.function.Function;
116
import java.util.function.Predicate;
@@ -23,7 +18,6 @@
2318
import io.fabric8.kubernetes.client.informers.ResourceEventHandler;
2419
import io.javaoperatorsdk.operator.OperatorException;
2520
import io.javaoperatorsdk.operator.ReconcilerUtils;
26-
import io.javaoperatorsdk.operator.api.config.Cloner;
2721
import io.javaoperatorsdk.operator.api.config.ConfigurationService;
2822
import io.javaoperatorsdk.operator.api.config.ResourceConfiguration;
2923
import io.javaoperatorsdk.operator.health.InformerHealthIndicator;
@@ -40,19 +34,21 @@ public class InformerManager<T extends HasMetadata, C extends ResourceConfigurat
4034
private static final Logger log = LoggerFactory.getLogger(InformerManager.class);
4135

4236
private final Map<String, InformerWrapper<T>> sources = new ConcurrentHashMap<>();
43-
private Cloner cloner;
4437
private final C configuration;
4538
private final MixedOperation<T, KubernetesResourceList<T>, Resource<T>> client;
4639
private final ResourceEventHandler<T> eventHandler;
4740
private final Map<String, Function<T, List<String>>> indexers = new HashMap<>();
48-
private final ConfigurationService configurationService;
41+
private ConfigurationService configurationService;
4942

50-
public InformerManager(MixedOperation<T, KubernetesResourceList<T>, Resource<T>> client,
51-
C configuration, ConfigurationService configurationService,
43+
InformerManager(MixedOperation<T, KubernetesResourceList<T>, Resource<T>> client,
44+
C configuration,
5245
ResourceEventHandler<T> eventHandler) {
5346
this.client = client;
5447
this.configuration = configuration;
5548
this.eventHandler = eventHandler;
49+
}
50+
51+
void setConfigurationService(ConfigurationService configurationService) {
5652
this.configurationService = configurationService;
5753
}
5854

@@ -74,7 +70,6 @@ private void initSources() {
7470
if (!sources.isEmpty()) {
7571
throw new IllegalStateException("Some sources already initialized.");
7672
}
77-
cloner = configurationService.getResourceCloner();
7873
final var targetNamespaces = configuration.getEffectiveNamespaces(configurationService);
7974
if (ResourceConfiguration.allNamespacesWatched(targetNamespaces)) {
8075
var source = createEventSourceForNamespace(WATCH_ALL_NAMESPACES);
@@ -175,7 +170,7 @@ public Stream<T> list(String namespace, Predicate<T> predicate) {
175170
public Optional<T> get(ResourceID resourceID) {
176171
return getSource(resourceID.getNamespace().orElse(WATCH_ALL_NAMESPACES))
177172
.flatMap(source -> source.get(resourceID))
178-
.map(cloner::clone);
173+
.map(r -> configurationService.getResourceCloner().clone(r));
179174
}
180175

181176
@Override

Diff for: operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/ManagedInformerEventSource.java

+8-7
Original file line numberDiff line numberDiff line change
@@ -36,18 +36,17 @@ public abstract class ManagedInformerEventSource<R extends HasMetadata, P extend
3636
InformerWrappingEventSourceHealthIndicator<R>, Configurable<C> {
3737

3838
private static final Logger log = LoggerFactory.getLogger(ManagedInformerEventSource.class);
39+
private final InformerManager<R, C> cache;
3940

4041
protected TemporaryResourceCache<R> temporaryResourceCache;
41-
protected InformerManager<R, C> cache;
42-
protected C configuration;
4342
protected MixedOperation<R, KubernetesResourceList<R>, Resource<R>> client;
4443

4544
protected ManagedInformerEventSource(
4645
MixedOperation<R, KubernetesResourceList<R>, Resource<R>> client, C configuration) {
4746
super(configuration.getResourceClass());
4847
this.client = client;
4948
temporaryResourceCache = new TemporaryResourceCache<>(this);
50-
this.configuration = configuration;
49+
this.cache = new InformerManager<>(client, configuration, this);
5150
}
5251

5352
@Override
@@ -128,7 +127,9 @@ void setTemporalResourceCache(TemporaryResourceCache<R> temporaryResourceCache)
128127
this.temporaryResourceCache = temporaryResourceCache;
129128
}
130129

131-
public abstract void addIndexers(Map<String, Function<R, List<String>>> indexers);
130+
public void addIndexers(Map<String, Function<R, List<String>>> indexers) {
131+
cache.addIndexers(indexers);
132+
}
132133

133134
public List<R> byIndex(String indexName, String indexKey) {
134135
return manager().byIndex(indexName, indexKey);
@@ -156,7 +157,7 @@ public Status getStatus() {
156157

157158
@Override
158159
public ResourceConfiguration<R> getInformerConfiguration() {
159-
return configuration;
160+
return configuration();
160161
}
161162

162163
@Override
@@ -167,11 +168,11 @@ public C configuration() {
167168
@Override
168169
public String toString() {
169170
return getClass().getSimpleName() + "{" +
170-
"resourceClass: " + configuration.getResourceClass().getSimpleName() +
171+
"resourceClass: " + configuration().getResourceClass().getSimpleName() +
171172
"}";
172173
}
173174

174175
public void setConfigurationService(ConfigurationService configurationService) {
175-
cache = new InformerManager<>(client, configuration, configurationService, this);
176+
cache.setConfigurationService(configurationService);
176177
}
177178
}

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

+3-11
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,8 @@
2323

2424
import static org.assertj.core.api.Assertions.assertThat;
2525
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
26-
import static org.junit.jupiter.api.Assertions.assertEquals;
27-
import static org.junit.jupiter.api.Assertions.assertThrows;
28-
import static org.junit.jupiter.api.Assertions.assertTrue;
29-
import static org.mockito.Mockito.any;
30-
import static org.mockito.Mockito.doReturn;
31-
import static org.mockito.Mockito.mock;
32-
import static org.mockito.Mockito.spy;
33-
import static org.mockito.Mockito.times;
34-
import static org.mockito.Mockito.verify;
35-
import static org.mockito.Mockito.when;
26+
import static org.junit.jupiter.api.Assertions.*;
27+
import static org.mockito.Mockito.*;
3628

3729
@SuppressWarnings({"rawtypes", "unchecked"})
3830
class EventSourceManagerTest {
@@ -166,7 +158,7 @@ void changesNamespacesOnControllerAndInformerEventSources() {
166158
when(informerConfigurationMock.followControllerNamespaceChanges()).thenReturn(true);
167159
InformerEventSource informerEventSource = mock(InformerEventSource.class);
168160
when(informerEventSource.resourceType()).thenReturn(TestCustomResource.class);
169-
when(informerEventSource.getConfiguration()).thenReturn(informerConfigurationMock);
161+
when(informerEventSource.configuration()).thenReturn(informerConfigurationMock);
170162
when(informerEventSource.allowsNamespaceChanges()).thenCallRealMethod();
171163
manager.registerEventSource("ies", informerEventSource);
172164

0 commit comments

Comments
 (0)