Skip to content

Commit 02e2377

Browse files
committed
kubernetes dependent resource configuration
1 parent 0bac343 commit 02e2377

File tree

6 files changed

+64
-16
lines changed

6 files changed

+64
-16
lines changed

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

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,14 @@
1717
import io.javaoperatorsdk.operator.OperatorException;
1818
import io.javaoperatorsdk.operator.ReconcilerUtils;
1919
import io.javaoperatorsdk.operator.api.config.dependent.DependentResourceSpec;
20-
import io.javaoperatorsdk.operator.api.reconciler.Constants;
20+
import io.javaoperatorsdk.operator.api.reconciler.*;
2121
import io.javaoperatorsdk.operator.api.reconciler.ControllerConfiguration;
22-
import io.javaoperatorsdk.operator.api.reconciler.Reconciler;
2322
import io.javaoperatorsdk.operator.api.reconciler.dependent.Dependent;
2423
import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
2524
import io.javaoperatorsdk.operator.api.reconciler.dependent.VoidCondition;
2625
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependent;
2726
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependentResource;
2827
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependentResourceConfig;
29-
import io.javaoperatorsdk.operator.processing.dependent.workflow.Condition;
3028
import io.javaoperatorsdk.operator.processing.event.rate.RateLimiter;
3129
import io.javaoperatorsdk.operator.processing.event.source.controller.ResourceEventFilter;
3230
import io.javaoperatorsdk.operator.processing.event.source.controller.ResourceEventFilters;
@@ -264,9 +262,9 @@ public List<DependentResourceSpec> getDependentResources() {
264262
}
265263
spec = new DependentResourceSpec(dependentType, config, name,
266264
Set.of(dependent.dependsOn()),
267-
instantiateConditionIfNotVoid(dependent.readyPostcondition()),
268-
instantiateConditionIfNotVoid(dependent.reconcilePrecondition()),
269-
instantiateConditionIfNotVoid(dependent.deletePostcondition()));
265+
instantiateIfNotVoid(dependent.readyPostcondition(), VoidCondition.class),
266+
instantiateIfNotVoid(dependent.reconcilePrecondition(), VoidCondition.class),
267+
instantiateIfNotVoid(dependent.deletePostcondition(), VoidCondition.class));
270268
specsMap.put(name, spec);
271269
}
272270

@@ -275,8 +273,8 @@ public List<DependentResourceSpec> getDependentResources() {
275273
return specs;
276274
}
277275

