Skip to content

Commit 7593ac5

Browse files
committed
static secondary to primary mapper handling
Signed-off-by: Attila Mészáros <csviri@gmail.com>
1 parent d46706f commit 7593ac5

File tree

2 files changed

+39
-22
lines changed

2 files changed

+39
-22
lines changed

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

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import io.javaoperatorsdk.operator.api.config.dependent.DependentResourceSpec;
1212
import io.javaoperatorsdk.operator.api.config.informer.InformerConfiguration;
1313
import io.javaoperatorsdk.operator.api.reconciler.Constants;
14+
import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
1415
import io.javaoperatorsdk.operator.processing.GroupVersionKind;
1516
import io.javaoperatorsdk.operator.processing.event.source.PrimaryToSecondaryMapper;
1617
import io.javaoperatorsdk.operator.processing.event.source.SecondaryToPrimaryMapper;
@@ -19,6 +20,7 @@
1920
import io.javaoperatorsdk.operator.processing.event.source.filter.OnDeleteFilter;
2021
import io.javaoperatorsdk.operator.processing.event.source.filter.OnUpdateFilter;
2122

23+
import static io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependentResource.getSecondaryToPrimaryMapper;
2224
import static io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependentResourceConfig.DEFAULT_CREATE_RESOURCE_ONLY_IF_NOT_EXISTING_WITH_SSA;
2325

