diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/RuntimeInfo.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/RuntimeInfo.java index 1a51c45b70..ba874bdc07 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/RuntimeInfo.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/RuntimeInfo.java @@ -63,9 +63,7 @@ private void checkIfStarted() { public boolean allEventSourcesAreHealthy() { checkIfStarted(); return registeredControllers.stream() - .filter(rc -> !rc.getControllerHealthInfo().unhealthyEventSources().isEmpty()) - .findFirst() - .isEmpty(); + .noneMatch(rc -> rc.getControllerHealthInfo().hasUnhealthyEventSources()); } /** diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/health/ControllerHealthInfo.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/health/ControllerHealthInfo.java index 4a78e60f05..f2a9359e04 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/health/ControllerHealthInfo.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/health/ControllerHealthInfo.java @@ -16,7 +16,10 @@ package io.javaoperatorsdk.operator.health; import java.util.Map; +import java.util.function.Predicate; +import java.util.stream.Collector; import java.util.stream.Collectors; +import java.util.stream.Stream; import io.javaoperatorsdk.operator.processing.event.EventSourceManager; import io.javaoperatorsdk.operator.processing.event.source.EventSource; @@ -25,6 +28,17 @@ @SuppressWarnings("rawtypes") public class ControllerHealthInfo { + private static final Predicate UNHEALTHY = e -> e.getStatus() == Status.UNHEALTHY; + private static final Predicate INFORMER = + e -> e instanceof InformerWrappingEventSourceHealthIndicator; + private static final Predicate UNHEALTHY_INFORMER = + e -> INFORMER.test(e) && e.getStatus() == Status.UNHEALTHY; + private static final Collector> + NAME_TO_ES_MAP = Collectors.toMap(EventSource::name, e -> e); + private static final Collector< + EventSource, ?, Map> + NAME_TO_ES_HEALTH_MAP = + Collectors.toMap(EventSource::name, e -> (InformerWrappingEventSourceHealthIndicator) e); private final EventSourceManager eventSourceManager; public ControllerHealthInfo(EventSourceManager eventSourceManager) { @@ -32,23 +46,31 @@ public ControllerHealthInfo(EventSourceManager eventSourceManager) { } public Map eventSourceHealthIndicators() { - return eventSourceManager.allEventSources().stream() - .collect(Collectors.toMap(EventSource::name, e -> e)); + return eventSourceManager.allEventSourcesStream().collect(NAME_TO_ES_MAP); + } + + /** + * Whether the associated {@link io.javaoperatorsdk.operator.processing.Controller} has unhealthy + * event sources. + * + * @return {@code true} if any of the associated controller is unhealthy, {@code false} otherwise + * @since 5.3.0 + */ + public boolean hasUnhealthyEventSources() { + return filteredEventSources(UNHEALTHY).findAny().isPresent(); } public Map unhealthyEventSources() { - return eventSourceManager.allEventSources().stream() - .filter(e -> e.getStatus() == Status.UNHEALTHY) - .collect(Collectors.toMap(EventSource::name, e -> e)); + return filteredEventSources(UNHEALTHY).collect(NAME_TO_ES_MAP); + } + + private Stream filteredEventSources(Predicate filter) { + return eventSourceManager.allEventSourcesStream().filter(filter); } public Map informerEventSourceHealthIndicators() { - return eventSourceManager.allEventSources().stream() - .filter(e -> e instanceof InformerWrappingEventSourceHealthIndicator) - .collect( - Collectors.toMap( - EventSource::name, e -> (InformerWrappingEventSourceHealthIndicator) e)); + return filteredEventSources(INFORMER).collect(NAME_TO_ES_HEALTH_MAP); } /** @@ -58,11 +80,6 @@ public Map unhealthyEventSources() { */ public Map unhealthyInformerEventSourceHealthIndicators() { - return eventSourceManager.allEventSources().stream() - .filter(e -> e.getStatus() == Status.UNHEALTHY) - .filter(e -> e instanceof InformerWrappingEventSourceHealthIndicator) - .collect( - Collectors.toMap( - EventSource::name, e -> (InformerWrappingEventSourceHealthIndicator) e)); + return filteredEventSources(UNHEALTHY_INFORMER).collect(NAME_TO_ES_HEALTH_MAP); } } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/health/InformerHealthIndicator.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/health/InformerHealthIndicator.java index 66d24aa383..6c39a2601b 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/health/InformerHealthIndicator.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/health/InformerHealthIndicator.java @@ -23,8 +23,5 @@ public interface InformerHealthIndicator extends EventSourceHealthIndicator { boolean isRunning(); - @Override - Status getStatus(); - String getTargetNamespace(); } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/EventSourceManager.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/EventSourceManager.java index 62e19394c8..441d3cf178 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/EventSourceManager.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/EventSourceManager.java @@ -217,7 +217,12 @@ public Set> getRegisteredEventSources() { @SuppressWarnings("rawtypes") public List allEventSources() { - return eventSources.allEventSources().toList(); + return allEventSourcesStream().toList(); + } + + @SuppressWarnings("rawtypes") + public Stream allEventSourcesStream() { + return eventSources.allEventSources(); } @SuppressWarnings("unused")