Skip to content

Commit

Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: update to informer configuration changes for controller (#895)
Browse files Browse the repository at this point in the history
Requires JOSDK PR 2455

Signed-off-by: Chris Laprun <[email protected]>
metacosm committed Jul 4, 2024
1 parent c2de9d9 commit a9728b6
Showing 7 changed files with 179 additions and 139 deletions.
Original file line number Diff line number Diff line change
@@ -7,6 +7,7 @@
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collectors;

import org.jboss.jandex.*;
@@ -24,6 +25,7 @@
import io.javaoperatorsdk.operator.api.config.dependent.DependentResourceSpec;
import io.javaoperatorsdk.operator.api.reconciler.MaxReconciliationInterval;
import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.InformerConfigHolder;
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependent;
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependentConverter;
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependentResource;
@@ -70,6 +72,10 @@ public KubernetesDependentResourceConfig configFrom(KubernetesDependent configAn
new QuarkusInformerConfigHolder(original.informerConfig()));
}
};
private static final Supplier<AnnotationInstance> NULL_ANNOTATION_SUPPLIER = () -> null;
public static final Supplier<String[]> NULL_STRING_ARRAY_SUPPLIER = () -> null;
public static final Supplier<String> NULL_STRING_SUPPLIER = () -> null;

static {
// register Quarkus-specific converter for Kubernetes dependent resources
DependentResourceConfigurationResolver.registerConverter(KubernetesDependentResource.class,
@@ -159,10 +165,13 @@ static QuarkusControllerConfiguration createConfiguration(
Long nullableInformerListLimit = null;
String fieldManager = null;
ItemStore<?> itemStore = null;
Set<String> namespaces = null;
String informerName = null;
String labelSelector = null;
if (controllerAnnotation != null) {
final var intervalFromAnnotation = ConfigurationUtils.annotationValueOrDefault(
controllerAnnotation, "maxReconciliationInterval", AnnotationValue::asNested,
() -> null);
NULL_ANNOTATION_SUPPLIER);
final var interval = ConfigurationUtils.annotationValueOrDefault(
intervalFromAnnotation, "interval", AnnotationValue::asLong,
() -> MaxReconciliationInterval.DEFAULT_INTERVAL);
@@ -175,32 +184,53 @@ static QuarkusControllerConfiguration createConfiguration(
maxReconciliationInterval = Duration.of(interval, timeUnit.toChronoUnit());
}

onAddFilter = ConfigurationUtils.instantiateImplementationClass(
controllerAnnotation, "onAddFilter", OnAddFilter.class, OnAddFilter.class, true, index);
onUpdateFilter = ConfigurationUtils.instantiateImplementationClass(
controllerAnnotation, "onUpdateFilter", OnUpdateFilter.class, OnUpdateFilter.class,
true, index);
genericFilter = ConfigurationUtils.instantiateImplementationClass(
controllerAnnotation, "genericFilter", GenericFilter.class, GenericFilter.class,
true, index);
retryClass = ConfigurationUtils.annotationValueOrDefault(controllerAnnotation,
"retry", av -> loadClass(av.asClass().name().toString(), Retry.class), () -> GenericRetry.class);
// deal with informer configuration
final var informerConfigAnnotation = ConfigurationUtils.annotationValueOrDefault(controllerAnnotation,
"informerConfig", AnnotationValue::asNested, NULL_ANNOTATION_SUPPLIER);
if (informerConfigAnnotation != null) {
onAddFilter = ConfigurationUtils.instantiateImplementationClass(
informerConfigAnnotation, "onAddFilter", OnAddFilter.class, OnAddFilter.class, true, index);
onUpdateFilter = ConfigurationUtils.instantiateImplementationClass(
informerConfigAnnotation, "onUpdateFilter", OnUpdateFilter.class, OnUpdateFilter.class,
true, index);
genericFilter = ConfigurationUtils.instantiateImplementationClass(
informerConfigAnnotation, "genericFilter", GenericFilter.class, GenericFilter.class,
true, index);
retryClass = ConfigurationUtils.annotationValueOrDefault(informerConfigAnnotation,
"retry", av -> loadClass(av.asClass().name().toString(), Retry.class), () -> GenericRetry.class);
nullableInformerListLimit = ConfigurationUtils.annotationValueOrDefault(
informerConfigAnnotation, "informerListLimit", AnnotationValue::asLong,
() -> null);
itemStore = ConfigurationUtils.instantiateImplementationClass(informerConfigAnnotation, "itemStore",
ItemStore.class,
ItemStore.class, true, index);
informerName = ConfigurationUtils.annotationValueOrDefault(informerConfigAnnotation, "name",
AnnotationValue::asString, NULL_STRING_SUPPLIER);
labelSelector = ConfigurationUtils.annotationValueOrDefault(informerConfigAnnotation,
"labelSelector",
AnnotationValue::asString,
NULL_STRING_SUPPLIER);

// extract the namespaces
// first check if we explicitly set the namespaces via the annotations
namespaces = Optional.ofNullable(informerConfigAnnotation.value("namespaces"))
.map(v -> new HashSet<>(Arrays.asList(v.asStringArray())))
.orElse(null);
}

final var retryConfigurableInfo = configurableInfos.get(retryClass.getName());
retryConfigurationClass = getConfigurationAnnotationClass(reconcilerInfo, retryConfigurableInfo);

rateLimiterClass = ConfigurationUtils.annotationValueOrDefault(
controllerAnnotation,
"rateLimiter", av -> loadClass(av.asClass().name().toString(), RateLimiter.class),
() -> DefaultRateLimiter.class);
final var rateLimiterConfigurableInfo = configurableInfos.get(rateLimiterClass.getName());
rateLimiterConfigurationClass = getConfigurationAnnotationClass(reconcilerInfo,
rateLimiterConfigurableInfo);
nullableInformerListLimit = ConfigurationUtils.annotationValueOrDefault(
controllerAnnotation, "informerListLimit", AnnotationValue::asLong,
() -> null);

fieldManager = ConfigurationUtils.annotationValueOrDefault(controllerAnnotation, "fieldManager",
AnnotationValue::asString, () -> null);
itemStore = ConfigurationUtils.instantiateImplementationClass(controllerAnnotation, "itemStore", ItemStore.class,
ItemStore.class, true, index);
AnnotationValue::asString, NULL_STRING_SUPPLIER);
}

// check if we have additional RBAC rules to handle
@@ -209,14 +239,6 @@ static QuarkusControllerConfiguration createConfiguration(
// check if we have additional RBAC role refs to handle
final var additionalRBACRoleRefs = extractAdditionalRBACRoleRefs(info);

// extract the namespaces
// first check if we explicitly set the namespaces via the annotations
Set<String> namespaces = null;
if (controllerAnnotation != null) {
namespaces = Optional.ofNullable(controllerAnnotation.value("namespaces"))
.map(v -> new HashSet<>(Arrays.asList(v.asStringArray())))
.orElse(null);
}
// remember whether or not we explicitly set the namespaces
final boolean wereNamespacesSet;
if (namespaces == null) {
@@ -236,26 +258,36 @@ static QuarkusControllerConfiguration createConfiguration(
// create the configuration
final ReconciledAugmentedClassInfo<?> primaryInfo = reconcilerInfo.associatedResourceInfo();
final var primaryAsResource = primaryInfo.asResourceTargeting();
final var resourceClass = primaryInfo.loadAssociatedClass();
final Class<? extends HasMetadata> resourceClass = (Class<? extends HasMetadata>) primaryInfo.loadAssociatedClass();
final String resourceFullName = primaryAsResource.fullResourceName();

final var informerConfigHolder = InformerConfigHolder.builder(resourceClass)
.withName(informerName)
.withNamespaces(namespaces)
.withLabelSelector(labelSelector)
.withGenericFilter(genericFilter)
.withOnAddFilter(onAddFilter)
.withOnUpdateFilter(onUpdateFilter)
.withItemStore(itemStore)
.withInformerListLimit(nullableInformerListLimit)
.buildForController();
final var informerConfig = new QuarkusInformerConfigHolder(informerConfigHolder);

configuration = new QuarkusControllerConfiguration(
reconcilerClassName,
name,
resourceFullName,
primaryAsResource.version(),
configExtractor.generationAware(),
resourceClass,
nullableInformerListLimit,
namespaces,
wereNamespacesSet,
getFinalizer(controllerAnnotation, resourceFullName),
getLabelSelector(controllerAnnotation),
primaryAsResource.hasNonVoidStatus(),
maxReconciliationInterval,
onAddFilter, onUpdateFilter, genericFilter, retryClass, retryConfigurationClass, rateLimiterClass,
retryClass, retryConfigurationClass, rateLimiterClass,
rateLimiterConfigurationClass, additionalRBACRules, additionalRBACRoleRefs,
fieldManager, itemStore);
fieldManager,
informerConfig);

// compute workflow and set it
initializeWorkflowIfNeeded(configuration, reconcilerInfo, index);
@@ -341,27 +373,27 @@ private static PolicyRule extractRule(AnnotationInstance ruleAnnotation) {
builder.withApiGroups(ConfigurationUtils.annotationValueOrDefault(ruleAnnotation,
"apiGroups",
AnnotationValue::asStringArray,
() -> null));
NULL_STRING_ARRAY_SUPPLIER));

builder.withVerbs(ConfigurationUtils.annotationValueOrDefault(ruleAnnotation,
"verbs",
AnnotationValue::asStringArray,
() -> null));
NULL_STRING_ARRAY_SUPPLIER));

