From 754d28c9002bb5bf2402af55d90e8a08a26f229b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Tue, 12 Sep 2023 10:44:30 +0200 Subject: [PATCH] feat: builder for kubernetes dependent configuration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Attila Mészáros --- .../KubernetesDependentResourceConfig.java | 38 +++++---- ...ernetesDependentResourceConfigBuilder.java | 84 +++++++++++++++++++ .../ControllerConfigurationOverriderTest.java | 6 +- .../WebPageDependentsWorkflowReconciler.java | 6 +- ...WebPageStandaloneDependentsReconciler.java | 10 +-- 5 files changed, 118 insertions(+), 26 deletions(-) create mode 100644 operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependentResourceConfigBuilder.java 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 836bfbfc08..9b3838831d 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 @@ -16,22 +16,24 @@ public class KubernetesDependentResourceConfig { public static final boolean DEFAULT_CREATE_RESOURCE_ONLY_IF_NOT_EXISTING_WITH_SSA = true; - private Set namespaces = Constants.SAME_AS_CONTROLLER_NAMESPACES_SET; - private String labelSelector = NO_VALUE_SET; - private boolean namespacesWereConfigured = false; - private boolean createResourceOnlyIfNotExistingWithSSA; - private ResourceDiscriminator resourceDiscriminator; - private Boolean useSSA; - - private OnAddFilter onAddFilter; - - private OnUpdateFilter onUpdateFilter; - - private OnDeleteFilter onDeleteFilter; - - private GenericFilter genericFilter; - - public KubernetesDependentResourceConfig() {} + private Set namespaces; + private String labelSelector; + private final boolean namespacesWereConfigured; + private final boolean createResourceOnlyIfNotExistingWithSSA; + private final ResourceDiscriminator resourceDiscriminator; + private final Boolean useSSA; + + private final OnAddFilter onAddFilter; + private final OnUpdateFilter onUpdateFilter; + private final OnDeleteFilter onDeleteFilter; + private final GenericFilter genericFilter; + + public KubernetesDependentResourceConfig() { + this(Constants.SAME_AS_CONTROLLER_NAMESPACES_SET, NO_VALUE_SET, true, + DEFAULT_CREATE_RESOURCE_ONLY_IF_NOT_EXISTING_WITH_SSA, + null, null, null, + null, null, null); + } public KubernetesDependentResourceConfig(Set namespaces, String labelSelector, @@ -54,12 +56,16 @@ public KubernetesDependentResourceConfig(Set namespaces, this.useSSA = useSSA; } + // use builder instead + @Deprecated(forRemoval = true) public KubernetesDependentResourceConfig(Set namespaces, String labelSelector) { this(namespaces, labelSelector, true, DEFAULT_CREATE_RESOURCE_ONLY_IF_NOT_EXISTING_WITH_SSA, null, null, null, null, null, null); } + // use builder instead + @Deprecated(forRemoval = true) public KubernetesDependentResourceConfig setLabelSelector(String labelSelector) { this.labelSelector = labelSelector; return this; diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependentResourceConfigBuilder.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependentResourceConfigBuilder.java new file mode 100644 index 0000000000..8bdb8a47a5 --- /dev/null +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependentResourceConfigBuilder.java @@ -0,0 +1,84 @@ +package io.javaoperatorsdk.operator.processing.dependent.kubernetes; + +import java.util.Set; + +import io.javaoperatorsdk.operator.api.reconciler.ResourceDiscriminator; +import io.javaoperatorsdk.operator.processing.event.source.filter.GenericFilter; +import io.javaoperatorsdk.operator.processing.event.source.filter.OnAddFilter; +import io.javaoperatorsdk.operator.processing.event.source.filter.OnDeleteFilter; +import io.javaoperatorsdk.operator.processing.event.source.filter.OnUpdateFilter; + +public final class KubernetesDependentResourceConfigBuilder { + + private Set namespaces; + private String labelSelector; + private boolean createResourceOnlyIfNotExistingWithSSA; + private ResourceDiscriminator resourceDiscriminator; + private Boolean useSSA; + private OnAddFilter onAddFilter; + private OnUpdateFilter onUpdateFilter; + private OnDeleteFilter onDeleteFilter; + private GenericFilter genericFilter; + + public KubernetesDependentResourceConfigBuilder() {} + + public static KubernetesDependentResourceConfigBuilder aKubernetesDependentResourceConfig() { + return new KubernetesDependentResourceConfigBuilder<>(); + } + + public KubernetesDependentResourceConfigBuilder withNamespaces(Set namespaces) { + this.namespaces = namespaces; + return this; + } + + public KubernetesDependentResourceConfigBuilder withLabelSelector(String labelSelector) { + this.labelSelector = labelSelector; + return this; + } + + public KubernetesDependentResourceConfigBuilder withCreateResourceOnlyIfNotExistingWithSSA( + boolean createResourceOnlyIfNotExistingWithSSA) { + this.createResourceOnlyIfNotExistingWithSSA = createResourceOnlyIfNotExistingWithSSA; + return this; + } + + public KubernetesDependentResourceConfigBuilder withResourceDiscriminator( + ResourceDiscriminator resourceDiscriminator) { + this.resourceDiscriminator = resourceDiscriminator; + return this; + } + + public KubernetesDependentResourceConfigBuilder withUseSSA(Boolean useSSA) { + this.useSSA = useSSA; + return this; + } + + public KubernetesDependentResourceConfigBuilder withOnAddFilter(OnAddFilter onAddFilter) { + this.onAddFilter = onAddFilter; + return this; + } + + public KubernetesDependentResourceConfigBuilder withOnUpdateFilter( + OnUpdateFilter onUpdateFilter) { + this.onUpdateFilter = onUpdateFilter; + return this; + } + + public KubernetesDependentResourceConfigBuilder withOnDeleteFilter( + OnDeleteFilter onDeleteFilter) { + this.onDeleteFilter = onDeleteFilter; + return this; + } + + public KubernetesDependentResourceConfigBuilder withGenericFilter( + GenericFilter genericFilter) { + this.genericFilter = genericFilter; + return this; + } + + public KubernetesDependentResourceConfig build() { + return new KubernetesDependentResourceConfig<>(namespaces, labelSelector, false, + createResourceOnlyIfNotExistingWithSSA, resourceDiscriminator, useSSA, onAddFilter, + onUpdateFilter, onDeleteFilter, genericFilter); + } +} diff --git a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/api/config/ControllerConfigurationOverriderTest.java b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/api/config/ControllerConfigurationOverriderTest.java index 71be6a2cd4..eae4c22ac6 100644 --- a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/api/config/ControllerConfigurationOverriderTest.java +++ b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/api/config/ControllerConfigurationOverriderTest.java @@ -20,6 +20,7 @@ import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependent; import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependentResource; import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependentResourceConfig; +import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependentResourceConfigBuilder; import io.javaoperatorsdk.operator.processing.dependent.workflow.Condition; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -327,7 +328,10 @@ void replaceNamedDependentResourceConfigShouldWork() { final var overridden = ControllerConfigurationOverrider.override(configuration) .replacingNamedDependentResourceConfig( DependentResource.defaultNameFor(ReadOnlyDependent.class), - new KubernetesDependentResourceConfig(Set.of(overriddenNS), labelSelector)) + new KubernetesDependentResourceConfigBuilder<>() + .withNamespaces(Set.of(overriddenNS)) + .withLabelSelector(labelSelector) + .build()) .build(); dependents = overridden.getDependentResources(); dependentSpec = dependents.stream().filter(dr -> dr.getName().equals(dependentResourceName)) diff --git a/sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/WebPageDependentsWorkflowReconciler.java b/sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/WebPageDependentsWorkflowReconciler.java index 1aaf6d19db..d21e89a172 100644 --- a/sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/WebPageDependentsWorkflowReconciler.java +++ b/sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/WebPageDependentsWorkflowReconciler.java @@ -17,7 +17,7 @@ import io.javaoperatorsdk.operator.api.reconciler.Reconciler; import io.javaoperatorsdk.operator.api.reconciler.UpdateControl; import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependentResource; -import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependentResourceConfig; +import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependentResourceConfigBuilder; import io.javaoperatorsdk.operator.processing.dependent.workflow.Workflow; import io.javaoperatorsdk.operator.processing.dependent.workflow.WorkflowBuilder; import io.javaoperatorsdk.operator.processing.event.source.EventSource; @@ -91,8 +91,8 @@ private void initDependentResources(KubernetesClient client) { Arrays.asList(configMapDR, deploymentDR, serviceDR, ingressDR).forEach(dr -> { dr.setKubernetesClient(client); - dr.configureWith(new KubernetesDependentResourceConfig() - .setLabelSelector(DEPENDENT_RESOURCE_LABEL_SELECTOR)); + dr.configureWith(new KubernetesDependentResourceConfigBuilder() + .withLabelSelector(DEPENDENT_RESOURCE_LABEL_SELECTOR).build()); }); } diff --git a/sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/WebPageStandaloneDependentsReconciler.java b/sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/WebPageStandaloneDependentsReconciler.java index 3230259c1d..c1b3030c9b 100644 --- a/sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/WebPageStandaloneDependentsReconciler.java +++ b/sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/WebPageStandaloneDependentsReconciler.java @@ -13,7 +13,7 @@ import io.fabric8.kubernetes.client.KubernetesClient; import io.javaoperatorsdk.operator.api.reconciler.*; import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependentResource; -import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependentResourceConfig; +import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependentResourceConfigBuilder; import io.javaoperatorsdk.operator.processing.event.source.EventSource; import io.javaoperatorsdk.operator.sample.customresource.WebPage; import io.javaoperatorsdk.operator.sample.dependentresource.ConfigMapDependentResource; @@ -79,21 +79,19 @@ public ErrorStatusUpdateControl updateErrorStatus( return handleError(resource, e); } - @SuppressWarnings("unchecked") + @SuppressWarnings({"unchecked", "rawtypes"}) private void createDependentResources(KubernetesClient client) { this.configMapDR = new ConfigMapDependentResource(); this.deploymentDR = new DeploymentDependentResource(); this.serviceDR = new ServiceDependentResource(); this.ingressDR = new IngressDependentResource(); - Arrays.asList(configMapDR, deploymentDR, serviceDR, ingressDR).forEach(dr -> { dr.setKubernetesClient(client); - dr.configureWith(new KubernetesDependentResourceConfig() - .setLabelSelector(SELECTOR + "=true")); + dr.configureWith(new KubernetesDependentResourceConfigBuilder() + .withLabelSelector(SELECTOR + "=true").build()); }); } - }