Skip to content

Commit

Permalink
refactor: KubernetesResource classes grabbed during build and recorde…
Browse files Browse the repository at this point in the history
…d at static initialization

Signed-off-by: Marc Nuri <marc@marcnuri.com>
  • Loading branch information
manusa committed Jun 9, 2023
1 parent f6ebdc8 commit ac642ef
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 22 deletions.
Original file line number Diff line number Diff line change
@@ -1,11 +1,17 @@
package io.quarkus.kubernetes.client.deployment;

import java.util.HashSet;
import java.util.ServiceLoader;
import java.util.Set;

import jakarta.inject.Singleton;

import org.jboss.jandex.AnnotationInstance;
import org.jboss.jandex.DotName;
import org.jboss.jandex.Type;

import io.fabric8.kubernetes.api.model.KubernetesResource;
import io.fabric8.kubernetes.internal.KubernetesDeserializer;
import io.quarkus.arc.deployment.AdditionalBeanBuildItem;
import io.quarkus.arc.deployment.SyntheticBeanBuildItem;
import io.quarkus.deployment.annotations.BuildProducer;
Expand All @@ -14,19 +20,42 @@
import io.quarkus.deployment.annotations.Record;
import io.quarkus.kubernetes.client.runtime.KubernetesResources;
import io.quarkus.kubernetes.client.runtime.KubernetesSerializationRecorder;
import io.quarkus.kubernetes.client.spi.KubernetesResourcesBuildItem;

public class KubernetesResourceBuildStep {

@BuildStep
void scanKubernetesResourceClasses(BuildProducer<KubernetesResourcesBuildItem> kubernetesResourcesBuildItemBuildProducer) {
final var classLoaders = new ClassLoader[] {
Thread.currentThread().getContextClassLoader(),
KubernetesDeserializer.class.getClassLoader() };
final Set<Class<? extends KubernetesResource>> resourceClasses = new HashSet<>();
for (var classLoader : classLoaders) {
if (classLoader == null) {
continue;
}
final var serviceLoader = ServiceLoader.load(KubernetesResource.class, classLoader);
for (var kr : serviceLoader) {
resourceClasses.add(kr.getClass());
}
}
kubernetesResourcesBuildItemBuildProducer.produce(
new KubernetesResourcesBuildItem(resourceClasses.<Class<? extends KubernetesResource>> toArray(Class[]::new)));
}

@BuildStep
@Record(ExecutionTime.STATIC_INIT)
SyntheticBeanBuildItem kubernetesResourceClasses(
KubernetesSerializationRecorder recorder, BuildProducer<AdditionalBeanBuildItem> additionalBeans) {
KubernetesSerializationRecorder recorder,
KubernetesResourcesBuildItem kubernetesResourcesBuildItem,
BuildProducer<AdditionalBeanBuildItem> additionalBeans) {
additionalBeans.produce(AdditionalBeanBuildItem.unremovableOf(KubernetesResources.class));
final var classArray = Type.create(DotName.createSimple(Class[].class.getName()), Type.Kind.ARRAY);
return SyntheticBeanBuildItem
.configure(Object.class).providerType(classArray).addType(classArray)
.scope(Singleton.class)
.qualifiers(AnnotationInstance.builder(KubernetesResources.class).build())
.runtimeValue(recorder.scanKubernetesResources())
.runtimeValue(recorder.initKubernetesResources(kubernetesResourcesBuildItem.getResourceClasses()))
.done();
}
}
Original file line number Diff line number Diff line change
@@ -1,31 +1,14 @@
package io.quarkus.kubernetes.client.runtime;

import java.util.HashSet;
import java.util.ServiceLoader;
import java.util.Set;

import io.fabric8.kubernetes.api.model.KubernetesResource;
import io.fabric8.kubernetes.internal.KubernetesDeserializer;
import io.quarkus.runtime.RuntimeValue;
import io.quarkus.runtime.annotations.Recorder;

@Recorder
public class KubernetesSerializationRecorder {

public RuntimeValue<Class<? extends KubernetesResource>[]> scanKubernetesResources() {
final var classLoaders = new ClassLoader[] {
Thread.currentThread().getContextClassLoader(),
KubernetesDeserializer.class.getClassLoader() };
final Set<Class<? extends KubernetesResource>> resourceClasses = new HashSet<>();
for (var classLoader : classLoaders) {
if (classLoader == null) {
continue;
}
final var serviceLoader = ServiceLoader.load(KubernetesResource.class, classLoader);
for (var kr : serviceLoader) {
resourceClasses.add(kr.getClass());
}
}
return new RuntimeValue<>(resourceClasses.<Class<? extends KubernetesResource>> toArray(Class[]::new));
public RuntimeValue<Class<? extends KubernetesResource>[]> initKubernetesResources(
Class<? extends KubernetesResource>[] resources) {
return new RuntimeValue<>(resources);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package io.quarkus.kubernetes.client.spi;

import io.fabric8.kubernetes.api.model.KubernetesResource;
import io.quarkus.builder.item.SimpleBuildItem;

public final class KubernetesResourcesBuildItem extends SimpleBuildItem {

private final Class<? extends KubernetesResource>[] resourceClasses;

public KubernetesResourcesBuildItem(Class<? extends KubernetesResource>[] resourceClasses) {
this.resourceClasses = resourceClasses;
}

public Class<? extends KubernetesResource>[] getResourceClasses() {
return resourceClasses;
}
}

0 comments on commit ac642ef

Please sign in to comment.