2426
public class KubernetesDependentConverter<R extends HasMetadata, P extends HasMetadata> implements
@@ -55,18 +57,17 @@ private InformerConfiguration<R> createInformerConfiguration(KubernetesDependent
5557
ControllerConfiguration<?> controllerConfig,
5658
DependentResourceSpec<?, ?> spec) {
5759
try {
58-
Class<? extends KubernetesDependentResource<?, ?>> originatingClass =
60+
Class<? extends KubernetesDependentResource<?, ?>> dependentResourceClass =
5961
(Class<? extends KubernetesDependentResource<?, ?>>) spec.getDependentResourceClass();
60-
var dependentInstance = originatingClass.getConstructor().newInstance();
61-
var resourceType = dependentInstance.resourceType();
62+
var resourceType = dependentResourceClass.getConstructor().newInstance().resourceType();
6263

6364
InformerConfiguration.InformerConfigurationBuilder informerConfig;
6465
if (configAnnotation != null && configAnnotation.informerConfig() != null &&
6566
!Constants.NO_VALUE_SET.equals(configAnnotation.informerConfig().groupVersionKind())) {
6667

6768
if (!GenericKubernetesResource.class.isAssignableFrom(resourceType)) {
6869
throw new IllegalStateException("If GroupVersionKind is set the resource type must be " +
69-
"GenericKubernetesDependentResource. For: " + originatingClass.getName());
70+
"GenericKubernetesDependentResource. For: " + dependentResourceClass.getName());
7071
}
7172

7273
informerConfig = InformerConfiguration.from(
@@ -77,17 +78,14 @@ private InformerConfiguration<R> createInformerConfiguration(KubernetesDependent
7778
InformerConfiguration.from(resourceType, controllerConfig.getResourceClass());
7879
}
7980

80-
informerConfig.withSecondaryToPrimaryMapper(
81-
dependentInstance.getSecondaryToPrimaryMapper().orElse(null));
82-
8381
if (configAnnotation != null && configAnnotation.informerConfig() != null) {
8482

8583
if (!Constants.NO_VALUE_SET.equals(configAnnotation.informerConfig().name())) {
86-
informerConfig.withName(dependentInstance.name());
84+
informerConfig.withName(configAnnotation.informerConfig().name());
8785
} else if (spec.getName() != null && !Constants.NO_VALUE_SET.equals(spec.getName())) {
8886
informerConfig.withName(spec.getName());
8987
} else {
90-
informerConfig.withName(dependentInstance.name());
88+
informerConfig.withName(DependentResource.defaultNameFor(dependentResourceClass));
9189
}
9290

9391
var namespaces = Set.of(configAnnotation.informerConfig().namespaces());
@@ -97,7 +95,7 @@ private InformerConfiguration<R> createInformerConfiguration(KubernetesDependent
9795
var labelSelector = Constants.NO_VALUE_SET.equals(fromAnnotation) ? null : fromAnnotation;
9896
informerConfig.withLabelSelector(labelSelector);
9997

100-
final var context = Utils.contextFor(controllerConfig, originatingClass,
98+
final var context = Utils.contextFor(controllerConfig, dependentResourceClass,
10199
configAnnotation.annotationType());
102100

103101
var onAddFilter = Utils.instantiate(configAnnotation.informerConfig().onAddFilter(),
@@ -135,15 +133,24 @@ private InformerConfiguration<R> createInformerConfiguration(KubernetesDependent
135133
if (secondaryToPrimaryMapper != null) {
136134
informerConfig.withSecondaryToPrimaryMapper(secondaryToPrimaryMapper);
137135
}
138-
136+
} else {
137+
var mapper = getSecondaryToPrimaryMapper(dependentResourceClass,
138+
controllerConfig.getResourceClass()).orElseThrow(
139+
() -> new IllegalStateException(
140+
"No suitable SecondaryToPrimaryMapper for informer of dependent resource: "
141+
+ dependentResourceClass.getName()));
142+
informerConfig.withSecondaryToPrimaryMapper(mapper);
139143
}
140144

145+
146+
141147
return informerConfig.build();
142148
} catch (InstantiationException | IllegalAccessException | InvocationTargetException
143149
| NoSuchMethodException e) {
144150
throw new RuntimeException(e);
145151
}
146-
147152
}
148153

154+
155+
149156
}

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

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import io.javaoperatorsdk.operator.api.reconciler.dependent.GarbageCollected;
2222
import io.javaoperatorsdk.operator.api.reconciler.dependent.managed.DependentResourceConfigurator;
2323
import io.javaoperatorsdk.operator.processing.dependent.AbstractEventSourceHolderDependentResource;
24+
import io.javaoperatorsdk.operator.processing.dependent.Creator;
2425
import io.javaoperatorsdk.operator.processing.dependent.Matcher.Result;
2526
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.updatermatcher.GenericResourceUpdaterMatcher;
2627
import io.javaoperatorsdk.operator.processing.event.ResourceID;
@@ -72,15 +73,6 @@ public void configureWith(KubernetesDependentResourceConfig<R> config) {
7273
this.kubernetesDependentResourceConfig = config;
7374
}
7475

75-
public Optional<SecondaryToPrimaryMapper<R>> getSecondaryToPrimaryMapper() {
76-
if (garbageCollected) {
77-
return Optional.of(Mappers.fromOwnerReferences(getPrimaryResourceType(), clustered));
78-
} else if (useNonOwnerRefBasedSecondaryToPrimaryMapping()) {
79-
return Optional.of(Mappers.fromDefaultAnnotations());
80-
} else {
81-
return Optional.empty();
82-
}
83-
}
8476

8577
@SuppressWarnings("unused")
8678
public R create(R desired, P primary, Context<P> context) {
@@ -224,6 +216,7 @@ protected void addReferenceHandlingMetadata(R desired, P primary) {
224216
}
225217
}
226218

219+
@SuppressWarnings("unchecked")
227220
@Override
228221
protected InformerEventSource<R, P> createEventSource(EventSourceContext<P> context) {
229222
InformerConfiguration<R> config;
@@ -234,7 +227,9 @@ protected InformerEventSource<R, P> createEventSource(EventSourceContext<P> cont
234227

235228
config = informerConfigurationBuilder()
236229
.withName(name())
237-
.withSecondaryToPrimaryMapper(getSecondaryToPrimaryMapper().orElseThrow())
230+
.withSecondaryToPrimaryMapper(
231+
(SecondaryToPrimaryMapper<R>) getSecondaryToPrimaryMapper(this.getClass(),
232+
getPrimaryResourceType()).orElseThrow())
238233
.build();
239234
}
240235
var es = new InformerEventSource<>(config, context);
@@ -310,4 +305,19 @@ public boolean isDeletable() {
310305
return super.isDeletable() && !garbageCollected;
311306
}
312307

308+
@SuppressWarnings("rawtypes")
309+
public static Optional<SecondaryToPrimaryMapper<?>> getSecondaryToPrimaryMapper(
310+
Class<? extends KubernetesDependentResource> drClass,
311+
Class<? extends HasMetadata> primaryResourceClass) {
312+
313+
if (GarbageCollected.class.isAssignableFrom(drClass)) {
314+
var clustered = !Namespaced.class.isAssignableFrom(primaryResourceClass);
315+
return Optional.of(Mappers.fromOwnerReferences(primaryResourceClass, clustered));
316+
} else if (!GarbageCollected.class.isAssignableFrom(drClass)
317+
&& Creator.class.isAssignableFrom(drClass)) {
318+
return Optional.of(Mappers.fromDefaultAnnotations());
319+
} else {
320+
return Optional.empty();
321+
}
322+
}
313323
}

0 commit comments

Comments
 (0)