From 49080816632e486aea373af903ac7b8a698e4753 Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Wed, 12 Oct 2022 16:08:23 +0200 Subject: [PATCH] fix: properly report missing CRDs from informers Fixes #1539 --- .../operator/ReconcilerUtils.java | 2 +- .../operator/processing/Controller.java | 2 +- .../event/source/informer/InformerWrapper.java | 16 ++++++++++++---- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/ReconcilerUtils.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/ReconcilerUtils.java index 0a420c52a9..229d5e5223 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/ReconcilerUtils.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/ReconcilerUtils.java @@ -133,7 +133,7 @@ public static void handleKubernetesClientException(Exception e, String resourceT // only throw MissingCRDException if the 404 error occurs on the target CRD if (resourceTypeName.equals(ke.getFullResourceName()) || matchesResourceType(resourceTypeName, ke)) { - throw new MissingCRDException(resourceTypeName, null, e.getMessage(), e); + throw new MissingCRDException(resourceTypeName, ke.getVersion(), e.getMessage(), e); } } } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/Controller.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/Controller.java index 92b70e722d..9bccb4e3c3 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/Controller.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/Controller.java @@ -299,7 +299,7 @@ public synchronized void start(boolean startEventProcessor) throws OperatorExcep log.info("'{}' controller started, pending event sources initialization", controllerName); } catch (MissingCRDException e) { stop(); - throwMissingCRDException(crdName, specVersion, controllerName); + throwMissingCRDException(e.getCrdName(), e.getSpecVersion(), controllerName); } } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/InformerWrapper.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/InformerWrapper.java index cb1ad28674..a58f2ae6b9 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/InformerWrapper.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/InformerWrapper.java @@ -7,6 +7,9 @@ import java.util.function.Predicate; import java.util.stream.Stream; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import io.fabric8.kubernetes.api.model.HasMetadata; import io.fabric8.kubernetes.client.informers.ResourceEventHandler; import io.fabric8.kubernetes.client.informers.SharedIndexInformer; @@ -21,6 +24,8 @@ class InformerWrapper implements LifecycleAware, IndexerResourceCache { + private static final Logger log = LoggerFactory.getLogger(InformerWrapper.class); + private final SharedIndexInformer informer; private final Cache cache; @@ -45,8 +50,7 @@ public void start() throws OperatorException { }); } else { final var apiTypeClass = informer.getApiTypeClass(); - final var fullResourceName = - HasMetadata.getFullResourceName(apiTypeClass); + final var fullResourceName = HasMetadata.getFullResourceName(apiTypeClass); final var version = HasMetadata.getVersion(apiTypeClass); throw new IllegalStateException( "Cannot retrieve 'stopped' callback to listen to informer stopping for informer for " @@ -55,8 +59,12 @@ public void start() throws OperatorException { }); } catch (Exception e) { - ReconcilerUtils.handleKubernetesClientException(e, - HasMetadata.getFullResourceName(informer.getApiTypeClass())); + final var apiTypeClass = informer.getApiTypeClass(); + final var fullResourceName = HasMetadata.getFullResourceName(apiTypeClass); + final var version = HasMetadata.getVersion(apiTypeClass); + log.error("Couldn't start informer for " + fullResourceName + "/" + version + " resources", + e); + ReconcilerUtils.handleKubernetesClientException(e, fullResourceName); throw e; } }