This is an automated email from the ASF dual-hosted git repository. cdeppisch pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push: new 7571f4eb23d CAMEL-20984: Add Camel JBang Kubernetes trait container missing options 7571f4eb23d is described below commit 7571f4eb23df71b7c2eb168401e13793192e38ca Author: Gaelle Fournier <gaelle.fournier.w...@gmail.com> AuthorDate: Mon Jul 22 10:09:25 2024 +0200 CAMEL-20984: Add Camel JBang Kubernetes trait container missing options * Add missing container trait options to Kubernetes plugin: container.request-cpu, container.request-memory, container.limit-cpu, container.limit-memory * Fix parsing to be able to map kebab case command option to camel case containing an uppercase part (like CPU or SSL) --- .../modules/ROOT/pages/camel-jbang-kubernetes.adoc | 22 +++++++++++++++++++++- .../core/commands/kubernetes/KubernetesHelper.java | 1 + .../commands/kubernetes/traits/ContainerTrait.java | 17 +++++++++++++++++ .../commands/kubernetes/KubernetesExportTest.java | 18 +++++++++++++++++- 4 files changed, 56 insertions(+), 2 deletions(-) diff --git a/docs/user-manual/modules/ROOT/pages/camel-jbang-kubernetes.adoc b/docs/user-manual/modules/ROOT/pages/camel-jbang-kubernetes.adoc index 0702390d39f..70f04e90c12 100644 --- a/docs/user-manual/modules/ROOT/pages/camel-jbang-kubernetes.adoc +++ b/docs/user-manual/modules/ROOT/pages/camel-jbang-kubernetes.adoc @@ -190,6 +190,22 @@ The container trait is able to customize the container specification with follow | PullPolicy | The pull policy: Always\|Never\|IfNotPresent +| container.request-cpu +| string +| The minimum amount of CPU required. + +| container.request-memory +| string +| The minimum amount of memory required. + +| container.limit-cpu +| string +| The maximum amount of CPU required. + +| container.limit-memory +| string +| The maximum amount of memory required. + |=== The syntax to specify container trait options is as follows: @@ -203,7 +219,7 @@ You may specify these options with the export command to customize the container [source,bash] ---- -camel kubernetes export Sample.java --trait container.name=my-container --trait container.port=8088 --trait container.imagePullPolicy=IfNotPresent +camel kubernetes export Sample.java --trait container.name=my-container --trait container.port=8088 --trait container.imagePullPolicy=IfNotPresent --trait container.request-cpu=0.005 --trait container.request-memory=100Mi ---- This results in the following container specification in the Deployment resource. @@ -233,6 +249,10 @@ spec: - containerPort: 8088 #<4> name: http protocol: TCP + resources: + requests: + memory: 100Mi + cpu: '0.005' ---- <1> Container image running the application <2> Customized image pull policy diff --git a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesHelper.java b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesHelper.java index 26ad4c4235b..7accbf83990 100644 --- a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesHelper.java +++ b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesHelper.java @@ -55,6 +55,7 @@ public final class KubernetesHelper { .enable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING) .disable(JsonParser.Feature.AUTO_CLOSE_SOURCE) .enable(MapperFeature.BLOCK_UNSAFE_POLYMORPHIC_BASE_TYPES) + .enable(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES) .build() .setDefaultPropertyInclusion( JsonInclude.Value.construct(JsonInclude.Include.NON_EMPTY, JsonInclude.Include.NON_EMPTY)); diff --git a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/traits/ContainerTrait.java b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/traits/ContainerTrait.java index 946bd4efb0a..83531df2e75 100644 --- a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/traits/ContainerTrait.java +++ b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/traits/ContainerTrait.java @@ -21,6 +21,8 @@ import java.util.Optional; import io.fabric8.kubernetes.api.model.ContainerBuilder; import io.fabric8.kubernetes.api.model.ContainerPortBuilder; +import io.fabric8.kubernetes.api.model.Quantity; +import io.fabric8.kubernetes.api.model.ResourceRequirementsBuilder; import org.apache.camel.v1.integrationspec.Traits; import org.apache.camel.v1.integrationspec.traits.Container; @@ -59,6 +61,21 @@ public class ContainerTrait extends BaseTrait { .build()); } + ResourceRequirementsBuilder resourceRequirementsBuilder = new ResourceRequirementsBuilder(); + if (containerTrait.getRequestMemory() != null) { + resourceRequirementsBuilder.addToRequests("memory", new Quantity(containerTrait.getRequestMemory())); + } + if (containerTrait.getRequestCPU() != null) { + resourceRequirementsBuilder.addToRequests("cpu", new Quantity(containerTrait.getRequestCPU())); + } + if (containerTrait.getLimitMemory() != null) { + resourceRequirementsBuilder.addToLimits("memory", new Quantity(containerTrait.getLimitMemory())); + } + if (containerTrait.getLimitCPU() != null) { + resourceRequirementsBuilder.addToLimits("cpu", new Quantity(containerTrait.getLimitCPU())); + } + container.withResources(resourceRequirementsBuilder.build()); + context.doWithDeployments(d -> d.editOrNewSpec() .editOrNewTemplate() .editOrNewMetadata() diff --git a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/test/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesExportTest.java b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/test/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesExportTest.java index 29cc1bd87cc..069e68ba24b 100644 --- a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/test/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesExportTest.java +++ b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/test/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesExportTest.java @@ -143,7 +143,11 @@ class KubernetesExportTest extends KubernetesBaseTest { "container.port-name=custom", "container.service-port-name=custom-port", "container.image-pull-policy=IfNotPresent", - "container.service-port=443" }; + "container.service-port=443", + "container.request-cpu=5m", + "container.request-memory=100Mi", + "container.limit-cpu=0.5", + "container.limit-memory=512Mi" }; command.doCall(); Assertions.assertTrue(hasService(workingDir)); @@ -160,6 +164,18 @@ class KubernetesExportTest extends KubernetesBaseTest { deployment.getSpec().getTemplate().getSpec().getContainers().get(0).getPorts().get(0).getName()); Assertions.assertEquals(8088, deployment.getSpec().getTemplate().getSpec().getContainers().get(0).getPorts().get(0).getContainerPort()); + Assertions.assertEquals("5m", + deployment.getSpec().getTemplate().getSpec().getContainers().get(0).getResources().getRequests().get("cpu") + .toString()); + Assertions.assertEquals("100Mi", + deployment.getSpec().getTemplate().getSpec().getContainers().get(0).getResources().getRequests().get("memory") + .toString()); + Assertions.assertEquals("0.5", + deployment.getSpec().getTemplate().getSpec().getContainers().get(0).getResources().getLimits().get("cpu") + .toString()); + Assertions.assertEquals("512Mi", + deployment.getSpec().getTemplate().getSpec().getContainers().get(0).getResources().getLimits().get("memory") + .toString()); Service service = getService(workingDir); Assertions.assertEquals("route-service", service.getMetadata().getName());