Skip to content

Commit 73aebaa

Browse files
committed
feat: add validation method on interfaces instead of implementations
1 parent 641ae9c commit 73aebaa

File tree

5 files changed

+39
-58
lines changed

5 files changed

+39
-58
lines changed

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,20 @@ default String getFinalizerName() {
3030
return ReconcilerUtils.getDefaultFinalizerName(getResourceClass());
3131
}
3232

33+
static String ensureValidFinalizerName(String finalizer, String resourceTypeName) {
34+
if (finalizer != null && !finalizer.isBlank()) {
35+
if (ReconcilerUtils.isFinalizerValid(finalizer)) {
36+
return finalizer;
37+
} else {
38+
throw new IllegalArgumentException(
39+
finalizer
40+
+ " is not a valid finalizer. See https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/#finalizers for details");
41+
}
42+
} else {
43+
return ReconcilerUtils.getDefaultFinalizerName(resourceTypeName);
44+
}
45+
}
46+
3347
default boolean isGenerationAware() {
3448
return true;
3549
}

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

Lines changed: 6 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,14 @@
11
package io.javaoperatorsdk.operator.api.config;
22

3-
import java.util.Collection;
43
import java.util.Optional;
54
import java.util.Set;
65

76
import io.fabric8.kubernetes.api.model.HasMetadata;
87
import io.javaoperatorsdk.operator.ReconcilerUtils;
9-
import io.javaoperatorsdk.operator.api.reconciler.Constants;
108
import io.javaoperatorsdk.operator.processing.event.source.filter.GenericFilter;
119
import io.javaoperatorsdk.operator.processing.event.source.filter.OnAddFilter;
1210
import io.javaoperatorsdk.operator.processing.event.source.filter.OnUpdateFilter;
1311

