Skip to content

Commit 04334ef

Browse files
committed
fix(native): register CR class for reflection
1 parent 825a9c2 commit 04334ef

File tree

1 file changed

+23
-5
lines changed

1 file changed

+23
-5
lines changed

operator-framework-quarkus-extension/deployment/src/main/java/io/javaoperatorsdk/quarkus/extension/deployment/QuarkusExtensionProcessor.java

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
import io.quarkus.gizmo.ClassOutput;
2727
import io.quarkus.gizmo.MethodCreator;
2828
import io.quarkus.gizmo.MethodDescriptor;
29-
import io.quarkus.kubernetes.client.spi.KubernetesClientBuildItem;
29+
import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
3030
import java.lang.reflect.Modifier;
3131
import java.util.List;
3232
import java.util.Optional;
@@ -63,21 +63,21 @@ void indexSDKDependencies(BuildProducer<IndexDependencyBuildItem> indexDependenc
6363
}
6464

6565
@BuildStep
66-
@Record(ExecutionTime.RUNTIME_INIT)
66+
@Record(ExecutionTime.STATIC_INIT)
6767
void createConfigurationServiceAndOperator(
6868
CombinedIndexBuildItem combinedIndexBuildItem,
6969
BuildProducer<GeneratedClassBuildItem> generatedClass,
7070
BuildProducer<SyntheticBeanBuildItem> syntheticBeanBuildItemBuildProducer,
7171
BuildProducer<AdditionalBeanBuildItem> additionalBeans,
72-
KubernetesClientBuildItem clientBuildItem,
72+
BuildProducer<ReflectiveClassBuildItem> reflectionClasses,
7373
ConfigurationServiceRecorder recorder) {
7474
final var index = combinedIndexBuildItem.getIndex();
7575
final var resourceControllers = index.getAllKnownImplementors(RESOURCE_CONTROLLER);
7676

7777
final var classOutput = new GeneratedClassGizmoAdaptor(generatedClass, true);
7878
final List<ControllerConfiguration> controllerConfigs =
7979
resourceControllers.stream()
80-
.map(ci -> createControllerConfiguration(ci, classOutput, additionalBeans))
80+
.map(ci -> createControllerConfiguration(ci, classOutput, additionalBeans, reflectionClasses))
8181
.collect(Collectors.toList());
8282

8383
final var supplier = recorder.configurationServiceSupplier(controllerConfigs);
@@ -95,7 +95,8 @@ void createConfigurationServiceAndOperator(
9595
private ControllerConfiguration createControllerConfiguration(
9696
ClassInfo info,
9797
ClassOutput classOutput,
98-
BuildProducer<AdditionalBeanBuildItem> additionalBeans) {
98+
BuildProducer<AdditionalBeanBuildItem> additionalBeans,
99+
BuildProducer<ReflectiveClassBuildItem> reflectionClasses) {
99100
// first retrieve the custom resource class
100101
final var rcInterface =
101102
info.interfaceTypes().stream()
@@ -147,9 +148,18 @@ private ControllerConfiguration createControllerConfiguration(
147148
+ Controller.class.getCanonicalName()
148149
+ " annotation");
149150
}
151+
152+
// load CR class
153+
final Class<CustomResource> crClass = (Class<CustomResource>) loadClass(crType);
154+
155+
// register CR class for introspection
156+
reflectionClasses.produce(new ReflectiveClassBuildItem(true, true, crClass));
157+
150158
final var crdName =
151159
valueOrDefault(
152160
controllerAnnotation, "crdName", AnnotationValue::asString, EXCEPTION_SUPPLIER);
161+
162+
// create the configuration
153163
final var configuration =
154164
new QuarkusControllerConfiguration(
155165
resourceControllerClassName,
@@ -193,4 +203,12 @@ private <T> T valueOrDefault(
193203
Supplier<T> defaultValue) {
194204
return Optional.ofNullable(annotation.value(name)).map(converter).orElseGet(defaultValue);
195205
}
206+
207+
private Class<?> loadClass(String className) {
208+
try {
209+
return Thread.currentThread().getContextClassLoader().loadClass(className);
210+
} catch (ClassNotFoundException e) {
211+
throw new IllegalArgumentException("Couldn't find class " + className);
212+
}
213+
}
196214
}

0 commit comments

Comments
 (0)