Skip to content

Commit ef6ff28

Browse files
committed
feat: ReconcileUtils for strongly consistent updates
1 parent 589b7a6 commit ef6ff28

File tree

62 files changed

+1763
-581
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

62 files changed

+1763
-581
lines changed

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/Operator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ public <P extends HasMetadata> RegisteredController<P> register(
258258
"Cannot register reconciler with name "
259259
+ reconciler.getClass().getCanonicalName()
260260
+ " reconciler named "
261-
+ ReconcilerUtils.getNameFor(reconciler)
261+
+ ReconcilerUtilsInternal.getNameFor(reconciler)
262262
+ " because its configuration cannot be found.\n"
263263
+ " Known reconcilers are: "
264264
+ configurationService.getKnownReconcilerNames());

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/ReconcilerUtils.java renamed to operator-framework-core/src/main/java/io/javaoperatorsdk/operator/ReconcilerUtilsInternal.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
import io.javaoperatorsdk.operator.api.reconciler.Reconciler;
3535

3636
@SuppressWarnings("rawtypes")
37-
public class ReconcilerUtils {
37+
public class ReconcilerUtilsInternal {
3838

3939
private static final String FINALIZER_NAME_SUFFIX = "/finalizer";
4040
protected static final String MISSING_GROUP_SUFFIX = ".javaoperatorsdk.io";
@@ -46,7 +46,7 @@ public class ReconcilerUtils {
4646
Pattern.compile(".*http(s?)://[^/]*/api(s?)/(\\S*).*"); // NOSONAR: input is controlled
4747

4848
// prevent instantiation of util class
49-
private ReconcilerUtils() {}
49+
private ReconcilerUtilsInternal() {}
5050

5151
public static boolean isFinalizerValid(String finalizer) {
5252
return HasMetadata.validateFinalizer(finalizer);

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/AbstractConfigurationService.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222

2323
import io.fabric8.kubernetes.api.model.HasMetadata;
2424
import io.fabric8.kubernetes.client.KubernetesClient;
25-
import io.javaoperatorsdk.operator.ReconcilerUtils;
25+
import io.javaoperatorsdk.operator.ReconcilerUtilsInternal;
2626
import io.javaoperatorsdk.operator.api.reconciler.Reconciler;
2727

2828
/**
@@ -145,7 +145,7 @@ private String getReconcilersNameMessage() {
145145
}
146146

147147
protected <R extends HasMetadata> String keyFor(Reconciler<R> reconciler) {
148-
return ReconcilerUtils.getNameFor(reconciler);
148+
return ReconcilerUtilsInternal.getNameFor(reconciler);
149149
}
150150

151151
@SuppressWarnings("unused")

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/BaseConfigurationService.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828

2929
import io.fabric8.kubernetes.api.model.HasMetadata;
3030
import io.fabric8.kubernetes.client.KubernetesClient;
31-
import io.javaoperatorsdk.operator.ReconcilerUtils;
31+
import io.javaoperatorsdk.operator.ReconcilerUtilsInternal;
3232
import io.javaoperatorsdk.operator.api.config.Utils.Configurator;
3333
import io.javaoperatorsdk.operator.api.config.dependent.DependentResourceConfigurationResolver;
3434
import io.javaoperatorsdk.operator.api.config.dependent.DependentResourceSpec;
@@ -265,7 +265,7 @@ private <P extends HasMetadata> ResolvedControllerConfiguration<P> controllerCon
265265
io.javaoperatorsdk.operator.api.reconciler.ControllerConfiguration annotation) {
266266
final var resourceClass = getResourceClassResolver().getPrimaryResourceClass(reconcilerClass);
267267

268-
final var name = ReconcilerUtils.getNameFor(reconcilerClass);
268+
final var name = ReconcilerUtilsInternal.getNameFor(reconcilerClass);
269269
final var generationAware =
270270
valueOrDefaultFromAnnotation(
271271
annotation,

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfiguration.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
import java.util.Set;
2121

2222
import io.fabric8.kubernetes.api.model.HasMetadata;
23-
import io.javaoperatorsdk.operator.ReconcilerUtils;
23+
import io.javaoperatorsdk.operator.ReconcilerUtilsInternal;
2424
import io.javaoperatorsdk.operator.api.config.dependent.DependentResourceSpec;
2525
import io.javaoperatorsdk.operator.api.config.workflow.WorkflowSpec;
2626
import io.javaoperatorsdk.operator.api.reconciler.MaxReconciliationInterval;
@@ -42,16 +42,18 @@ default String getName() {
4242
}
4343

4444
default String getFinalizerName() {
45-
return ReconcilerUtils.getDefaultFinalizerName(getResourceClass());
45+
return ReconcilerUtilsInternal.getDefaultFinalizerName(getResourceClass());
4646
}
4747

4848
static String ensureValidName(String name, String reconcilerClassName) {
49-
return name != null ? name : ReconcilerUtils.getDefaultReconcilerName(reconcilerClassName);
49+
return name != null
50+
? name
51+
: ReconcilerUtilsInternal.getDefaultReconcilerName(reconcilerClassName);
5052
}
5153

5254
static String ensureValidFinalizerName(String finalizer, String resourceTypeName) {
5355
if (finalizer != null && !finalizer.isBlank()) {
54-
if (ReconcilerUtils.isFinalizerValid(finalizer)) {
56+
if (ReconcilerUtilsInternal.isFinalizerValid(finalizer)) {
5557
return finalizer;
5658
} else {
5759
throw new IllegalArgumentException(
@@ -61,7 +63,7 @@ static String ensureValidFinalizerName(String finalizer, String resourceTypeName
6163
+ " for details");
6264
}
6365
} else {
64-
return ReconcilerUtils.getDefaultFinalizerName(resourceTypeName);
66+
return ReconcilerUtilsInternal.getDefaultFinalizerName(resourceTypeName);
6567
}
6668
}
6769

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/informer/InformerConfiguration.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
import io.fabric8.kubernetes.api.model.HasMetadata;
2626
import io.fabric8.kubernetes.client.informers.cache.ItemStore;
2727
import io.javaoperatorsdk.operator.OperatorException;
28-
import io.javaoperatorsdk.operator.ReconcilerUtils;
28+
import io.javaoperatorsdk.operator.ReconcilerUtilsInternal;
2929
import io.javaoperatorsdk.operator.api.config.ControllerConfiguration;
3030
import io.javaoperatorsdk.operator.api.config.Utils;
3131
import io.javaoperatorsdk.operator.api.reconciler.Constants;
@@ -92,7 +92,7 @@ private InformerConfiguration(Class<R> resourceClass) {
9292
// controller
9393
// where GenericKubernetesResource now does not apply
9494
? GenericKubernetesResource.class.getSimpleName()
95-
: ReconcilerUtils.getResourceTypeName(resourceClass);
95+
: ReconcilerUtilsInternal.getResourceTypeName(resourceClass);
9696
}
9797

9898
@SuppressWarnings({"rawtypes", "unchecked"})
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/*
2+
* Copyright Java Operator SDK Authors
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package io.javaoperatorsdk.operator.api.reconciler;
17+
18+
public abstract class AbstractUpdateControl<T extends BaseControl<T>> extends BaseControl<T> {
19+
20+
private boolean filterPatchEvent = true;
21+
22+
/**
23+
* The event from resource primary updates are filtered by default, thus does not trigger the
24+
* reconciliation. Setting this to false will turn the filtering off.
25+
*
26+
* @since 5.3.0
27+
*/
28+
public T filterPatchEvent(boolean filterPatchEvent) {
29+
this.filterPatchEvent = filterPatchEvent;
30+
return (T) this;
31+
}
32+
33+
public boolean isFilterPatchEvent() {
34+
return filterPatchEvent;
35+
}
36+
}

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/ErrorStatusUpdateControl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
import io.fabric8.kubernetes.api.model.HasMetadata;
2222

2323
public class ErrorStatusUpdateControl<P extends HasMetadata>
24-
extends BaseControl<ErrorStatusUpdateControl<P>> {
24+
extends AbstractUpdateControl<ErrorStatusUpdateControl<P>> {
2525

2626
private final P resource;
2727
private boolean noRetry = false;

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/PrimaryUpdateAndCacheUtils.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,11 @@
4545
* caches the updated resource from the response in an overlay cache on top of the Informer cache.
4646
* If the update fails, it reads the primary resource from the cluster, applies the modifications
4747
* again and retries the update.
48+
*
49+
* @deprecated Use {@link ReconcileUtils} that contains the more efficient up-to-date versions of
50+
* the target utils.
4851
*/
52+
@Deprecated(forRemoval = true)
4953
public class PrimaryUpdateAndCacheUtils {
5054

5155
public static final int DEFAULT_MAX_RETRY = 10;

0 commit comments

Comments
 (0)