diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/MDCUtils.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/MDCUtils.java index 6f475b56d8..4578c31744 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/MDCUtils.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/MDCUtils.java @@ -15,17 +15,17 @@ public class MDCUtils { private static final String GENERATION = "resource.generation"; private static final String UID = "resource.uid"; - public static void addCustomResourceIDInfo(ResourceID resourceID) { + public static void addResourceIDInfo(ResourceID resourceID) { MDC.put(NAME, resourceID.getName()); MDC.put(NAMESPACE, resourceID.getNamespace().orElse("no namespace")); } - public static void removeCustomResourceIDInfo() { + public static void removeResourceIDInfo() { MDC.remove(NAME); MDC.remove(NAMESPACE); } - public static void addCustomResourceInfo(HasMetadata resource) { + public static void addResourceInfo(HasMetadata resource) { MDC.put(API_VERSION, resource.getApiVersion()); MDC.put(KIND, resource.getKind()); MDC.put(NAME, resource.getMetadata().getName()); @@ -37,7 +37,7 @@ public static void addCustomResourceInfo(HasMetadata resource) { MDC.put(UID, resource.getMetadata().getUid()); } - public static void removeCustomResourceInfo() { + public static void removeResourceInfo() { MDC.remove(API_VERSION); MDC.remove(KIND); MDC.remove(NAME); diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/ResourceCache.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/ResourceCache.java deleted file mode 100644 index 8fa497f61c..0000000000 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/ResourceCache.java +++ /dev/null @@ -1,12 +0,0 @@ -package io.javaoperatorsdk.operator.processing; - -import java.util.Optional; - -import io.fabric8.kubernetes.api.model.HasMetadata; -import io.javaoperatorsdk.operator.processing.event.ResourceID; - -public interface ResourceCache { - - Optional getCustomResource(ResourceID resourceID); - -} diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/EventProcessor.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/EventProcessor.java index bda71502bb..faaf21910b 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/EventProcessor.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/EventProcessor.java @@ -20,8 +20,8 @@ import io.javaoperatorsdk.operator.api.reconciler.RetryInfo; import io.javaoperatorsdk.operator.processing.LifecycleAware; import io.javaoperatorsdk.operator.processing.MDCUtils; -import io.javaoperatorsdk.operator.processing.ResourceCache; import io.javaoperatorsdk.operator.processing.event.source.ResourceAction; +import io.javaoperatorsdk.operator.processing.event.source.ResourceCache; import io.javaoperatorsdk.operator.processing.event.source.ResourceEvent; import io.javaoperatorsdk.operator.processing.event.source.TimerEventSource; import io.javaoperatorsdk.operator.processing.retry.GenericRetry; @@ -54,7 +54,7 @@ class EventProcessor implements EventHandler, LifecycleAw EventProcessor(EventSourceManager eventSourceManager) { this( - eventSourceManager.getControllerResourceEventSource(), + eventSourceManager.getControllerResourceEventSource().getResourceCache(), ExecutorServiceManager.instance().executorService(), eventSourceManager.getController().getConfiguration().getName(), new ReconciliationDispatcher<>(eventSourceManager.getController()), @@ -69,7 +69,8 @@ class EventProcessor implements EventHandler, LifecycleAw EventSourceManager eventSourceManager, String relatedControllerName, Retry retry) { - this(eventSourceManager.getControllerResourceEventSource(), null, relatedControllerName, + this(eventSourceManager.getControllerResourceEventSource().getResourceCache(), null, + relatedControllerName, reconciliationDispatcher, retry, null, eventSourceManager); } @@ -105,7 +106,7 @@ public void handleEvent(Event event) { return; } final var resourceID = event.getRelatedCustomResourceID(); - MDCUtils.addCustomResourceIDInfo(resourceID); + MDCUtils.addResourceIDInfo(resourceID); metrics.receivedEvent(event); handleEventMarking(event); @@ -116,42 +117,35 @@ public void handleEvent(Event event) { } } finally { lock.unlock(); - MDCUtils.removeCustomResourceIDInfo(); + MDCUtils.removeResourceIDInfo(); } } - private void submitReconciliationExecution(ResourceID customResourceUid) { + private void submitReconciliationExecution(ResourceID resourceID) { try { - boolean controllerUnderExecution = isControllerUnderExecution(customResourceUid); - Optional latestCustomResource = - resourceCache.getCustomResource(customResourceUid); - latestCustomResource.ifPresent(MDCUtils::addCustomResourceInfo); - if (!controllerUnderExecution - && latestCustomResource.isPresent()) { - setUnderExecutionProcessing(customResourceUid); - final var retryInfo = retryInfo(customResourceUid); - ExecutionScope executionScope = - new ExecutionScope<>( - latestCustomResource.get(), - retryInfo); - eventMarker.unMarkEventReceived(customResourceUid); - metrics.reconcileCustomResource(customResourceUid, retryInfo); + boolean controllerUnderExecution = isControllerUnderExecution(resourceID); + Optional latest = resourceCache.get(resourceID); + latest.ifPresent(MDCUtils::addResourceInfo); + if (!controllerUnderExecution && latest.isPresent()) { + setUnderExecutionProcessing(resourceID); + final var retryInfo = retryInfo(resourceID); + ExecutionScope executionScope = new ExecutionScope<>(latest.get(), retryInfo); + eventMarker.unMarkEventReceived(resourceID); + metrics.reconcileCustomResource(resourceID, retryInfo); log.debug("Executing events for custom resource. Scope: {}", executionScope); executor.execute(new ControllerExecution(executionScope)); } else { log.debug( - "Skipping executing controller for resource id: {}." - + " Controller in execution: {}. Latest CustomResource present: {}", - customResourceUid, + "Skipping executing controller for resource id: {}. Controller in execution: {}. Latest Resource present: {}", + resourceID, controllerUnderExecution, - latestCustomResource.isPresent()); - if (latestCustomResource.isEmpty()) { - log.warn("no custom resource found in cache for CustomResourceID: {}", - customResourceUid); + latest.isPresent()); + if (latest.isEmpty()) { + log.warn("no custom resource found in cache for ResourceID: {}", resourceID); } } } finally { - MDCUtils.removeCustomResourceInfo(); + MDCUtils.removeResourceInfo(); } } @@ -227,7 +221,7 @@ private boolean isCacheReadyForInstantReconciliation(ExecutionScope execution .orElseThrow(() -> new IllegalStateException( "Updated custom resource must be present at this point of time"))); String cachedCustomResourceVersion = getVersion(resourceCache - .getCustomResource(executionScope.getCustomResourceID()) + .get(executionScope.getCustomResourceID()) .orElseThrow(() -> new IllegalStateException( "Cached custom resource must be present at this point"))); @@ -357,7 +351,7 @@ public void run() { final var thread = Thread.currentThread(); final var name = thread.getName(); try { - MDCUtils.addCustomResourceInfo(executionScope.getResource()); + MDCUtils.addResourceInfo(executionScope.getResource()); thread.setName("EventHandler-" + controllerName); PostExecutionControl postExecutionControl = reconciliationDispatcher.handleExecution(executionScope); @@ -365,7 +359,7 @@ public void run() { } finally { // restore original name thread.setName(name); - MDCUtils.removeCustomResourceInfo(); + MDCUtils.removeResourceInfo(); } } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/ControllerResourceCache.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/ControllerResourceCache.java new file mode 100644 index 0000000000..2186277e32 --- /dev/null +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/ControllerResourceCache.java @@ -0,0 +1,67 @@ +package io.javaoperatorsdk.operator.processing.event.source; + +import java.util.Map; +import java.util.Optional; +import java.util.function.Predicate; +import java.util.stream.Stream; + +import io.fabric8.kubernetes.api.model.HasMetadata; +import io.fabric8.kubernetes.client.informers.SharedIndexInformer; +import io.fabric8.kubernetes.client.informers.cache.Cache; +import io.javaoperatorsdk.operator.api.config.Cloner; +import io.javaoperatorsdk.operator.processing.event.ResourceID; + +import static io.javaoperatorsdk.operator.processing.event.source.ControllerResourceEventSource.ANY_NAMESPACE_MAP_KEY; + +public class ControllerResourceCache implements ResourceCache { + + private final Map> sharedIndexInformers; + private final Cloner cloner; + + public ControllerResourceCache(Map> sharedIndexInformers, + Cloner cloner) { + this.sharedIndexInformers = sharedIndexInformers; + this.cloner = cloner; + } + + @Override + public Stream list(Predicate predicate) { + return sharedIndexInformers.values().stream() + .flatMap(i -> i.getStore().list().stream().filter(predicate)); + } + + @Override + public Stream list(String namespace, Predicate predicate) { + if (isWatchingAllNamespaces()) { + final var stream = sharedIndexInformers.get(ANY_NAMESPACE_MAP_KEY).getStore().list().stream() + .filter(r -> r.getMetadata().getNamespace().equals(namespace)); + return predicate != null ? stream.filter(predicate) : stream; + } else { + final var informer = sharedIndexInformers.get(namespace); + return informer != null ? informer.getStore().list().stream().filter(predicate) + : Stream.empty(); + } + } + + @Override + public Optional get(ResourceID resourceID) { + var sharedIndexInformer = sharedIndexInformers.get(ANY_NAMESPACE_MAP_KEY); + if (sharedIndexInformer == null) { + sharedIndexInformer = + sharedIndexInformers.get(resourceID.getNamespace().orElse(ANY_NAMESPACE_MAP_KEY)); + } + var resource = sharedIndexInformer.getStore() + .getByKey(Cache.namespaceKeyFunc(resourceID.getNamespace().orElse(null), + resourceID.getName())); + if (resource == null) { + return Optional.empty(); + } else { + return Optional.of(cloner.clone(resource)); + } + } + + private boolean isWatchingAllNamespaces() { + return sharedIndexInformers.containsKey(ANY_NAMESPACE_MAP_KEY); + } + +} diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/ControllerResourceEventSource.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/ControllerResourceEventSource.java index 0729dde5ef..faf0d8f33b 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/ControllerResourceEventSource.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/ControllerResourceEventSource.java @@ -1,6 +1,9 @@ package io.javaoperatorsdk.operator.processing.event.source; -import java.util.*; +import java.util.Collections; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; import org.slf4j.Logger; @@ -12,13 +15,10 @@ import io.fabric8.kubernetes.client.dsl.FilterWatchListDeletable; import io.fabric8.kubernetes.client.informers.ResourceEventHandler; import io.fabric8.kubernetes.client.informers.SharedIndexInformer; -import io.fabric8.kubernetes.client.informers.cache.Cache; import io.javaoperatorsdk.operator.MissingCRDException; -import io.javaoperatorsdk.operator.api.config.Cloner; import io.javaoperatorsdk.operator.api.config.ControllerConfiguration; import io.javaoperatorsdk.operator.processing.Controller; import io.javaoperatorsdk.operator.processing.MDCUtils; -import io.javaoperatorsdk.operator.processing.ResourceCache; import io.javaoperatorsdk.operator.processing.event.ResourceID; import static io.javaoperatorsdk.operator.processing.KubernetesResourceUtils.getName; @@ -29,7 +29,7 @@ * This is a special case since is not bound to a single custom resource */ public class ControllerResourceEventSource extends AbstractEventSource - implements ResourceEventHandler, ResourceCache { + implements ResourceEventHandler { public static final String ANY_NAMESPACE_MAP_KEY = "anyNamespace"; @@ -41,11 +41,12 @@ public class ControllerResourceEventSource extends Abstra private final ResourceEventFilter filter; private final OnceWhitelistEventFilterEventFilter onceWhitelistEventFilterEventFilter; - private final Cloner cloner; + private final ControllerResourceCache cache; public ControllerResourceEventSource(Controller controller) { this.controller = controller; - this.cloner = controller.getConfiguration().getConfigurationService().getResourceCloner(); + var cloner = controller.getConfiguration().getConfigurationService().getResourceCloner(); + this.cache = new ControllerResourceCache<>(sharedIndexInformers, cloner); var filters = new ResourceEventFilter[] { ResourceEventFilters.finalizerNeededAndApplied(), @@ -128,7 +129,7 @@ public void eventReceived(ResourceAction action, T customResource, T oldResource try { log.debug( "Event received for resource: {}", getName(customResource)); - MDCUtils.addCustomResourceInfo(customResource); + MDCUtils.addResourceInfo(customResource); if (filter.acceptChange(controller.getConfiguration(), oldResource, customResource)) { eventHandler.handleEvent( new ResourceEvent(action, ResourceID.fromResource(customResource))); @@ -139,7 +140,7 @@ public void eventReceived(ResourceAction action, T customResource, T oldResource getVersion(customResource)); } } finally { - MDCUtils.removeCustomResourceInfo(); + MDCUtils.removeResourceInfo(); } } @@ -158,24 +159,13 @@ public void onDelete(T resource, boolean b) { eventReceived(ResourceAction.DELETED, resource, null); } - @Override - public Optional getCustomResource(ResourceID resourceID) { - var sharedIndexInformer = sharedIndexInformers.get(ANY_NAMESPACE_MAP_KEY); - if (sharedIndexInformer == null) { - sharedIndexInformer = - sharedIndexInformers.get(resourceID.getNamespace().orElse(ANY_NAMESPACE_MAP_KEY)); - } - var resource = sharedIndexInformer.getStore() - .getByKey(Cache.namespaceKeyFunc(resourceID.getNamespace().orElse(null), - resourceID.getName())); - if (resource == null) { - return Optional.empty(); - } else { - return Optional.of(cloner.clone(resource)); - } + public Optional get(ResourceID resourceID) { + return cache.get(resourceID); } - + public ControllerResourceCache getResourceCache() { + return cache; + } /** * @return shared informers by namespace. If custom resource is not namespace scoped use diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/ResourceCache.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/ResourceCache.java new file mode 100644 index 0000000000..af156e24ec --- /dev/null +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/ResourceCache.java @@ -0,0 +1,27 @@ +package io.javaoperatorsdk.operator.processing.event.source; + +import java.util.Optional; +import java.util.function.Predicate; +import java.util.stream.Stream; + +import io.fabric8.kubernetes.api.model.HasMetadata; +import io.javaoperatorsdk.operator.processing.event.ResourceID; + +@SuppressWarnings({"rawtypes", "unchecked"}) +public interface ResourceCache { + Predicate TRUE = (a) -> true; + + Optional get(ResourceID resourceID); + + default Stream list() { + return list(TRUE); + } + + Stream list(Predicate predicate); + + default Stream list(String namespace) { + return list(namespace, TRUE); + } + + Stream list(String namespace, Predicate predicate); +} diff --git a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/EventProcessorTest.java b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/EventProcessorTest.java index 4700b1f4d2..9f99b1bdd0 100644 --- a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/EventProcessorTest.java +++ b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/EventProcessorTest.java @@ -12,10 +12,7 @@ import org.slf4j.LoggerFactory; import io.fabric8.kubernetes.api.model.HasMetadata; -import io.javaoperatorsdk.operator.processing.event.source.ControllerResourceEventSource; -import io.javaoperatorsdk.operator.processing.event.source.ResourceAction; -import io.javaoperatorsdk.operator.processing.event.source.ResourceEvent; -import io.javaoperatorsdk.operator.processing.event.source.TimerEventSource; +import io.javaoperatorsdk.operator.processing.event.source.*; import io.javaoperatorsdk.operator.processing.retry.GenericRetry; import io.javaoperatorsdk.operator.sample.simple.TestCustomResource; @@ -42,15 +39,20 @@ class EventProcessorTest { private ReconciliationDispatcher reconciliationDispatcherMock = mock(ReconciliationDispatcher.class); private EventSourceManager eventSourceManagerMock = mock(EventSourceManager.class); - private ControllerResourceEventSource resourceCacheMock = - mock(ControllerResourceEventSource.class); + private ControllerResourceCache resourceCacheMock = + mock(ControllerResourceCache.class); private TimerEventSource retryTimerEventSourceMock = mock(TimerEventSource.class); + private ControllerResourceEventSource controllerResourceEventSourceMock = + mock(ControllerResourceEventSource.class); private EventProcessor eventProcessor; private EventProcessor eventProcessorWithRetry; @BeforeEach public void setup() { - when(eventSourceManagerMock.getControllerResourceEventSource()).thenReturn(resourceCacheMock); + + when(eventSourceManagerMock.getControllerResourceEventSource()) + .thenReturn(controllerResourceEventSourceMock); + when(controllerResourceEventSourceMock.getResourceCache()).thenReturn(resourceCacheMock); eventProcessor = spy(new EventProcessor(reconciliationDispatcherMock, eventSourceManagerMock, "Test", null)); @@ -72,8 +74,7 @@ public void dispatchesEventsIfNoExecutionInProgress() { @Test public void skipProcessingIfLatestCustomResourceNotInCache() { Event event = prepareCREvent(); - when(resourceCacheMock.getCustomResource(event.getRelatedCustomResourceID())) - .thenReturn(Optional.empty()); + when(resourceCacheMock.get(event.getRelatedCustomResourceID())).thenReturn(Optional.empty()); eventProcessor.handleEvent(event); @@ -237,9 +238,8 @@ public void whitelistNextEventIfTheCacheIsNotPropagatedAfterAnUpdate() { updatedCr.getMetadata().setResourceVersion("2"); var mockCREventSource = mock(ControllerResourceEventSource.class); eventProcessor.getEventMarker().markEventReceived(crID); - when(resourceCacheMock.getCustomResource(eq(crID))).thenReturn(Optional.of(cr)); - when(eventSourceManagerMock.getControllerResourceEventSource()) - .thenReturn(mockCREventSource); + when(resourceCacheMock.get(eq(crID))).thenReturn(Optional.of(cr)); + when(eventSourceManagerMock.getControllerResourceEventSource()).thenReturn(mockCREventSource); eventProcessor.eventProcessingFinished(new ExecutionScope(cr, null), PostExecutionControl.customResourceUpdated(updatedCr)); @@ -257,9 +257,8 @@ public void dontWhitelistsEventWhenOtherChangeDuringExecution() { otherChangeCR.getMetadata().setResourceVersion("3"); var mockCREventSource = mock(ControllerResourceEventSource.class); eventProcessor.getEventMarker().markEventReceived(crID); - when(resourceCacheMock.getCustomResource(eq(crID))).thenReturn(Optional.of(otherChangeCR)); - when(eventSourceManagerMock.getControllerResourceEventSource()) - .thenReturn(mockCREventSource); + when(resourceCacheMock.get(eq(crID))).thenReturn(Optional.of(otherChangeCR)); + when(eventSourceManagerMock.getControllerResourceEventSource()).thenReturn(mockCREventSource); eventProcessor.eventProcessingFinished(new ExecutionScope(cr, null), PostExecutionControl.customResourceUpdated(updatedCr)); @@ -273,9 +272,8 @@ public void dontWhitelistsEventIfUpdatedEventInCache() { var cr = testCustomResource(crID); var mockCREventSource = mock(ControllerResourceEventSource.class); eventProcessor.getEventMarker().markEventReceived(crID); - when(resourceCacheMock.getCustomResource(eq(crID))).thenReturn(Optional.of(cr)); - when(eventSourceManagerMock.getControllerResourceEventSource()) - .thenReturn(mockCREventSource); + when(resourceCacheMock.get(eq(crID))).thenReturn(Optional.of(cr)); + when(eventSourceManagerMock.getControllerResourceEventSource()).thenReturn(mockCREventSource); eventProcessor.eventProcessingFinished(new ExecutionScope(cr, null), PostExecutionControl.customResourceUpdated(cr)); @@ -312,7 +310,7 @@ private ResourceEvent prepareCREvent() { private ResourceEvent prepareCREvent(ResourceID uid) { TestCustomResource customResource = testCustomResource(uid); - when(resourceCacheMock.getCustomResource(eq(uid))).thenReturn(Optional.of(customResource)); + when(resourceCacheMock.get(eq(uid))).thenReturn(Optional.of(customResource)); return new ResourceEvent(ResourceAction.UPDATED, ResourceID.fromResource(customResource)); } diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/InformerEventSourceIT.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/InformerEventSourceIT.java index 07a9348191..06a1238bb5 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/InformerEventSourceIT.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/InformerEventSourceIT.java @@ -40,7 +40,7 @@ public void testUsingInformerToWatchChangesOfConfigMap() { waitForCRStatusValue(INITIAL_STATUS_MESSAGE); configMap.getData().put(TARGET_CONFIG_MAP_KEY, UPDATE_STATUS_MESSAGE); - operator.replace(ConfigMap.class, configMap); + configMap = operator.replace(ConfigMap.class, configMap); waitForCRStatusValue(UPDATE_STATUS_MESSAGE); } diff --git a/sample-operators/tomcat-operator/src/main/java/io/javaoperatorsdk/operator/sample/TomcatReconciler.java b/sample-operators/tomcat-operator/src/main/java/io/javaoperatorsdk/operator/sample/TomcatReconciler.java index 64118be4aa..ed6faa2e1c 100644 --- a/sample-operators/tomcat-operator/src/main/java/io/javaoperatorsdk/operator/sample/TomcatReconciler.java +++ b/sample-operators/tomcat-operator/src/main/java/io/javaoperatorsdk/operator/sample/TomcatReconciler.java @@ -17,6 +17,7 @@ import io.fabric8.kubernetes.client.dsl.ServiceResource; import io.fabric8.kubernetes.client.informers.SharedIndexInformer; import io.fabric8.kubernetes.client.utils.Serialization; +import io.javaoperatorsdk.operator.api.*; import io.javaoperatorsdk.operator.api.reconciler.*; import io.javaoperatorsdk.operator.processing.event.ResourceID; import io.javaoperatorsdk.operator.processing.event.source.EventSourceRegistry; diff --git a/sample-operators/tomcat-operator/src/main/java/io/javaoperatorsdk/operator/sample/WebappReconciler.java b/sample-operators/tomcat-operator/src/main/java/io/javaoperatorsdk/operator/sample/WebappReconciler.java index 4b1bb6ee33..f536d87013 100644 --- a/sample-operators/tomcat-operator/src/main/java/io/javaoperatorsdk/operator/sample/WebappReconciler.java +++ b/sample-operators/tomcat-operator/src/main/java/io/javaoperatorsdk/operator/sample/WebappReconciler.java @@ -17,9 +17,13 @@ import io.fabric8.kubernetes.client.KubernetesClient; import io.fabric8.kubernetes.client.dsl.ExecListener; import io.fabric8.kubernetes.client.dsl.ExecWatch; -import io.javaoperatorsdk.operator.api.reconciler.*; +import io.javaoperatorsdk.operator.api.reconciler.Context; +import io.javaoperatorsdk.operator.api.reconciler.ControllerConfiguration; +import io.javaoperatorsdk.operator.api.reconciler.DeleteControl; +import io.javaoperatorsdk.operator.api.reconciler.EventSourceInitializer; +import io.javaoperatorsdk.operator.api.reconciler.Reconciler; +import io.javaoperatorsdk.operator.api.reconciler.UpdateControl; import io.javaoperatorsdk.operator.processing.event.ResourceID; -import io.javaoperatorsdk.operator.processing.event.source.ControllerResourceEventSource; import io.javaoperatorsdk.operator.processing.event.source.EventSourceRegistry; import io.javaoperatorsdk.operator.processing.event.source.InformerEventSource; @@ -44,17 +48,10 @@ public void prepareEventSources(EventSourceRegistry eventSourceRegistry) // we need to find which WebApp this Tomcat custom resource is related to. // To find the related customResourceId of the WebApp resource we traverse the cache to // and identify it based on naming convention. - var webAppInformer = - eventSourceRegistry.getControllerResourceEventSource() - .getInformer(ControllerResourceEventSource.ANY_NAMESPACE_MAP_KEY); - - var ids = webAppInformer.getStore().list().stream() - .filter( - (Webapp webApp) -> webApp.getSpec().getTomcat().equals(t.getMetadata().getName())) - .map(webapp -> new ResourceID(webapp.getMetadata().getName(), - webapp.getMetadata().getNamespace())) + return eventSourceRegistry.getControllerResourceEventSource().getResourceCache() + .list(webApp -> webApp.getSpec().getTomcat().equals(t.getMetadata().getName())) + .map(ResourceID::fromResource) .collect(Collectors.toSet()); - return ids; }); eventSourceRegistry.registerEventSource(tomcatEventSource); }