Skip to content

Commit 89acf8d

Browse files
committed
feat: handle clustered resource on secondary to primary mapper init
Fixes #2311 Signed-off-by: Chris Laprun <claprun@redhat.com>
1 parent 43b8591 commit 89acf8d

File tree

2 files changed

+34
-16
lines changed

2 files changed

+34
-16
lines changed

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

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -119,9 +119,13 @@ static boolean getBooleanFromSystemPropsOrDefault(String propertyName, boolean d
119119
}
120120

121121
public static Class<?> getFirstTypeArgumentFromExtendedClass(Class<?> clazz) {
122+
return getTypeArgumentFromExtendedClassByIndex(clazz, 0);
123+
}
124+
125+
public static Class<?> getTypeArgumentFromExtendedClassByIndex(Class<?> clazz, int index) {
122126
try {
123127
Type type = clazz.getGenericSuperclass();
124-
return (Class<?>) ((ParameterizedType) type).getActualTypeArguments()[0];
128+
return (Class<?>) ((ParameterizedType) type).getActualTypeArguments()[index];
125129
} catch (Exception e) {
126130
throw new RuntimeException(GENERIC_PARAMETER_TYPE_ERROR_PREFIX
127131
+ clazz.getSimpleName()
@@ -190,27 +194,31 @@ private static Optional<? extends Class<?>> extractType(Class<?> clazz,
190194

191195
public static Class<?> getFirstTypeArgumentFromSuperClassOrInterface(Class<?> clazz,
192196
Class<?> expectedImplementedInterface) {
197+
return getTypeArgumentFromSuperClassOrInterfaceByIndex(clazz, expectedImplementedInterface, 0);
198+
}
199+
200+
public static Class<?> getTypeArgumentFromSuperClassOrInterfaceByIndex(Class<?> clazz,
201+
Class<?> expectedImplementedInterface, int index) {
193202
// first check super class if it exists
194203
try {
195204
final Class<?> superclass = clazz.getSuperclass();
196205
if (!superclass.equals(Object.class)) {
197206
try {
198-
return getFirstTypeArgumentFromExtendedClass(clazz);
207+
return getTypeArgumentFromExtendedClassByIndex(clazz, index);
199208
} catch (Exception e) {
200209
// try interfaces
201210
try {
202-
return getFirstTypeArgumentFromInterface(clazz, expectedImplementedInterface);
211+
return getTypeArgumentFromInterfaceByIndex(clazz, expectedImplementedInterface, index);
203212
} catch (Exception ex) {
204213
// try on the parent
205-
return getFirstTypeArgumentFromSuperClassOrInterface(superclass,
206-
expectedImplementedInterface);
214+
return getTypeArgumentFromSuperClassOrInterfaceByIndex(superclass,
215+
expectedImplementedInterface, index);
207216
}
208217
}
209218
}
210-
return getFirstTypeArgumentFromInterface(clazz, expectedImplementedInterface);
219+
return getTypeArgumentFromInterfaceByIndex(clazz, expectedImplementedInterface, index);
211220
} catch (Exception e) {
212-
throw new OperatorException(
213-
GENERIC_PARAMETER_TYPE_ERROR_PREFIX + clazz.getSimpleName(), e);
221+
throw new OperatorException(GENERIC_PARAMETER_TYPE_ERROR_PREFIX + clazz.getSimpleName(), e);
214222
}
215223
}
216224

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

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,18 @@
88
import org.slf4j.LoggerFactory;
99

1010
import io.fabric8.kubernetes.api.model.HasMetadata;
11+
import io.fabric8.kubernetes.api.model.Namespaced;
1112
import io.fabric8.kubernetes.client.dsl.Resource;
1213
import io.javaoperatorsdk.operator.OperatorException;
1314
import io.javaoperatorsdk.operator.ReconcilerUtils;
15+
import io.javaoperatorsdk.operator.api.config.Utils;
1416
import io.javaoperatorsdk.operator.api.config.dependent.Configured;
1517
import io.javaoperatorsdk.operator.api.config.informer.InformerConfiguration;
1618
import io.javaoperatorsdk.operator.api.reconciler.Constants;
1719
import io.javaoperatorsdk.operator.api.reconciler.Context;
1820
import io.javaoperatorsdk.operator.api.reconciler.EventSourceContext;
1921
import io.javaoperatorsdk.operator.api.reconciler.Ignore;
22+
import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
2023
import io.javaoperatorsdk.operator.api.reconciler.dependent.GarbageCollected;
2124
import io.javaoperatorsdk.operator.api.reconciler.dependent.managed.DependentResourceConfigurator;
2225
import io.javaoperatorsdk.operator.processing.dependent.AbstractEventSourceHolderDependentResource;
@@ -35,20 +38,27 @@ public abstract class KubernetesDependentResource<R extends HasMetadata, P exten
3538
implements DependentResourceConfigurator<KubernetesDependentResourceConfig<R>> {
3639

3740
private static final Logger log = LoggerFactory.getLogger(KubernetesDependentResource.class);
38-
private final ResourceUpdaterMatcher<R> updaterMatcher;
3941
private final boolean garbageCollected = this instanceof GarbageCollected;
42+
private final boolean usingCustomResourceUpdateMatcher = this instanceof ResourceUpdaterMatcher;
43+
@SuppressWarnings("unchecked")
44+
private final ResourceUpdaterMatcher<R> updaterMatcher = usingCustomResourceUpdateMatcher
45+
? (ResourceUpdaterMatcher<R>) this
46+
: GenericResourceUpdaterMatcher.updaterMatcherFor(resourceType());
47+
private final boolean clustered;
4048
private KubernetesDependentResourceConfig<R> kubernetesDependentResourceConfig;
4149

42-
private final boolean usingCustomResourceUpdateMatcher;
4350

44-
@SuppressWarnings("unchecked")
4551
public KubernetesDependentResource(Class<R> resourceType) {
4652
super(resourceType);
53+
final var primaryResourceType =
54+
Utils.getTypeArgumentFromSuperClassOrInterfaceByIndex(getClass(), DependentResource.class,
55+
1);
56+
clustered = !Namespaced.class.isAssignableFrom(primaryResourceType);
57+
}
4758

48-
usingCustomResourceUpdateMatcher = this instanceof ResourceUpdaterMatcher;
49-
updaterMatcher = usingCustomResourceUpdateMatcher
50-
? (ResourceUpdaterMatcher<R>) this
51-
: GenericResourceUpdaterMatcher.updaterMatcherFor(resourceType);
59+
protected KubernetesDependentResource(Class<R> resourceType, boolean primaryIsClustered) {
60+
super(resourceType);
61+
clustered = primaryIsClustered;
5262
}
5363

5464
@SuppressWarnings("unchecked")
@@ -87,7 +97,7 @@ private SecondaryToPrimaryMapper<R> getSecondaryToPrimaryMapper() {
8797
if (this instanceof SecondaryToPrimaryMapper) {
8898
return (SecondaryToPrimaryMapper<R>) this;
8999
} else if (garbageCollected) {
90-
return Mappers.fromOwnerReferences(false);
100+
return Mappers.fromOwnerReferences(clustered);
91101
} else if (useNonOwnerRefBasedSecondaryToPrimaryMapping()) {
92102
return Mappers.fromDefaultAnnotations();
93103
} else {

0 commit comments

Comments
 (0)