From 1a14ec975b48dffc4bee9a57437749137b97111b Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Thu, 4 Jul 2024 10:13:35 +0200 Subject: [PATCH] feat: update to informer configuration changes for controller (#895) Requires JOSDK PR 2455 Signed-off-by: Chris Laprun --- ...arkusControllerConfigurationBuildStep.java | 115 +++++++++------ .../test/OneNSConfigurationTest.java | 36 +++++ .../test/sources/OneNSReconciler.java | 18 +++ .../QuarkusControllerConfiguration.java | 131 ++++++------------ .../runtime/QuarkusInformerConfigHolder.java | 12 +- .../it/OperatorSDKResourceTest.java | 4 +- pom.xml | 2 +- 7 files changed, 179 insertions(+), 139 deletions(-) create mode 100644 core/deployment/src/test/java/io/quarkiverse/operatorsdk/test/OneNSConfigurationTest.java create mode 100644 core/deployment/src/test/java/io/quarkiverse/operatorsdk/test/sources/OneNSReconciler.java diff --git a/core/deployment/src/main/java/io/quarkiverse/operatorsdk/deployment/QuarkusControllerConfigurationBuildStep.java b/core/deployment/src/main/java/io/quarkiverse/operatorsdk/deployment/QuarkusControllerConfigurationBuildStep.java index 4accfa5a1..d76971cac 100644 --- a/core/deployment/src/main/java/io/quarkiverse/operatorsdk/deployment/QuarkusControllerConfigurationBuildStep.java +++ b/core/deployment/src/main/java/io/quarkiverse/operatorsdk/deployment/QuarkusControllerConfigurationBuildStep.java @@ -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 NULL_ANNOTATION_SUPPLIER = () -> null; + public static final Supplier NULL_STRING_ARRAY_SUPPLIER = () -> null; + public static final Supplier 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 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,18 +184,43 @@ 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), @@ -194,13 +228,9 @@ static QuarkusControllerConfiguration createConfiguration( 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 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,9 +258,21 @@ static QuarkusControllerConfiguration createConfiguration( // create the configuration final ReconciledAugmentedClassInfo primaryInfo = reconcilerInfo.associatedResourceInfo(); final var primaryAsResource = primaryInfo.asResourceTargeting(); - final var resourceClass = primaryInfo.loadAssociatedClass(); + final Class resourceClass = (Class) 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, @@ -246,16 +280,14 @@ static QuarkusControllerConfiguration createConfiguration( 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); - } } diff --git a/core/deployment/src/test/java/io/quarkiverse/operatorsdk/test/OneNSConfigurationTest.java b/core/deployment/src/test/java/io/quarkiverse/operatorsdk/test/OneNSConfigurationTest.java new file mode 100644 index 000000000..c1065266d --- /dev/null +++ b/core/deployment/src/test/java/io/quarkiverse/operatorsdk/test/OneNSConfigurationTest.java @@ -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()); + } +} diff --git a/core/deployment/src/test/java/io/quarkiverse/operatorsdk/test/sources/OneNSReconciler.java b/core/deployment/src/test/java/io/quarkiverse/operatorsdk/test/sources/OneNSReconciler.java new file mode 100644 index 000000000..cd8617d88 --- /dev/null +++ b/core/deployment/src/test/java/io/quarkiverse/operatorsdk/test/sources/OneNSReconciler.java @@ -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 { + + public static final String NS = "foo"; + + @Override + public UpdateControl reconcile(TestCR testCR, Context context) throws Exception { + return null; + } +} diff --git a/core/runtime/src/main/java/io/quarkiverse/operatorsdk/runtime/QuarkusControllerConfiguration.java b/core/runtime/src/main/java/io/quarkiverse/operatorsdk/runtime/QuarkusControllerConfiguration.java index cb01e1fc6..e34b32cf8 100644 --- a/core/runtime/src/main/java/io/quarkiverse/operatorsdk/runtime/QuarkusControllerConfiguration.java +++ b/core/runtime/src/main/java/io/quarkiverse/operatorsdk/runtime/QuarkusControllerConfiguration.java @@ -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,20 +36,6 @@ public class QuarkusControllerConfiguration implements ControllerConfiguration, 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 name; private final boolean generationAware; private final String associatedReconcilerClassName; @@ -53,28 +43,22 @@ public DefaultRateLimiter(Duration refreshPeriod, int limitForPeriod) { private final String crVersion; private final boolean statusPresentAndNotVoid; private final Class resourceClass; - private final Optional informerListLimit; private final Duration maxReconciliationInterval; - private final Optional> onAddFilter; - private final Optional> onUpdateFilter; - private final Optional> genericFilter; private final List additionalRBACRules; private final List additionalRBACRoleRefs; private final String fieldManager; - private final Optional> itemStore; private Class retryConfigurationClass; private Class retryClass; private Class rateLimiterConfigurationClass; private Class rateLimiterClass; private String finalizer; - private Set namespaces; private boolean wereNamespacesSet; - private String labelSelector; private Retry retry; private RateLimiter rateLimiter; private QuarkusManagedWorkflow workflow; private QuarkusConfigurationService parent; private ExternalGradualRetryConfiguration gradualRetry; + private QuarkusInformerConfigHolder informerConfig; @RecordableConstructor @SuppressWarnings("unchecked") @@ -84,35 +68,28 @@ public QuarkusControllerConfiguration( String resourceTypeName, String crVersion, boolean generationAware, Class resourceClass, - Long nullableInformerListLimit, - Set namespaces, boolean wereNamespacesSet, - String finalizerName, String labelSelector, + String finalizerName, boolean statusPresentAndNotVoid, Duration maxReconciliationInterval, - OnAddFilter onAddFilter, OnUpdateFilter onUpdateFilter, GenericFilter genericFilter, Class retryClass, Class retryConfigurationClass, Class rateLimiterClass, Class rateLimiterConfigurationClass, List additionalRBACRules, List additionalRBACRoleRefs, String fieldManager, - ItemStore nullableItemStore) { + QuarkusInformerConfigHolder 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; - 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; @@ -123,7 +100,6 @@ public QuarkusControllerConfiguration( this.rateLimiterConfigurationClass = rateLimiterConfigurationClass; this.fieldManager = fieldManager != null ? fieldManager : ControllerConfiguration.super.fieldManager(); - this.itemStore = Optional.ofNullable(nullableItemStore); } @Override @@ -141,17 +117,6 @@ public Class getResourceClass() { return resourceClass; } - @Override - public Optional 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; @@ -188,24 +153,18 @@ public String getAssociatedReconcilerClassName() { return associatedReconcilerClassName; } - @Override - public Set getNamespaces() { - return namespaces; - } - void setNamespaces(Set 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 sanitizeNamespaces(Set 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 @@ -219,7 +178,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()); } }); } @@ -235,13 +194,10 @@ public Set getEffectiveNamespaces() { return ControllerConfiguration.super.getEffectiveNamespaces(); } - @Override - public String getLabelSelector() { - return labelSelector; - } - public void setLabelSelector(String labelSelector) { - this.labelSelector = labelSelector; + informerConfig = new QuarkusInformerConfigHolder<>(InformerConfigHolder.builder(informerConfig) + .withLabelSelector(labelSelector) + .buildForController()); } public boolean isStatusPresentAndNotVoid() { @@ -299,34 +255,19 @@ public Duration getMaxReconciliationInterval() { // for Quarkus' RecordableConstructor @SuppressWarnings("unused") public OnAddFilter getOnAddFilter() { - return onAddFilter.orElse(null); - } - - @Override - public Optional> onAddFilter() { - return onAddFilter; + return getInformerConfig().getOnAddFilter(); } // for Quarkus' RecordableConstructor @SuppressWarnings("unused") public OnUpdateFilter getOnUpdateFilter() { - return onUpdateFilter.orElse(null); - } - - @Override - public Optional> onUpdateFilter() { - return onUpdateFilter; + return getInformerConfig().getOnUpdateFilter(); } // for Quarkus' RecordableConstructor @SuppressWarnings("unused") public GenericFilter getGenericFilter() { - return genericFilter.orElse(null); - } - - @Override - public Optional> genericFilter() { - return genericFilter; + return getInformerConfig().getGenericFilter(); } // for Quarkus' RecordableConstructor @@ -421,14 +362,28 @@ public String fieldManager() { return fieldManager; } - @Override - public Optional> getItemStore() { - return itemStore; - } - @SuppressWarnings("unused") // this is needed by Quarkus for the RecordableConstructor public ItemStore getNullableItemStore() { - return itemStore.orElse(null); + return getInformerConfig().getItemStore(); + } + + @Override + public InformerConfigHolder 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); + } } } diff --git a/core/runtime/src/main/java/io/quarkiverse/operatorsdk/runtime/QuarkusInformerConfigHolder.java b/core/runtime/src/main/java/io/quarkiverse/operatorsdk/runtime/QuarkusInformerConfigHolder.java index 92e8df2eb..9db303a2a 100644 --- a/core/runtime/src/main/java/io/quarkiverse/operatorsdk/runtime/QuarkusInformerConfigHolder.java +++ b/core/runtime/src/main/java/io/quarkiverse/operatorsdk/runtime/QuarkusInformerConfigHolder.java @@ -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 extends Informer @RecordableConstructor public QuarkusInformerConfigHolder(String name, Set namespaces, - boolean followControllerNamespacesOnChange, String labelSelector, OnAddFilter onAddFilter, + String labelSelector, OnAddFilter onAddFilter, OnUpdateFilter onUpdateFilter, OnDeleteFilter onDeleteFilter, GenericFilter genericFilter, ItemStore 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 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 sanitizeNamespaces(Set namespaces) { + return namespaces.stream().map(String::trim).collect(Collectors.toSet()); + } } diff --git a/integration-tests/src/test/java/io/quarkiverse/operatorsdk/it/OperatorSDKResourceTest.java b/integration-tests/src/test/java/io/quarkiverse/operatorsdk/it/OperatorSDKResourceTest.java index a2cec1d03..788bcdeef 100644 --- a/integration-tests/src/test/java/io/quarkiverse/operatorsdk/it/OperatorSDKResourceTest.java +++ b/integration-tests/src/test/java/io/quarkiverse/operatorsdk/it/OperatorSDKResourceTest.java @@ -8,7 +8,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; @@ -27,7 +27,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 diff --git a/pom.xml b/pom.xml index 40d18529f..23ea14eb9 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ pom Quarkus - Operator SDK - Parent - 3.12.0 + 999-SNAPSHOT 5.0.0-SNAPSHOT