This is an automated email from the ASF dual-hosted git repository. jamesnetherton pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git
The following commit(s) were added to refs/heads/main by this push: new bd7d6011b8 Make the majority of KuberenetesClusterService configuration overridable at runtime bd7d6011b8 is described below commit bd7d6011b8c70a88d9749f098811541c2ff9bd79 Author: James Netherton <jamesnether...@gmail.com> AuthorDate: Tue Feb 13 11:50:19 2024 +0000 Make the majority of KuberenetesClusterService configuration overridable at runtime Fixes #5739 --- .../pages/reference/extensions/kubernetes.adoc | 38 ++++++++-------- .../KubernetesClusterServiceProcessor.java | 25 ++++++----- ...erServiceConfigEnabledWithRebalancingTest.java} | 2 +- .../KubernetesClusterServiceBuildTimeConfig.java | 51 ++++++++++++++++++++++ .../cluster/KubernetesClusterServiceRecorder.java | 30 ++++++------- ... => KubernetesClusterServiceRuntimeConfig.java} | 30 ++----------- 6 files changed, 102 insertions(+), 74 deletions(-) diff --git a/docs/modules/ROOT/pages/reference/extensions/kubernetes.adoc b/docs/modules/ROOT/pages/reference/extensions/kubernetes.adoc index a2a6e97a6c..97fc2967c9 100644 --- a/docs/modules/ROOT/pages/reference/extensions/kubernetes.adoc +++ b/docs/modules/ROOT/pages/reference/extensions/kubernetes.adoc @@ -125,85 +125,85 @@ Whether a Kubernetes Cluster Service should be automatically configured accordin | `boolean` | `false` -|icon:lock[title=Fixed at build time] [[quarkus.camel.cluster.kubernetes.id]]`link:#quarkus.camel.cluster.kubernetes.id[quarkus.camel.cluster.kubernetes.id]` +|icon:lock[title=Fixed at build time] [[quarkus.camel.cluster.kubernetes.rebalancing]]`link:#quarkus.camel.cluster.kubernetes.rebalancing[quarkus.camel.cluster.kubernetes.rebalancing]` + +Whether the camel master namespace leaders should be distributed evenly across all the camel contexts in the cluster. +| `boolean` +| `true` + +| [[quarkus.camel.cluster.kubernetes.id]]`link:#quarkus.camel.cluster.kubernetes.id[quarkus.camel.cluster.kubernetes.id]` The cluster service ID (defaults to null). | `string` | -|icon:lock[title=Fixed at build time] [[quarkus.camel.cluster.kubernetes.master-url]]`link:#quarkus.camel.cluster.kubernetes.master-url[quarkus.camel.cluster.kubernetes.master-url]` +| [[quarkus.camel.cluster.kubernetes.master-url]]`link:#quarkus.camel.cluster.kubernetes.master-url[quarkus.camel.cluster.kubernetes.master-url]` The URL of the Kubernetes master (read from Kubernetes client properties by default). | `string` | -|icon:lock[title=Fixed at build time] [[quarkus.camel.cluster.kubernetes.connection-timeout-millis]]`link:#quarkus.camel.cluster.kubernetes.connection-timeout-millis[quarkus.camel.cluster.kubernetes.connection-timeout-millis]` +| [[quarkus.camel.cluster.kubernetes.connection-timeout-millis]]`link:#quarkus.camel.cluster.kubernetes.connection-timeout-millis[quarkus.camel.cluster.kubernetes.connection-timeout-millis]` The connection timeout in milliseconds to use when making requests to the Kubernetes API server. | `java.lang.Integer` | -|icon:lock[title=Fixed at build time] [[quarkus.camel.cluster.kubernetes.namespace]]`link:#quarkus.camel.cluster.kubernetes.namespace[quarkus.camel.cluster.kubernetes.namespace]` +| [[quarkus.camel.cluster.kubernetes.namespace]]`link:#quarkus.camel.cluster.kubernetes.namespace[quarkus.camel.cluster.kubernetes.namespace]` The name of the Kubernetes namespace containing the pods and the configmap (autodetected by default). | `string` | -|icon:lock[title=Fixed at build time] [[quarkus.camel.cluster.kubernetes.pod-name]]`link:#quarkus.camel.cluster.kubernetes.pod-name[quarkus.camel.cluster.kubernetes.pod-name]` +| [[quarkus.camel.cluster.kubernetes.pod-name]]`link:#quarkus.camel.cluster.kubernetes.pod-name[quarkus.camel.cluster.kubernetes.pod-name]` The name of the current pod (autodetected from container host name by default). | `string` | -|icon:lock[title=Fixed at build time] [[quarkus.camel.cluster.kubernetes.jitter-factor]]`link:#quarkus.camel.cluster.kubernetes.jitter-factor[quarkus.camel.cluster.kubernetes.jitter-factor]` +| [[quarkus.camel.cluster.kubernetes.jitter-factor]]`link:#quarkus.camel.cluster.kubernetes.jitter-factor[quarkus.camel.cluster.kubernetes.jitter-factor]` The jitter factor to apply in order to prevent all pods to call Kubernetes APIs in the same instant (defaults to 1.2). | `java.lang.Double` | -|icon:lock[title=Fixed at build time] [[quarkus.camel.cluster.kubernetes.lease-duration-millis]]`link:#quarkus.camel.cluster.kubernetes.lease-duration-millis[quarkus.camel.cluster.kubernetes.lease-duration-millis]` +| [[quarkus.camel.cluster.kubernetes.lease-duration-millis]]`link:#quarkus.camel.cluster.kubernetes.lease-duration-millis[quarkus.camel.cluster.kubernetes.lease-duration-millis]` The default duration of the lease for the current leader (defaults to 15000). | `java.lang.Long` | -|icon:lock[title=Fixed at build time] [[quarkus.camel.cluster.kubernetes.renew-deadline-millis]]`link:#quarkus.camel.cluster.kubernetes.renew-deadline-millis[quarkus.camel.cluster.kubernetes.renew-deadline-millis]` +| [[quarkus.camel.cluster.kubernetes.renew-deadline-millis]]`link:#quarkus.camel.cluster.kubernetes.renew-deadline-millis[quarkus.camel.cluster.kubernetes.renew-deadline-millis]` The deadline after which the leader must stop its services because it may have lost the leadership (defaults to 10000). | `java.lang.Long` | -|icon:lock[title=Fixed at build time] [[quarkus.camel.cluster.kubernetes.retry-period-millis]]`link:#quarkus.camel.cluster.kubernetes.retry-period-millis[quarkus.camel.cluster.kubernetes.retry-period-millis]` +| [[quarkus.camel.cluster.kubernetes.retry-period-millis]]`link:#quarkus.camel.cluster.kubernetes.retry-period-millis[quarkus.camel.cluster.kubernetes.retry-period-millis]` The time between two subsequent attempts to check and acquire the leadership. It is randomized using the jitter factor (defaults to 2000). | `java.lang.Long` | -|icon:lock[title=Fixed at build time] [[quarkus.camel.cluster.kubernetes.order]]`link:#quarkus.camel.cluster.kubernetes.order[quarkus.camel.cluster.kubernetes.order]` +| [[quarkus.camel.cluster.kubernetes.order]]`link:#quarkus.camel.cluster.kubernetes.order[quarkus.camel.cluster.kubernetes.order]` Service lookup order/priority (defaults to 2147482647). | `java.lang.Integer` | -|icon:lock[title=Fixed at build time] [[quarkus.camel.cluster.kubernetes.resource-name]]`link:#quarkus.camel.cluster.kubernetes.resource-name[quarkus.camel.cluster.kubernetes.resource-name]` +| [[quarkus.camel.cluster.kubernetes.resource-name]]`link:#quarkus.camel.cluster.kubernetes.resource-name[quarkus.camel.cluster.kubernetes.resource-name]` The name of the lease resource used to do optimistic locking (defaults to 'leaders'). The resource name is used as prefix when the underlying Kubernetes resource can manage a single lock. | `string` | -|icon:lock[title=Fixed at build time] [[quarkus.camel.cluster.kubernetes.lease-resource-type]]`link:#quarkus.camel.cluster.kubernetes.lease-resource-type[quarkus.camel.cluster.kubernetes.lease-resource-type]` +| [[quarkus.camel.cluster.kubernetes.lease-resource-type]]`link:#quarkus.camel.cluster.kubernetes.lease-resource-type[quarkus.camel.cluster.kubernetes.lease-resource-type]` The lease resource type used in Kubernetes, either 'config-map' or 'lease' (defaults to 'lease'). | `org.apache.camel.component.kubernetes.cluster.LeaseResourceType` | -|icon:lock[title=Fixed at build time] [[quarkus.camel.cluster.kubernetes.rebalancing]]`link:#quarkus.camel.cluster.kubernetes.rebalancing[quarkus.camel.cluster.kubernetes.rebalancing]` - -Whether the camel master namespace leaders should be distributed evenly across all the camel contexts in the cluster. -| `boolean` -| `true` - -|icon:lock[title=Fixed at build time] [[quarkus.camel.cluster.kubernetes.labels]]`link:#quarkus.camel.cluster.kubernetes.labels[quarkus.camel.cluster.kubernetes.labels]` +| [[quarkus.camel.cluster.kubernetes.labels]]`link:#quarkus.camel.cluster.kubernetes.labels[quarkus.camel.cluster.kubernetes.labels]` The labels key/value used to identify the pods composing the cluster, defaults to empty map. | ``Map<String,String>`` diff --git a/extensions/kubernetes/deployment/src/main/java/org/apache/camel/quarkus/component/kubernetes/cluster/deployment/KubernetesClusterServiceProcessor.java b/extensions/kubernetes/deployment/src/main/java/org/apache/camel/quarkus/component/kubernetes/cluster/deployment/KubernetesClusterServiceProcessor.java index ff3962e3f5..96a9c34b9a 100644 --- a/extensions/kubernetes/deployment/src/main/java/org/apache/camel/quarkus/component/kubernetes/cluster/deployment/KubernetesClusterServiceProcessor.java +++ b/extensions/kubernetes/deployment/src/main/java/org/apache/camel/quarkus/component/kubernetes/cluster/deployment/KubernetesClusterServiceProcessor.java @@ -22,30 +22,31 @@ import io.quarkus.deployment.annotations.ExecutionTime; import io.quarkus.deployment.annotations.Record; import io.quarkus.runtime.RuntimeValue; import org.apache.camel.component.kubernetes.cluster.KubernetesClusterService; -import org.apache.camel.quarkus.component.kubernetes.cluster.KubernetesClusterServiceConfig; +import org.apache.camel.quarkus.component.kubernetes.cluster.KubernetesClusterServiceBuildTimeConfig; import org.apache.camel.quarkus.component.kubernetes.cluster.KubernetesClusterServiceRecorder; -import org.apache.camel.quarkus.core.deployment.spi.CamelBeanBuildItem; +import org.apache.camel.quarkus.component.kubernetes.cluster.KubernetesClusterServiceRuntimeConfig; import org.apache.camel.quarkus.core.deployment.spi.CamelContextBuildItem; +import org.apache.camel.quarkus.core.deployment.spi.CamelRuntimeBeanBuildItem; import org.apache.camel.support.cluster.RebalancingCamelClusterService; class KubernetesClusterServiceProcessor { - @Record(ExecutionTime.STATIC_INIT) - @BuildStep(onlyIf = KubernetesClusterServiceConfig.Enabled.class) + @Record(ExecutionTime.RUNTIME_INIT) + @BuildStep(onlyIf = KubernetesClusterServiceBuildTimeConfig.Enabled.class) @Consume(CamelContextBuildItem.class) - CamelBeanBuildItem setupKubernetesClusterService( - KubernetesClusterServiceConfig config, + CamelRuntimeBeanBuildItem setupKubernetesClusterService( + KubernetesClusterServiceBuildTimeConfig buildTimeConfig, + KubernetesClusterServiceRuntimeConfig runtimeConfig, KubernetesClusterServiceRecorder recorder) { - if (config.rebalancing) { + if (buildTimeConfig.rebalancing) { final RuntimeValue<RebalancingCamelClusterService> krcs = recorder - .createKubernetesRebalancingClusterService(config); - return new CamelBeanBuildItem("kubernetesRebalancingClusterService", + .createKubernetesRebalancingClusterService(runtimeConfig); + return new CamelRuntimeBeanBuildItem("kubernetesRebalancingClusterService", RebalancingCamelClusterService.class.getName(), krcs); } else { - final RuntimeValue<KubernetesClusterService> kcs = recorder.createKubernetesClusterService(config); - return new CamelBeanBuildItem("kubernetesClusterService", KubernetesClusterService.class.getName(), kcs); + final RuntimeValue<KubernetesClusterService> kcs = recorder.createKubernetesClusterService(runtimeConfig); + return new CamelRuntimeBeanBuildItem("kubernetesClusterService", KubernetesClusterService.class.getName(), kcs); } } - } diff --git a/extensions/kubernetes/deployment/src/test/java/org/apache/camel/quarkus/component/kubernetes/cluster/deployment/KubernetesClusterServiceConfigEnabledWithRebalancingtTest.java b/extensions/kubernetes/deployment/src/test/java/org/apache/camel/quarkus/component/kubernetes/cluster/deployment/KubernetesClusterServiceConfigEnabledWithRebalancingTest.java similarity index 99% rename from extensions/kubernetes/deployment/src/test/java/org/apache/camel/quarkus/component/kubernetes/cluster/deployment/KubernetesClusterServiceConfigEnabledWithRebalancingtTest.java rename to extensions/kubernetes/deployment/src/test/java/org/apache/camel/quarkus/component/kubernetes/cluster/deployment/KubernetesClusterServiceConfigEnabledWithRebalancingTest.java index 28e41eb5cf..7c4196e2ca 100644 --- a/extensions/kubernetes/deployment/src/test/java/org/apache/camel/quarkus/component/kubernetes/cluster/deployment/KubernetesClusterServiceConfigEnabledWithRebalancingtTest.java +++ b/extensions/kubernetes/deployment/src/test/java/org/apache/camel/quarkus/component/kubernetes/cluster/deployment/KubernetesClusterServiceConfigEnabledWithRebalancingTest.java @@ -34,7 +34,7 @@ import org.junit.jupiter.api.extension.RegisterExtension; import static org.junit.jupiter.api.Assertions.assertEquals; -public class KubernetesClusterServiceConfigEnabledWithRebalancingtTest { +public class KubernetesClusterServiceConfigEnabledWithRebalancingTest { @RegisterExtension static final QuarkusUnitTest CONFIG = new QuarkusUnitTest() .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class).addAsResource(applicationProperties(), diff --git a/extensions/kubernetes/runtime/src/main/java/org/apache/camel/quarkus/component/kubernetes/cluster/KubernetesClusterServiceBuildTimeConfig.java b/extensions/kubernetes/runtime/src/main/java/org/apache/camel/quarkus/component/kubernetes/cluster/KubernetesClusterServiceBuildTimeConfig.java new file mode 100644 index 0000000000..7d992f6e8f --- /dev/null +++ b/extensions/kubernetes/runtime/src/main/java/org/apache/camel/quarkus/component/kubernetes/cluster/KubernetesClusterServiceBuildTimeConfig.java @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.quarkus.component.kubernetes.cluster; + +import java.util.function.BooleanSupplier; + +import io.quarkus.runtime.annotations.ConfigItem; +import io.quarkus.runtime.annotations.ConfigPhase; +import io.quarkus.runtime.annotations.ConfigRoot; + +@ConfigRoot(name = "camel.cluster.kubernetes", phase = ConfigPhase.BUILD_AND_RUN_TIME_FIXED) +public class KubernetesClusterServiceBuildTimeConfig { + + /** + * Whether a Kubernetes Cluster Service should be automatically configured + * according to 'quarkus.camel.cluster.kubernetes.*' configurations. + */ + @ConfigItem(defaultValue = "false") + public boolean enabled; + + /** + * Whether the camel master namespace leaders should be distributed evenly + * across all the camel contexts in the cluster. + */ + @ConfigItem(defaultValue = "true") + public boolean rebalancing; + + public static final class Enabled implements BooleanSupplier { + KubernetesClusterServiceBuildTimeConfig config; + + @Override + public boolean getAsBoolean() { + return config.enabled; + } + } + +} diff --git a/extensions/kubernetes/runtime/src/main/java/org/apache/camel/quarkus/component/kubernetes/cluster/KubernetesClusterServiceRecorder.java b/extensions/kubernetes/runtime/src/main/java/org/apache/camel/quarkus/component/kubernetes/cluster/KubernetesClusterServiceRecorder.java index 611abe87f8..548cf332ff 100644 --- a/extensions/kubernetes/runtime/src/main/java/org/apache/camel/quarkus/component/kubernetes/cluster/KubernetesClusterServiceRecorder.java +++ b/extensions/kubernetes/runtime/src/main/java/org/apache/camel/quarkus/component/kubernetes/cluster/KubernetesClusterServiceRecorder.java @@ -24,34 +24,34 @@ import org.apache.camel.support.cluster.RebalancingCamelClusterService; @Recorder public class KubernetesClusterServiceRecorder { - public RuntimeValue<KubernetesClusterService> createKubernetesClusterService(KubernetesClusterServiceConfig config) { + public RuntimeValue<KubernetesClusterService> createKubernetesClusterService(KubernetesClusterServiceRuntimeConfig config) { KubernetesClusterService kcs = setupKubernetesClusterServiceFromConfig(config); return new RuntimeValue<KubernetesClusterService>(kcs); } public RuntimeValue<RebalancingCamelClusterService> createKubernetesRebalancingClusterService( - KubernetesClusterServiceConfig config) { + KubernetesClusterServiceRuntimeConfig config) { KubernetesClusterService kcs = setupKubernetesClusterServiceFromConfig(config); RebalancingCamelClusterService rebalancingService = new RebalancingCamelClusterService(kcs, kcs.getRenewDeadlineMillis()); return new RuntimeValue<RebalancingCamelClusterService>(rebalancingService); } - private KubernetesClusterService setupKubernetesClusterServiceFromConfig(KubernetesClusterServiceConfig config) { + private KubernetesClusterService setupKubernetesClusterServiceFromConfig(KubernetesClusterServiceRuntimeConfig config) { KubernetesClusterService clusterService = new KubernetesClusterService(); - config.id.ifPresent(id -> clusterService.setId(id)); - config.masterUrl.ifPresent(url -> clusterService.setMasterUrl(url)); - config.connectionTimeoutMillis.ifPresent(ctm -> clusterService.setConnectionTimeoutMillis(ctm)); - config.namespace.ifPresent(ns -> clusterService.setKubernetesNamespace(ns)); - config.podName.ifPresent(pn -> clusterService.setPodName(pn)); - config.jitterFactor.ifPresent(jf -> clusterService.setJitterFactor(jf)); - config.leaseDurationMillis.ifPresent(ldm -> clusterService.setLeaseDurationMillis(ldm)); - config.renewDeadlineMillis.ifPresent(rdm -> clusterService.setRenewDeadlineMillis(rdm)); - config.retryPeriodMillis.ifPresent(rpm -> clusterService.setRetryPeriodMillis(rpm)); - config.order.ifPresent(o -> clusterService.setOrder(o)); - config.resourceName.ifPresent(krn -> clusterService.setKubernetesResourceName(krn)); - config.leaseResourceType.ifPresent(lrt -> clusterService.setLeaseResourceType(lrt)); + config.id.ifPresent(clusterService::setId); + config.masterUrl.ifPresent(clusterService::setMasterUrl); + config.connectionTimeoutMillis.ifPresent(clusterService::setConnectionTimeoutMillis); + config.namespace.ifPresent(clusterService::setKubernetesNamespace); + config.podName.ifPresent(clusterService::setPodName); + config.jitterFactor.ifPresent(clusterService::setJitterFactor); + config.leaseDurationMillis.ifPresent(clusterService::setLeaseDurationMillis); + config.renewDeadlineMillis.ifPresent(clusterService::setRenewDeadlineMillis); + config.retryPeriodMillis.ifPresent(clusterService::setRetryPeriodMillis); + config.order.ifPresent(clusterService::setOrder); + config.resourceName.ifPresent(clusterService::setKubernetesResourceName); + config.leaseResourceType.ifPresent(clusterService::setLeaseResourceType); clusterService.setClusterLabels(config.labels); diff --git a/extensions/kubernetes/runtime/src/main/java/org/apache/camel/quarkus/component/kubernetes/cluster/KubernetesClusterServiceConfig.java b/extensions/kubernetes/runtime/src/main/java/org/apache/camel/quarkus/component/kubernetes/cluster/KubernetesClusterServiceRuntimeConfig.java similarity index 78% rename from extensions/kubernetes/runtime/src/main/java/org/apache/camel/quarkus/component/kubernetes/cluster/KubernetesClusterServiceConfig.java rename to extensions/kubernetes/runtime/src/main/java/org/apache/camel/quarkus/component/kubernetes/cluster/KubernetesClusterServiceRuntimeConfig.java index c95c42f801..26a3c8d2ef 100644 --- a/extensions/kubernetes/runtime/src/main/java/org/apache/camel/quarkus/component/kubernetes/cluster/KubernetesClusterServiceConfig.java +++ b/extensions/kubernetes/runtime/src/main/java/org/apache/camel/quarkus/component/kubernetes/cluster/KubernetesClusterServiceRuntimeConfig.java @@ -18,22 +18,14 @@ package org.apache.camel.quarkus.component.kubernetes.cluster; import java.util.Map; import java.util.Optional; -import java.util.function.BooleanSupplier; import io.quarkus.runtime.annotations.ConfigItem; +import io.quarkus.runtime.annotations.ConfigPhase; import io.quarkus.runtime.annotations.ConfigRoot; import org.apache.camel.component.kubernetes.cluster.LeaseResourceType; -import org.eclipse.microprofile.config.ConfigProvider; -@ConfigRoot(name = "camel.cluster.kubernetes") -public class KubernetesClusterServiceConfig { - - /** - * Whether a Kubernetes Cluster Service should be automatically configured - * according to 'quarkus.camel.cluster.kubernetes.*' configurations. - */ - @ConfigItem(defaultValue = "false") - public boolean enabled; +@ConfigRoot(name = "camel.cluster.kubernetes", phase = ConfigPhase.RUN_TIME) +public class KubernetesClusterServiceRuntimeConfig { /** * The cluster service ID (defaults to null). @@ -113,26 +105,10 @@ public class KubernetesClusterServiceConfig { @ConfigItem public Optional<LeaseResourceType> leaseResourceType; - /** - * Whether the camel master namespace leaders should be distributed evenly - * across all the camel contexts in the cluster. - */ - @ConfigItem(defaultValue = "true") - public boolean rebalancing; - /** * The labels key/value used to identify the pods composing the cluster, * defaults to empty map. */ @ConfigItem public Map<String, String> labels; - - public static final class Enabled implements BooleanSupplier { - @Override - public boolean getAsBoolean() { - return ConfigProvider.getConfig().getOptionalValue("quarkus.camel.cluster.kubernetes.enabled", Boolean.class) - .orElse(Boolean.FALSE); - } - } - }