14-
import static io.javaoperatorsdk.operator.api.reconciler.Constants.DEFAULT_NAMESPACES_SET;
15-
1612
public class DefaultResourceConfiguration<R extends HasMetadata>
1713
implements ResourceConfiguration<R> {
1814

@@ -21,36 +17,20 @@ public class DefaultResourceConfiguration<R extends HasMetadata>
2117
private final Optional<OnAddFilter<R>> onAddFilter;
2218
private final Optional<OnUpdateFilter<R>> onUpdateFilter;
2319
private final Optional<GenericFilter<R>> genericFilter;
24-
25-
26-
private String labelSelector;
27-
private Set<String> namespaces;
28-
29-
public DefaultResourceConfiguration(String labelSelector, Class<R> resourceClass,
30-
OnAddFilter<R> onAddFilter,
31-
OnUpdateFilter<R> onUpdateFilter, GenericFilter<R> genericFilter, String... namespaces) {
32-
this(labelSelector, resourceClass, onAddFilter, onUpdateFilter, genericFilter,
33-
namespaces == null || namespaces.length == 0 ? DEFAULT_NAMESPACES_SET
34-
: Set.of(namespaces));
35-
}
36-
37-
public DefaultResourceConfiguration(String labelSelector, Class<R> resourceClass,
38-
OnAddFilter<R> onAddFilter,
39-
OnUpdateFilter<R> onUpdateFilter, GenericFilter<R> genericFilter, Set<String> namespaces) {
40-
this(resourceClass, onAddFilter, onUpdateFilter, genericFilter, namespaces);
41-
setLabelSelector(labelSelector);
42-
}
20+
private final String labelSelector;
21+
private final Set<String> namespaces;
4322

4423
protected DefaultResourceConfiguration(Class<R> resourceClass,
45-
OnAddFilter<R> onAddFilter,
46-
OnUpdateFilter<R> onUpdateFilter, GenericFilter<R> genericFilter, Set<String> namespaces) {
24+
Set<String> namespaces, String labelSelector, OnAddFilter<R> onAddFilter,
25+
OnUpdateFilter<R> onUpdateFilter, GenericFilter<R> genericFilter) {
4726
this.resourceClass = resourceClass;
4827
this.resourceTypeName = ReconcilerUtils.getResourceTypeName(resourceClass);
4928
this.onAddFilter = Optional.ofNullable(onAddFilter);
5029
this.onUpdateFilter = Optional.ofNullable(onUpdateFilter);
5130
this.genericFilter = Optional.ofNullable(genericFilter);
5231

53-
setNamespaces(namespaces);
32+
this.namespaces = ResourceConfiguration.ensureValidNamespaces(namespaces);
33+
this.labelSelector = ResourceConfiguration.ensureValidLabelSelector(labelSelector);
5434
}
5535

5636
@Override
@@ -63,22 +43,11 @@ public String getLabelSelector() {
6343
return labelSelector;
6444
}
6545

66-
protected void setLabelSelector(String labelSelector) {
67-
this.labelSelector = labelSelector;
68-
}
69-
7046
@Override
7147
public Set<String> getNamespaces() {
7248
return namespaces;
7349
}
7450

75-
protected void setNamespaces(Collection<String> namespaces) {
76-
if (namespaces != null && !namespaces.isEmpty()) {
77-
this.namespaces = Set.copyOf(namespaces);
78-
} else {
79-
this.namespaces = Constants.DEFAULT_NAMESPACES_SET;
80-
}
81-
}
8251

8352
@Override
8453
public Class<R> getResourceClass() {

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

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import java.util.concurrent.TimeUnit;
99

1010
import io.fabric8.kubernetes.api.model.HasMetadata;
11-
import io.javaoperatorsdk.operator.ReconcilerUtils;
1211
import io.javaoperatorsdk.operator.api.config.dependent.DependentResourceSpec;
1312
import io.javaoperatorsdk.operator.api.reconciler.Reconciler;
1413
import io.javaoperatorsdk.operator.processing.event.rate.RateLimiter;
@@ -29,11 +28,10 @@ public class ResolvedControllerConfiguration<P extends HasMetadata>
2928
private final Retry retry;
3029
private final RateLimiter rateLimiter;
3130
private final Optional<Duration> maxReconciliationInterval;
31+
private final String finalizer;
3232

3333
private ResourceEventFilter<P> eventFilter;
3434
private List<DependentResourceSpec> dependentResources;
35-
private String finalizer;
36-
3735

3836
public ResolvedControllerConfiguration(Class<P> resourceClass, ControllerConfiguration<P> other) {
3937
this(resourceClass, other.getName(), other.isGenerationAware(),
@@ -78,16 +76,16 @@ protected ResolvedControllerConfiguration(Class<P> resourceClass, String name,
7876
RateLimiter rateLimiter, Duration maxReconciliationInterval,
7977
OnAddFilter<P> onAddFilter, OnUpdateFilter<P> onUpdateFilter, GenericFilter<P> genericFilter,
8078
Set<String> namespaces, String finalizer, String labelSelector) {
81-
super(resourceClass, onAddFilter, onUpdateFilter, genericFilter, namespaces);
79+
super(resourceClass, namespaces, labelSelector, onAddFilter, onUpdateFilter, genericFilter);
8280
this.name = name;
8381
this.generationAware = generationAware;
8482
this.associatedReconcilerClassName = associatedReconcilerClassName;
8583
this.retry = ensureRetry(retry);
8684
this.rateLimiter = ensureRateLimiter(rateLimiter);
8785
this.maxReconciliationInterval = Optional.ofNullable(maxReconciliationInterval);
8886

89-
setFinalizer(finalizer);
90-
setLabelSelector(labelSelector);
87+
this.finalizer =
88+
ControllerConfiguration.ensureValidFinalizerName(finalizer, getResourceTypeName());
9189
}
9290

9391
protected ResolvedControllerConfiguration(Class<P> resourceClass, String name,
@@ -107,20 +105,6 @@ public String getFinalizerName() {
107105
return finalizer;
108106
}
109107

110-
protected void setFinalizer(String finalizer) {
111-
if (finalizer != null && !finalizer.isBlank()) {
112-
if (ReconcilerUtils.isFinalizerValid(finalizer)) {
113-
this.finalizer = finalizer;
114-
} else {
115-
throw new IllegalArgumentException(
116-
finalizer
117-
+ " is not a valid finalizer. See https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/#finalizers for details");
118-
}
119-
} else {
120-
this.finalizer = ReconcilerUtils.getDefaultFinalizerName(getResourceTypeName());
121-
}
122-
}
123-
124108
@Override
125109
public boolean isGenerationAware() {
126110
return generationAware;

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.javaoperatorsdk.operator.api.config;
22

3+
import java.util.Collection;
34
import java.util.Collections;
45
import java.util.Optional;
56
import java.util.Set;
@@ -45,6 +46,11 @@ default String getLabelSelector() {
4546
return null;
4647
}
4748

49+
static String ensureValidLabelSelector(String labelSelector) {
50+
// might want to implement validation here?
51+
return labelSelector;
52+
}
53+
4854
@SuppressWarnings("unchecked")
4955
default Class<R> getResourceClass() {
5056
return (Class<R>) Utils.getFirstTypeArgumentFromSuperClassOrInterface(getClass(),
@@ -88,6 +94,14 @@ static void failIfNotValid(Set<String> namespaces) {
8894
+ Constants.WATCH_CURRENT_NAMESPACE + "'");
8995
}
9096

97+
static Set<String> ensureValidNamespaces(Collection<String> namespaces) {
98+
if (namespaces != null && !namespaces.isEmpty()) {
99+
return Set.copyOf(namespaces);
100+
} else {
101+
return Constants.DEFAULT_NAMESPACES_SET;
102+
}
103+
}
104+
91105
/**
92106
* Computes the effective namespaces based on the set specified by the user, in particular
93107
* retrieves the current namespace from the client when the user specified that they wanted to

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ protected DefaultInformerConfiguration(String labelSelector,
3939
OnUpdateFilter<R> onUpdateFilter,
4040
OnDeleteFilter<R> onDeleteFilter,
4141
GenericFilter<R> genericFilter) {
42-
super(labelSelector, resourceClass, onAddFilter, onUpdateFilter, genericFilter, namespaces);
42+
super(resourceClass, namespaces, labelSelector, onAddFilter, onUpdateFilter, genericFilter);
4343
this.followControllerNamespaceChanges = followControllerNamespaceChanges;
4444

4545
this.primaryToSecondaryMapper = primaryToSecondaryMapper;

0 commit comments

Comments
 (0)