This is an automated email from the ASF dual-hosted git repository.

acosentino 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 cd1f0ffab44 CAMEL-21107 - Camel-Kubernetes: Add ability to add 
annotation to create resources operation - Cron Job (#15574)
cd1f0ffab44 is described below

commit cd1f0ffab44051d94e38f9df5e5ccf03d50dfb60
Author: Andrea Cosentino <[email protected]>
AuthorDate: Mon Sep 16 12:40:58 2024 +0200

    CAMEL-21107 - Camel-Kubernetes: Add ability to add annotation to create 
resources operation - Cron Job (#15574)
    
    Signed-off-by: Andrea Cosentino <[email protected]>
---
 .../catalog/components/kubernetes-cronjob.json     |  3 ++-
 .../kubernetes/cronjob/kubernetes-cronjob.json     |  3 ++-
 .../component/kubernetes/KubernetesConstants.java  |  3 +++
 .../cronjob/KubernetesCronJobProducer.java         | 15 ++++++++++---
 .../producer/KubernetesCronJobProducerTest.java    | 26 ++++++++++++++++++++++
 .../KubernetesCronJobEndpointBuilderFactory.java   | 12 ++++++++++
 6 files changed, 57 insertions(+), 5 deletions(-)

diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/kubernetes-cronjob.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/kubernetes-cronjob.json
index 4b9695842aa..6209834b5ba 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/kubernetes-cronjob.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/kubernetes-cronjob.json
@@ -32,7 +32,8 @@
     "CamelKubernetesOperation": { "index": 0, "kind": "header", "displayName": 
"", "group": "producer", "label": "producer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "The Producer operation", "constantName": 
"org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_OPERATION"
 },
     "CamelKubernetesCronJobLabels": { "index": 1, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "Map<String, String>", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "The Cronjob labels.", 
"constantName": 
"org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_CRON_JOB_LABELS"
 },
     "CamelKubernetesCronJobName": { "index": 2, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The Cronjob name.", "constantName": 
"org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_CRON_JOB_NAME"
 },
-    "CamelKubernetesCronJobSpec": { "index": 3, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "io.fabric8.kubernetes.api.model.batch.v1.CronJobSpec", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The spec for a Job.", "constantName": 
"org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_CRON_JOB_SPEC"
 }
+    "CamelKubernetesCronJobSpec": { "index": 3, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "io.fabric8.kubernetes.api.model.batch.v1.CronJobSpec", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The spec for a Job.", "constantName": 
"org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_CRON_JOB_SPEC"
 },
+    "CamelKubernetesCronJobAnnotations": { "index": 4, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "Map<String, String>", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "The Cron Job 
annotations.", "constantName": 
"org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_CRON_JOB_ANNOTATIONS"
 }
   },
   "properties": {
     "masterUrl": { "index": 0, "kind": "path", "displayName": "Master Url", 
"group": "producer", "label": "", "required": true, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "configurationClass": 
"org.apache.camel.component.kubernetes.KubernetesConfiguration", 
"configurationField": "configuration", "description": "URL to a remote 
Kubernetes API server. This should only be used when your Camel application 
[...]
diff --git 
a/components/camel-kubernetes/src/generated/resources/META-INF/org/apache/camel/component/kubernetes/cronjob/kubernetes-cronjob.json
 
b/components/camel-kubernetes/src/generated/resources/META-INF/org/apache/camel/component/kubernetes/cronjob/kubernetes-cronjob.json
index 4b9695842aa..6209834b5ba 100644
--- 
a/components/camel-kubernetes/src/generated/resources/META-INF/org/apache/camel/component/kubernetes/cronjob/kubernetes-cronjob.json
+++ 
b/components/camel-kubernetes/src/generated/resources/META-INF/org/apache/camel/component/kubernetes/cronjob/kubernetes-cronjob.json
@@ -32,7 +32,8 @@
     "CamelKubernetesOperation": { "index": 0, "kind": "header", "displayName": 
"", "group": "producer", "label": "producer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "The Producer operation", "constantName": 
"org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_OPERATION"
 },
     "CamelKubernetesCronJobLabels": { "index": 1, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "Map<String, String>", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "The Cronjob labels.", 
"constantName": 
"org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_CRON_JOB_LABELS"
 },
     "CamelKubernetesCronJobName": { "index": 2, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The Cronjob name.", "constantName": 
"org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_CRON_JOB_NAME"
 },
-    "CamelKubernetesCronJobSpec": { "index": 3, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "io.fabric8.kubernetes.api.model.batch.v1.CronJobSpec", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The spec for a Job.", "constantName": 
"org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_CRON_JOB_SPEC"
 }
+    "CamelKubernetesCronJobSpec": { "index": 3, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "io.fabric8.kubernetes.api.model.batch.v1.CronJobSpec", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The spec for a Job.", "constantName": 
"org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_CRON_JOB_SPEC"
 },
+    "CamelKubernetesCronJobAnnotations": { "index": 4, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "Map<String, String>", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "The Cron Job 
annotations.", "constantName": 
"org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_CRON_JOB_ANNOTATIONS"
 }
   },
   "properties": {
     "masterUrl": { "index": 0, "kind": "path", "displayName": "Master Url", 
"group": "producer", "label": "", "required": true, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "configurationClass": 
"org.apache.camel.component.kubernetes.KubernetesConfiguration", 
"configurationField": "configuration", "description": "URL to a remote 
Kubernetes API server. This should only be used when your Camel application 
[...]
diff --git 
a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/KubernetesConstants.java
 
b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/KubernetesConstants.java
index 6822a3f9dc0..aa8fe4561af 100644
--- 
a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/KubernetesConstants.java
+++ 
b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/KubernetesConstants.java
@@ -278,6 +278,9 @@ public final class KubernetesConstants {
     @Metadata(label = "producer", description = "The spec for a Job.",
               javaType = 
"io.fabric8.kubernetes.api.model.batch.v1.CronJobSpec", applicableFor = 
SCHEME_CRON_JOB)
     public static final String KUBERNETES_CRON_JOB_SPEC = 
"CamelKubernetesCronJobSpec";
+    @Metadata(label = "producer", description = "The Cron Job annotations.", 
javaType = "Map<String, String>",
+              applicableFor = SCHEME_CRON_JOB)
+    public static final String KUBERNETES_CRON_JOB_ANNOTATIONS = 
"CamelKubernetesCronJobAnnotations";
 
     private KubernetesConstants() {
 
diff --git 
a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/cronjob/KubernetesCronJobProducer.java
 
b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/cronjob/KubernetesCronJobProducer.java
index 025c452ba8c..87d62de04c0 100644
--- 
a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/cronjob/KubernetesCronJobProducer.java
+++ 
b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/cronjob/KubernetesCronJobProducer.java
@@ -16,6 +16,7 @@
  */
 package org.apache.camel.component.kubernetes.cronjob;
 
+import java.util.HashMap;
 import java.util.Map;
 import java.util.function.Function;
 
@@ -136,6 +137,8 @@ public class KubernetesCronJobProducer extends 
DefaultProducer {
         String cronjobName = 
exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_CRON_JOB_NAME, 
String.class);
         String namespaceName = 
exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, 
String.class);
         CronJobSpec cronjobSpec = 
exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_CRON_JOB_SPEC, 
CronJobSpec.class);
+        HashMap<String, String> annotations
+                = 
exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_CRON_JOB_ANNOTATIONS, 
HashMap.class);
         if (ObjectHelper.isEmpty(cronjobName)) {
             throw new IllegalArgumentException(
                     String.format("%s a specific cronjob require specify a 
cronjob name", operationName));
@@ -149,11 +152,17 @@ public class KubernetesCronJobProducer extends 
DefaultProducer {
                     String.format("%s a specific cronjob require specify a 
cronjob spec bean", operationName));
         }
         Map<String, String> labels = 
exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_CRON_JOB_LABELS, 
Map.class);
-        CronJob cronjobCreating = new 
CronJobBuilder().withNewMetadata().withName(cronjobName).withLabels(labels).endMetadata()
-                .withSpec(cronjobSpec).build();
+        CronJobBuilder cronJobBuilder = new CronJobBuilder();
+        if (ObjectHelper.isEmpty(annotations)) {
+            
cronJobBuilder.withNewMetadata().withName(cronjobName).withLabels(labels).endMetadata()
+                    .withSpec(cronjobSpec);
+        } else {
+            
cronJobBuilder.withNewMetadata().withName(cronjobName).withLabels(labels).withAnnotations(annotations).endMetadata()
+                    .withSpec(cronjobSpec);
+        }
         Object cronJob = operation.apply(
                 
getEndpoint().getKubernetesClient().batch().v1().cronjobs().inNamespace(namespaceName)
-                        .resource(cronjobCreating));
+                        .resource(cronJobBuilder.build()));
 
         prepareOutboundMessage(exchange, cronJob);
     }
diff --git 
a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesCronJobProducerTest.java
 
b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesCronJobProducerTest.java
index ea86704e6cf..8a6266c3e1f 100644
--- 
a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesCronJobProducerTest.java
+++ 
b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesCronJobProducerTest.java
@@ -113,6 +113,32 @@ public class KubernetesCronJobProducerTest extends 
KubernetesTestSupport {
         assertEquals(labels, result.getMetadata().getLabels());
     }
 
+    @Test
+    void createJobWithAnnotationsTest() {
+        Map<String, String> labels = Map.of("my.label.key", "my.label.value");
+        Map<String, String> annotations = Map.of("my.annotation.key", 
"my.annotation.value");
+        CronJobSpec spec = new CronJobSpecBuilder().build();
+        CronJob j1 = new 
CronJobBuilder().withNewMetadata().withName("j1").withNamespace("test").withLabels(labels)
+                .withAnnotations(annotations).and()
+                .withSpec(spec).build();
+        
server.expect().post().withPath("/apis/batch/v1/namespaces/test/cronjobs").andReturn(200,
 j1).once();
+
+        Exchange ex = template.request("direct:create", exchange -> {
+            
exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, 
"test");
+            
exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_CRON_JOB_LABELS, 
labels);
+            
exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_CRON_JOB_ANNOTATIONS, 
annotations);
+            
exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_CRON_JOB_NAME, "j1");
+            
exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_CRON_JOB_SPEC, spec);
+        });
+
+        CronJob result = ex.getMessage().getBody(CronJob.class);
+
+        assertEquals("test", result.getMetadata().getNamespace());
+        assertEquals("j1", result.getMetadata().getName());
+        assertEquals(labels, result.getMetadata().getLabels());
+        assertEquals(annotations, result.getMetadata().getAnnotations());
+    }
+
     @Test
     void updateJobTest() {
         Map<String, String> labels = Map.of("my.label.key", "my.label.value");
diff --git 
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/KubernetesCronJobEndpointBuilderFactory.java
 
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/KubernetesCronJobEndpointBuilderFactory.java
index 2a77bd9cd3c..29b8c42bbaa 100644
--- 
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/KubernetesCronJobEndpointBuilderFactory.java
+++ 
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/KubernetesCronJobEndpointBuilderFactory.java
@@ -560,6 +560,18 @@ public interface KubernetesCronJobEndpointBuilderFactory {
         public String kubernetesCronJobSpec() {
             return "CamelKubernetesCronJobSpec";
         }
+        /**
+         * The Cron Job annotations.
+         * 
+         * The option is a: {@code Map<String, String>} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code KubernetesCronJobAnnotations}.
+         */
+        public String kubernetesCronJobAnnotations() {
+            return "CamelKubernetesCronJobAnnotations";
+        }
     }
     static KubernetesCronJobEndpointBuilder endpointBuilder(String 
componentName, String path) {
         class KubernetesCronJobEndpointBuilderImpl extends 
AbstractEndpointBuilder implements KubernetesCronJobEndpointBuilder, 
AdvancedKubernetesCronJobEndpointBuilder {

Reply via email to