builder.withResources(ConfigurationUtils.annotationValueOrDefault(ruleAnnotation,
"resources",
AnnotationValue::asStringArray,
() -> null));
NULL_STRING_ARRAY_SUPPLIER));

builder.withResourceNames(ConfigurationUtils.annotationValueOrDefault(ruleAnnotation,
"resourceNames",
AnnotationValue::asStringArray,
() -> null));
NULL_STRING_ARRAY_SUPPLIER));

builder.withNonResourceURLs(ConfigurationUtils.annotationValueOrDefault(ruleAnnotation,
"nonResourceURLs",
AnnotationValue::asStringArray,
() -> null));
NULL_STRING_ARRAY_SUPPLIER));

return builder.build();
}
@@ -378,7 +410,7 @@ private static RoleRef extractRoleRef(AnnotationInstance roleRefAnnotation) {
builder.withName(ConfigurationUtils.annotationValueOrDefault(roleRefAnnotation,
"name",
AnnotationValue::asString,
() -> null));
NULL_STRING_SUPPLIER));

return builder.build();
}
@@ -440,7 +472,7 @@ private static DependentResourceSpecMetadata createDependentResourceSpec(

final var useEventSourceWithName = ConfigurationUtils.annotationValueOrDefault(
dependentConfig, "useEventSourceWithName", AnnotationValue::asString,
() -> null);
NULL_STRING_SUPPLIER);

