diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/dependent/AbstractDependentResource.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/dependent/GenericDependentResource.java similarity index 53% rename from operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/dependent/AbstractDependentResource.java rename to operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/dependent/GenericDependentResource.java index bf40654812..91c35e9905 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/dependent/AbstractDependentResource.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/dependent/GenericDependentResource.java @@ -3,11 +3,11 @@ import io.fabric8.kubernetes.api.model.HasMetadata; import io.javaoperatorsdk.operator.api.reconciler.Context; -public abstract class AbstractDependentResource - implements DependentResource { +public interface GenericDependentResource + extends DependentResource { - @Override - public void reconcile(P primary, Context context) { + + default void reconcile(P primary, Context context) { var actual = getResource(primary); var desired = desired(primary, context); if (actual.isEmpty()) { @@ -19,13 +19,13 @@ public void reconcile(P primary, Context context) { } } - protected abstract R desired(P primary, Context context); + R desired(P primary, Context context); - protected abstract boolean match(R actual, R target, Context context); + boolean match(R actual, R target, Context context); - protected abstract R create(R target, P primary, Context context); + void create(R target, P primary, Context context); // the actual needed to copy/preserve new labels or annotations - protected abstract R update(R actual, R target, P primary, Context context); + void update(R actual, R target, P primary, Context context); } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/dependent/ReadOnlyDependentResource.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/dependent/ReadOnlyDependentResource.java new file mode 100644 index 0000000000..28d2188a54 --- /dev/null +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/dependent/ReadOnlyDependentResource.java @@ -0,0 +1,15 @@ +package io.javaoperatorsdk.operator.api.reconciler.dependent; + +import io.fabric8.kubernetes.api.model.HasMetadata; +import io.javaoperatorsdk.operator.api.reconciler.Context; + +public interface ReadOnlyDependentResource + extends DependentResource { + + @Override + default void reconcile(HasMetadata primary, Context context) {} + + @Override + default void delete(HasMetadata primary, Context context) {} + +} diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/external/PollingDependentResourceConfig.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/external/PollingDependentResourceConfig.java new file mode 100644 index 0000000000..0768f40070 --- /dev/null +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/external/PollingDependentResourceConfig.java @@ -0,0 +1,23 @@ +package io.javaoperatorsdk.operator.processing.dependent.external; + +public class PollingDependentResourceConfig { + + public static final long DEFAULT_POLLING_PERIOD = 700; + + private long pollingPeriod = DEFAULT_POLLING_PERIOD; + + public PollingDependentResourceConfig() {} + + public PollingDependentResourceConfig(long pollingPeriod) { + this.pollingPeriod = pollingPeriod; + } + + public PollingDependentResourceConfig setPollingPeriod(long pollingPeriod) { + this.pollingPeriod = pollingPeriod; + return this; + } + + public long getPollingPeriod() { + return pollingPeriod; + } +} diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/external/PollingReadOnlyDependentResource.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/external/PollingReadOnlyDependentResource.java new file mode 100644 index 0000000000..e689265c5a --- /dev/null +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/external/PollingReadOnlyDependentResource.java @@ -0,0 +1,45 @@ +package io.javaoperatorsdk.operator.processing.dependent.external; + +import java.util.Map; +import java.util.Optional; +import java.util.function.Supplier; + +import io.fabric8.kubernetes.api.model.HasMetadata; +import io.javaoperatorsdk.operator.api.config.Utils; +import io.javaoperatorsdk.operator.api.reconciler.EventSourceContext; +import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResourceConfigurator; +import io.javaoperatorsdk.operator.api.reconciler.dependent.EventSourceProvider; +import io.javaoperatorsdk.operator.api.reconciler.dependent.ReadOnlyDependentResource; +import io.javaoperatorsdk.operator.processing.event.ResourceID; +import io.javaoperatorsdk.operator.processing.event.source.EventSource; +import io.javaoperatorsdk.operator.processing.event.source.polling.PollingEventSource; + +import static io.javaoperatorsdk.operator.processing.dependent.external.PollingDependentResourceConfig.DEFAULT_POLLING_PERIOD; + +public abstract class PollingReadOnlyDependentResource + implements ReadOnlyDependentResource, EventSourceProvider

, + Supplier>, DependentResourceConfigurator { + + private PollingEventSource pollingEventSource; + private long pollingPeriod = DEFAULT_POLLING_PERIOD; + + @Override + public EventSource eventSource(EventSourceContext

context) { + pollingEventSource = new PollingEventSource<>(this, pollingPeriod, resourceType()); + return null; + } + + @Override + public Optional getResource(P primaryResource) { + return pollingEventSource.getAssociated(primaryResource); + } + + protected Class resourceType() { + return (Class) Utils.getFirstTypeArgumentFromExtendedClass(getClass()); + } + + @Override + public void configureWith(C config) { + this.pollingPeriod = config.getPollingPeriod(); + } +} diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/InformerConfig.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/InformerConfig.java new file mode 100644 index 0000000000..d8933feebe --- /dev/null +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/InformerConfig.java @@ -0,0 +1,46 @@ +package io.javaoperatorsdk.operator.processing.dependent.kubernetes; + +import io.javaoperatorsdk.operator.api.config.ConfigurationService; + +import static io.javaoperatorsdk.operator.api.reconciler.Constants.EMPTY_STRING; + +public class InformerConfig { + + private String[] namespaces = new String[0]; + private String labelSelector = EMPTY_STRING; + private ConfigurationService configurationService; + + public InformerConfig() {} + + public InformerConfig(String[] namespaces, String labelSelector, + ConfigurationService configurationService) { + this.namespaces = namespaces; + this.labelSelector = labelSelector; + this.configurationService = configurationService; + } + + public void setNamespaces(String[] namespaces) { + this.namespaces = namespaces; + } + + public void setLabelSelector(String labelSelector) { + this.labelSelector = labelSelector; + } + + public void setConfigurationService( + ConfigurationService configurationService) { + this.configurationService = configurationService; + } + + public String[] namespaces() { + return namespaces; + } + + public String labelSelector() { + return labelSelector; + } + + public ConfigurationService getConfigurationService() { + return configurationService; + } +} diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependent.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependent.java index c0922f569f..ed7806a4a5 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependent.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependent.java @@ -12,9 +12,12 @@ public @interface KubernetesDependent { boolean ADD_OWNER_REFERENCE_DEFAULT = true; + boolean EDIT_ONLY_DEFAULT = false; boolean addOwnerReference() default ADD_OWNER_REFERENCE_DEFAULT; + boolean editOnly() default EDIT_ONLY_DEFAULT; + /** * Specified which namespaces this Controller monitors for custom resources events. If no * namespace is specified then the controller will monitor the namespaces configured for the diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependentResource.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependentResource.java index 1204a3b844..350d41e99f 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependentResource.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependentResource.java @@ -1,22 +1,16 @@ package io.javaoperatorsdk.operator.processing.dependent.kubernetes; -import java.util.Optional; import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import io.fabric8.kubernetes.api.model.HasMetadata; -import io.fabric8.kubernetes.client.KubernetesClient; import io.javaoperatorsdk.operator.api.config.ConfigurationService; -import io.javaoperatorsdk.operator.api.config.Utils; import io.javaoperatorsdk.operator.api.config.informer.InformerConfiguration; import io.javaoperatorsdk.operator.api.reconciler.Context; import io.javaoperatorsdk.operator.api.reconciler.EventSourceContext; -import io.javaoperatorsdk.operator.api.reconciler.dependent.AbstractDependentResource; -import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResourceConfigurator; -import io.javaoperatorsdk.operator.api.reconciler.dependent.EventSourceProvider; -import io.javaoperatorsdk.operator.api.reconciler.dependent.KubernetesClientAware; +import io.javaoperatorsdk.operator.api.reconciler.dependent.GenericDependentResource; import io.javaoperatorsdk.operator.processing.event.ResourceID; import io.javaoperatorsdk.operator.processing.event.source.AssociatedSecondaryResourceIdentifier; import io.javaoperatorsdk.operator.processing.event.source.EventSource; @@ -25,27 +19,27 @@ import io.javaoperatorsdk.operator.processing.event.source.informer.Mappers; public abstract class KubernetesDependentResource - extends AbstractDependentResource - implements KubernetesClientAware, EventSourceProvider

, - DependentResourceConfigurator { + extends KubernetesDependentResourceBase + implements GenericDependentResource { private static final Logger log = LoggerFactory.getLogger(KubernetesDependentResource.class); - protected KubernetesClient client; - private InformerEventSource informerEventSource; - private boolean addOwnerReference; protected ResourceMatcher resourceMatcher; protected ResourceUpdatePreProcessor resourceUpdatePreProcessor; + private boolean addOwnerReference; + private boolean editOnly = false; + @Override public void configureWith(KubernetesDependentResourceConfig config) { + super.configureWith(config); configureWith(config.getConfigurationService(), config.labelSelector(), - Set.of(config.namespaces()), config.addOwnerReference()); + Set.of(config.namespaces()), config.addOwnerReference(), config.isEditOnly()); } @SuppressWarnings("unchecked") private void configureWith(ConfigurationService configService, String labelSelector, - Set namespaces, boolean addOwnerReference) { + Set namespaces, boolean addOwnerReference, boolean editOnly) { final var primaryResourcesRetriever = (this instanceof PrimaryResourcesRetriever) ? (PrimaryResourcesRetriever) this : Mappers.fromOwnerReference(); @@ -60,7 +54,8 @@ private void configureWith(ConfigurationService configService, String labelSelec .withPrimaryResourcesRetriever(primaryResourcesRetriever) .withAssociatedSecondaryResourceIdentifier(secondaryResourceIdentifier) .build(); - configureWith(configService, new InformerEventSource<>(ic, client), addOwnerReference); + configureWith(configService, new InformerEventSource<>(ic, client), addOwnerReference, + editOnly); } /** @@ -72,9 +67,10 @@ private void configureWith(ConfigurationService configService, String labelSelec */ public void configureWith(ConfigurationService configurationService, InformerEventSource informerEventSource, - boolean addOwnerReference) { + boolean addOwnerReference, boolean editOnly) { this.informerEventSource = informerEventSource; this.addOwnerReference = addOwnerReference; + this.editOnly = editOnly; initResourceMatcherAndUpdatePreProcessorIfNotSet(configurationService); } @@ -85,42 +81,39 @@ protected void beforeCreate(R desired, P primary) { } @Override - protected boolean match(R actualResource, R desiredResource, Context context) { + public boolean match(R actualResource, R desiredResource, Context context) { return resourceMatcher.match(actualResource, desiredResource, context); } @SuppressWarnings("unchecked") @Override - protected R create(R target, P primary, Context context) { + public void create(R target, P primary, Context context) { + if (editOnly) { + return; + } log.debug("Creating target resource with type: " + "{}, with id: {}", target.getClass(), ResourceID.fromResource(target)); beforeCreate(target, primary); Class targetClass = (Class) target.getClass(); - return client.resources(targetClass).inNamespace(target.getMetadata().getNamespace()) + client.resources(targetClass).inNamespace(target.getMetadata().getNamespace()) .create(target); } @SuppressWarnings("unchecked") @Override - protected R update(R actual, R target, P primary, Context context) { + public void update(R actual, R target, P primary, Context context) { log.debug("Updating target resource with type: {}, with id: {}", target.getClass(), ResourceID.fromResource(target)); Class targetClass = (Class) target.getClass(); var updatedActual = resourceUpdatePreProcessor.replaceSpecOnActual(actual, target); - return client.resources(targetClass).inNamespace(target.getMetadata().getNamespace()) + client.resources(targetClass).inNamespace(target.getMetadata().getNamespace()) .replace(updatedActual); } @Override public EventSource eventSource(EventSourceContext

context) { initResourceMatcherAndUpdatePreProcessorIfNotSet(context.getConfigurationService()); - if (informerEventSource == null) { - configureWith(context.getConfigurationService(), null, null, - KubernetesDependent.ADD_OWNER_REFERENCE_DEFAULT); - log.warn("Using default configuration for " + resourceType().getSimpleName() - + " KubernetesDependentResource, call configureWith to provide configuration"); - } - return informerEventSource; + return super.eventSource(context); } public KubernetesDependentResource setInformerEventSource( @@ -138,20 +131,6 @@ public void delete(P primary, Context context) { } @SuppressWarnings("unchecked") - protected Class resourceType() { - return (Class) Utils.getFirstTypeArgumentFromExtendedClass(getClass()); - } - - @Override - public Optional getResource(P primaryResource) { - return informerEventSource.getAssociated(primaryResource); - } - - @Override - public void setKubernetesClient(KubernetesClient kubernetesClient) { - this.client = kubernetesClient; - } - /** * Override this method to configure resource matcher * diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependentResourceBase.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependentResourceBase.java new file mode 100644 index 0000000000..c1a9708d72 --- /dev/null +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependentResourceBase.java @@ -0,0 +1,71 @@ +package io.javaoperatorsdk.operator.processing.dependent.kubernetes; + +import java.util.Optional; + +import io.fabric8.kubernetes.api.model.HasMetadata; +import io.fabric8.kubernetes.client.KubernetesClient; +import io.javaoperatorsdk.operator.api.config.Utils; +import io.javaoperatorsdk.operator.api.config.informer.InformerConfiguration; +import io.javaoperatorsdk.operator.api.reconciler.EventSourceContext; +import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResourceConfigurator; +import io.javaoperatorsdk.operator.api.reconciler.dependent.EventSourceProvider; +import io.javaoperatorsdk.operator.api.reconciler.dependent.KubernetesClientAware; +import io.javaoperatorsdk.operator.processing.event.ResourceID; +import io.javaoperatorsdk.operator.processing.event.source.AssociatedSecondaryResourceIdentifier; +import io.javaoperatorsdk.operator.processing.event.source.EventSource; +import io.javaoperatorsdk.operator.processing.event.source.PrimaryResourcesRetriever; +import io.javaoperatorsdk.operator.processing.event.source.informer.InformerEventSource; +import io.javaoperatorsdk.operator.processing.event.source.informer.Mappers; + +public abstract class KubernetesDependentResourceBase + implements DependentResourceConfigurator, EventSourceProvider

, KubernetesClientAware { + + protected InformerEventSource informerEventSource; + protected KubernetesClient client; + + @Override + public void configureWith(C config) { + configureWithInformerConfig(config); + } + + public void configureWithInformerConfig(InformerConfig config) { + final var primaryResourcesRetriever = + (this instanceof PrimaryResourcesRetriever) ? (PrimaryResourcesRetriever) this + : Mappers.fromOwnerReference(); + final AssociatedSecondaryResourceIdentifier

secondaryResourceIdentifier = + (this instanceof AssociatedSecondaryResourceIdentifier) + ? (AssociatedSecondaryResourceIdentifier

) this + : ResourceID::fromResource; + + var ic = InformerConfiguration + .from(config.getConfigurationService(), resourceType()) + .withLabelSelector(config.labelSelector()) + .withNamespaces(config.namespaces()) + .withPrimaryResourcesRetriever(primaryResourcesRetriever) + .withAssociatedSecondaryResourceIdentifier(secondaryResourceIdentifier) + .build(); + this.informerEventSource = new InformerEventSource<>(ic, client); + } + + protected Class resourceType() { + return (Class) Utils.getFirstTypeArgumentFromExtendedClass(getClass()); + } + + @Override + public EventSource eventSource(EventSourceContext

context) { + configureWithInformerConfig(new InformerConfig(null, null, context.getConfigurationService())); + return informerEventSource; + } + + @Override + public void setKubernetesClient(KubernetesClient kubernetesClient) { + this.client = kubernetesClient; + } + + + public Optional getResource(P primaryResource) { + return informerEventSource.getAssociated(primaryResource); + } + + +} diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependentResourceConfig.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependentResourceConfig.java index 4464f3fd7d..a41367b926 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependentResourceConfig.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependentResourceConfig.java @@ -2,24 +2,21 @@ import io.javaoperatorsdk.operator.api.config.ConfigurationService; -import static io.javaoperatorsdk.operator.api.reconciler.Constants.EMPTY_STRING; import static io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependent.ADD_OWNER_REFERENCE_DEFAULT; -public class KubernetesDependentResourceConfig { +public class KubernetesDependentResourceConfig extends InformerConfig { private boolean addOwnerReference = ADD_OWNER_REFERENCE_DEFAULT; - private String[] namespaces = new String[0]; - private String labelSelector = EMPTY_STRING; - private ConfigurationService configurationService; + private boolean editOnly = false; public KubernetesDependentResourceConfig() {} - public KubernetesDependentResourceConfig(boolean addOwnerReference, String[] namespaces, + public KubernetesDependentResourceConfig(boolean addOwnerReference, + boolean editOnly, String[] namespaces, String labelSelector, ConfigurationService configurationService) { + super(namespaces, labelSelector, configurationService); this.addOwnerReference = addOwnerReference; - this.namespaces = namespaces; - this.labelSelector = labelSelector; - this.configurationService = configurationService; + this.editOnly = editOnly; } public KubernetesDependentResourceConfig setAddOwnerReference( @@ -28,35 +25,18 @@ public KubernetesDependentResourceConfig setAddOwnerReference( return this; } - public KubernetesDependentResourceConfig setNamespaces(String[] namespaces) { - this.namespaces = namespaces; + public KubernetesDependentResourceConfig setEditOnly(boolean editOnly) { + this.editOnly = editOnly; return this; } - public KubernetesDependentResourceConfig setLabelSelector(String labelSelector) { - this.labelSelector = labelSelector; - return this; - } - - public KubernetesDependentResourceConfig setConfigurationService( - ConfigurationService configurationService) { - this.configurationService = configurationService; - return this; + public boolean isEditOnly() { + return editOnly; } public boolean addOwnerReference() { return addOwnerReference; } - public String[] namespaces() { - return namespaces; - } - - public String labelSelector() { - return labelSelector; - } - public ConfigurationService getConfigurationService() { - return configurationService; - } } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesReadOnlyResource.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesReadOnlyResource.java new file mode 100644 index 0000000000..ea096e0d87 --- /dev/null +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesReadOnlyResource.java @@ -0,0 +1,10 @@ +package io.javaoperatorsdk.operator.processing.dependent.kubernetes; + +import io.fabric8.kubernetes.api.model.HasMetadata; +import io.javaoperatorsdk.operator.api.reconciler.dependent.ReadOnlyDependentResource; + +public class KubernetesReadOnlyResource + extends KubernetesDependentResourceBase + implements ReadOnlyDependentResource { + +} diff --git a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/api/config/UtilsTest.java b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/api/config/UtilsTest.java index 88dd8db469..0419b6e920 100644 --- a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/api/config/UtilsTest.java +++ b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/api/config/UtilsTest.java @@ -23,7 +23,7 @@ public static class TestKubernetesDependentResource extends KubernetesDependentResource { @Override - protected Deployment desired(TestCustomResource primary, Context context) { + public Deployment desired(TestCustomResource primary, Context context) { return null; } } diff --git a/operator-framework/src/main/java/io/javaoperatorsdk/operator/config/runtime/AnnotationControllerConfiguration.java b/operator-framework/src/main/java/io/javaoperatorsdk/operator/config/runtime/AnnotationControllerConfiguration.java index dd1e005fc1..bab80a8bc1 100644 --- a/operator-framework/src/main/java/io/javaoperatorsdk/operator/config/runtime/AnnotationControllerConfiguration.java +++ b/operator-framework/src/main/java/io/javaoperatorsdk/operator/config/runtime/AnnotationControllerConfiguration.java @@ -168,8 +168,12 @@ public List getDependentResources() { kubeDependent, KubernetesDependent::addOwnerReference, KubernetesDependent.ADD_OWNER_REFERENCE_DEFAULT); + final var editOnly = Utils.valueOrDefault( + kubeDependent, + KubernetesDependent::editOnly, + KubernetesDependent.EDIT_ONLY_DEFAULT); KubernetesDependentResourceConfig config = - new KubernetesDependentResourceConfig( + new KubernetesDependentResourceConfig(editOnly, addOwnerReference, namespaces, labelSelector, getConfigurationService()); resourceSpecs.add(new DependentResourceSpec(dependentType, config)); } else { diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/standalonedependent/StandaloneDependentTestReconciler.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/standalonedependent/StandaloneDependentTestReconciler.java index d529f19c3d..cf1a42c578 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/standalonedependent/StandaloneDependentTestReconciler.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/standalonedependent/StandaloneDependentTestReconciler.java @@ -54,7 +54,7 @@ private class DeploymentDependentResource extends KubernetesDependentResource { @Override - protected Deployment desired(StandaloneDependentTestCustomResource primary, Context context) { + public Deployment desired(StandaloneDependentTestCustomResource primary, Context context) { Deployment deployment = ReconcilerUtils.loadYaml(Deployment.class, getClass(), "nginx-deployment.yaml"); deployment.getMetadata().setName(primary.getMetadata().getName()); diff --git a/sample-operators/mysql-schema/src/main/java/io/javaoperatorsdk/operator/sample/SchemaDependentResource.java b/sample-operators/mysql-schema/src/main/java/io/javaoperatorsdk/operator/sample/SchemaDependentResource.java index 67c553268f..ced10d4841 100644 --- a/sample-operators/mysql-schema/src/main/java/io/javaoperatorsdk/operator/sample/SchemaDependentResource.java +++ b/sample-operators/mysql-schema/src/main/java/io/javaoperatorsdk/operator/sample/SchemaDependentResource.java @@ -7,9 +7,9 @@ import io.javaoperatorsdk.operator.api.reconciler.Context; import io.javaoperatorsdk.operator.api.reconciler.EventSourceContext; -import io.javaoperatorsdk.operator.api.reconciler.dependent.AbstractDependentResource; import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResourceConfigurator; import io.javaoperatorsdk.operator.api.reconciler.dependent.EventSourceProvider; +import io.javaoperatorsdk.operator.api.reconciler.dependent.GenericDependentResource; import io.javaoperatorsdk.operator.processing.event.source.EventSource; import io.javaoperatorsdk.operator.processing.event.source.polling.PerResourcePollingEventSource; import io.javaoperatorsdk.operator.sample.schema.Schema; @@ -18,8 +18,7 @@ import static java.lang.String.format; public class SchemaDependentResource - extends AbstractDependentResource - implements EventSourceProvider, + implements GenericDependentResource, EventSourceProvider, DependentResourceConfigurator { private MySQLDbConfig dbConfig; @@ -47,12 +46,12 @@ public Schema desired(MySQLSchema primary, Context context) { } @Override - protected boolean match(Schema actual, Schema target, Context context) { + public boolean match(Schema actual, Schema target, Context context) { return actual.equals(target); } @Override - protected Schema create(Schema target, MySQLSchema mySQLSchema, Context context) { + public void create(Schema target, MySQLSchema mySQLSchema, Context context) { try (Connection connection = getConnection()) { final var schema = SchemaService.createSchemaAndRelatedUser( connection, @@ -63,7 +62,6 @@ protected Schema create(Schema target, MySQLSchema mySQLSchema, Context context) // put the newly built schema in the context to let the reconciler know we just built it context.put(MySQLSchemaReconciler.BUILT_SCHEMA, schema); - return schema; } catch (SQLException e) { MySQLSchemaReconciler.log.error("Error while creating Schema", e); throw new IllegalStateException(e); @@ -71,7 +69,7 @@ protected Schema create(Schema target, MySQLSchema mySQLSchema, Context context) } @Override - protected Schema update(Schema actual, Schema target, MySQLSchema mySQLSchema, Context context) { + public void update(Schema actual, Schema target, MySQLSchema mySQLSchema, Context context) { throw new IllegalStateException("Target schema should not be changed: " + mySQLSchema); } diff --git a/sample-operators/mysql-schema/src/main/java/io/javaoperatorsdk/operator/sample/SecretDependentResource.java b/sample-operators/mysql-schema/src/main/java/io/javaoperatorsdk/operator/sample/SecretDependentResource.java index 884cc6d2c9..08cbb92879 100644 --- a/sample-operators/mysql-schema/src/main/java/io/javaoperatorsdk/operator/sample/SecretDependentResource.java +++ b/sample-operators/mysql-schema/src/main/java/io/javaoperatorsdk/operator/sample/SecretDependentResource.java @@ -20,14 +20,14 @@ private static String encode(String value) { // An alternative would be to override reconcile() method and exclude the update part. @Override - protected Secret update(Secret actual, Secret target, MySQLSchema primary, Context context) { + public void update(Secret actual, Secret target, MySQLSchema primary, Context context) { throw new IllegalStateException( "Secret should not be updated. Secret: " + target + " for custom resource: " + primary); } @Override - protected Secret desired(MySQLSchema schema, Context context) { + public Secret desired(MySQLSchema schema, Context context) { return new SecretBuilder() .withNewMetadata() .withName(context.getMandatory(MYSQL_SECRET_NAME, String.class)) @@ -41,7 +41,7 @@ protected Secret desired(MySQLSchema schema, Context context) { } @Override - protected boolean match(Secret actual, Secret target, Context context) { + public boolean match(Secret actual, Secret target, Context context) { return ResourceID.fromResource(actual).equals(ResourceID.fromResource(target)); } diff --git a/sample-operators/tomcat-operator/src/main/java/io/javaoperatorsdk/operator/sample/DeploymentDependentResource.java b/sample-operators/tomcat-operator/src/main/java/io/javaoperatorsdk/operator/sample/DeploymentDependentResource.java index 3a68973165..ddd577957c 100644 --- a/sample-operators/tomcat-operator/src/main/java/io/javaoperatorsdk/operator/sample/DeploymentDependentResource.java +++ b/sample-operators/tomcat-operator/src/main/java/io/javaoperatorsdk/operator/sample/DeploymentDependentResource.java @@ -16,7 +16,7 @@ private static String tomcatImage(Tomcat tomcat) { } @Override - protected Deployment desired(Tomcat tomcat, Context context) { + public Deployment desired(Tomcat tomcat, Context context) { Deployment deployment = ReconcilerUtils.loadYaml(Deployment.class, getClass(), "deployment.yaml"); final ObjectMeta tomcatMetadata = tomcat.getMetadata(); diff --git a/sample-operators/tomcat-operator/src/main/java/io/javaoperatorsdk/operator/sample/ServiceDependentResource.java b/sample-operators/tomcat-operator/src/main/java/io/javaoperatorsdk/operator/sample/ServiceDependentResource.java index a77d13b345..e6812ed561 100644 --- a/sample-operators/tomcat-operator/src/main/java/io/javaoperatorsdk/operator/sample/ServiceDependentResource.java +++ b/sample-operators/tomcat-operator/src/main/java/io/javaoperatorsdk/operator/sample/ServiceDependentResource.java @@ -10,7 +10,7 @@ public class ServiceDependentResource extends KubernetesDependentResource { @Override - protected Service desired(Tomcat tomcat, Context context) { + public Service desired(Tomcat tomcat, Context context) { final ObjectMeta tomcatMetadata = tomcat.getMetadata(); return new ServiceBuilder(ReconcilerUtils.loadYaml(Service.class, getClass(), "service.yaml")) .editMetadata() diff --git a/sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/WebPageReconciler.java b/sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/WebPageReconciler.java index b3200903d1..3719c83783 100644 --- a/sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/WebPageReconciler.java +++ b/sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/WebPageReconciler.java @@ -87,7 +87,7 @@ private void createDependentResources(KubernetesClient client) { new KubernetesDependentResource<>() { @Override - protected Deployment desired(WebPage webPage, Context context) { + public Deployment desired(WebPage webPage, Context context) { var deploymentName = deploymentName(webPage); Deployment deployment = loadYaml(Deployment.class, getClass(), "deployment.yaml"); deployment.getMetadata().setName(deploymentName); @@ -121,7 +121,7 @@ protected Class resourceType() { new KubernetesDependentResource<>() { @Override - protected Service desired(WebPage webPage, Context context) { + public Service desired(WebPage webPage, Context context) { Service service = loadYaml(Service.class, getClass(), "service.yaml"); service.getMetadata().setName(serviceName(webPage)); service.getMetadata().setNamespace(webPage.getMetadata().getNamespace()); @@ -155,7 +155,7 @@ private class ConfigMapDependentResource extends KubernetesDependentResource { @Override - protected ConfigMap desired(WebPage webPage, Context context) { + public ConfigMap desired(WebPage webPage, Context context) { Map data = new HashMap<>(); data.put("index.html", webPage.getSpec().getHtml()); return new ConfigMapBuilder() @@ -169,15 +169,15 @@ protected ConfigMap desired(WebPage webPage, Context context) { } @Override - protected boolean match(ConfigMap actual, ConfigMap target, Context context) { + public boolean match(ConfigMap actual, ConfigMap target, Context context) { return StringUtils.equals( actual.getData().get("index.html"), target.getData().get("index.html")); } @Override - protected ConfigMap update( + public void update( ConfigMap actual, ConfigMap target, WebPage primary, Context context) { - var cm = super.update(actual, target, primary, context); + super.update(actual, target, primary, context); var ns = actual.getMetadata().getNamespace(); log.info("Restarting pods because HTML has changed in {}", ns); kubernetesClient @@ -185,7 +185,6 @@ protected ConfigMap update( .inNamespace(ns) .withLabel("app", deploymentName(primary)) .delete(); - return cm; } @Override