diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/Operator.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/Operator.java index 7f2cdbad18..046677bd69 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/Operator.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/Operator.java @@ -1,5 +1,6 @@ package io.javaoperatorsdk.operator; +import com.fasterxml.jackson.databind.ObjectMapper; import io.fabric8.kubernetes.api.model.apiextensions.v1.CustomResourceDefinition; import io.fabric8.kubernetes.client.CustomResource; import io.fabric8.kubernetes.client.KubernetesClient; @@ -24,10 +25,19 @@ public class Operator { private static final Logger log = LoggerFactory.getLogger(Operator.class); private final KubernetesClient k8sClient; private final ConfigurationService configurationService; + private final ObjectMapper objectMapper; public Operator(KubernetesClient k8sClient, ConfigurationService configurationService) { + this(k8sClient, configurationService, new ObjectMapper()); + } + + public Operator( + KubernetesClient k8sClient, + ConfigurationService configurationService, + ObjectMapper objectMapper) { this.k8sClient = k8sClient; this.configurationService = configurationService; + this.objectMapper = objectMapper; } /** @@ -131,7 +141,7 @@ public void register( new EventDispatcher( controller, finalizer, new EventDispatcher.CustomResourceFacade(client)); - CustomResourceCache customResourceCache = new CustomResourceCache(); + CustomResourceCache customResourceCache = new CustomResourceCache(objectMapper); DefaultEventHandler defaultEventHandler = new DefaultEventHandler(customResourceCache, dispatcher, controllerName, retry); DefaultEventSourceManager eventSourceManager = diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/CustomResourceCache.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/CustomResourceCache.java index 09279a91c4..8cea9776ec 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/CustomResourceCache.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/CustomResourceCache.java @@ -3,23 +3,32 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import io.fabric8.kubernetes.client.CustomResource; -import java.util.Map; import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import java.util.function.Predicate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@SuppressWarnings("rawtypes") public class CustomResourceCache { private static final Logger log = LoggerFactory.getLogger(CustomResourceCache.class); - private ObjectMapper objectMapper = new ObjectMapper(); - private final Map resources = new ConcurrentHashMap<>(); + private final ObjectMapper objectMapper; + private final ConcurrentMap resources = new ConcurrentHashMap<>(); private final Lock lock = new ReentrantLock(); + public CustomResourceCache() { + this(new ObjectMapper()); + } + + public CustomResourceCache(ObjectMapper objectMapper) { + this.objectMapper = objectMapper; + } + public void cacheResource(CustomResource resource) { try { lock.lock(); @@ -49,18 +58,13 @@ public void cacheResource(CustomResource resource, Predicate pre * @return */ public Optional getLatestResource(String uuid) { - return Optional.ofNullable(clone(resources.get(uuid))); + return Optional.ofNullable(resources.get(uuid)).map(this::clone); } private CustomResource clone(CustomResource customResource) { try { - if (customResource == null) { - return null; - } - CustomResource clonedObject = - objectMapper.readValue( - objectMapper.writeValueAsString(customResource), customResource.getClass()); - return clonedObject; + return objectMapper.readValue( + objectMapper.writeValueAsString(customResource), customResource.getClass()); } catch (JsonProcessingException e) { throw new IllegalStateException(e); } diff --git a/operator-framework-spring-boot-starter/src/main/java/io/javaoperatorsdk/operator/springboot/starter/OperatorAutoConfiguration.java b/operator-framework-spring-boot-starter/src/main/java/io/javaoperatorsdk/operator/springboot/starter/OperatorAutoConfiguration.java index ba109428b0..9005d2bd79 100644 --- a/operator-framework-spring-boot-starter/src/main/java/io/javaoperatorsdk/operator/springboot/starter/OperatorAutoConfiguration.java +++ b/operator-framework-spring-boot-starter/src/main/java/io/javaoperatorsdk/operator/springboot/starter/OperatorAutoConfiguration.java @@ -1,5 +1,6 @@ package io.javaoperatorsdk.operator.springboot.starter; +import com.fasterxml.jackson.databind.ObjectMapper; import io.fabric8.kubernetes.client.Config; import io.fabric8.kubernetes.client.ConfigBuilder; import io.fabric8.kubernetes.client.CustomResource; @@ -59,8 +60,13 @@ public boolean checkCRDAndValidateLocalModel() { @Bean @ConditionalOnMissingBean(Operator.class) public Operator operator( - KubernetesClient kubernetesClient, List> resourceControllers) { - Operator operator = new Operator(kubernetesClient, this); + KubernetesClient kubernetesClient, + List> resourceControllers, + Optional objectMapper) { + Operator operator = + objectMapper + .map(x -> new Operator(kubernetesClient, this, x)) + .orElse(new Operator(kubernetesClient, this)); resourceControllers.forEach(r -> operator.register(processController(r))); return operator; }