278-
private Condition<?, ?> instantiateConditionIfNotVoid(Class<? extends Condition> condition) {
279-
if (condition != VoidCondition.class) {
276+
private <T> T instantiateIfNotVoid(Class<T> condition, Class<?> voidClass) {
277+
if (!condition.equals(voidClass)) {
280278
try {
281279
return condition.getDeclaredConstructor().newInstance();
282280
} catch (InstantiationException
@@ -310,6 +308,7 @@ private Object createKubernetesResourceConfig(Class<? extends DependentResource>
310308
OnUpdateFilter<? extends HasMetadata> onUpdateFilter = null;
311309
OnDeleteFilter<? extends HasMetadata> onDeleteFilter = null;
312310
GenericFilter<? extends HasMetadata> genericFilter = null;
311+
ResourceDiscriminator<?, ? extends HasMetadata> resourceDiscriminator = null;
313312
if (kubeDependent != null) {
314313
if (!Arrays.equals(KubernetesDependent.DEFAULT_NAMESPACES,
315314
kubeDependent.namespaces())) {
@@ -332,10 +331,14 @@ private Object createKubernetesResourceConfig(Class<? extends DependentResource>
332331
genericFilter =
333332
createFilter(kubeDependent.genericFilter(), FilterType.generic, kubeDependentName)
334333
.orElse(null);
334+
335+
resourceDiscriminator = instantiateIfNotVoid(kubeDependent.resourceDiscriminator(),
336+
VoidResourceDiscriminator.class);
335337
}
336338

337339
config =
338-
new KubernetesDependentResourceConfig(namespaces, labelSelector, configuredNS, onAddFilter,
340+
new KubernetesDependentResourceConfig(namespaces, labelSelector, configuredNS,
341+
resourceDiscriminator, onAddFilter,
339342
onUpdateFilter, onDeleteFilter, genericFilter);
340343

341344
return config;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package io.javaoperatorsdk.operator.api.reconciler;
2+
3+
import java.util.Optional;
4+
5+
import io.fabric8.kubernetes.api.model.HasMetadata;
6+
import io.javaoperatorsdk.operator.processing.event.EventSourceRetriever;
7+
8+
public class VoidResourceDiscriminator<R, P extends HasMetadata>
9+
implements ResourceDiscriminator<R, P> {
10+
11+
@Override
12+
public Optional<R> distinguish(Class<R> resource, Context<P> context,
13+
EventSourceRetriever<P> eventSourceManager) {
14+
throw new UnsupportedOperationException();
15+
}
16+
}

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/AbstractDependentResource.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import io.fabric8.kubernetes.api.model.HasMetadata;
99
import io.javaoperatorsdk.operator.api.reconciler.Context;
1010
import io.javaoperatorsdk.operator.api.reconciler.Ignore;
11+
import io.javaoperatorsdk.operator.api.reconciler.ResourceDiscriminator;
1112
import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
1213
import io.javaoperatorsdk.operator.api.reconciler.dependent.ReconcileResult;
1314
import io.javaoperatorsdk.operator.processing.event.ResourceID;
@@ -23,6 +24,8 @@ public abstract class AbstractDependentResource<R, P extends HasMetadata>
2324
protected Creator<R, P> creator;
2425
protected Updater<R, P> updater;
2526

27+
private ResourceDiscriminator<R, P> resourceDiscriminator;
28+
2629
@SuppressWarnings("unchecked")
2730
public AbstractDependentResource() {
2831
creator = creatable ? (Creator<R, P>) this : null;
@@ -66,7 +69,11 @@ public ReconcileResult<R> reconcile(P primary, Context<P> context) {
6669
}
6770

6871
protected Optional<R> getSecondaryResource(P primary, Context<P> context) {
69-
return context.getSecondaryResource(resourceType());
72+
if (resourceDiscriminator == null) {
73+
return context.getSecondaryResource(resourceType());
74+
} else {
75+
return context.getSecondaryResource(resourceType(), resourceDiscriminator);
76+
}
7077
}
7178

7279
private void throwIfNull(R desired, P primary, String descriptor) {
@@ -125,4 +132,14 @@ protected R desired(P primary, Context<P> context) {
125132
throw new IllegalStateException(
126133
"desired method must be implemented if this DependentResource can be created and/or updated");
127134
}
135+
136+
protected ResourceDiscriminator<R, P> getResourceDiscriminator() {
137+
return resourceDiscriminator;
138+
}
139+
140+
protected AbstractDependentResource<R, P> setResourceDiscriminator(
141+
ResourceDiscriminator<R, P> resourceDiscriminator) {
142+
this.resourceDiscriminator = resourceDiscriminator;
143+
return this;
144+
}
128145
}

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependent.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
import io.fabric8.kubernetes.api.model.HasMetadata;
99
import io.javaoperatorsdk.operator.api.reconciler.Constants;
10+
import io.javaoperatorsdk.operator.api.reconciler.ResourceDiscriminator;
11+
import io.javaoperatorsdk.operator.api.reconciler.VoidResourceDiscriminator;
1012
import io.javaoperatorsdk.operator.processing.event.source.filter.*;
1113

1214
import static io.javaoperatorsdk.operator.api.reconciler.Constants.NO_VALUE_SET;
@@ -42,4 +44,6 @@
4244
Class<? extends OnDeleteFilter<? extends HasMetadata>> onDeleteFilter() default VoidOnDeleteFilter.class;
4345

4446
Class<? extends GenericFilter<? extends HasMetadata>> genericFilter() default VoidGenericFilter.class;
47+
48+
Class<? extends ResourceDiscriminator> resourceDiscriminator() default VoidResourceDiscriminator.class;
4549
}

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependentResource.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,7 @@ protected InformerEventSource<R, P> createEventSource(EventSourceContext<P> cont
166166
onUpdateFilter = kubernetesDependentResourceConfig.onUpdateFilter();
167167
onDeleteFilter = kubernetesDependentResourceConfig.onDeleteFilter();
168168
genericFilter = kubernetesDependentResourceConfig.genericFilter();
169+
setResourceDiscriminator(kubernetesDependentResourceConfig.getResourceDiscriminator());
169170

170171
configureWith(kubernetesDependentResourceConfig.labelSelector(),
171172
kubernetesDependentResourceConfig.namespaces(),

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependentResourceConfig.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import java.util.Set;
44

55
import io.javaoperatorsdk.operator.api.reconciler.Constants;
6+
import io.javaoperatorsdk.operator.api.reconciler.ResourceDiscriminator;
67
import io.javaoperatorsdk.operator.processing.event.source.filter.GenericFilter;
78
import io.javaoperatorsdk.operator.processing.event.source.filter.OnAddFilter;
89
import io.javaoperatorsdk.operator.processing.event.source.filter.OnDeleteFilter;
@@ -15,7 +16,7 @@ public class KubernetesDependentResourceConfig<R> {
1516
private Set<String> namespaces = Constants.SAME_AS_CONTROLLER_NAMESPACES_SET;
1617
private String labelSelector = NO_VALUE_SET;
1718
private boolean namespacesWereConfigured = false;
18-
19+
private ResourceDiscriminator<R, ?> resourceDiscriminator;
1920

2021
private OnAddFilter<R> onAddFilter;
2122

@@ -29,7 +30,8 @@ public KubernetesDependentResourceConfig() {}
2930

3031
@SuppressWarnings("rawtypes")
3132
public KubernetesDependentResourceConfig(Set<String> namespaces, String labelSelector,
32-
boolean configuredNS, OnAddFilter<R> onAddFilter,
33+
boolean configuredNS, ResourceDiscriminator<R, ?> resourceDiscriminator,
34+
OnAddFilter<R> onAddFilter,
3335
OnUpdateFilter<R> onUpdateFilter,
3436
OnDeleteFilter<R> onDeleteFilter, GenericFilter<R> genericFilter) {
3537
this.namespaces = namespaces;
@@ -42,7 +44,7 @@ public KubernetesDependentResourceConfig(Set<String> namespaces, String labelSel
4244
}
4345

4446
public KubernetesDependentResourceConfig(Set<String> namespaces, String labelSelector) {
45-
this(namespaces, labelSelector, true, null, null, null, null);
47+
this(namespaces, labelSelector, true, null, null, null, null, null);
4648
}
4749

4850
public KubernetesDependentResourceConfig<R> setNamespaces(Set<String> namespaces) {
@@ -73,17 +75,22 @@ public OnAddFilter onAddFilter() {
7375
return onAddFilter;
7476
}
7577

76-
@SuppressWarnings("rawtypes")
77-
public OnUpdateFilter onUpdateFilter() {
78+
79+
public OnUpdateFilter<R> onUpdateFilter() {
7880
return onUpdateFilter;
7981
}
8082

8183
@SuppressWarnings("rawtypes")
82-
public OnDeleteFilter onDeleteFilter() {
84+
public OnDeleteFilter<R> onDeleteFilter() {
8385
return onDeleteFilter;
8486
}
8587

8688
public GenericFilter<R> genericFilter() {
8789
return genericFilter;
8890
}
91+
92+
@SuppressWarnings("rawtypes")
93+
public ResourceDiscriminator getResourceDiscriminator() {
94+
return resourceDiscriminator;
95+
}
8996
}

0 commit comments

Comments
 (0)