diff --git a/docs/documentation/features.md b/docs/documentation/features.md index 9c4f30ff84..d281fd1a22 100644 --- a/docs/documentation/features.md +++ b/docs/documentation/features.md @@ -110,6 +110,13 @@ mostly for the cases when there is a long waiting period after a delete operatio you might want to either schedule a timed event to make sure the `deleteResource` is executed again or use event sources get notified about the state changes of a deleted resource. +## Automatic Observed Generation Handling + +## Support for Well Known (non-custom) Kubernetes Resources + +A Controller can be registered for a non-custom resource, so well known Kubernetes resources like ( +Ingress,Deployment,...). Note that automatic observed generation handling is not supported for these resources. + ## Automatic Retries on Error When an exception is thrown from a controller, the framework will schedule an automatic retry of the reconciliation. The diff --git a/micrometer-support/src/main/java/io/javaoperatorsdk/operator/monitoring/micrometer/MicrometerMetrics.java b/micrometer-support/src/main/java/io/javaoperatorsdk/operator/monitoring/micrometer/MicrometerMetrics.java index 19f4f78bf7..ebe193b101 100644 --- a/micrometer-support/src/main/java/io/javaoperatorsdk/operator/monitoring/micrometer/MicrometerMetrics.java +++ b/micrometer-support/src/main/java/io/javaoperatorsdk/operator/monitoring/micrometer/MicrometerMetrics.java @@ -7,8 +7,8 @@ import io.javaoperatorsdk.operator.api.monitoring.Metrics; import io.javaoperatorsdk.operator.api.reconciler.RetryInfo; -import io.javaoperatorsdk.operator.processing.event.CustomResourceID; import io.javaoperatorsdk.operator.processing.event.Event; +import io.javaoperatorsdk.operator.processing.event.ResourceID; import io.micrometer.core.instrument.MeterRegistry; import io.micrometer.core.instrument.Timer; @@ -53,30 +53,30 @@ public void receivedEvent(Event event) { } @Override - public void cleanupDoneFor(CustomResourceID customResourceUid) { + public void cleanupDoneFor(ResourceID customResourceUid) { incrementCounter(customResourceUid, "events.delete"); } - public void reconcileCustomResource(CustomResourceID customResourceID, + public void reconcileCustomResource(ResourceID resourceID, RetryInfo retryInfo) { - incrementCounter(customResourceID, RECONCILIATIONS + "started", + incrementCounter(resourceID, RECONCILIATIONS + "started", RECONCILIATIONS + "retries.number", "" + retryInfo.getAttemptCount(), RECONCILIATIONS + "retries.last", "" + retryInfo.isLastAttempt()); } @Override - public void finishedReconciliation(CustomResourceID customResourceID) { - incrementCounter(customResourceID, RECONCILIATIONS + "success"); + public void finishedReconciliation(ResourceID resourceID) { + incrementCounter(resourceID, RECONCILIATIONS + "success"); } - public void failedReconciliation(CustomResourceID customResourceID, RuntimeException exception) { + public void failedReconciliation(ResourceID resourceID, RuntimeException exception) { var cause = exception.getCause(); if (cause == null) { cause = exception; } else if (cause instanceof RuntimeException) { cause = cause.getCause() != null ? cause.getCause() : cause; } - incrementCounter(customResourceID, RECONCILIATIONS + "failed", "exception", + incrementCounter(resourceID, RECONCILIATIONS + "failed", "exception", cause.getClass().getSimpleName()); } @@ -84,7 +84,7 @@ public void failedReconciliation(CustomResourceID customResourceID, RuntimeExcep return registry.gaugeMapSize(PREFIX + name + ".size", Collections.emptyList(), map); } - private void incrementCounter(CustomResourceID id, String counterName, String... additionalTags) { + private void incrementCounter(ResourceID id, String counterName, String... additionalTags) { var tags = List.of( "name", id.getName(), "name", id.getName(), "namespace", id.getNamespace().orElse(""), 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 405f4b6927..0ec41a495c 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 @@ -9,7 +9,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import io.fabric8.kubernetes.client.CustomResource; +import io.fabric8.kubernetes.api.model.HasMetadata; import io.fabric8.kubernetes.client.DefaultKubernetesClient; import io.fabric8.kubernetes.client.KubernetesClient; import io.fabric8.kubernetes.client.Version; @@ -114,7 +114,7 @@ public void close() { * @param the {@code CustomResource} type associated with the controller * @throws OperatorException if a problem occurred during the registration process */ - public > void register(Reconciler controller) + public void register(Reconciler controller) throws OperatorException { register(controller, null); } @@ -132,7 +132,7 @@ public void close() { * @param the {@code CustomResource} type associated with the controller * @throws OperatorException if a problem occurred during the registration process */ - public > void register( + public void register( Reconciler reconciler, ControllerConfiguration configuration) throws OperatorException { final var existing = configurationService.getConfigurationFor(reconciler); @@ -157,7 +157,7 @@ public void close() { log.info( "Registered Controller: '{}' for CRD: '{}' for namespace(s): {}", configuration.getName(), - configuration.getCustomResourceClass(), + configuration.getResourceClass(), watchedNS); } } @@ -195,7 +195,7 @@ public synchronized void stop() { public synchronized void add(Controller controller) { final var configuration = controller.getConfiguration(); - final var crdName = configuration.getCRDName(); + final var crdName = configuration.getResourceTypeName(); final var existing = controllers.get(crdName); if (existing != null) { throw new OperatorException("Cannot register controller '" + configuration.getName() diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/AbstractConfigurationService.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/AbstractConfigurationService.java index b2eae5bbc2..0dda134c11 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/AbstractConfigurationService.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/AbstractConfigurationService.java @@ -5,7 +5,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Stream; -import io.fabric8.kubernetes.client.CustomResource; +import io.fabric8.kubernetes.api.model.HasMetadata; import io.javaoperatorsdk.operator.ControllerUtils; import io.javaoperatorsdk.operator.api.reconciler.Reconciler; @@ -18,15 +18,15 @@ public AbstractConfigurationService(Version version) { this.version = version; } - protected > void register(ControllerConfiguration config) { + protected void register(ControllerConfiguration config) { put(config, true); } - protected > void replace(ControllerConfiguration config) { + protected void replace(ControllerConfiguration config) { put(config, false); } - private > void put( + private void put( ControllerConfiguration config, boolean failIfExisting) { final var name = config.getName(); if (failIfExisting) { @@ -39,7 +39,7 @@ public AbstractConfigurationService(Version version) { config.setConfigurationService(this); } - protected > void throwExceptionOnNameCollision( + protected void throwExceptionOnNameCollision( String newControllerClassName, ControllerConfiguration existing) { throw new IllegalArgumentException( "Controller name '" @@ -51,7 +51,7 @@ public AbstractConfigurationService(Version version) { } @Override - public > ControllerConfiguration getConfigurationFor( + public ControllerConfiguration getConfigurationFor( Reconciler controller) { final var key = keyFor(controller); final var configuration = configurations.get(key); @@ -73,7 +73,7 @@ private String getControllersNameMessage() { + "."; } - protected > String keyFor(Reconciler controller) { + protected String keyFor(Reconciler controller) { return ControllerUtils.getNameFor(controller); } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/Cloner.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/Cloner.java index e50931a9b0..30b2cee0e9 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/Cloner.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/Cloner.java @@ -1,9 +1,9 @@ package io.javaoperatorsdk.operator.api.config; -import io.fabric8.kubernetes.client.CustomResource; +import io.fabric8.kubernetes.api.model.HasMetadata; public interface Cloner { - > T clone(T object); + R clone(R object); } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ConfigurationService.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ConfigurationService.java index 35d77844b8..bb692e9f9b 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ConfigurationService.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ConfigurationService.java @@ -4,6 +4,7 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import io.fabric8.kubernetes.api.model.HasMetadata; import io.fabric8.kubernetes.client.Config; import io.fabric8.kubernetes.client.CustomResource; import io.javaoperatorsdk.operator.api.monitoring.Metrics; @@ -19,10 +20,9 @@ public interface ConfigurationService { private final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); @Override - public > T clone(T object) { + public HasMetadata clone(HasMetadata object) { try { - return OBJECT_MAPPER.readValue(OBJECT_MAPPER.writeValueAsString(object), - (Class) object.getClass()); + return OBJECT_MAPPER.readValue(OBJECT_MAPPER.writeValueAsString(object), object.getClass()); } catch (JsonProcessingException e) { throw new IllegalStateException(e); } @@ -37,7 +37,7 @@ public interface ConfigurationService { * @return the {@link ControllerConfiguration} associated with the specified controller or {@code * null} if no configuration exists for the controller */ - > ControllerConfiguration getConfigurationFor( + ControllerConfiguration getConfigurationFor( Reconciler controller); /** diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ConfigurationServiceOverrider.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ConfigurationServiceOverrider.java index 3c223cd23f..08adf6e864 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ConfigurationServiceOverrider.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ConfigurationServiceOverrider.java @@ -2,8 +2,8 @@ import java.util.Set; +import io.fabric8.kubernetes.api.model.HasMetadata; import io.fabric8.kubernetes.client.Config; -import io.fabric8.kubernetes.client.CustomResource; import io.javaoperatorsdk.operator.api.monitoring.Metrics; import io.javaoperatorsdk.operator.api.reconciler.Reconciler; @@ -61,7 +61,7 @@ public ConfigurationServiceOverrider withMetrics(Metrics metrics) { public ConfigurationService build() { return new ConfigurationService() { @Override - public > ControllerConfiguration getConfigurationFor( + public ControllerConfiguration getConfigurationFor( Reconciler controller) { return original.getConfigurationFor(controller); } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfiguration.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfiguration.java index 70187b104c..b729ce2d07 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfiguration.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfiguration.java @@ -4,23 +4,24 @@ import java.util.Collections; import java.util.Set; +import io.fabric8.kubernetes.api.model.HasMetadata; import io.fabric8.kubernetes.client.CustomResource; import io.javaoperatorsdk.operator.ControllerUtils; -import io.javaoperatorsdk.operator.processing.event.internal.CustomResourceEventFilter; -import io.javaoperatorsdk.operator.processing.event.internal.CustomResourceEventFilters; +import io.javaoperatorsdk.operator.processing.event.internal.ResourceEventFilter; +import io.javaoperatorsdk.operator.processing.event.internal.ResourceEventFilters; -public interface ControllerConfiguration> { +public interface ControllerConfiguration { default String getName() { return ControllerUtils.getDefaultReconcilerName(getAssociatedReconcilerClassName()); } - default String getCRDName() { - return CustomResource.getCRDName(getCustomResourceClass()); + default String getResourceTypeName() { + return CustomResource.getCRDName(getResourceClass()); } default String getFinalizer() { - return ControllerUtils.getDefaultFinalizerName(getCRDName()); + return ControllerUtils.getDefaultFinalizerName(getResourceTypeName()); } /** @@ -39,7 +40,7 @@ default boolean isGenerationAware() { return true; } - default Class getCustomResourceClass() { + default Class getResourceClass() { ParameterizedType type = (ParameterizedType) getClass().getGenericInterfaces()[0]; return (Class) type.getActualTypeArguments()[0]; } @@ -110,7 +111,7 @@ default boolean useFinalizer() { * * @return filter */ - default CustomResourceEventFilter getEventFilter() { - return CustomResourceEventFilters.passthrough(); + default ResourceEventFilter getEventFilter() { + return ResourceEventFilters.passthrough(); } } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfigurationOverrider.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfigurationOverrider.java index 006d707803..31be7cb983 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfigurationOverrider.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfigurationOverrider.java @@ -4,17 +4,17 @@ import java.util.List; import java.util.Set; -import io.fabric8.kubernetes.client.CustomResource; -import io.javaoperatorsdk.operator.processing.event.internal.CustomResourceEventFilter; +import io.fabric8.kubernetes.api.model.HasMetadata; +import io.javaoperatorsdk.operator.processing.event.internal.ResourceEventFilter; -public class ControllerConfigurationOverrider> { +public class ControllerConfigurationOverrider { private String finalizer; private boolean generationAware; private final Set namespaces; private RetryConfiguration retry; private String labelSelector; - private CustomResourceEventFilter customResourcePredicate; + private ResourceEventFilter customResourcePredicate; private final ControllerConfiguration original; private ControllerConfigurationOverrider(ControllerConfiguration original) { @@ -69,7 +69,7 @@ public ControllerConfigurationOverrider withLabelSelector(String labelSelecto } public ControllerConfigurationOverrider withCustomResourcePredicate( - CustomResourceEventFilter customResourcePredicate) { + ResourceEventFilter customResourcePredicate) { this.customResourcePredicate = customResourcePredicate; return this; } @@ -78,18 +78,18 @@ public ControllerConfiguration build() { return new DefaultControllerConfiguration<>( original.getAssociatedReconcilerClassName(), original.getName(), - original.getCRDName(), + original.getResourceTypeName(), finalizer, generationAware, namespaces, retry, labelSelector, customResourcePredicate, - original.getCustomResourceClass(), + original.getResourceClass(), original.getConfigurationService()); } - public static > ControllerConfigurationOverrider override( + public static ControllerConfigurationOverrider override( ControllerConfiguration original) { return new ControllerConfigurationOverrider<>(original); } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/DefaultControllerConfiguration.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/DefaultControllerConfiguration.java index a0336eb92c..5e8f2611bc 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/DefaultControllerConfiguration.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/DefaultControllerConfiguration.java @@ -3,10 +3,10 @@ import java.util.Collections; import java.util.Set; -import io.fabric8.kubernetes.client.CustomResource; -import io.javaoperatorsdk.operator.processing.event.internal.CustomResourceEventFilter; +import io.fabric8.kubernetes.api.model.HasMetadata; +import io.javaoperatorsdk.operator.processing.event.internal.ResourceEventFilter; -public class DefaultControllerConfiguration> +public class DefaultControllerConfiguration implements ControllerConfiguration { private final String associatedControllerClassName; @@ -18,8 +18,8 @@ public class DefaultControllerConfiguration> private final boolean watchAllNamespaces; private final RetryConfiguration retryConfiguration; private final String labelSelector; - private final CustomResourceEventFilter customResourceEventFilter; - private final Class customResourceClass; + private final ResourceEventFilter resourceEventFilter; + private final Class resourceClass; private ConfigurationService service; public DefaultControllerConfiguration( @@ -31,8 +31,8 @@ public DefaultControllerConfiguration( Set namespaces, RetryConfiguration retryConfiguration, String labelSelector, - CustomResourceEventFilter customResourceEventFilter, - Class customResourceClass, + ResourceEventFilter resourceEventFilter, + Class resourceClass, ConfigurationService service) { this.associatedControllerClassName = associatedControllerClassName; this.name = name; @@ -47,10 +47,10 @@ public DefaultControllerConfiguration( ? ControllerConfiguration.super.getRetryConfiguration() : retryConfiguration; this.labelSelector = labelSelector; - this.customResourceEventFilter = customResourceEventFilter; - this.customResourceClass = - customResourceClass == null ? ControllerConfiguration.super.getCustomResourceClass() - : customResourceClass; + this.resourceEventFilter = resourceEventFilter; + this.resourceClass = + resourceClass == null ? ControllerConfiguration.super.getResourceClass() + : resourceClass; setConfigurationService(service); } @@ -60,7 +60,7 @@ public String getName() { } @Override - public String getCRDName() { + public String getResourceTypeName() { return crdName; } @@ -114,12 +114,12 @@ public String getLabelSelector() { } @Override - public Class getCustomResourceClass() { - return customResourceClass; + public Class getResourceClass() { + return resourceClass; } @Override - public CustomResourceEventFilter getEventFilter() { - return customResourceEventFilter; + public ResourceEventFilter getEventFilter() { + return resourceEventFilter; } } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/monitoring/Metrics.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/monitoring/Metrics.java index efb99cc0ae..25472c4626 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/monitoring/Metrics.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/monitoring/Metrics.java @@ -3,23 +3,23 @@ import java.util.Map; import io.javaoperatorsdk.operator.api.reconciler.RetryInfo; -import io.javaoperatorsdk.operator.processing.event.CustomResourceID; import io.javaoperatorsdk.operator.processing.event.Event; +import io.javaoperatorsdk.operator.processing.event.ResourceID; public interface Metrics { Metrics NOOP = new Metrics() {}; default void receivedEvent(Event event) {} - default void reconcileCustomResource(CustomResourceID customResourceID, + default void reconcileCustomResource(ResourceID resourceID, RetryInfo retryInfo) {} - default void failedReconciliation(CustomResourceID customResourceID, + default void failedReconciliation(ResourceID resourceID, RuntimeException exception) {} - default void cleanupDoneFor(CustomResourceID customResourceUid) {} + default void cleanupDoneFor(ResourceID customResourceUid) {} - default void finishedReconciliation(CustomResourceID resourceID) {} + default void finishedReconciliation(ResourceID resourceID) {} interface ControllerExecution { diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/ControllerConfiguration.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/ControllerConfiguration.java index 199a4985f8..3a522c1347 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/ControllerConfiguration.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/ControllerConfiguration.java @@ -5,7 +5,7 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; -import io.javaoperatorsdk.operator.processing.event.internal.CustomResourceEventFilter; +import io.javaoperatorsdk.operator.processing.event.internal.ResourceEventFilter; @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE}) @@ -54,10 +54,10 @@ /** - * Optional list of classes providing custom {@link CustomResourceEventFilter}. + * Optional list of classes providing custom {@link ResourceEventFilter}. * * @return the list of event filters. */ @SuppressWarnings("rawtypes") - Class[] eventFilters() default {}; + Class[] eventFilters() default {}; } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/ErrorStatusHandler.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/ErrorStatusHandler.java index 3ea7bb4862..578d3ff8a6 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/ErrorStatusHandler.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/ErrorStatusHandler.java @@ -1,8 +1,8 @@ package io.javaoperatorsdk.operator.api.reconciler; -import io.fabric8.kubernetes.client.CustomResource; +import io.fabric8.kubernetes.api.model.HasMetadata; -public interface ErrorStatusHandler> { +public interface ErrorStatusHandler { /** *

diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/EventSourceInitializer.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/EventSourceInitializer.java index f782b8bec7..b568814739 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/EventSourceInitializer.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/EventSourceInitializer.java @@ -1,9 +1,9 @@ package io.javaoperatorsdk.operator.api.reconciler; -import io.fabric8.kubernetes.client.CustomResource; +import io.fabric8.kubernetes.api.model.HasMetadata; import io.javaoperatorsdk.operator.processing.event.EventSourceRegistry; -public interface EventSourceInitializer> { +public interface EventSourceInitializer { /** * In this typically you might want to register event sources. But can access diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/Reconciler.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/Reconciler.java index 937969126f..7a6977d940 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/Reconciler.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/Reconciler.java @@ -1,8 +1,8 @@ package io.javaoperatorsdk.operator.api.reconciler; -import io.fabric8.kubernetes.client.CustomResource; +import io.fabric8.kubernetes.api.model.HasMetadata; -public interface Reconciler> { +public interface Reconciler { /** * Note that this method is used in combination of finalizers. If automatic finalizer handling is diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/UpdateControl.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/UpdateControl.java index 7d7b6b6e0b..3646a6df0f 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/UpdateControl.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/UpdateControl.java @@ -1,29 +1,29 @@ package io.javaoperatorsdk.operator.api.reconciler; -import io.fabric8.kubernetes.client.CustomResource; +import io.fabric8.kubernetes.api.model.HasMetadata; @SuppressWarnings("rawtypes") -public class UpdateControl extends BaseControl> { +public class UpdateControl extends BaseControl> { - private final T customResource; + private final T resource; private final boolean updateStatusSubResource; - private final boolean updateCustomResource; + private final boolean updateResource; private UpdateControl( - T customResource, boolean updateStatusSubResource, boolean updateCustomResource) { - if ((updateCustomResource || updateStatusSubResource) && customResource == null) { + T resource, boolean updateStatusSubResource, boolean updateResource) { + if ((updateResource || updateStatusSubResource) && resource == null) { throw new IllegalArgumentException("CustomResource cannot be null in case of update"); } - this.customResource = customResource; + this.resource = resource; this.updateStatusSubResource = updateStatusSubResource; - this.updateCustomResource = updateCustomResource; + this.updateResource = updateResource; } - public static UpdateControl updateCustomResource(T customResource) { + public static UpdateControl updateResource(T customResource) { return new UpdateControl<>(customResource, false, true); } - public static UpdateControl updateStatusSubResource( + public static UpdateControl updateStatusSubResource( T customResource) { return new UpdateControl<>(customResource, true, false); } @@ -35,28 +35,28 @@ public static UpdateControl updateStatusSubResourc * @param customResource - custom resource to use in both API calls * @return UpdateControl instance */ - public static > UpdateControl updateCustomResourceAndStatus( + public static UpdateControl updateCustomResourceAndStatus( T customResource) { return new UpdateControl<>(customResource, true, true); } - public static > UpdateControl noUpdate() { + public static UpdateControl noUpdate() { return new UpdateControl<>(null, false, false); } - public T getCustomResource() { - return customResource; + public T getResource() { + return resource; } public boolean isUpdateStatusSubResource() { return updateStatusSubResource; } - public boolean isUpdateCustomResource() { - return updateCustomResource; + public boolean isUpdateResource() { + return updateResource; } public boolean isUpdateCustomResourceAndStatusSubResource() { - return updateCustomResource && updateStatusSubResource; + return updateResource && updateStatusSubResource; } } 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 cb0cef3b90..45d26e5a83 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 @@ -2,9 +2,9 @@ import java.util.Objects; +import io.fabric8.kubernetes.api.model.HasMetadata; import io.fabric8.kubernetes.api.model.KubernetesResourceList; import io.fabric8.kubernetes.api.model.apiextensions.v1.CustomResourceDefinition; -import io.fabric8.kubernetes.client.CustomResource; import io.fabric8.kubernetes.client.KubernetesClient; import io.fabric8.kubernetes.client.dsl.MixedOperation; import io.fabric8.kubernetes.client.dsl.Resource; @@ -22,7 +22,7 @@ import io.javaoperatorsdk.operator.processing.event.EventSourceManager; import io.javaoperatorsdk.operator.processing.event.EventSourceRegistry; -public class Controller> implements Reconciler, +public class Controller implements Reconciler, LifecycleAware, EventSourceInitializer { private final Reconciler reconciler; private final ControllerConfiguration configuration; @@ -138,7 +138,7 @@ public KubernetesClient getClient() { } public MixedOperation, Resource> getCRClient() { - return kubernetesClient.resources(configuration.getCustomResourceClass()); + return kubernetesClient.resources(configuration.getResourceClass()); } /** @@ -150,9 +150,9 @@ public MixedOperation, Resource> getCRClient() { * @throws OperatorException if a problem occurred during the registration process */ public void start() throws OperatorException { - final Class resClass = configuration.getCustomResourceClass(); + final Class resClass = configuration.getResourceClass(); final String controllerName = configuration.getName(); - final var crdName = configuration.getCRDName(); + final var crdName = configuration.getResourceTypeName(); final var specVersion = "v1"; try { // check that the custom resource is known by the cluster if configured that way @@ -171,7 +171,7 @@ public void start() throws OperatorException { eventSourceManager = new EventSourceManager<>(this); eventProcessor = - new EventProcessor<>(this, eventSourceManager.getCustomResourceEventSource()); + new EventProcessor<>(this, eventSourceManager.getControllerResourceEventSource()); eventProcessor.setEventSourceManager(eventSourceManager); eventSourceManager.setEventProcessor(eventProcessor); if (reconciler instanceof EventSourceInitializer) { diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/EventMarker.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/EventMarker.java index 9be023416b..b32983ac8e 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/EventMarker.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/EventMarker.java @@ -2,8 +2,8 @@ import java.util.HashMap; -import io.javaoperatorsdk.operator.processing.event.CustomResourceID; import io.javaoperatorsdk.operator.processing.event.Event; +import io.javaoperatorsdk.operator.processing.event.ResourceID; /** * Manages the state of received events. Basically there can be only three distinct states relevant @@ -22,33 +22,33 @@ public enum EventingState { DELETE_EVENT_PRESENT, } - private final HashMap eventingState = new HashMap<>(); + private final HashMap eventingState = new HashMap<>(); - private EventingState getEventingState(CustomResourceID customResourceID) { - EventingState actualState = eventingState.get(customResourceID); + private EventingState getEventingState(ResourceID resourceID) { + EventingState actualState = eventingState.get(resourceID); return actualState == null ? EventingState.NO_EVENT_PRESENT : actualState; } - private void setEventingState(CustomResourceID customResourceID, EventingState state) { - eventingState.put(customResourceID, state); + private void setEventingState(ResourceID resourceID, EventingState state) { + eventingState.put(resourceID, state); } public void markEventReceived(Event event) { markEventReceived(event.getRelatedCustomResourceID()); } - public void markEventReceived(CustomResourceID customResourceID) { - if (deleteEventPresent(customResourceID)) { + public void markEventReceived(ResourceID resourceID) { + if (deleteEventPresent(resourceID)) { throw new IllegalStateException("Cannot receive event after a delete event received"); } - setEventingState(customResourceID, EventingState.EVENT_PRESENT); + setEventingState(resourceID, EventingState.EVENT_PRESENT); } - public void unMarkEventReceived(CustomResourceID customResourceID) { - var actualState = getEventingState(customResourceID); + public void unMarkEventReceived(ResourceID resourceID) { + var actualState = getEventingState(resourceID); switch (actualState) { case EVENT_PRESENT: - setEventingState(customResourceID, + setEventingState(resourceID, EventingState.NO_EVENT_PRESENT); break; case DELETE_EVENT_PRESENT: @@ -60,25 +60,25 @@ public void markDeleteEventReceived(Event event) { markDeleteEventReceived(event.getRelatedCustomResourceID()); } - public void markDeleteEventReceived(CustomResourceID customResourceID) { - setEventingState(customResourceID, EventingState.DELETE_EVENT_PRESENT); + public void markDeleteEventReceived(ResourceID resourceID) { + setEventingState(resourceID, EventingState.DELETE_EVENT_PRESENT); } - public boolean deleteEventPresent(CustomResourceID customResourceID) { - return getEventingState(customResourceID) == EventingState.DELETE_EVENT_PRESENT; + public boolean deleteEventPresent(ResourceID resourceID) { + return getEventingState(resourceID) == EventingState.DELETE_EVENT_PRESENT; } - public boolean eventPresent(CustomResourceID customResourceID) { - var actualState = getEventingState(customResourceID); + public boolean eventPresent(ResourceID resourceID) { + var actualState = getEventingState(resourceID); return actualState == EventingState.EVENT_PRESENT; } - public boolean noEventPresent(CustomResourceID customResourceID) { - var actualState = getEventingState(customResourceID); + public boolean noEventPresent(ResourceID resourceID) { + var actualState = getEventingState(resourceID); return actualState == EventingState.NO_EVENT_PRESENT; } - public void cleanup(CustomResourceID customResourceID) { - eventingState.remove(customResourceID); + public void cleanup(ResourceID resourceID) { + eventingState.remove(resourceID); } } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/EventProcessor.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/EventProcessor.java index 1fd8952ebf..360001602f 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/EventProcessor.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/EventProcessor.java @@ -12,19 +12,19 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import io.fabric8.kubernetes.client.CustomResource; +import io.fabric8.kubernetes.api.model.HasMetadata; import io.javaoperatorsdk.operator.OperatorException; import io.javaoperatorsdk.operator.api.LifecycleAware; import io.javaoperatorsdk.operator.api.config.ConfigurationService; import io.javaoperatorsdk.operator.api.config.ExecutorServiceManager; import io.javaoperatorsdk.operator.api.monitoring.Metrics; import io.javaoperatorsdk.operator.api.reconciler.RetryInfo; -import io.javaoperatorsdk.operator.processing.event.CustomResourceID; import io.javaoperatorsdk.operator.processing.event.Event; import io.javaoperatorsdk.operator.processing.event.EventHandler; import io.javaoperatorsdk.operator.processing.event.EventSourceManager; -import io.javaoperatorsdk.operator.processing.event.internal.CustomResourceEvent; +import io.javaoperatorsdk.operator.processing.event.ResourceID; import io.javaoperatorsdk.operator.processing.event.internal.ResourceAction; +import io.javaoperatorsdk.operator.processing.event.internal.ResourceEvent; import io.javaoperatorsdk.operator.processing.retry.GenericRetry; import io.javaoperatorsdk.operator.processing.retry.Retry; import io.javaoperatorsdk.operator.processing.retry.RetryExecution; @@ -36,15 +36,15 @@ * Event handler that makes sure that events are processed in a "single threaded" way per resource * UID, while buffering events which are received during an execution. */ -public class EventProcessor> +public class EventProcessor implements EventHandler, LifecycleAware { private static final Logger log = LoggerFactory.getLogger(EventProcessor.class); - private final Set underProcessing = new HashSet<>(); + private final Set underProcessing = new HashSet<>(); private final ReconciliationDispatcher reconciliationDispatcher; private final Retry retry; - private final Map retryState = new HashMap<>(); + private final Map retryState = new HashMap<>(); private final ExecutorService executor; private final String controllerName; private final ReentrantLock lock = new ReentrantLock(); @@ -120,7 +120,7 @@ public void handleEvent(Event event) { } } - private void submitReconciliationExecution(CustomResourceID customResourceUid) { + private void submitReconciliationExecution(ResourceID customResourceUid) { try { boolean controllerUnderExecution = isControllerUnderExecution(customResourceUid); Optional latestCustomResource = @@ -156,15 +156,15 @@ private void submitReconciliationExecution(CustomResourceID customResourceUid) { } private void handleEventMarking(Event event) { - if (event instanceof CustomResourceEvent && - ((CustomResourceEvent) event).getAction() == ResourceAction.DELETED) { + if (event instanceof ResourceEvent && + ((ResourceEvent) event).getAction() == ResourceAction.DELETED) { eventMarker.markDeleteEventReceived(event); } else if (!eventMarker.deleteEventPresent(event.getRelatedCustomResourceID())) { eventMarker.markEventReceived(event); } } - private RetryInfo retryInfo(CustomResourceID customResourceUid) { + private RetryInfo retryInfo(ResourceID customResourceUid) { return retryState.get(customResourceUid); } @@ -175,36 +175,36 @@ void eventProcessingFinished( if (!running) { return; } - CustomResourceID customResourceID = executionScope.getCustomResourceID(); + ResourceID resourceID = executionScope.getCustomResourceID(); log.debug( "Event processing finished. Scope: {}, PostExecutionControl: {}", executionScope, postExecutionControl); - unsetUnderExecution(customResourceID); + unsetUnderExecution(resourceID); // If a delete event present at this phase, it was received during reconciliation. // So we either removed the finalizer during reconciliation or we don't use finalizers. // Either way we don't want to retry. if (isRetryConfigured() && postExecutionControl.exceptionDuringExecution() && - !eventMarker.deleteEventPresent(customResourceID)) { + !eventMarker.deleteEventPresent(resourceID)) { handleRetryOnException(executionScope, postExecutionControl.getRuntimeException().orElseThrow()); return; } cleanupOnSuccessfulExecution(executionScope); - metrics.finishedReconciliation(customResourceID); - if (eventMarker.deleteEventPresent(customResourceID)) { + metrics.finishedReconciliation(resourceID); + if (eventMarker.deleteEventPresent(resourceID)) { cleanupForDeletedEvent(executionScope.getCustomResourceID()); } else { - if (eventMarker.eventPresent(customResourceID)) { + if (eventMarker.eventPresent(resourceID)) { if (isCacheReadyForInstantReconciliation(executionScope, postExecutionControl)) { - submitReconciliationExecution(customResourceID); + submitReconciliationExecution(resourceID); } else { - postponeReconciliationAndHandleCacheSyncEvent(customResourceID); + postponeReconciliationAndHandleCacheSyncEvent(resourceID); } } else { reScheduleExecutionIfInstructed(postExecutionControl, - executionScope.getCustomResource()); + executionScope.getResource()); } } } finally { @@ -212,8 +212,8 @@ void eventProcessingFinished( } } - private void postponeReconciliationAndHandleCacheSyncEvent(CustomResourceID customResourceID) { - eventSourceManager.getCustomResourceEventSource().whitelistNextEvent(customResourceID); + private void postponeReconciliationAndHandleCacheSyncEvent(ResourceID resourceID) { + eventSourceManager.getControllerResourceEventSource().whitelistNextEvent(resourceID); } private boolean isCacheReadyForInstantReconciliation(ExecutionScope executionScope, @@ -221,7 +221,7 @@ private boolean isCacheReadyForInstantReconciliation(ExecutionScope execution if (!postExecutionControl.customResourceUpdatedDuringExecution()) { return true; } - String originalResourceVersion = getVersion(executionScope.getCustomResource()); + String originalResourceVersion = getVersion(executionScope.getResource()); String customResourceVersionAfterExecution = getVersion(postExecutionControl .getUpdatedCustomResource() .orElseThrow(() -> new IllegalStateException( @@ -277,7 +277,7 @@ private void handleRetryOnException(ExecutionScope executionScope, metrics.failedReconciliation(customResourceID, exception); eventSourceManager .getRetryAndRescheduleTimerEventSource() - .scheduleOnce(executionScope.getCustomResource(), delay); + .scheduleOnce(executionScope.getResource(), delay); }, () -> log.error("Exhausted retries for {}", executionScope)); } @@ -285,7 +285,7 @@ private void handleRetryOnException(ExecutionScope executionScope, private void cleanupOnSuccessfulExecution(ExecutionScope executionScope) { log.debug( "Cleanup for successful execution for resource: {}", - getName(executionScope.getCustomResource())); + getName(executionScope.getResource())); if (isRetryConfigured()) { retryState.remove(executionScope.getCustomResourceID()); } @@ -303,21 +303,21 @@ private RetryExecution getOrInitRetryExecution(ExecutionScope executionScope) return retryExecution; } - private void cleanupForDeletedEvent(CustomResourceID customResourceUid) { + private void cleanupForDeletedEvent(ResourceID customResourceUid) { eventSourceManager.cleanupForCustomResource(customResourceUid); eventMarker.cleanup(customResourceUid); metrics.cleanupDoneFor(customResourceUid); } - private boolean isControllerUnderExecution(CustomResourceID customResourceUid) { + private boolean isControllerUnderExecution(ResourceID customResourceUid) { return underProcessing.contains(customResourceUid); } - private void setUnderExecutionProcessing(CustomResourceID customResourceUid) { + private void setUnderExecutionProcessing(ResourceID customResourceUid) { underProcessing.add(customResourceUid); } - private void unsetUnderExecution(CustomResourceID customResourceUid) { + private void unsetUnderExecution(ResourceID customResourceUid) { underProcessing.remove(customResourceUid); } @@ -358,7 +358,7 @@ public void run() { final var thread = Thread.currentThread(); final var name = thread.getName(); try { - MDCUtils.addCustomResourceInfo(executionScope.getCustomResource()); + MDCUtils.addCustomResourceInfo(executionScope.getResource()); thread.setName("EventHandler-" + controllerName); PostExecutionControl postExecutionControl = reconciliationDispatcher.handleExecution(executionScope); diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/ExecutionScope.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/ExecutionScope.java index a24f3461c7..cb40ab35eb 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/ExecutionScope.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/ExecutionScope.java @@ -1,35 +1,35 @@ package io.javaoperatorsdk.operator.processing; -import io.fabric8.kubernetes.client.CustomResource; +import io.fabric8.kubernetes.api.model.HasMetadata; import io.javaoperatorsdk.operator.api.reconciler.RetryInfo; -import io.javaoperatorsdk.operator.processing.event.CustomResourceID; +import io.javaoperatorsdk.operator.processing.event.ResourceID; -public class ExecutionScope> { +public class ExecutionScope { // the latest custom resource from cache - private final R customResource; + private final R resource; private final RetryInfo retryInfo; - public ExecutionScope(R customResource, RetryInfo retryInfo) { - this.customResource = customResource; + public ExecutionScope(R resource, RetryInfo retryInfo) { + this.resource = resource; this.retryInfo = retryInfo; } - public R getCustomResource() { - return customResource; + public R getResource() { + return resource; } - public CustomResourceID getCustomResourceID() { - return CustomResourceID.fromResource(customResource); + public ResourceID getCustomResourceID() { + return ResourceID.fromResource(resource); } @Override public String toString() { return "ExecutionScope{" - + ", customResource uid: " - + customResource.getMetadata().getUid() + + " resource id: " + + ResourceID.fromResource(resource) + ", version: " - + customResource.getMetadata().getResourceVersion() + + resource.getMetadata().getResourceVersion() + '}'; } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/KubernetesResourceUtils.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/KubernetesResourceUtils.java index cf26dc08ed..f585974dff 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/KubernetesResourceUtils.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/KubernetesResourceUtils.java @@ -4,15 +4,15 @@ public class KubernetesResourceUtils { - public static String getName(HasMetadata customResource) { - return customResource.getMetadata().getName(); + public static String getName(HasMetadata resource) { + return resource.getMetadata().getName(); } - public static String getUID(HasMetadata customResource) { - return customResource.getMetadata().getUid(); + public static String getUID(HasMetadata resource) { + return resource.getMetadata().getUid(); } - public static String getVersion(HasMetadata customResource) { - return customResource.getMetadata().getResourceVersion(); + public static String getVersion(HasMetadata resource) { + return resource.getMetadata().getResourceVersion(); } } 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 e68312c451..6f475b56d8 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 @@ -2,8 +2,8 @@ import org.slf4j.MDC; -import io.fabric8.kubernetes.client.CustomResource; -import io.javaoperatorsdk.operator.processing.event.CustomResourceID; +import io.fabric8.kubernetes.api.model.HasMetadata; +import io.javaoperatorsdk.operator.processing.event.ResourceID; public class MDCUtils { @@ -15,9 +15,9 @@ public class MDCUtils { private static final String GENERATION = "resource.generation"; private static final String UID = "resource.uid"; - public static void addCustomResourceIDInfo(CustomResourceID customResourceID) { - MDC.put(NAME, customResourceID.getName()); - MDC.put(NAMESPACE, customResourceID.getNamespace().orElse("no namespace")); + public static void addCustomResourceIDInfo(ResourceID resourceID) { + MDC.put(NAME, resourceID.getName()); + MDC.put(NAMESPACE, resourceID.getNamespace().orElse("no namespace")); } public static void removeCustomResourceIDInfo() { @@ -25,14 +25,16 @@ public static void removeCustomResourceIDInfo() { MDC.remove(NAMESPACE); } - public static void addCustomResourceInfo(CustomResource customResource) { - MDC.put(API_VERSION, customResource.getApiVersion()); - MDC.put(KIND, customResource.getKind()); - MDC.put(NAME, customResource.getMetadata().getName()); - MDC.put(NAMESPACE, customResource.getMetadata().getNamespace()); - MDC.put(RESOURCE_VERSION, customResource.getMetadata().getResourceVersion()); - MDC.put(GENERATION, customResource.getMetadata().getGeneration().toString()); - MDC.put(UID, customResource.getMetadata().getUid()); + public static void addCustomResourceInfo(HasMetadata resource) { + MDC.put(API_VERSION, resource.getApiVersion()); + MDC.put(KIND, resource.getKind()); + MDC.put(NAME, resource.getMetadata().getName()); + MDC.put(NAMESPACE, resource.getMetadata().getNamespace()); + MDC.put(RESOURCE_VERSION, resource.getMetadata().getResourceVersion()); + if (resource.getMetadata().getGeneration() != null) { + MDC.put(GENERATION, resource.getMetadata().getGeneration().toString()); + } + MDC.put(UID, resource.getMetadata().getUid()); } public static void removeCustomResourceInfo() { diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/PostExecutionControl.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/PostExecutionControl.java index 60d0f4bb34..e8df3225ef 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/PostExecutionControl.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/PostExecutionControl.java @@ -2,9 +2,9 @@ import java.util.Optional; -import io.fabric8.kubernetes.client.CustomResource; +import io.fabric8.kubernetes.api.model.HasMetadata; -public final class PostExecutionControl> { +public final class PostExecutionControl { private final boolean onlyFinalizerHandled; private final R updatedCustomResource; @@ -21,20 +21,20 @@ private PostExecutionControl( this.runtimeException = runtimeException; } - public static > PostExecutionControl onlyFinalizerAdded() { + public static PostExecutionControl onlyFinalizerAdded() { return new PostExecutionControl<>(true, null, null); } - public static > PostExecutionControl defaultDispatch() { + public static PostExecutionControl defaultDispatch() { return new PostExecutionControl<>(false, null, null); } - public static > PostExecutionControl customResourceUpdated( + public static PostExecutionControl customResourceUpdated( R updatedCustomResource) { return new PostExecutionControl<>(false, updatedCustomResource, null); } - public static > PostExecutionControl exceptionDuringExecution( + public static PostExecutionControl exceptionDuringExecution( RuntimeException exception) { return new PostExecutionControl<>(false, null, exception); } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/ReconciliationDispatcher.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/ReconciliationDispatcher.java index b38b880442..c198252678 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/ReconciliationDispatcher.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/ReconciliationDispatcher.java @@ -3,6 +3,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import io.fabric8.kubernetes.api.model.HasMetadata; import io.fabric8.kubernetes.api.model.KubernetesResourceList; import io.fabric8.kubernetes.client.CustomResource; import io.fabric8.kubernetes.client.KubernetesClientException; @@ -25,7 +26,7 @@ /** * Handles calls and results of a Reconciler and finalizer related logic */ -public class ReconciliationDispatcher> { +public class ReconciliationDispatcher { private static final Logger log = LoggerFactory.getLogger(ReconciliationDispatcher.class); @@ -59,7 +60,7 @@ public PostExecutionControl handleExecution(ExecutionScope executionScope) } private PostExecutionControl handleDispatch(ExecutionScope executionScope) { - R resource = executionScope.getCustomResource(); + R resource = executionScope.getResource(); log.debug("Handling dispatch for resource {}", getName(resource)); final var markedForDeletion = resource.isMarkedForDeletion(); @@ -86,7 +87,7 @@ private ControllerConfiguration configuration() { /** * Determines whether the given resource should be dispatched to the controller's - * {@link Reconciler#cleanup(CustomResource, Context)} method + * {@link Reconciler#cleanup(HasMetadata, Context)} method * * @param resource the resource to be potentially deleted * @return {@code true} if the resource should be handed to the controller's {@code @@ -147,16 +148,16 @@ private PostExecutionControl createOrUpdateExecution(ExecutionScope execut UpdateControl updateControl = controller.reconcile(resource, context); R updatedCustomResource = null; if (updateControl.isUpdateCustomResourceAndStatusSubResource()) { - updatedCustomResource = updateCustomResource(updateControl.getCustomResource()); + updatedCustomResource = updateCustomResource(updateControl.getResource()); updateControl - .getCustomResource() + .getResource() .getMetadata() .setResourceVersion(updatedCustomResource.getMetadata().getResourceVersion()); - updatedCustomResource = updateStatusGenerationAware(updateControl.getCustomResource()); + updatedCustomResource = updateStatusGenerationAware(updateControl.getResource()); } else if (updateControl.isUpdateStatusSubResource()) { - updatedCustomResource = updateStatusGenerationAware(updateControl.getCustomResource()); - } else if (updateControl.isUpdateCustomResource()) { - updatedCustomResource = updateCustomResource(updateControl.getCustomResource()); + updatedCustomResource = updateStatusGenerationAware(updateControl.getResource()); + } else if (updateControl.isUpdateResource()) { + updatedCustomResource = updateCustomResource(updateControl.getResource()); } return createPostExecutionControl(updatedCustomResource, updateControl); } @@ -188,13 +189,17 @@ private R updateStatusGenerationAware(R customResource) { return customResourceFacade.updateStatus(customResource); } - private void updateStatusObservedGenerationIfRequired(R customResource) { - if (controller.getConfiguration().isGenerationAware()) { + private void updateStatusObservedGenerationIfRequired(R resource) { + // todo: change this to check for HasStatus (or similar) when + // https://github.com/fabric8io/kubernetes-client/issues/3586 is fixed + if (controller.getConfiguration().isGenerationAware() + && resource instanceof CustomResource) { + var customResource = (CustomResource) resource; var status = customResource.getStatus(); // Note that if status is null we won't update the observed generation. if (status instanceof ObservedGenerationAware) { ((ObservedGenerationAware) status) - .setObservedGeneration(customResource.getMetadata().getGeneration()); + .setObservedGeneration(resource.getMetadata().getGeneration()); } } } @@ -276,7 +281,7 @@ private R replace(R resource) { } // created to support unit testing - static class CustomResourceFacade> { + static class CustomResourceFacade { private final MixedOperation, Resource> resourceOperation; 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 index 127926c724..8fa497f61c 100644 --- 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 @@ -2,11 +2,11 @@ import java.util.Optional; -import io.fabric8.kubernetes.client.CustomResource; -import io.javaoperatorsdk.operator.processing.event.CustomResourceID; +import io.fabric8.kubernetes.api.model.HasMetadata; +import io.javaoperatorsdk.operator.processing.event.ResourceID; -public interface ResourceCache> { +public interface ResourceCache { - Optional getCustomResource(CustomResourceID resourceID); + Optional getCustomResource(ResourceID resourceID); } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/Event.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/Event.java index ff871b1534..deacb85956 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/Event.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/Event.java @@ -2,13 +2,13 @@ public class Event { - private final CustomResourceID relatedCustomResource; + private final ResourceID relatedCustomResource; - public Event(CustomResourceID targetCustomResource) { + public Event(ResourceID targetCustomResource) { this.relatedCustomResource = targetCustomResource; } - public CustomResourceID getRelatedCustomResourceID() { + public ResourceID getRelatedCustomResourceID() { return relatedCustomResource; } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/EventSource.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/EventSource.java index 7646dcc353..a2be4547a2 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/EventSource.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/EventSource.java @@ -11,5 +11,5 @@ public interface EventSource extends LifecycleAware { * * @param customResourceUid - id of custom resource */ - default void cleanupForCustomResource(CustomResourceID customResourceUid) {} + default void cleanupForResource(ResourceID customResourceUid) {} } 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 b1d941d4e4..760bde2f43 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 @@ -9,16 +9,16 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import io.fabric8.kubernetes.client.CustomResource; +import io.fabric8.kubernetes.api.model.HasMetadata; import io.javaoperatorsdk.operator.MissingCRDException; import io.javaoperatorsdk.operator.OperatorException; import io.javaoperatorsdk.operator.api.LifecycleAware; import io.javaoperatorsdk.operator.processing.Controller; import io.javaoperatorsdk.operator.processing.EventProcessor; -import io.javaoperatorsdk.operator.processing.event.internal.CustomResourceEventSource; +import io.javaoperatorsdk.operator.processing.event.internal.ControllerResourceEventSource; import io.javaoperatorsdk.operator.processing.event.internal.TimerEventSource; -public class EventSourceManager> +public class EventSourceManager implements EventSourceRegistry, LifecycleAware { private static final Logger log = LoggerFactory.getLogger(EventSourceManager.class); @@ -27,7 +27,7 @@ public class EventSourceManager> private final Set eventSources = Collections.synchronizedSet(new HashSet<>()); private EventProcessor eventProcessor; private TimerEventSource retryAndRescheduleTimerEventSource; - private CustomResourceEventSource customResourceEventSource; + private ControllerResourceEventSource controllerResourceEventSource; EventSourceManager() { init(); @@ -35,8 +35,8 @@ public class EventSourceManager> public EventSourceManager(Controller controller) { init(); - customResourceEventSource = new CustomResourceEventSource<>(controller); - registerEventSource(customResourceEventSource); + controllerResourceEventSource = new ControllerResourceEventSource<>(controller); + registerEventSource(controllerResourceEventSource); } private void init() { @@ -46,8 +46,8 @@ private void init() { public EventSourceManager setEventProcessor(EventProcessor eventProcessor) { this.eventProcessor = eventProcessor; - if (customResourceEventSource != null) { - customResourceEventSource.setEventHandler(eventProcessor); + if (controllerResourceEventSource != null) { + controllerResourceEventSource.setEventHandler(eventProcessor); } if (retryAndRescheduleTimerEventSource != null) { retryAndRescheduleTimerEventSource.setEventHandler(eventProcessor); @@ -110,11 +110,11 @@ public final void registerEventSource(EventSource eventSource) } } - public void cleanupForCustomResource(CustomResourceID customResourceUid) { + public void cleanupForCustomResource(ResourceID customResourceUid) { lock.lock(); try { for (EventSource eventSource : this.eventSources) { - eventSource.cleanupForCustomResource(customResourceUid); + eventSource.cleanupForResource(customResourceUid); } } finally { lock.unlock(); @@ -131,8 +131,8 @@ public Set getRegisteredEventSources() { } @Override - public CustomResourceEventSource getCustomResourceEventSource() { - return customResourceEventSource; + public ControllerResourceEventSource getControllerResourceEventSource() { + return controllerResourceEventSource; } } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/EventSourceRegistry.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/EventSourceRegistry.java index 95de04976e..518b470fa8 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/EventSourceRegistry.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/EventSourceRegistry.java @@ -2,11 +2,11 @@ import java.util.Set; -import io.fabric8.kubernetes.client.CustomResource; +import io.fabric8.kubernetes.api.model.HasMetadata; import io.javaoperatorsdk.operator.OperatorException; -import io.javaoperatorsdk.operator.processing.event.internal.CustomResourceEventSource; +import io.javaoperatorsdk.operator.processing.event.internal.ControllerResourceEventSource; -public interface EventSourceRegistry> { +public interface EventSourceRegistry { /** * Add the {@link EventSource} identified by the given name to the event manager. @@ -21,6 +21,6 @@ void registerEventSource(EventSource eventSource) Set getRegisteredEventSources(); - CustomResourceEventSource getCustomResourceEventSource(); + ControllerResourceEventSource getControllerResourceEventSource(); } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/CustomResourceID.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/ResourceID.java similarity index 76% rename from operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/CustomResourceID.java rename to operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/ResourceID.java index b668a772dd..515be245b8 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/CustomResourceID.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/ResourceID.java @@ -5,22 +5,22 @@ import io.fabric8.kubernetes.api.model.HasMetadata; -public class CustomResourceID { +public class ResourceID { - public static CustomResourceID fromResource(HasMetadata resource) { - return new CustomResourceID(resource.getMetadata().getName(), + public static ResourceID fromResource(HasMetadata resource) { + return new ResourceID(resource.getMetadata().getName(), resource.getMetadata().getNamespace()); } private final String name; private final String namespace; - public CustomResourceID(String name, String namespace) { + public ResourceID(String name, String namespace) { this.name = name; this.namespace = namespace; } - public CustomResourceID(String name) { + public ResourceID(String name) { this(name, null); } @@ -38,7 +38,7 @@ public boolean equals(Object o) { return true; if (o == null || getClass() != o.getClass()) return false; - CustomResourceID that = (CustomResourceID) o; + ResourceID that = (ResourceID) o; return Objects.equals(name, that.name) && Objects.equals(namespace, that.namespace); } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/internal/CustomResourceEventSource.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/internal/ControllerResourceEventSource.java similarity index 85% rename from operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/internal/CustomResourceEventSource.java rename to operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/internal/ControllerResourceEventSource.java index a912072e5c..775fd06948 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/internal/CustomResourceEventSource.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/internal/ControllerResourceEventSource.java @@ -6,8 +6,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import io.fabric8.kubernetes.api.model.HasMetadata; import io.fabric8.kubernetes.api.model.KubernetesResourceList; -import io.fabric8.kubernetes.client.CustomResource; import io.fabric8.kubernetes.client.KubernetesClientException; import io.fabric8.kubernetes.client.dsl.FilterWatchListDeletable; import io.fabric8.kubernetes.client.informers.ResourceEventHandler; @@ -20,7 +20,7 @@ import io.javaoperatorsdk.operator.processing.MDCUtils; import io.javaoperatorsdk.operator.processing.ResourceCache; import io.javaoperatorsdk.operator.processing.event.AbstractEventSource; -import io.javaoperatorsdk.operator.processing.event.CustomResourceID; +import io.javaoperatorsdk.operator.processing.event.ResourceID; import static io.javaoperatorsdk.operator.processing.KubernetesResourceUtils.getName; import static io.javaoperatorsdk.operator.processing.KubernetesResourceUtils.getUID; @@ -29,31 +29,31 @@ /** * This is a special case since is not bound to a single custom resource */ -public class CustomResourceEventSource> extends AbstractEventSource +public class ControllerResourceEventSource extends AbstractEventSource implements ResourceEventHandler, ResourceCache { public static final String ANY_NAMESPACE_MAP_KEY = "anyNamespace"; - private static final Logger log = LoggerFactory.getLogger(CustomResourceEventSource.class); + private static final Logger log = LoggerFactory.getLogger(ControllerResourceEventSource.class); private final Controller controller; private final Map> sharedIndexInformers = new ConcurrentHashMap<>(); - private final CustomResourceEventFilter filter; + private final ResourceEventFilter filter; private final OnceWhitelistEventFilterEventFilter onceWhitelistEventFilterEventFilter; private final Cloner cloner; - public CustomResourceEventSource(Controller controller) { + public ControllerResourceEventSource(Controller controller) { this.controller = controller; this.cloner = controller.getConfiguration().getConfigurationService().getResourceCloner(); - var filters = new CustomResourceEventFilter[] { - CustomResourceEventFilters.finalizerNeededAndApplied(), - CustomResourceEventFilters.markedForDeletion(), - CustomResourceEventFilters.and( + var filters = new ResourceEventFilter[] { + ResourceEventFilters.finalizerNeededAndApplied(), + ResourceEventFilters.markedForDeletion(), + ResourceEventFilters.and( controller.getConfiguration().getEventFilter(), - CustomResourceEventFilters.generationAware()), + ResourceEventFilters.generationAware()), null }; @@ -63,7 +63,7 @@ public CustomResourceEventSource(Controller controller) { } else { onceWhitelistEventFilterEventFilter = null; } - filter = CustomResourceEventFilters.or(filters); + filter = ResourceEventFilters.or(filters); } @Override @@ -94,7 +94,7 @@ public void start() { KubernetesClientException ke = (KubernetesClientException) e; if (404 == ke.getCode()) { // only throw MissingCRDException if the 404 error occurs on the target CRD - final var targetCRDName = controller.getConfiguration().getCRDName(); + final var targetCRDName = controller.getConfiguration().getResourceTypeName(); if (targetCRDName.equals(ke.getFullResourceName())) { throw new MissingCRDException(targetCRDName, null, e.getMessage(), e); } @@ -132,7 +132,7 @@ public void eventReceived(ResourceAction action, T customResource, T oldResource MDCUtils.addCustomResourceInfo(customResource); if (filter.acceptChange(controller.getConfiguration(), oldResource, customResource)) { eventHandler.handleEvent( - new CustomResourceEvent(action, CustomResourceID.fromResource(customResource))); + new ResourceEvent(action, ResourceID.fromResource(customResource))); } else { log.debug( "Skipping event handling resource {} with version: {}", @@ -160,7 +160,7 @@ public void onDelete(T resource, boolean b) { } @Override - public Optional getCustomResource(CustomResourceID resourceID) { + public Optional getCustomResource(ResourceID resourceID) { var sharedIndexInformer = sharedIndexInformers.get(ANY_NAMESPACE_MAP_KEY); if (sharedIndexInformer == null) { sharedIndexInformer = @@ -194,11 +194,11 @@ public SharedIndexInformer getInformer(String namespace) { * This will ensure that the next event received after this method is called will not be filtered * out. * - * @param customResourceID - to which the event is related + * @param resourceID - to which the event is related */ - public void whitelistNextEvent(CustomResourceID customResourceID) { + public void whitelistNextEvent(ResourceID resourceID) { if (onceWhitelistEventFilterEventFilter != null) { - onceWhitelistEventFilterEventFilter.whitelistNextEvent(customResourceID); + onceWhitelistEventFilterEventFilter.whitelistNextEvent(resourceID); } } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/internal/InformerEventSource.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/internal/InformerEventSource.java index 9b61b18ade..8758566619 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/internal/InformerEventSource.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/internal/InformerEventSource.java @@ -14,41 +14,41 @@ import io.fabric8.kubernetes.client.informers.cache.Cache; import io.fabric8.kubernetes.client.informers.cache.Store; import io.javaoperatorsdk.operator.processing.event.AbstractEventSource; -import io.javaoperatorsdk.operator.processing.event.CustomResourceID; import io.javaoperatorsdk.operator.processing.event.Event; +import io.javaoperatorsdk.operator.processing.event.ResourceID; public class InformerEventSource extends AbstractEventSource { private static final Logger log = LoggerFactory.getLogger(InformerEventSource.class); private final SharedInformer sharedInformer; - private final Function> resourceToCustomResourceIDSet; + private final Function> secondaryToPrimaryResourcesIdSet; private final Function associatedWith; private final boolean skipUpdateEventPropagationIfNoChange; public InformerEventSource(SharedInformer sharedInformer, - Function> resourceToCustomResourceIDSet) { - this(sharedInformer, resourceToCustomResourceIDSet, null, true); + Function> resourceToTargetResourceIDSet) { + this(sharedInformer, resourceToTargetResourceIDSet, null, true); } public InformerEventSource(KubernetesClient client, Class type, - Function> resourceToCustomResourceIDSet) { - this(client, type, resourceToCustomResourceIDSet, false); + Function> resourceToTargetResourceIDSet) { + this(client, type, resourceToTargetResourceIDSet, false); } InformerEventSource(KubernetesClient client, Class type, - Function> resourceToCustomResourceIDSet, + Function> resourceToTargetResourceIDSet, boolean skipUpdateEventPropagationIfNoChange) { - this(client.informers().sharedIndexInformerFor(type, 0), resourceToCustomResourceIDSet, null, + this(client.informers().sharedIndexInformerFor(type, 0), resourceToTargetResourceIDSet, null, skipUpdateEventPropagationIfNoChange); } public InformerEventSource(SharedInformer sharedInformer, - Function> resourceToCustomResourceIDSet, + Function> resourceToTargetResourceIDSet, Function associatedWith, boolean skipUpdateEventPropagationIfNoChange) { this.sharedInformer = sharedInformer; - this.resourceToCustomResourceIDSet = resourceToCustomResourceIDSet; + this.secondaryToPrimaryResourcesIdSet = resourceToTargetResourceIDSet; this.skipUpdateEventPropagationIfNoChange = skipUpdateEventPropagationIfNoChange; if (sharedInformer.isRunning()) { log.warn( @@ -86,12 +86,12 @@ public void onDelete(T t, boolean b) { } private void propagateEvent(T object) { - var customResourceIDSet = resourceToCustomResourceIDSet.apply(object); - if (customResourceIDSet.isEmpty()) { + var primaryResourceIdSet = secondaryToPrimaryResourcesIdSet.apply(object); + if (primaryResourceIdSet.isEmpty()) { return; } - customResourceIDSet.forEach(customResourceId -> { - Event event = new Event(customResourceId); + primaryResourceIdSet.forEach(resourceId -> { + Event event = new Event(resourceId); /* * In fabric8 client for certain cases informers can be created on in a way that they are * automatically started, what would cause a NullPointerException here, since an event might diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/internal/Mappers.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/internal/Mappers.java index 7351b80d4f..07d3b05cfe 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/internal/Mappers.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/internal/Mappers.java @@ -5,31 +5,31 @@ import java.util.function.Function; import io.fabric8.kubernetes.api.model.HasMetadata; -import io.javaoperatorsdk.operator.processing.event.CustomResourceID; +import io.javaoperatorsdk.operator.processing.event.ResourceID; public class Mappers { - public static Function> fromAnnotation( + public static Function> fromAnnotation( String nameKey) { return fromMetadata(nameKey, null, false); } - public static Function> fromAnnotation( + public static Function> fromAnnotation( String nameKey, String namespaceKey) { return fromMetadata(nameKey, namespaceKey, false); } - public static Function> fromLabel( + public static Function> fromLabel( String nameKey) { return fromMetadata(nameKey, null, true); } - public static Function> fromLabel( + public static Function> fromLabel( String nameKey, String namespaceKey) { return fromMetadata(nameKey, namespaceKey, true); } - private static Function> fromMetadata( + private static Function> fromMetadata( String nameKey, String namespaceKey, boolean isLabel) { return resource -> { final var metadata = resource.getMetadata(); @@ -39,7 +39,7 @@ private static Function> fromMe final var map = isLabel ? metadata.getLabels() : metadata.getAnnotations(); var namespace = namespaceKey == null ? resource.getMetadata().getNamespace() : map.get(namespaceKey); - return map != null ? Set.of(new CustomResourceID(map.get(nameKey), namespace)) + return map != null ? Set.of(new ResourceID(map.get(nameKey), namespace)) : Collections.emptySet(); } }; diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/internal/OnceWhitelistEventFilterEventFilter.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/internal/OnceWhitelistEventFilterEventFilter.java index 4c144e65e6..34c5514c39 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/internal/OnceWhitelistEventFilterEventFilter.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/internal/OnceWhitelistEventFilterEventFilter.java @@ -6,31 +6,30 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import io.fabric8.kubernetes.client.CustomResource; +import io.fabric8.kubernetes.api.model.HasMetadata; import io.javaoperatorsdk.operator.api.config.ControllerConfiguration; -import io.javaoperatorsdk.operator.processing.event.CustomResourceID; +import io.javaoperatorsdk.operator.processing.event.ResourceID; -public class OnceWhitelistEventFilterEventFilter> - implements CustomResourceEventFilter { +public class OnceWhitelistEventFilterEventFilter + implements ResourceEventFilter { private static final Logger log = LoggerFactory.getLogger(OnceWhitelistEventFilterEventFilter.class); - private final ConcurrentMap whiteList = - new ConcurrentHashMap<>(); + private final ConcurrentMap whiteList = new ConcurrentHashMap<>(); @Override public boolean acceptChange(ControllerConfiguration configuration, T oldResource, T newResource) { - CustomResourceID customResourceID = CustomResourceID.fromResource(newResource); - boolean res = whiteList.remove(customResourceID, customResourceID); + ResourceID resourceID = ResourceID.fromResource(newResource); + boolean res = whiteList.remove(resourceID, resourceID); if (res) { - log.debug("Accepting whitelisted event for CR id: {}", customResourceID); + log.debug("Accepting whitelisted event for CR id: {}", resourceID); } return res; } - public void whitelistNextEvent(CustomResourceID customResourceID) { - whiteList.putIfAbsent(customResourceID, customResourceID); + public void whitelistNextEvent(ResourceID resourceID) { + whiteList.putIfAbsent(resourceID, resourceID); } } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/internal/CustomResourceEvent.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/internal/ResourceEvent.java similarity index 61% rename from operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/internal/CustomResourceEvent.java rename to operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/internal/ResourceEvent.java index 9752e7cf5e..c15792f867 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/internal/CustomResourceEvent.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/internal/ResourceEvent.java @@ -1,15 +1,15 @@ package io.javaoperatorsdk.operator.processing.event.internal; -import io.javaoperatorsdk.operator.processing.event.CustomResourceID; import io.javaoperatorsdk.operator.processing.event.Event; +import io.javaoperatorsdk.operator.processing.event.ResourceID; -public class CustomResourceEvent extends Event { +public class ResourceEvent extends Event { private final ResourceAction action; - public CustomResourceEvent(ResourceAction action, - CustomResourceID customResourceID) { - super(customResourceID); + public ResourceEvent(ResourceAction action, + ResourceID resourceID) { + super(resourceID); this.action = action; } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/internal/CustomResourceEventFilter.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/internal/ResourceEventFilter.java similarity index 89% rename from operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/internal/CustomResourceEventFilter.java rename to operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/internal/ResourceEventFilter.java index cf9802674e..b4c101be00 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/internal/CustomResourceEventFilter.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/internal/ResourceEventFilter.java @@ -1,6 +1,6 @@ package io.javaoperatorsdk.operator.processing.event.internal; -import io.fabric8.kubernetes.client.CustomResource; +import io.fabric8.kubernetes.api.model.HasMetadata; import io.javaoperatorsdk.operator.api.config.ControllerConfiguration; /** @@ -11,7 +11,7 @@ * @param the type of custom resources handled by this filter */ @FunctionalInterface -public interface CustomResourceEventFilter> { +public interface ResourceEventFilter { /** * Determines whether the change between the old version of the resource and the new one needs to @@ -32,7 +32,7 @@ public interface CustomResourceEventFilter> { * @param other the possibly {@code null} other filter to combine this one with * @return a composite filter implementing the AND logic between this and the provided filter */ - default CustomResourceEventFilter and(CustomResourceEventFilter other) { + default ResourceEventFilter and(ResourceEventFilter other) { return other == null ? this : (ControllerConfiguration configuration, T oldResource, T newResource) -> { boolean result = acceptChange(configuration, oldResource, newResource); @@ -48,7 +48,7 @@ default CustomResourceEventFilter and(CustomResourceEventFilter other) { * @param other the possibly {@code null} other filter to combine this one with * @return a composite filter implementing the OR logic between this and the provided filter */ - default CustomResourceEventFilter or(CustomResourceEventFilter other) { + default ResourceEventFilter or(ResourceEventFilter other) { return other == null ? this : (ControllerConfiguration configuration, T oldResource, T newResource) -> { boolean result = acceptChange(configuration, oldResource, newResource); diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/internal/CustomResourceEventFilters.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/internal/ResourceEventFilters.java similarity index 67% rename from operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/internal/CustomResourceEventFilters.java rename to operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/internal/ResourceEventFilters.java index 63584a2c86..a46a9175e6 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/internal/CustomResourceEventFilters.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/internal/ResourceEventFilters.java @@ -1,14 +1,15 @@ package io.javaoperatorsdk.operator.processing.event.internal; +import io.fabric8.kubernetes.api.model.HasMetadata; import io.fabric8.kubernetes.client.CustomResource; import io.javaoperatorsdk.operator.api.ObservedGenerationAware; /** - * Convenience implementations of, and utility methods for, {@link CustomResourceEventFilter}. + * Convenience implementations of, and utility methods for, {@link ResourceEventFilter}. */ -public final class CustomResourceEventFilters { +public final class ResourceEventFilters { - private static final CustomResourceEventFilter> USE_FINALIZER = + private static final ResourceEventFilter USE_FINALIZER = (configuration, oldResource, newResource) -> { if (configuration.useFinalizer()) { final var finalizer = configuration.getFinalizer(); @@ -21,30 +22,35 @@ public final class CustomResourceEventFilters { } }; - private static final CustomResourceEventFilter> GENERATION_AWARE = + private static final ResourceEventFilter GENERATION_AWARE = (configuration, oldResource, newResource) -> { - final var status = newResource.getStatus(); final var generationAware = configuration.isGenerationAware(); - if (generationAware && status instanceof ObservedGenerationAware) { - var actualGeneration = newResource.getMetadata().getGeneration(); - var observedGeneration = ((ObservedGenerationAware) status) - .getObservedGeneration(); - return observedGeneration.map(aLong -> actualGeneration > aLong).orElse(true); + // todo: change this to check for HasStatus (or similar) when + // https://github.com/fabric8io/kubernetes-client/issues/3586 is fixed + if (newResource instanceof CustomResource) { + var newCustomResource = (CustomResource) newResource; + final var status = newCustomResource.getStatus(); + if (generationAware && status instanceof ObservedGenerationAware) { + var actualGeneration = newResource.getMetadata().getGeneration(); + var observedGeneration = ((ObservedGenerationAware) status) + .getObservedGeneration(); + return observedGeneration.map(aLong -> actualGeneration > aLong).orElse(true); + } } return oldResource == null || !generationAware || oldResource.getMetadata().getGeneration() < newResource.getMetadata().getGeneration(); }; - private static final CustomResourceEventFilter> PASSTHROUGH = + private static final ResourceEventFilter PASSTHROUGH = (configuration, oldResource, newResource) -> true; - private static final CustomResourceEventFilter> NONE = + private static final ResourceEventFilter NONE = (configuration, oldResource, newResource) -> false; - private static final CustomResourceEventFilter> MARKED_FOR_DELETION = + private static final ResourceEventFilter MARKED_FOR_DELETION = (configuration, oldResource, newResource) -> newResource.isMarkedForDeletion(); - private CustomResourceEventFilters() {} + private ResourceEventFilters() {} /** * Retrieves a filter that accepts all events. @@ -53,8 +59,8 @@ private CustomResourceEventFilters() {} * @return a filter that accepts all events */ @SuppressWarnings("unchecked") - public static > CustomResourceEventFilter passthrough() { - return (CustomResourceEventFilter) PASSTHROUGH; + public static ResourceEventFilter passthrough() { + return (ResourceEventFilter) PASSTHROUGH; } /** @@ -64,8 +70,8 @@ private CustomResourceEventFilters() {} * @return a filter that reject all events */ @SuppressWarnings("unchecked") - public static > CustomResourceEventFilter none() { - return (CustomResourceEventFilter) NONE; + public static ResourceEventFilter none() { + return (ResourceEventFilter) NONE; } /** @@ -76,8 +82,8 @@ private CustomResourceEventFilters() {} * @return a filter accepting changes based on generation information */ @SuppressWarnings("unchecked") - public static > CustomResourceEventFilter generationAware() { - return (CustomResourceEventFilter) GENERATION_AWARE; + public static ResourceEventFilter generationAware() { + return (ResourceEventFilter) GENERATION_AWARE; } /** @@ -89,8 +95,8 @@ private CustomResourceEventFilters() {} * applied */ @SuppressWarnings("unchecked") - public static > CustomResourceEventFilter finalizerNeededAndApplied() { - return (CustomResourceEventFilter) USE_FINALIZER; + public static ResourceEventFilter finalizerNeededAndApplied() { + return (ResourceEventFilter) USE_FINALIZER; } /** @@ -100,14 +106,14 @@ private CustomResourceEventFilters() {} * @return a filter accepting changes based on whether the Custom Resource is marked for deletion. */ @SuppressWarnings("unchecked") - public static > CustomResourceEventFilter markedForDeletion() { - return (CustomResourceEventFilter) MARKED_FOR_DELETION; + public static ResourceEventFilter markedForDeletion() { + return (ResourceEventFilter) MARKED_FOR_DELETION; } /** * Combines the provided, potentially {@code null} filters with an AND logic, i.e. the resulting * filter will only accept the change if all filters accept it, reject it otherwise. - * + *

* Note that the evaluation of filters is lazy: the result is returned as soon as possible without * evaluating all filters if possible. * @@ -116,14 +122,14 @@ private CustomResourceEventFilters() {} * @return a combined filter implementing the AND logic combination of the provided filters */ @SafeVarargs - public static > CustomResourceEventFilter and( - CustomResourceEventFilter... items) { + public static ResourceEventFilter and( + ResourceEventFilter... items) { if (items == null) { return none(); } return (configuration, oldResource, newResource) -> { - for (CustomResourceEventFilter item : items) { + for (ResourceEventFilter item : items) { if (item == null) { continue; } @@ -150,14 +156,14 @@ private CustomResourceEventFilters() {} * @return a combined filter implementing the OR logic combination of both provided filters */ @SafeVarargs - public static > CustomResourceEventFilter or( - CustomResourceEventFilter... items) { + public static ResourceEventFilter or( + ResourceEventFilter... items) { if (items == null) { return none(); } return (configuration, oldResource, newResource) -> { - for (CustomResourceEventFilter item : items) { + for (ResourceEventFilter item : items) { if (item == null) { continue; } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/internal/TimerEventSource.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/internal/TimerEventSource.java index 7fda09df1f..030b46298e 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/internal/TimerEventSource.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/internal/TimerEventSource.java @@ -9,24 +9,24 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import io.fabric8.kubernetes.client.CustomResource; +import io.fabric8.kubernetes.api.model.HasMetadata; import io.javaoperatorsdk.operator.processing.event.AbstractEventSource; -import io.javaoperatorsdk.operator.processing.event.CustomResourceID; import io.javaoperatorsdk.operator.processing.event.Event; +import io.javaoperatorsdk.operator.processing.event.ResourceID; -public class TimerEventSource> extends AbstractEventSource { +public class TimerEventSource extends AbstractEventSource { private static final Logger log = LoggerFactory.getLogger(TimerEventSource.class); private final Timer timer = new Timer(); private final AtomicBoolean running = new AtomicBoolean(); - private final Map onceTasks = new ConcurrentHashMap<>(); + private final Map onceTasks = new ConcurrentHashMap<>(); - public void scheduleOnce(R customResource, long delay) { + public void scheduleOnce(R resource, long delay) { if (!running.get()) { throw new IllegalStateException("The TimerEventSource is not running"); } - CustomResourceID resourceUid = CustomResourceID.fromResource(customResource); + ResourceID resourceUid = ResourceID.fromResource(resource); if (onceTasks.containsKey(resourceUid)) { cancelOnceSchedule(resourceUid); } @@ -36,11 +36,11 @@ public void scheduleOnce(R customResource, long delay) { } @Override - public void cleanupForCustomResource(CustomResourceID customResourceUid) { - cancelOnceSchedule(customResourceUid); + public void cleanupForResource(ResourceID resourceUid) { + cancelOnceSchedule(resourceUid); } - public void cancelOnceSchedule(CustomResourceID customResourceUid) { + public void cancelOnceSchedule(ResourceID customResourceUid) { TimerTask timerTask = onceTasks.remove(customResourceUid); if (timerTask != null) { timerTask.cancel(); @@ -61,9 +61,9 @@ public void stop() { public class EventProducerTimeTask extends TimerTask { - protected final CustomResourceID customResourceUid; + protected final ResourceID customResourceUid; - public EventProducerTimeTask(CustomResourceID customResourceUid) { + public EventProducerTimeTask(ResourceID customResourceUid) { this.customResourceUid = customResourceUid; } diff --git a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/ControllerManagerTest.java b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/ControllerManagerTest.java index 6db84b45e3..c24a6dbe3e 100644 --- a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/ControllerManagerTest.java +++ b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/ControllerManagerTest.java @@ -2,6 +2,7 @@ import org.junit.Test; +import io.fabric8.kubernetes.api.model.HasMetadata; import io.fabric8.kubernetes.client.CustomResource; import io.javaoperatorsdk.operator.Operator.ControllerManager; import io.javaoperatorsdk.operator.api.config.DefaultControllerConfiguration; @@ -39,7 +40,7 @@ public void addingMultipleControllersForCustomResourcesWithDifferentVersionsShou } - private , U extends CustomResource> void checkException( + private void checkException( TestControllerConfiguration registered, TestControllerConfiguration duplicated) { final var exception = assertThrows(OperatorException.class, () -> { @@ -51,10 +52,10 @@ public void addingMultipleControllersForCustomResourcesWithDifferentVersionsShou assertTrue( msg.contains("Cannot register controller '" + duplicated.getControllerName() + "'") && msg.contains(registered.getControllerName()) - && msg.contains(registered.getCRDName())); + && msg.contains(registered.getResourceTypeName())); } - private static class TestControllerConfiguration> + private static class TestControllerConfiguration extends DefaultControllerConfiguration { private final Reconciler controller; @@ -64,7 +65,7 @@ public TestControllerConfiguration(Reconciler controller, Class crClass) { this.controller = controller; } - static > String getControllerName( + static String getControllerName( Reconciler controller) { return controller.getClass().getSimpleName() + "Controller"; } diff --git a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/TestUtils.java b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/TestUtils.java index 5e15fd59c8..137ed2d11d 100644 --- a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/TestUtils.java +++ b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/TestUtils.java @@ -6,14 +6,14 @@ import io.fabric8.kubernetes.api.model.ObjectMetaBuilder; import io.fabric8.kubernetes.api.model.apiextensions.v1.CustomResourceDefinition; import io.fabric8.kubernetes.api.model.apiextensions.v1.CustomResourceDefinitionBuilder; -import io.javaoperatorsdk.operator.processing.event.CustomResourceID; +import io.javaoperatorsdk.operator.processing.event.ResourceID; import io.javaoperatorsdk.operator.sample.simple.TestCustomResource; import io.javaoperatorsdk.operator.sample.simple.TestCustomResourceSpec; public class TestUtils { public static TestCustomResource testCustomResource() { - return testCustomResource(new CustomResourceID(UUID.randomUUID().toString(), "test")); + return testCustomResource(new ResourceID(UUID.randomUUID().toString(), "test")); } public static CustomResourceDefinition testCRD(String scope) { @@ -27,7 +27,7 @@ public static CustomResourceDefinition testCRD(String scope) { .build(); } - public static TestCustomResource testCustomResource(CustomResourceID id) { + public static TestCustomResource testCustomResource(ResourceID id) { TestCustomResource resource = new TestCustomResource(); resource.setMetadata( new ObjectMetaBuilder() diff --git a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/api/config/ControllerConfigurationTest.java b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/api/config/ControllerConfigurationTest.java index 7f8698d81b..3bc72d81f2 100644 --- a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/api/config/ControllerConfigurationTest.java +++ b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/api/config/ControllerConfigurationTest.java @@ -21,6 +21,6 @@ public ConfigurationService getConfigurationService() { return null; } }; - assertEquals(TestCustomResource.class, conf.getCustomResourceClass()); + assertEquals(TestCustomResource.class, conf.getResourceClass()); } } diff --git a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/EventMarkerTest.java b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/EventMarkerTest.java index 98b87f1713..08090f3c1d 100644 --- a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/EventMarkerTest.java +++ b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/EventMarkerTest.java @@ -3,64 +3,64 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import io.javaoperatorsdk.operator.processing.event.CustomResourceID; +import io.javaoperatorsdk.operator.processing.event.ResourceID; import static org.assertj.core.api.Assertions.assertThat; class EventMarkerTest { private final EventMarker eventMarker = new EventMarker(); - private CustomResourceID sampleCustomResourceID = new CustomResourceID("test-name"); + private ResourceID sampleResourceID = new ResourceID("test-name"); @Test public void returnsNoEventPresentIfNotMarkedYet() { - assertThat(eventMarker.noEventPresent(sampleCustomResourceID)).isTrue(); + assertThat(eventMarker.noEventPresent(sampleResourceID)).isTrue(); } @Test public void marksEvent() { - eventMarker.markEventReceived(sampleCustomResourceID); + eventMarker.markEventReceived(sampleResourceID); - assertThat(eventMarker.eventPresent(sampleCustomResourceID)).isTrue(); - assertThat(eventMarker.deleteEventPresent(sampleCustomResourceID)).isFalse(); + assertThat(eventMarker.eventPresent(sampleResourceID)).isTrue(); + assertThat(eventMarker.deleteEventPresent(sampleResourceID)).isFalse(); } @Test public void marksDeleteEvent() { - eventMarker.markDeleteEventReceived(sampleCustomResourceID); + eventMarker.markDeleteEventReceived(sampleResourceID); - assertThat(eventMarker.deleteEventPresent(sampleCustomResourceID)) + assertThat(eventMarker.deleteEventPresent(sampleResourceID)) .isTrue(); - assertThat(eventMarker.eventPresent(sampleCustomResourceID)).isFalse(); + assertThat(eventMarker.eventPresent(sampleResourceID)).isFalse(); } @Test public void afterDeleteEventMarkEventIsNotRelevant() { - eventMarker.markEventReceived(sampleCustomResourceID); + eventMarker.markEventReceived(sampleResourceID); - eventMarker.markDeleteEventReceived(sampleCustomResourceID); + eventMarker.markDeleteEventReceived(sampleResourceID); - assertThat(eventMarker.deleteEventPresent(sampleCustomResourceID)) + assertThat(eventMarker.deleteEventPresent(sampleResourceID)) .isTrue(); - assertThat(eventMarker.eventPresent(sampleCustomResourceID)).isFalse(); + assertThat(eventMarker.eventPresent(sampleResourceID)).isFalse(); } @Test public void cleansUp() { - eventMarker.markEventReceived(sampleCustomResourceID); - eventMarker.markDeleteEventReceived(sampleCustomResourceID); + eventMarker.markEventReceived(sampleResourceID); + eventMarker.markDeleteEventReceived(sampleResourceID); - eventMarker.cleanup(sampleCustomResourceID); + eventMarker.cleanup(sampleResourceID); - assertThat(eventMarker.deleteEventPresent(sampleCustomResourceID)).isFalse(); - assertThat(eventMarker.eventPresent(sampleCustomResourceID)).isFalse(); + assertThat(eventMarker.deleteEventPresent(sampleResourceID)).isFalse(); + assertThat(eventMarker.eventPresent(sampleResourceID)).isFalse(); } @Test public void cannotMarkEventAfterDeleteEventReceived() { Assertions.assertThrows(IllegalStateException.class, () -> { - eventMarker.markDeleteEventReceived(sampleCustomResourceID); - eventMarker.markEventReceived(sampleCustomResourceID); + eventMarker.markDeleteEventReceived(sampleResourceID); + eventMarker.markEventReceived(sampleResourceID); }); } diff --git a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/EventProcessorTest.java b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/EventProcessorTest.java index 2c10a37ddc..2e3c708c6c 100644 --- a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/EventProcessorTest.java +++ b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/EventProcessorTest.java @@ -11,13 +11,13 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import io.fabric8.kubernetes.client.CustomResource; -import io.javaoperatorsdk.operator.processing.event.CustomResourceID; +import io.fabric8.kubernetes.api.model.HasMetadata; import io.javaoperatorsdk.operator.processing.event.Event; import io.javaoperatorsdk.operator.processing.event.EventSourceManager; -import io.javaoperatorsdk.operator.processing.event.internal.CustomResourceEvent; -import io.javaoperatorsdk.operator.processing.event.internal.CustomResourceEventSource; +import io.javaoperatorsdk.operator.processing.event.ResourceID; +import io.javaoperatorsdk.operator.processing.event.internal.ControllerResourceEventSource; import io.javaoperatorsdk.operator.processing.event.internal.ResourceAction; +import io.javaoperatorsdk.operator.processing.event.internal.ResourceEvent; import io.javaoperatorsdk.operator.processing.event.internal.TimerEventSource; import io.javaoperatorsdk.operator.processing.retry.GenericRetry; import io.javaoperatorsdk.operator.sample.simple.TestCustomResource; @@ -80,7 +80,7 @@ public void skipProcessingIfLatestCustomResourceNotInCache() { @Test public void ifExecutionInProgressWaitsUntilItsFinished() throws InterruptedException { - CustomResourceID resourceUid = eventAlreadyUnderProcessing(); + ResourceID resourceUid = eventAlreadyUnderProcessing(); eventProcessor.handleEvent(nonCREvent(resourceUid)); @@ -205,7 +205,7 @@ public void doNotFireEventsIfClosing() { @Test public void cleansUpWhenDeleteEventReceivedAndNoEventPresent() { Event deleteEvent = - new CustomResourceEvent(DELETED, prepareCREvent().getRelatedCustomResourceID()); + new ResourceEvent(DELETED, prepareCREvent().getRelatedCustomResourceID()); eventProcessor.handleEvent(deleteEvent); @@ -216,7 +216,7 @@ public void cleansUpWhenDeleteEventReceivedAndNoEventPresent() { @Test public void cleansUpAfterExecutionIfOnlyDeleteEventMarkLeft() { var cr = testCustomResource(); - var crEvent = prepareCREvent(CustomResourceID.fromResource(cr)); + var crEvent = prepareCREvent(ResourceID.fromResource(cr)); eventMarker.markDeleteEventReceived(crEvent.getRelatedCustomResourceID()); var executionScope = new ExecutionScope(cr, null); @@ -229,14 +229,14 @@ public void cleansUpAfterExecutionIfOnlyDeleteEventMarkLeft() { @Test public void whitelistNextEventIfTheCacheIsNotPropagatedAfterAnUpdate() { - var crID = new CustomResourceID("test-cr", TEST_NAMESPACE); + var crID = new ResourceID("test-cr", TEST_NAMESPACE); var cr = testCustomResource(crID); var updatedCr = testCustomResource(crID); updatedCr.getMetadata().setResourceVersion("2"); - var mockCREventSource = mock(CustomResourceEventSource.class); + var mockCREventSource = mock(ControllerResourceEventSource.class); eventMarker.markEventReceived(crID); when(resourceCacheMock.getCustomResource(eq(crID))).thenReturn(Optional.of(cr)); - when(eventSourceManagerMock.getCustomResourceEventSource()) + when(eventSourceManagerMock.getControllerResourceEventSource()) .thenReturn(mockCREventSource); eventProcessor.eventProcessingFinished(new ExecutionScope(cr, null), @@ -247,16 +247,16 @@ public void whitelistNextEventIfTheCacheIsNotPropagatedAfterAnUpdate() { @Test public void dontWhitelistsEventWhenOtherChangeDuringExecution() { - var crID = new CustomResourceID("test-cr", TEST_NAMESPACE); + var crID = new ResourceID("test-cr", TEST_NAMESPACE); var cr = testCustomResource(crID); var updatedCr = testCustomResource(crID); updatedCr.getMetadata().setResourceVersion("2"); var otherChangeCR = testCustomResource(crID); otherChangeCR.getMetadata().setResourceVersion("3"); - var mockCREventSource = mock(CustomResourceEventSource.class); + var mockCREventSource = mock(ControllerResourceEventSource.class); eventMarker.markEventReceived(crID); when(resourceCacheMock.getCustomResource(eq(crID))).thenReturn(Optional.of(otherChangeCR)); - when(eventSourceManagerMock.getCustomResourceEventSource()) + when(eventSourceManagerMock.getControllerResourceEventSource()) .thenReturn(mockCREventSource); eventProcessor.eventProcessingFinished(new ExecutionScope(cr, null), @@ -267,12 +267,12 @@ public void dontWhitelistsEventWhenOtherChangeDuringExecution() { @Test public void dontWhitelistsEventIfUpdatedEventInCache() { - var crID = new CustomResourceID("test-cr", TEST_NAMESPACE); + var crID = new ResourceID("test-cr", TEST_NAMESPACE); var cr = testCustomResource(crID); - var mockCREventSource = mock(CustomResourceEventSource.class); + var mockCREventSource = mock(ControllerResourceEventSource.class); eventMarker.markEventReceived(crID); when(resourceCacheMock.getCustomResource(eq(crID))).thenReturn(Optional.of(cr)); - when(eventSourceManagerMock.getCustomResourceEventSource()) + when(eventSourceManagerMock.getControllerResourceEventSource()) .thenReturn(mockCREventSource); eventProcessor.eventProcessingFinished(new ExecutionScope(cr, null), @@ -283,7 +283,7 @@ public void dontWhitelistsEventIfUpdatedEventInCache() { @Test public void cancelScheduleOnceEventsOnSuccessfulExecution() { - var crID = new CustomResourceID("test-cr", TEST_NAMESPACE); + var crID = new ResourceID("test-cr", TEST_NAMESPACE); var cr = testCustomResource(crID); eventProcessor.eventProcessingFinished(new ExecutionScope(cr, null), @@ -292,7 +292,7 @@ public void cancelScheduleOnceEventsOnSuccessfulExecution() { verify(retryTimerEventSourceMock, times(1)).cancelOnceSchedule(eq(crID)); } - private CustomResourceID eventAlreadyUnderProcessing() { + private ResourceID eventAlreadyUnderProcessing() { when(reconciliationDispatcherMock.handleExecution(any())) .then( (Answer) invocationOnMock -> { @@ -304,22 +304,22 @@ private CustomResourceID eventAlreadyUnderProcessing() { return event.getRelatedCustomResourceID(); } - private CustomResourceEvent prepareCREvent() { - return prepareCREvent(new CustomResourceID(UUID.randomUUID().toString(), TEST_NAMESPACE)); + private ResourceEvent prepareCREvent() { + return prepareCREvent(new ResourceID(UUID.randomUUID().toString(), TEST_NAMESPACE)); } - private CustomResourceEvent prepareCREvent(CustomResourceID uid) { + private ResourceEvent prepareCREvent(ResourceID uid) { TestCustomResource customResource = testCustomResource(uid); when(resourceCacheMock.getCustomResource(eq(uid))).thenReturn(Optional.of(customResource)); - return new CustomResourceEvent(ResourceAction.UPDATED, - CustomResourceID.fromResource(customResource)); + return new ResourceEvent(ResourceAction.UPDATED, + ResourceID.fromResource(customResource)); } - private Event nonCREvent(CustomResourceID relatedCustomResourceUid) { + private Event nonCREvent(ResourceID relatedCustomResourceUid) { return new Event(relatedCustomResourceUid); } - private void overrideData(CustomResourceID id, CustomResource applyTo) { + private void overrideData(ResourceID id, HasMetadata applyTo) { applyTo.getMetadata().setName(id.getName()); applyTo.getMetadata().setNamespace(id.getNamespace().orElse(null)); } diff --git a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/ReconciliationDispatcherTest.java b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/ReconciliationDispatcherTest.java index 781b48a53b..052ac91a0e 100644 --- a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/ReconciliationDispatcherTest.java +++ b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/ReconciliationDispatcherTest.java @@ -7,6 +7,7 @@ import org.mockito.ArgumentCaptor; import org.mockito.ArgumentMatchers; +import io.fabric8.kubernetes.api.model.HasMetadata; import io.fabric8.kubernetes.api.model.ObjectMeta; import io.fabric8.kubernetes.client.CustomResource; import io.javaoperatorsdk.operator.TestUtils; @@ -46,7 +47,7 @@ void setup() { init(testCustomResource, reconciler, configuration, customResourceFacade); } - private > ReconciliationDispatcher init(R customResource, + private ReconciliationDispatcher init(R customResource, Reconciler reconciler, ControllerConfiguration configuration, CustomResourceFacade customResourceFacade) { when(configuration.getFinalizer()).thenReturn(DEFAULT_FINALIZER); @@ -56,7 +57,7 @@ void setup() { when(configuration.getConfigurationService()).thenReturn(configService); when(configService.getResourceCloner()).thenReturn(ConfigurationService.DEFAULT_CLONER); when(reconciler.reconcile(eq(customResource), any())) - .thenReturn(UpdateControl.updateCustomResource(customResource)); + .thenReturn(UpdateControl.updateResource(customResource)); when(reconciler.cleanup(eq(customResource), any())) .thenReturn(DeleteControl.defaultDelete()); when(customResourceFacade.replaceWithLock(any())).thenReturn(null); @@ -156,7 +157,7 @@ void doNotCallDeleteIfMarkedForDeletionWhenFinalizerHasAlreadyBeenRemoved() { } private void configureToNotUseFinalizer() { - ControllerConfiguration> configuration = + ControllerConfiguration configuration = mock(ControllerConfiguration.class); when(configuration.getName()).thenReturn("EventDispatcherTestController"); when(configService.getMetrics()).thenReturn(Metrics.NOOP); @@ -371,7 +372,7 @@ private void removeFinalizers(CustomResource customResource) { customResource.getMetadata().getFinalizers().clear(); } - public > ExecutionScope executionScopeWithCREvent(T resource) { + public ExecutionScope executionScopeWithCREvent(T resource) { return new ExecutionScope<>(resource, null); } } diff --git a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/EventSourceManagerTest.java b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/EventSourceManagerTest.java index 76dc7e3411..2054efd10b 100644 --- a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/EventSourceManagerTest.java +++ b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/EventSourceManagerTest.java @@ -73,9 +73,9 @@ public void deRegistersEventSources() { eventSourceManager.registerEventSource(eventSource); eventSourceManager - .cleanupForCustomResource(CustomResourceID.fromResource(customResource)); + .cleanupForCustomResource(ResourceID.fromResource(customResource)); verify(eventSource, times(1)) - .cleanupForCustomResource(eq(CustomResourceID.fromResource(customResource))); + .cleanupForResource(eq(ResourceID.fromResource(customResource))); } } diff --git a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/internal/CustomResourceEventSourceTest.java b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/internal/ControllerResourceEventSourceTest.java similarity index 76% rename from operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/internal/CustomResourceEventSourceTest.java rename to operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/internal/ControllerResourceEventSourceTest.java index 61a550a652..5fb4b65dfb 100644 --- a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/internal/CustomResourceEventSourceTest.java +++ b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/internal/ControllerResourceEventSourceTest.java @@ -14,8 +14,8 @@ import io.javaoperatorsdk.operator.api.config.DefaultControllerConfiguration; import io.javaoperatorsdk.operator.api.monitoring.Metrics; import io.javaoperatorsdk.operator.processing.Controller; -import io.javaoperatorsdk.operator.processing.event.CustomResourceID; import io.javaoperatorsdk.operator.processing.event.EventHandler; +import io.javaoperatorsdk.operator.processing.event.ResourceID; import io.javaoperatorsdk.operator.sample.simple.TestCustomResource; import static org.mockito.Mockito.any; @@ -24,19 +24,19 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -class CustomResourceEventSourceTest { +class ControllerResourceEventSourceTest { public static final String FINALIZER = "finalizer"; private static final MixedOperation, Resource> client = mock(MixedOperation.class); EventHandler eventHandler = mock(EventHandler.class); - private CustomResourceEventSource customResourceEventSource = - new CustomResourceEventSource<>(new TestController(true)); + private ControllerResourceEventSource controllerResourceEventSource = + new ControllerResourceEventSource<>(new TestController(true)); @BeforeEach public void setup() { - customResourceEventSource.setEventHandler(eventHandler); + controllerResourceEventSource.setEventHandler(eventHandler); } @Test @@ -48,11 +48,11 @@ public void skipsEventHandlingIfGenerationNotIncreased() { TestCustomResource oldCustomResource = TestUtils.testCustomResource(); oldCustomResource.getMetadata().setFinalizers(List.of(FINALIZER)); - customResourceEventSource.eventReceived(ResourceAction.UPDATED, customResource, + controllerResourceEventSource.eventReceived(ResourceAction.UPDATED, customResource, oldCustomResource); verify(eventHandler, times(1)).handleEvent(any()); - customResourceEventSource.eventReceived(ResourceAction.UPDATED, customResource, + controllerResourceEventSource.eventReceived(ResourceAction.UPDATED, customResource, customResource); verify(eventHandler, times(1)).handleEvent(any()); } @@ -61,13 +61,13 @@ public void skipsEventHandlingIfGenerationNotIncreased() { public void dontSkipEventHandlingIfMarkedForDeletion() { TestCustomResource customResource1 = TestUtils.testCustomResource(); - customResourceEventSource.eventReceived(ResourceAction.UPDATED, customResource1, + controllerResourceEventSource.eventReceived(ResourceAction.UPDATED, customResource1, customResource1); verify(eventHandler, times(1)).handleEvent(any()); // mark for deletion customResource1.getMetadata().setDeletionTimestamp(LocalDateTime.now().toString()); - customResourceEventSource.eventReceived(ResourceAction.UPDATED, customResource1, + controllerResourceEventSource.eventReceived(ResourceAction.UPDATED, customResource1, customResource1); verify(eventHandler, times(2)).handleEvent(any()); } @@ -76,29 +76,29 @@ public void dontSkipEventHandlingIfMarkedForDeletion() { public void normalExecutionIfGenerationChanges() { TestCustomResource customResource1 = TestUtils.testCustomResource(); - customResourceEventSource.eventReceived(ResourceAction.UPDATED, customResource1, + controllerResourceEventSource.eventReceived(ResourceAction.UPDATED, customResource1, customResource1); verify(eventHandler, times(1)).handleEvent(any()); customResource1.getMetadata().setGeneration(2L); - customResourceEventSource.eventReceived(ResourceAction.UPDATED, customResource1, + controllerResourceEventSource.eventReceived(ResourceAction.UPDATED, customResource1, customResource1); verify(eventHandler, times(2)).handleEvent(any()); } @Test public void handlesAllEventIfNotGenerationAware() { - customResourceEventSource = - new CustomResourceEventSource<>(new TestController(false)); + controllerResourceEventSource = + new ControllerResourceEventSource<>(new TestController(false)); setup(); TestCustomResource customResource1 = TestUtils.testCustomResource(); - customResourceEventSource.eventReceived(ResourceAction.UPDATED, customResource1, + controllerResourceEventSource.eventReceived(ResourceAction.UPDATED, customResource1, customResource1); verify(eventHandler, times(1)).handleEvent(any()); - customResourceEventSource.eventReceived(ResourceAction.UPDATED, customResource1, + controllerResourceEventSource.eventReceived(ResourceAction.UPDATED, customResource1, customResource1); verify(eventHandler, times(2)).handleEvent(any()); } @@ -107,7 +107,7 @@ public void handlesAllEventIfNotGenerationAware() { public void eventWithNoGenerationProcessedIfNoFinalizer() { TestCustomResource customResource1 = TestUtils.testCustomResource(); - customResourceEventSource.eventReceived(ResourceAction.UPDATED, customResource1, + controllerResourceEventSource.eventReceived(ResourceAction.UPDATED, customResource1, customResource1); verify(eventHandler, times(1)).handleEvent(any()); @@ -117,9 +117,9 @@ public void eventWithNoGenerationProcessedIfNoFinalizer() { public void handlesNextEventIfWhitelisted() { TestCustomResource customResource = TestUtils.testCustomResource(); customResource.getMetadata().setFinalizers(List.of(FINALIZER)); - customResourceEventSource.whitelistNextEvent(CustomResourceID.fromResource(customResource)); + controllerResourceEventSource.whitelistNextEvent(ResourceID.fromResource(customResource)); - customResourceEventSource.eventReceived(ResourceAction.UPDATED, customResource, + controllerResourceEventSource.eventReceived(ResourceAction.UPDATED, customResource, customResource); verify(eventHandler, times(1)).handleEvent(any()); @@ -130,7 +130,7 @@ public void notHandlesNextEventIfNotWhitelisted() { TestCustomResource customResource = TestUtils.testCustomResource(); customResource.getMetadata().setFinalizers(List.of(FINALIZER)); - customResourceEventSource.eventReceived(ResourceAction.UPDATED, customResource, + controllerResourceEventSource.eventReceived(ResourceAction.UPDATED, customResource, customResource); verify(eventHandler, times(0)).handleEvent(any()); diff --git a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/internal/OnceWhitelistEventFilterEventFilterTest.java b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/internal/OnceWhitelistEventFilterEventFilterTest.java index fde6bb2a7f..5634f11cad 100644 --- a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/internal/OnceWhitelistEventFilterEventFilterTest.java +++ b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/internal/OnceWhitelistEventFilterEventFilterTest.java @@ -3,7 +3,7 @@ import org.junit.jupiter.api.Test; import io.javaoperatorsdk.operator.TestUtils; -import io.javaoperatorsdk.operator.processing.event.CustomResourceID; +import io.javaoperatorsdk.operator.processing.event.ResourceID; import static io.javaoperatorsdk.operator.TestUtils.testCustomResource; import static org.assertj.core.api.Assertions.assertThat; @@ -22,7 +22,7 @@ public void notAcceptCustomResourceNotWhitelisted() { public void allowCustomResourceWhitelisted() { var cr = TestUtils.testCustomResource(); - filter.whitelistNextEvent(CustomResourceID.fromResource(cr)); + filter.whitelistNextEvent(ResourceID.fromResource(cr)); assertThat(filter.acceptChange(null, cr, cr)).isTrue(); @@ -32,7 +32,7 @@ public void allowCustomResourceWhitelisted() { public void allowCustomResourceWhitelistedOnlyOnce() { var cr = TestUtils.testCustomResource(); - filter.whitelistNextEvent(CustomResourceID.fromResource(cr)); + filter.whitelistNextEvent(ResourceID.fromResource(cr)); assertThat(filter.acceptChange(null, cr, cr)).isTrue(); diff --git a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/internal/CustomResourceEventFilterTest.java b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/internal/ResourceEventFilterTest.java similarity index 91% rename from operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/internal/CustomResourceEventFilterTest.java rename to operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/internal/ResourceEventFilterTest.java index 119d683880..1c130a0f6b 100644 --- a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/internal/CustomResourceEventFilterTest.java +++ b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/internal/ResourceEventFilterTest.java @@ -6,9 +6,9 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import io.fabric8.kubernetes.api.model.HasMetadata; import io.fabric8.kubernetes.api.model.KubernetesResourceList; import io.fabric8.kubernetes.api.model.ObjectMeta; -import io.fabric8.kubernetes.client.CustomResource; import io.fabric8.kubernetes.client.dsl.MixedOperation; import io.fabric8.kubernetes.client.dsl.Resource; import io.javaoperatorsdk.operator.TestUtils; @@ -26,7 +26,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -class CustomResourceEventFilterTest { +class ResourceEventFilterTest { public static final String FINALIZER = "finalizer"; private EventHandler eventHandler; @@ -46,7 +46,7 @@ public void eventFilteredByCustomPredicate() { newResource.getStatus().getConfigMapStatus())); var controller = new TestController(config); - var eventSource = new CustomResourceEventSource<>(controller); + var eventSource = new ControllerResourceEventSource<>(controller); eventSource.setEventHandler(eventHandler); TestCustomResource cr = TestUtils.testCustomResource(); @@ -74,7 +74,7 @@ public void eventFilteredByCustomPredicateAndGenerationAware() { newResource.getStatus().getConfigMapStatus())); var controller = new TestController(config); - var eventSource = new CustomResourceEventSource<>(controller); + var eventSource = new ControllerResourceEventSource<>(controller); eventSource.setEventHandler(eventHandler); TestCustomResource cr = TestUtils.testCustomResource(); @@ -104,7 +104,7 @@ public void observedGenerationFiltering() { .thenReturn(ConfigurationService.DEFAULT_CLONER); var controller = new ObservedGenController(config); - var eventSource = new CustomResourceEventSource<>(controller); + var eventSource = new ControllerResourceEventSource<>(controller); eventSource.setEventHandler(eventHandler); ObservedGenCustomResource cr = new ObservedGenCustomResource(); @@ -135,7 +135,7 @@ public void eventNotFilteredByCustomPredicateIfFinalizerIsRequired() { .thenReturn(ConfigurationService.DEFAULT_CLONER); var controller = new TestController(config); - var eventSource = new CustomResourceEventSource<>(controller); + var eventSource = new ControllerResourceEventSource<>(controller); eventSource.setEventHandler(eventHandler); TestCustomResource cr = TestUtils.testCustomResource(); @@ -154,23 +154,23 @@ public void eventNotFilteredByCustomPredicateIfFinalizerIsRequired() { private static class TestControllerConfig extends ControllerConfig { public TestControllerConfig(String finalizer, boolean generationAware, - CustomResourceEventFilter eventFilter) { + ResourceEventFilter eventFilter) { super(finalizer, generationAware, eventFilter, TestCustomResource.class); } } private static class ObservedGenControllerConfig extends ControllerConfig { public ObservedGenControllerConfig(String finalizer, boolean generationAware, - CustomResourceEventFilter eventFilter) { + ResourceEventFilter eventFilter) { super(finalizer, generationAware, eventFilter, ObservedGenCustomResource.class); } } - private static class ControllerConfig> extends + private static class ControllerConfig extends DefaultControllerConfiguration { public ControllerConfig(String finalizer, boolean generationAware, - CustomResourceEventFilter eventFilter, Class customResourceClass) { + ResourceEventFilter eventFilter, Class customResourceClass) { super( null, null, diff --git a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/internal/TimerEventSourceTest.java b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/internal/TimerEventSourceTest.java index c862843a05..e41c78ba55 100644 --- a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/internal/TimerEventSourceTest.java +++ b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/internal/TimerEventSourceTest.java @@ -12,9 +12,9 @@ import org.junit.jupiter.api.Test; import io.javaoperatorsdk.operator.TestUtils; -import io.javaoperatorsdk.operator.processing.event.CustomResourceID; import io.javaoperatorsdk.operator.processing.event.Event; import io.javaoperatorsdk.operator.processing.event.EventHandler; +import io.javaoperatorsdk.operator.processing.event.ResourceID; import io.javaoperatorsdk.operator.sample.simple.TestCustomResource; import static org.assertj.core.api.Assertions.assertThat; @@ -52,7 +52,7 @@ public void canCancelOnce() { TestCustomResource customResource = TestUtils.testCustomResource(); timerEventSource.scheduleOnce(customResource, PERIOD); - timerEventSource.cancelOnceSchedule(CustomResourceID.fromResource(customResource)); + timerEventSource.cancelOnceSchedule(ResourceID.fromResource(customResource)); untilAsserted(() -> assertThat(eventHandlerMock.events).isEmpty()); } @@ -73,7 +73,7 @@ public void deRegistersOnceEventSources() { timerEventSource.scheduleOnce(customResource, PERIOD); timerEventSource - .cleanupForCustomResource(CustomResourceID.fromResource(customResource)); + .cleanupForResource(ResourceID.fromResource(customResource)); untilAsserted(() -> assertThat(eventHandlerMock.events).isEmpty()); } diff --git a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/sample/simple/TestCustomReconciler.java b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/sample/simple/TestCustomReconciler.java index 10b76b8cdc..ec0e9bffbd 100644 --- a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/sample/simple/TestCustomReconciler.java +++ b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/sample/simple/TestCustomReconciler.java @@ -103,7 +103,7 @@ public UpdateControl reconcile( } resource.getStatus().setConfigMapStatus("ConfigMap Ready"); } - return UpdateControl.updateCustomResource(resource); + return UpdateControl.updateResource(resource); } private Map configMapData(TestCustomResource resource) { diff --git a/operator-framework-junit5/src/main/java/io/javaoperatorsdk/operator/junit/OperatorExtension.java b/operator-framework-junit5/src/main/java/io/javaoperatorsdk/operator/junit/OperatorExtension.java index ed19ed3ac2..9a44885a47 100644 --- a/operator-framework-junit5/src/main/java/io/javaoperatorsdk/operator/junit/OperatorExtension.java +++ b/operator-framework-junit5/src/main/java/io/javaoperatorsdk/operator/junit/OperatorExtension.java @@ -159,7 +159,7 @@ protected void before(ExtensionContext context) { for (var ref : controllers) { final var config = configurationService.getConfigurationFor(ref.controller); final var oconfig = override(config).settingNamespace(namespace); - final var path = "/META-INF/fabric8/" + config.getCRDName() + "-v1.yml"; + final var path = "/META-INF/fabric8/" + config.getResourceTypeName() + "-v1.yml"; if (ref.retry != null) { oconfig.withRetry(ref.retry); @@ -172,7 +172,7 @@ protected void before(ExtensionContext context) { // when the operator started. This seems to be fixing this issue (maybe a problem with // minikube?) Thread.sleep(2000); - LOGGER.debug("Applied CRD with name: {}", config.getCRDName()); + LOGGER.debug("Applied CRD with name: {}", config.getResourceTypeName()); } catch (Exception ex) { throw new IllegalStateException("Cannot apply CRD yaml: " + path, ex); } @@ -199,7 +199,7 @@ protected void after(ExtensionContext context) { LOGGER.info("Waiting for namespace {} to be deleted", namespace); Awaitility.await("namespace deleted") .pollInterval(50, TimeUnit.MILLISECONDS) - .atMost(60, TimeUnit.SECONDS) + .atMost(90, TimeUnit.SECONDS) .until(() -> kubernetesClient.namespaces().withName(namespace).get() == null); } } diff --git a/operator-framework/src/main/java/io/javaoperatorsdk/operator/config/runtime/AnnotationConfiguration.java b/operator-framework/src/main/java/io/javaoperatorsdk/operator/config/runtime/AnnotationConfiguration.java index 4539873955..a56ee66cb0 100644 --- a/operator-framework/src/main/java/io/javaoperatorsdk/operator/config/runtime/AnnotationConfiguration.java +++ b/operator-framework/src/main/java/io/javaoperatorsdk/operator/config/runtime/AnnotationConfiguration.java @@ -3,15 +3,15 @@ import java.util.Set; import java.util.function.Function; -import io.fabric8.kubernetes.client.CustomResource; +import io.fabric8.kubernetes.api.model.HasMetadata; import io.javaoperatorsdk.operator.ControllerUtils; import io.javaoperatorsdk.operator.api.config.ConfigurationService; import io.javaoperatorsdk.operator.api.reconciler.ControllerConfiguration; import io.javaoperatorsdk.operator.api.reconciler.Reconciler; -import io.javaoperatorsdk.operator.processing.event.internal.CustomResourceEventFilter; -import io.javaoperatorsdk.operator.processing.event.internal.CustomResourceEventFilters; +import io.javaoperatorsdk.operator.processing.event.internal.ResourceEventFilter; +import io.javaoperatorsdk.operator.processing.event.internal.ResourceEventFilters; -public class AnnotationConfiguration> +public class AnnotationConfiguration implements io.javaoperatorsdk.operator.api.config.ControllerConfiguration { private final Reconciler reconciler; @@ -31,7 +31,7 @@ public String getName() { @Override public String getFinalizer() { if (annotation == null || annotation.finalizerName().isBlank()) { - return ControllerUtils.getDefaultFinalizerName(getCRDName()); + return ControllerUtils.getDefaultFinalizerName(getResourceTypeName()); } else { return annotation.finalizerName(); } @@ -44,8 +44,8 @@ public boolean isGenerationAware() { } @Override - public Class getCustomResourceClass() { - return RuntimeControllerMetadata.getCustomResourceClass(reconciler); + public Class getResourceClass() { + return RuntimeControllerMetadata.getResourceClass(reconciler); } @Override @@ -75,17 +75,17 @@ public String getAssociatedReconcilerClassName() { @SuppressWarnings("unchecked") @Override - public CustomResourceEventFilter getEventFilter() { - CustomResourceEventFilter answer = null; + public ResourceEventFilter getEventFilter() { + ResourceEventFilter answer = null; - Class>[] filterTypes = - (Class>[]) valueOrDefault(annotation, + Class>[] filterTypes = + (Class>[]) valueOrDefault(annotation, ControllerConfiguration::eventFilters, new Object[] {}); if (filterTypes.length > 0) { for (var filterType : filterTypes) { try { - CustomResourceEventFilter filter = filterType.getConstructor().newInstance(); + ResourceEventFilter filter = filterType.getConstructor().newInstance(); if (answer == null) { answer = filter; @@ -99,7 +99,7 @@ public CustomResourceEventFilter getEventFilter() { } return answer != null ? answer - : CustomResourceEventFilters.passthrough(); + : ResourceEventFilters.passthrough(); } public static T valueOrDefault(ControllerConfiguration controllerConfiguration, diff --git a/operator-framework/src/main/java/io/javaoperatorsdk/operator/config/runtime/ClassMappingProvider.java b/operator-framework/src/main/java/io/javaoperatorsdk/operator/config/runtime/ClassMappingProvider.java index a0fadbb8cb..f2f0167de0 100644 --- a/operator-framework/src/main/java/io/javaoperatorsdk/operator/config/runtime/ClassMappingProvider.java +++ b/operator-framework/src/main/java/io/javaoperatorsdk/operator/config/runtime/ClassMappingProvider.java @@ -24,8 +24,8 @@ static Map provide(final String resourcePath, T key, V value) { Map result = new HashMap<>(); try { final var classLoader = Thread.currentThread().getContextClassLoader(); - final Enumeration customResourcesMetadataList = classLoader.getResources(resourcePath); - for (Iterator it = customResourcesMetadataList.asIterator(); it.hasNext();) { + final Enumeration resourcesMetadataList = classLoader.getResources(resourcePath); + for (Iterator it = resourcesMetadataList.asIterator(); it.hasNext();) { URL url = it.next(); List classNamePairs = retrieveClassNamePairs(url); @@ -47,7 +47,7 @@ static Map provide(final String resourcePath, T key, V value) { } }); } - log.debug("Loaded Controller to CustomResource mappings {}", result); + log.debug("Loaded Controller to resource mappings {}", result); return result; } catch (IOException e) { throw new RuntimeException(e); diff --git a/operator-framework/src/main/java/io/javaoperatorsdk/operator/config/runtime/DefaultConfigurationService.java b/operator-framework/src/main/java/io/javaoperatorsdk/operator/config/runtime/DefaultConfigurationService.java index bcd2ed2f59..78cb631d63 100644 --- a/operator-framework/src/main/java/io/javaoperatorsdk/operator/config/runtime/DefaultConfigurationService.java +++ b/operator-framework/src/main/java/io/javaoperatorsdk/operator/config/runtime/DefaultConfigurationService.java @@ -1,6 +1,6 @@ package io.javaoperatorsdk.operator.config.runtime; -import io.fabric8.kubernetes.client.CustomResource; +import io.fabric8.kubernetes.api.model.HasMetadata; import io.javaoperatorsdk.operator.api.config.BaseConfigurationService; import io.javaoperatorsdk.operator.api.config.ControllerConfiguration; import io.javaoperatorsdk.operator.api.config.Utils; @@ -19,12 +19,12 @@ public static DefaultConfigurationService instance() { } @Override - public > ControllerConfiguration getConfigurationFor( + public ControllerConfiguration getConfigurationFor( Reconciler reconciler) { return getConfigurationFor(reconciler, true); } - > ControllerConfiguration getConfigurationFor( + ControllerConfiguration getConfigurationFor( Reconciler reconciler, boolean createIfNeeded) { var config = super.getConfigurationFor(reconciler); if (config == null) { diff --git a/operator-framework/src/main/java/io/javaoperatorsdk/operator/config/runtime/RuntimeControllerMetadata.java b/operator-framework/src/main/java/io/javaoperatorsdk/operator/config/runtime/RuntimeControllerMetadata.java index 68ba58f1c1..1595f88f97 100644 --- a/operator-framework/src/main/java/io/javaoperatorsdk/operator/config/runtime/RuntimeControllerMetadata.java +++ b/operator-framework/src/main/java/io/javaoperatorsdk/operator/config/runtime/RuntimeControllerMetadata.java @@ -2,31 +2,31 @@ import java.util.Map; -import io.fabric8.kubernetes.client.CustomResource; +import io.fabric8.kubernetes.api.model.HasMetadata; import io.javaoperatorsdk.operator.api.reconciler.Reconciler; @SuppressWarnings("rawtypes") public class RuntimeControllerMetadata { public static final String RECONCILERS_RESOURCE_PATH = "javaoperatorsdk/reconcilers"; - private static final Map, Class> controllerToCustomResourceMappings; + private static final Map, Class> controllerToCustomResourceMappings; static { controllerToCustomResourceMappings = ClassMappingProvider.provide( - RECONCILERS_RESOURCE_PATH, Reconciler.class, CustomResource.class); + RECONCILERS_RESOURCE_PATH, Reconciler.class, HasMetadata.class); } - static > Class getCustomResourceClass( + static Class getResourceClass( Reconciler reconciler) { - final Class customResourceClass = + final Class resourceClass = controllerToCustomResourceMappings.get(reconciler.getClass()); - if (customResourceClass == null) { + if (resourceClass == null) { throw new IllegalArgumentException( String.format( "No custom resource has been found for controller %s", reconciler.getClass().getCanonicalName())); } - return (Class) customResourceClass; + return (Class) resourceClass; } } 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 06a1238bb5..07a9348191 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); - configMap = operator.replace(ConfigMap.class, configMap); + operator.replace(ConfigMap.class, configMap); waitForCRStatusValue(UPDATE_STATUS_MESSAGE); } diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/KubernetesResourceStatusUpdateIT.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/KubernetesResourceStatusUpdateIT.java new file mode 100644 index 0000000000..252e7f603a --- /dev/null +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/KubernetesResourceStatusUpdateIT.java @@ -0,0 +1,72 @@ +package io.javaoperatorsdk.operator; + +import java.util.HashMap; +import java.util.List; +import java.util.concurrent.TimeUnit; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import io.fabric8.kubernetes.api.model.*; +import io.fabric8.kubernetes.api.model.apps.Deployment; +import io.fabric8.kubernetes.api.model.apps.DeploymentSpec; +import io.javaoperatorsdk.operator.config.runtime.DefaultConfigurationService; +import io.javaoperatorsdk.operator.junit.OperatorExtension; +import io.javaoperatorsdk.operator.sample.deployment.DeploymentReconciler; + +import static io.javaoperatorsdk.operator.sample.deployment.DeploymentReconciler.STATUS_MESSAGE; +import static org.assertj.core.api.Assertions.assertThat; +import static org.awaitility.Awaitility.await; + +public class KubernetesResourceStatusUpdateIT { + + @RegisterExtension + OperatorExtension operator = + OperatorExtension.builder() + .withConfigurationService(DefaultConfigurationService.instance()) + .withReconciler(new DeploymentReconciler()) + .build(); + + @Test + public void testReconciliationOfNonCustomResourceAndStatusUpdate() { + var deployment = operator.create(Deployment.class, testDeployment()); + await().atMost(10, TimeUnit.SECONDS).untilAsserted(() -> { + var d = operator.get(Deployment.class, deployment.getMetadata().getName()); + assertThat(d.getStatus()).isNotNull(); + assertThat(d.getStatus().getConditions()).isNotNull(); + assertThat( + d.getStatus().getConditions().stream().filter(c -> c.getMessage().equals(STATUS_MESSAGE)) + .count()).isEqualTo(1); + }); + } + + private Deployment testDeployment() { + Deployment resource = new Deployment(); + resource.setMetadata( + new ObjectMetaBuilder() + .withName("test-deployment") + .build()); + DeploymentSpec spec = new DeploymentSpec(); + resource.setSpec(spec); + spec.setReplicas(1); + var labelSelector = new HashMap(); + labelSelector.put("app", "nginx"); + spec.setSelector(new LabelSelector(null, labelSelector)); + PodTemplateSpec podTemplate = new PodTemplateSpec(); + spec.setTemplate(podTemplate); + + podTemplate.setMetadata(new ObjectMeta()); + podTemplate.getMetadata().setLabels(labelSelector); + podTemplate.setSpec(new PodSpec()); + + Container container = new Container(); + container.setName("nginx"); + container.setImage("nginx:1.14.2"); + ContainerPort port = new ContainerPort(); + port.setContainerPort(80); + container.setPorts(List.of(port)); + + podTemplate.getSpec().setContainers(List.of(container)); + return resource; + } +} diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/config/runtime/DefaultConfigurationServiceTest.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/config/runtime/DefaultConfigurationServiceTest.java index 425f822ddc..fa1101dbd4 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/config/runtime/DefaultConfigurationServiceTest.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/config/runtime/DefaultConfigurationServiceTest.java @@ -78,11 +78,11 @@ public void returnsValuesFromControllerAnnotationFinalizer() { final var configuration = DefaultConfigurationService.instance().getConfigurationFor(reconciler); assertEquals(CustomResource.getCRDName(TestCustomResource.class), - configuration.getCRDName()); + configuration.getResourceTypeName()); assertEquals( - ControllerUtils.getDefaultFinalizerName(configuration.getCRDName()), + ControllerUtils.getDefaultFinalizerName(configuration.getResourceTypeName()), configuration.getFinalizer()); - assertEquals(TestCustomResource.class, configuration.getCustomResourceClass()); + assertEquals(TestCustomResource.class, configuration.getResourceClass()); assertFalse(configuration.isGenerationAware()); } diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/deployment/DeploymentReconciler.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/deployment/DeploymentReconciler.java new file mode 100644 index 0000000000..a7340465ef --- /dev/null +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/deployment/DeploymentReconciler.java @@ -0,0 +1,56 @@ +package io.javaoperatorsdk.operator.sample.deployment; + +import java.util.ArrayList; +import java.util.concurrent.atomic.AtomicInteger; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import io.fabric8.kubernetes.api.model.apps.Deployment; +import io.fabric8.kubernetes.api.model.apps.DeploymentCondition; +import io.fabric8.kubernetes.api.model.apps.DeploymentStatus; +import io.javaoperatorsdk.operator.api.reconciler.Context; +import io.javaoperatorsdk.operator.api.reconciler.ControllerConfiguration; +import io.javaoperatorsdk.operator.api.reconciler.Reconciler; +import io.javaoperatorsdk.operator.api.reconciler.UpdateControl; +import io.javaoperatorsdk.operator.support.TestExecutionInfoProvider; + +@ControllerConfiguration +public class DeploymentReconciler + implements Reconciler, TestExecutionInfoProvider { + + public static final String STATUS_MESSAGE = "Reconciled by DeploymentReconciler"; + + private static final Logger log = LoggerFactory.getLogger(DeploymentReconciler.class); + private final AtomicInteger numberOfExecutions = new AtomicInteger(0); + + @Override + public UpdateControl reconcile( + Deployment resource, Context context) { + + log.info("Reconcile deployment: {}", resource); + numberOfExecutions.incrementAndGet(); + if (resource.getStatus() == null) { + resource.setStatus(new DeploymentStatus()); + } + if (resource.getStatus().getConditions() == null) { + resource.getStatus().setConditions(new ArrayList<>()); + } + var conditions = resource.getStatus().getConditions(); + var condition = + conditions.stream().filter(c -> c.getMessage().equals(STATUS_MESSAGE)).findFirst(); + if (condition.isEmpty()) { + conditions.add(new DeploymentCondition(null, null, STATUS_MESSAGE, null, + "unknown", "DeploymentReconciler")); + return UpdateControl.updateStatusSubResource(resource); + } else { + return UpdateControl.noUpdate(); + } + } + + + @Override + public int getNumberOfExecutions() { + return numberOfExecutions.get(); + } +} diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/errorstatushandler/ErrorStatusHandlerTestReconciler.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/errorstatushandler/ErrorStatusHandlerTestReconciler.java index 7ad8f20bae..3a922ce092 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/errorstatushandler/ErrorStatusHandlerTestReconciler.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/errorstatushandler/ErrorStatusHandlerTestReconciler.java @@ -8,7 +8,9 @@ import io.javaoperatorsdk.operator.api.reconciler.*; import io.javaoperatorsdk.operator.support.TestExecutionInfoProvider; -@ControllerConfiguration +import static io.javaoperatorsdk.operator.api.reconciler.ControllerConfiguration.NO_FINALIZER; + +@ControllerConfiguration(finalizerName = NO_FINALIZER) public class ErrorStatusHandlerTestReconciler implements Reconciler, TestExecutionInfoProvider, ErrorStatusHandler { diff --git a/operator-framework/src/test/resources/compile-fixtures/MultilevelReconciler.java b/operator-framework/src/test/resources/compile-fixtures/MultilevelReconciler.java index fe15e54a6c..acea0a0db2 100644 --- a/operator-framework/src/test/resources/compile-fixtures/MultilevelReconciler.java +++ b/operator-framework/src/test/resources/compile-fixtures/MultilevelReconciler.java @@ -17,7 +17,7 @@ public static class MyCustomResource extends CustomResource { public UpdateControl reconcile( MultilevelReconciler.MyCustomResource customResource, Context context) { - return UpdateControl.updateCustomResource(null); + return UpdateControl.updateResource(null); } public DeleteControl cleanup(MultilevelReconciler.MyCustomResource customResource, diff --git a/operator-framework/src/test/resources/compile-fixtures/ReconcilerImplemented2Interfaces.java b/operator-framework/src/test/resources/compile-fixtures/ReconcilerImplemented2Interfaces.java index 6331c54d2c..5ab0596319 100644 --- a/operator-framework/src/test/resources/compile-fixtures/ReconcilerImplemented2Interfaces.java +++ b/operator-framework/src/test/resources/compile-fixtures/ReconcilerImplemented2Interfaces.java @@ -16,7 +16,7 @@ public static class MyCustomResource extends CustomResource { @Override public UpdateControl reconcile(MyCustomResource customResource, Context context) { - return UpdateControl.updateCustomResource(null); + return UpdateControl.updateResource(null); } @Override diff --git a/operator-framework/src/test/resources/compile-fixtures/ReconcilerImplementedIntermediateAbstractClass.java b/operator-framework/src/test/resources/compile-fixtures/ReconcilerImplementedIntermediateAbstractClass.java index 17280051a2..b95495a614 100644 --- a/operator-framework/src/test/resources/compile-fixtures/ReconcilerImplementedIntermediateAbstractClass.java +++ b/operator-framework/src/test/resources/compile-fixtures/ReconcilerImplementedIntermediateAbstractClass.java @@ -13,7 +13,7 @@ public class ReconcilerImplementedIntermediateAbstractClass extends public UpdateControl reconcile( AbstractReconciler.MyCustomResource customResource, Context context) { - return UpdateControl.updateCustomResource(null); + return UpdateControl.updateResource(null); } public DeleteControl cleanup(AbstractReconciler.MyCustomResource customResource, 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 1aa7f1cfd0..62afafb365 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,10 +17,9 @@ 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.CustomResourceID; import io.javaoperatorsdk.operator.processing.event.EventSourceRegistry; +import io.javaoperatorsdk.operator.processing.event.ResourceID; import io.javaoperatorsdk.operator.processing.event.internal.InformerEventSource; import static java.util.Collections.EMPTY_SET; @@ -52,7 +51,7 @@ public void prepareEventSources(EventSourceRegistry eventSourceRegistry) this.informerEventSource = new InformerEventSource<>(deploymentInformer, d -> { var ownerReferences = d.getMetadata().getOwnerReferences(); if (!ownerReferences.isEmpty()) { - return Set.of(new CustomResourceID(ownerReferences.get(0).getName(), + return Set.of(new ResourceID(ownerReferences.get(0).getName(), d.getMetadata().getNamespace())); } else { return EMPTY_SET; 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 64f5db8e77..017a4a79b1 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,11 +17,10 @@ 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.*; import io.javaoperatorsdk.operator.api.reconciler.*; -import io.javaoperatorsdk.operator.processing.event.CustomResourceID; import io.javaoperatorsdk.operator.processing.event.EventSourceRegistry; -import io.javaoperatorsdk.operator.processing.event.internal.CustomResourceEventSource; +import io.javaoperatorsdk.operator.processing.event.ResourceID; +import io.javaoperatorsdk.operator.processing.event.internal.ControllerResourceEventSource; import io.javaoperatorsdk.operator.processing.event.internal.InformerEventSource; import okhttp3.Response; @@ -46,13 +45,13 @@ public void prepareEventSources(EventSourceRegistry eventSourceRegistry) // To find the related customResourceId of the WebApp resource we traverse the cache to // and identify it based on naming convention. var webAppInformer = - eventSourceRegistry.getCustomResourceEventSource() - .getInformer(CustomResourceEventSource.ANY_NAMESPACE_MAP_KEY); + 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 CustomResourceID(webapp.getMetadata().getName(), + .map(webapp -> new ResourceID(webapp.getMetadata().getName(), webapp.getMetadata().getNamespace())) .collect(Collectors.toSet()); return ids; diff --git a/smoke-test-samples/common/src/main/java/io/javaoperatorsdk/operator/sample/CustomServiceReconciler.java b/smoke-test-samples/common/src/main/java/io/javaoperatorsdk/operator/sample/CustomServiceReconciler.java index 5400a8bef3..60d859565e 100644 --- a/smoke-test-samples/common/src/main/java/io/javaoperatorsdk/operator/sample/CustomServiceReconciler.java +++ b/smoke-test-samples/common/src/main/java/io/javaoperatorsdk/operator/sample/CustomServiceReconciler.java @@ -57,6 +57,6 @@ public UpdateControl reconcile( .endMetadata() .withSpec(serviceSpec) .build()); - return UpdateControl.updateCustomResource(resource); + return UpdateControl.updateResource(resource); } }