final var spec = new DependentResourceSpecMetadata(dependentClass, dependent.nameOrFailIfUnset(),
dependsOn, readyCondition, reconcilePrecondition, deletePostcondition, activationCondition,
@@ -457,11 +489,4 @@ private static String getFinalizer(AnnotationInstance controllerAnnotation, Stri
AnnotationValue::asString,
() -> ReconcilerUtils.getDefaultFinalizerName(crdName));
}

private static String getLabelSelector(AnnotationInstance controllerAnnotation) {
return ConfigurationUtils.annotationValueOrDefault(controllerAnnotation,
"labelSelector",
AnnotationValue::asString,
() -> null);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package io.quarkiverse.operatorsdk.test;

import static org.junit.jupiter.api.Assertions.assertEquals;

import java.util.Set;

import jakarta.inject.Inject;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;

import io.javaoperatorsdk.operator.api.config.ConfigurationService;
import io.quarkiverse.operatorsdk.test.sources.OneNSReconciler;
import io.quarkiverse.operatorsdk.test.sources.TestCR;
import io.quarkus.test.QuarkusUnitTest;

public class OneNSConfigurationTest {

@RegisterExtension
static QuarkusUnitTest runner = new QuarkusUnitTest()
.overrideConfigKey("quarkus.operator-sdk.start-operator", "false")
.withApplicationRoot(
jar -> jar.addClasses(OneNSReconciler.class, TestCR.class));

@Inject
ConfigurationService configurationService;

@Inject
OneNSReconciler testReconciler;

@Test
void checkDefaultOperatorLevelNamespaces() {
final var config = configurationService.getConfigurationFor(testReconciler);
assertEquals(Set.of(OneNSReconciler.NS), config.getNamespaces());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package io.quarkiverse.operatorsdk.test.sources;

import io.javaoperatorsdk.operator.api.reconciler.Context;
import io.javaoperatorsdk.operator.api.reconciler.ControllerConfiguration;
import io.javaoperatorsdk.operator.api.reconciler.Reconciler;
import io.javaoperatorsdk.operator.api.reconciler.UpdateControl;
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.InformerConfig;

@ControllerConfiguration(informerConfig = @InformerConfig(namespaces = OneNSReconciler.NS))
public class OneNSReconciler implements Reconciler<TestCR> {

public static final String NS = "foo";

@Override
public UpdateControl<TestCR> reconcile(TestCR testCR, Context<TestCR> context) throws Exception {
return null;
}
}
Original file line number Diff line number Diff line change
@@ -2,8 +2,11 @@

import java.lang.annotation.Annotation;
import java.time.Duration;
import java.util.*;
import java.util.stream.Collectors;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;

import io.fabric8.kubernetes.api.model.HasMetadata;
import io.fabric8.kubernetes.api.model.rbac.PolicyRule;
@@ -17,6 +20,7 @@
import io.javaoperatorsdk.operator.api.config.dependent.DependentResourceSpec;
import io.javaoperatorsdk.operator.api.config.workflow.WorkflowSpec;
import io.javaoperatorsdk.operator.api.reconciler.Reconciler;
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.InformerConfigHolder;
import io.javaoperatorsdk.operator.processing.event.rate.LinearRateLimiter;
import io.javaoperatorsdk.operator.processing.event.rate.RateLimiter;
import io.javaoperatorsdk.operator.processing.event.source.filter.GenericFilter;
@@ -32,49 +36,29 @@
public class QuarkusControllerConfiguration<R extends HasMetadata> implements ControllerConfiguration<R>,
DependentResourceConfigurationProvider {

// Needed by Quarkus because LinearRateLimiter doesn't expose setters for byte recording
public final static class DefaultRateLimiter extends LinearRateLimiter {

public DefaultRateLimiter() {
super();
}

@RecordableConstructor
@SuppressWarnings("unused")
public DefaultRateLimiter(Duration refreshPeriod, int limitForPeriod) {
super(refreshPeriod, limitForPeriod);
}
}

private final String associatedReconcilerClassName;
private final String name;
private final String resourceTypeName;
private final String crVersion;
private final boolean generationAware;
private final boolean statusPresentAndNotVoid;
private final Class<R> resourceClass;
private final Optional<Long> informerListLimit;
private final Optional<OnAddFilter<? super R>> onAddFilter;
private final Optional<OnUpdateFilter<? super R>> onUpdateFilter;
private final Optional<GenericFilter<? super R>> genericFilter;
private final List<PolicyRule> additionalRBACRules;
private final List<RoleRef> additionalRBACRoleRefs;
private final String fieldManager;
private final Optional<ItemStore<R>> itemStore;
private Class<? extends Annotation> retryConfigurationClass;
private Class<? extends Retry> retryClass;
private Class<? extends Annotation> rateLimiterConfigurationClass;
private Class<? extends RateLimiter> rateLimiterClass;
private Optional<Duration> maxReconciliationInterval;
private String finalizer;
private Set<String> namespaces;
private boolean wereNamespacesSet;
private String labelSelector;
private Retry retry;
private RateLimiter rateLimiter;
private QuarkusManagedWorkflow<R> workflow;
private QuarkusConfigurationService parent;
private ExternalGradualRetryConfiguration gradualRetry;
private QuarkusInformerConfigHolder<R> informerConfig;

@RecordableConstructor
@SuppressWarnings("unchecked")
@@ -84,36 +68,29 @@ public QuarkusControllerConfiguration(
String resourceTypeName,
String crVersion, boolean generationAware,
Class resourceClass,
Long nullableInformerListLimit,
Set<String> namespaces,
boolean wereNamespacesSet,
String finalizerName, String labelSelector,
String finalizerName,
boolean statusPresentAndNotVoid,
Duration maxReconciliationInterval,
OnAddFilter<R> onAddFilter, OnUpdateFilter<R> onUpdateFilter, GenericFilter<R> genericFilter,
Class<? extends Retry> retryClass, Class<? extends Annotation> retryConfigurationClass,
Class<? extends RateLimiter> rateLimiterClass, Class<? extends Annotation> rateLimiterConfigurationClass,
List<PolicyRule> additionalRBACRules, List<RoleRef> additionalRBACRoleRefs, String fieldManager,
ItemStore<R> nullableItemStore) {
QuarkusInformerConfigHolder<R> informerConfig) {
this.informerConfig = informerConfig;
this.associatedReconcilerClassName = associatedReconcilerClassName;
this.name = name;
this.resourceTypeName = resourceTypeName;
this.crVersion = crVersion;
this.generationAware = generationAware;
this.resourceClass = resourceClass;
this.informerListLimit = Optional.ofNullable(nullableInformerListLimit);
this.additionalRBACRules = additionalRBACRules;
this.additionalRBACRoleRefs = additionalRBACRoleRefs;
setNamespaces(namespaces);
setNamespaces(informerConfig.getNamespaces());
this.wereNamespacesSet = wereNamespacesSet;
setFinalizer(finalizerName);
this.labelSelector = labelSelector;
this.statusPresentAndNotVoid = statusPresentAndNotVoid;
this.maxReconciliationInterval = maxReconciliationInterval != null ? Optional.of(maxReconciliationInterval)
: ControllerConfiguration.super.maxReconciliationInterval();
this.onAddFilter = Optional.ofNullable(onAddFilter);
this.onUpdateFilter = Optional.ofNullable(onUpdateFilter);
this.genericFilter = Optional.ofNullable(genericFilter);

this.retryClass = retryClass;
this.retry = GenericRetry.class.equals(retryClass) ? new GenericRetry() : null;
@@ -124,7 +101,6 @@ public QuarkusControllerConfiguration(
this.rateLimiterConfigurationClass = rateLimiterConfigurationClass;

this.fieldManager = fieldManager != null ? fieldManager : ControllerConfiguration.super.fieldManager();
this.itemStore = Optional.ofNullable(nullableItemStore);
}

@Override
@@ -142,17 +118,6 @@ public Class<R> getResourceClass() {
return resourceClass;
}

@Override
public Optional<Long> getInformerListLimit() {
return informerListLimit;
}

@SuppressWarnings("unused")
// this is needed by Quarkus for the RecordableConstructor
public Long getNullableInformerListLimit() {
return informerListLimit.orElse(null);
}

@Override
public String getName() {
return name;
@@ -189,24 +154,18 @@ public String getAssociatedReconcilerClassName() {
return associatedReconcilerClassName;
}

@Override
public Set<String> getNamespaces() {
return namespaces;
}

void setNamespaces(Set<String> namespaces) {
if (!namespaces.equals(this.namespaces)) {
this.namespaces = sanitizeNamespaces(namespaces);
if (!namespaces.equals(informerConfig.getNamespaces())) {
informerConfig = new QuarkusInformerConfigHolder<>(
InformerConfigHolder.builder(informerConfig)
.withNamespaces(namespaces)
.buildForController());
wereNamespacesSet = true;
// propagate namespace changes to the dependents' config if needed
propagateNamespacesToDependents();
}
}

private static Set<String> sanitizeNamespaces(Set<String> namespaces) {
return namespaces.stream().map(String::trim).collect(Collectors.toSet());
}

/**
* Record potentially user-set namespaces, updating the dependent resources, which should have been set before this method
* is called. Note that this method won't affect the status of whether the namespaces were set by the user or not, as this
@@ -220,7 +179,7 @@ public void propagateNamespacesToDependents() {
dependentsMetadata().forEach((unused, spec) -> {
final var config = spec.getConfiguration().orElse(null);
if (config instanceof QuarkusKubernetesDependentResourceConfig qConfig) {
qConfig.setNamespaces(namespaces);
qConfig.setNamespaces(getNamespaces());
}
});
}
@@ -236,13 +195,10 @@ public Set<String> getEffectiveNamespaces() {
return ControllerConfiguration.super.getEffectiveNamespaces();
}

@Override
public String getLabelSelector() {
return labelSelector;
}

void setLabelSelector(String labelSelector) {
this.labelSelector = labelSelector;
informerConfig = new QuarkusInformerConfigHolder<>(InformerConfigHolder.builder(informerConfig)
.withLabelSelector(labelSelector)
.buildForController());
}

public boolean isStatusPresentAndNotVoid() {
@@ -304,34 +260,19 @@ void setMaxReconciliationInterval(Duration duration) {
// for Quarkus' RecordableConstructor
@SuppressWarnings("unused")
public OnAddFilter<? super R> getOnAddFilter() {
return onAddFilter.orElse(null);
}

@Override
public Optional<OnAddFilter<? super R>> onAddFilter() {
return onAddFilter;
return getInformerConfig().getOnAddFilter();
}

// for Quarkus' RecordableConstructor
@SuppressWarnings("unused")
public OnUpdateFilter<? super R> getOnUpdateFilter() {
return onUpdateFilter.orElse(null);
}

@Override
public Optional<OnUpdateFilter<? super R>> onUpdateFilter() {
return onUpdateFilter;
return getInformerConfig().getOnUpdateFilter();
}

// for Quarkus' RecordableConstructor
@SuppressWarnings("unused")
public GenericFilter<? super R> getGenericFilter() {
return genericFilter.orElse(null);
}

@Override
public Optional<GenericFilter<? super R>> genericFilter() {
return genericFilter;
return getInformerConfig().getGenericFilter();
}

// for Quarkus' RecordableConstructor
@@ -426,14 +367,28 @@ public String fieldManager() {
return fieldManager;
}

@Override
public Optional<ItemStore<R>> getItemStore() {
return itemStore;
}

@SuppressWarnings("unused")
// this is needed by Quarkus for the RecordableConstructor
public ItemStore<R> getNullableItemStore() {
return itemStore.orElse(null);
return getInformerConfig().getItemStore();
}

@Override
public InformerConfigHolder<R> getInformerConfig() {
return informerConfig;
}

// Needed by Quarkus because LinearRateLimiter doesn't expose setters for byte recording
public final static class DefaultRateLimiter extends LinearRateLimiter {

public DefaultRateLimiter() {
super();
}

@RecordableConstructor
@SuppressWarnings("unused")
public DefaultRateLimiter(Duration refreshPeriod, int limitForPeriod) {
super(refreshPeriod, limitForPeriod);
}
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package io.quarkiverse.operatorsdk.runtime;

import java.util.Set;
import java.util.stream.Collectors;

import io.fabric8.kubernetes.api.model.HasMetadata;
import io.fabric8.kubernetes.client.informers.cache.ItemStore;
@@ -15,16 +16,21 @@ public class QuarkusInformerConfigHolder<R extends HasMetadata> extends Informer

@RecordableConstructor
public QuarkusInformerConfigHolder(String name, Set<String> namespaces,
boolean followControllerNamespacesOnChange, String labelSelector, OnAddFilter<? super R> onAddFilter,
String labelSelector, OnAddFilter<? super R> onAddFilter,
OnUpdateFilter<? super R> onUpdateFilter, OnDeleteFilter<? super R> onDeleteFilter,
GenericFilter<? super R> genericFilter, ItemStore<R> itemStore, Long informerListLimit) {
super(name, namespaces, followControllerNamespacesOnChange, labelSelector, onAddFilter, onUpdateFilter, onDeleteFilter,
super(name, namespaces, false, labelSelector, onAddFilter, onUpdateFilter, onDeleteFilter,
genericFilter, itemStore, informerListLimit);
}

public QuarkusInformerConfigHolder(InformerConfigHolder<R> config) {
this(config.getName(), config.getNamespaces(), config.isFollowControllerNamespacesOnChange(), config.getLabelSelector(),
this(config.getName(), sanitizeNamespaces(config.getNamespaces()),
config.getLabelSelector(),
config.getOnAddFilter(), config.getOnUpdateFilter(), config.getOnDeleteFilter(), config.getGenericFilter(),
config.getItemStore(), config.getInformerListLimit());
}

private static Set<String> sanitizeNamespaces(Set<String> namespaces) {
return namespaces.stream().map(String::trim).collect(Collectors.toSet());
}
}
Original file line number Diff line number Diff line change
@@ -10,7 +10,7 @@
import org.junit.jupiter.api.Test;

import io.javaoperatorsdk.operator.ReconcilerUtils;
import io.quarkus.test.common.QuarkusTestResource;
import io.quarkus.test.common.WithTestResource;
import io.quarkus.test.junit.DisabledOnIntegrationTest;
import io.quarkus.test.junit.QuarkusTest;

@@ -29,7 +29,7 @@
* See also {@code maven-surefire-plugin} configuration where these same environment variables are set
*/
@QuarkusTest
@QuarkusTestResource(CustomKubernetesServerTestResource.class)
@WithTestResource(CustomKubernetesServerTestResource.class)
class OperatorSDKResourceTest {

@BeforeAll
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
@@ -12,7 +12,7 @@
<packaging>pom</packaging>
<name>Quarkus - Operator SDK - Parent</name>
<properties>
<quarkus.version>3.12.0</quarkus.version>
<quarkus.version>999-SNAPSHOT</quarkus.version>
<java-operator-sdk.version>5.0.0-SNAPSHOT</java-operator-sdk.version>
</properties>
<scm>

0 comments on commit a9728b6

Please sign in to comment.