You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ac...@apache.org on 2024/08/30 11:56:14 UTC
(camel) branch CAMEL-21107-other created (now 940d9791f93)
This is an automated email from the ASF dual-hosted git repository.
acosentino pushed a change to branch CAMEL-21107-other
in repository https://gitbox.apache.org/repos/asf/camel.git
at 940d9791f93 Camel-Kubernetes: Add ability to add annotation to create resources operation - Job
This branch includes the following new commits:
new 940d9791f93 Camel-Kubernetes: Add ability to add annotation to create resources operation - Job
The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
(camel) 01/01: Camel-Kubernetes: Add ability to add annotation to create resources operation - Job
Posted by ac...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
acosentino pushed a commit to branch CAMEL-21107-other
in repository https://gitbox.apache.org/repos/asf/camel.git
commit 940d9791f934daa3de360c3f512b0eb651c80f89
Author: Andrea Cosentino <an...@gmail.com>
AuthorDate: Fri Aug 30 13:55:16 2024 +0200
Camel-Kubernetes: Add ability to add annotation to create resources operation - Job
Signed-off-by: Andrea Cosentino <an...@gmail.com>
---
.../camel/catalog/components/kubernetes-job.json | 3 ++-
.../component/kubernetes/job/kubernetes-job.json | 3 ++-
.../component/kubernetes/KubernetesConstants.java | 3 +++
.../kubernetes/job/KubernetesJobProducer.java | 16 ++++++++++---
.../producer/KubernetesJobProducerTest.java | 28 ++++++++++++++++++++++
.../dsl/KubernetesJobEndpointBuilderFactory.java | 12 ++++++++++
6 files changed, 60 insertions(+), 5 deletions(-)
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/kubernetes-job.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/kubernetes-job.json
index 7e917dddca9..562985678b5 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/kubernetes-job.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/kubernetes-job.json
@@ -32,7 +32,8 @@
"CamelKubernetesNamespaceName": { "index": 1, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The namespace name", "constantName": "org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_NAMESPACE_NAME" },
"CamelKubernetesJobName": { "index": 2, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Job name.", "constantName": "org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_JOB_NAME" },
"CamelKubernetesJobSpec": { "index": 3, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "io.fabric8.kubernetes.api.model.batch.v1.JobSpec", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The spec for a Job.", "constantName": "org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_JOB_SPEC" },
- "CamelKubernetesJobLabels": { "index": 4, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Map<String, String>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Job labels.", "constantName": "org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_JOB_LABELS" }
+ "CamelKubernetesJobLabels": { "index": 4, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Map<String, String>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Job labels.", "constantName": "org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_JOB_LABELS" },
+ "CamelKubernetesJobAnnotations": { "index": 5, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Map<String, String>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Job annotations.", "constantName": "org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_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/job/kubernetes-job.json b/components/camel-kubernetes/src/generated/resources/META-INF/org/apache/camel/component/kubernetes/job/kubernetes-job.json
index 7e917dddca9..562985678b5 100644
--- a/components/camel-kubernetes/src/generated/resources/META-INF/org/apache/camel/component/kubernetes/job/kubernetes-job.json
+++ b/components/camel-kubernetes/src/generated/resources/META-INF/org/apache/camel/component/kubernetes/job/kubernetes-job.json
@@ -32,7 +32,8 @@
"CamelKubernetesNamespaceName": { "index": 1, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The namespace name", "constantName": "org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_NAMESPACE_NAME" },
"CamelKubernetesJobName": { "index": 2, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Job name.", "constantName": "org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_JOB_NAME" },
"CamelKubernetesJobSpec": { "index": 3, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "io.fabric8.kubernetes.api.model.batch.v1.JobSpec", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The spec for a Job.", "constantName": "org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_JOB_SPEC" },
- "CamelKubernetesJobLabels": { "index": 4, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Map<String, String>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Job labels.", "constantName": "org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_JOB_LABELS" }
+ "CamelKubernetesJobLabels": { "index": 4, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Map<String, String>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Job labels.", "constantName": "org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_JOB_LABELS" },
+ "CamelKubernetesJobAnnotations": { "index": 5, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Map<String, String>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Job annotations.", "constantName": "org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_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 dad4a517e7b..8f4ba52fde0 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
@@ -210,6 +210,9 @@ public final class KubernetesConstants {
public static final String KUBERNETES_JOB_SPEC = "CamelKubernetesJobSpec";
@Metadata(label = "producer", description = "The Job labels.", javaType = "Map<String, String>", applicableFor = SCHEME_JOB)
public static final String KUBERNETES_JOB_LABELS = "CamelKubernetesJobLabels";
+ @Metadata(label = "producer", description = "The Job annotations.", javaType = "Map<String, String>",
+ applicableFor = SCHEME_JOB)
+ public static final String KUBERNETES_JOB_ANNOTATIONS = "CamelKubernetesJobAnnotations";
@Metadata(label = "producer", description = "The deployment name", javaType = "String",
applicableFor = SCHEME_CUSTOM_RESOURCES)
public static final String KUBERNETES_CRD_INSTANCE_NAME = "CamelKubernetesCRDInstanceName";
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/job/KubernetesJobProducer.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/job/KubernetesJobProducer.java
index 4c2f6b37443..2a8cb7eace6 100644
--- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/job/KubernetesJobProducer.java
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/job/KubernetesJobProducer.java
@@ -16,6 +16,7 @@
*/
package org.apache.camel.component.kubernetes.job;
+import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;
@@ -140,6 +141,8 @@ public class KubernetesJobProducer extends DefaultProducer {
String jobName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_JOB_NAME, String.class);
String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class);
JobSpec jobSpec = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_JOB_SPEC, JobSpec.class);
+ HashMap<String, String> annotations
+ = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_JOB_ANNOTATIONS, HashMap.class);
if (ObjectHelper.isEmpty(jobName)) {
LOG.error("{} a specific job require specify a job name", operationName);
throw new IllegalArgumentException(String.format("%s a specific job require specify a job name", operationName));
@@ -155,10 +158,17 @@ public class KubernetesJobProducer extends DefaultProducer {
String.format("%s a specific job require specify a hpa spec bean", operationName));
}
Map<String, String> labels = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_JOB_LABELS, Map.class);
- Job jobCreating = new JobBuilder().withNewMetadata().withName(jobName).withLabels(labels).endMetadata()
- .withSpec(jobSpec).build();
+ JobBuilder jobCreatingBuilder = new JobBuilder();
+ if (ObjectHelper.isEmpty(annotations)) {
+ jobCreatingBuilder.withNewMetadata().withName(jobName).withLabels(labels).endMetadata()
+ .withSpec(jobSpec);
+ } else {
+ jobCreatingBuilder.withNewMetadata().withName(jobName).withLabels(labels).withAnnotations(annotations).endMetadata()
+ .withSpec(jobSpec);
+ }
Job job = operation.apply(
- getEndpoint().getKubernetesClient().batch().v1().jobs().inNamespace(namespaceName).resource(jobCreating));
+ getEndpoint().getKubernetesClient().batch().v1().jobs().inNamespace(namespaceName)
+ .resource(jobCreatingBuilder.build()));
prepareOutboundMessage(exchange, job);
}
diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesJobProducerTest.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesJobProducerTest.java
index a04762e25a7..276cfca9870 100644
--- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesJobProducerTest.java
+++ b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesJobProducerTest.java
@@ -117,6 +117,33 @@ public class KubernetesJobProducerTest extends KubernetesTestSupport {
assertEquals(13, result.getSpec().getBackoffLimit());
}
+ @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");
+ JobSpec spec = new JobSpecBuilder().withBackoffLimit(13).build();
+ Job j1 = new JobBuilder().withNewMetadata().withName("j1").withNamespace("test").withLabels(labels)
+ .withAnnotations(annotations).and()
+ .withSpec(spec).build();
+ server.expect().post().withPath("/apis/batch/v1/namespaces/test/jobs").andReturn(200, j1).once();
+
+ Exchange ex = template.request("direct:createWithAnnotations", exchange -> {
+ exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test");
+ exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_JOB_LABELS, labels);
+ exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_JOB_ANNOTATIONS, annotations);
+ exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_JOB_NAME, "j1");
+ exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_JOB_SPEC, spec);
+ });
+
+ Job result = ex.getMessage().getBody(Job.class);
+
+ assertEquals("test", result.getMetadata().getNamespace());
+ assertEquals("j1", result.getMetadata().getName());
+ assertEquals(labels, result.getMetadata().getLabels());
+ assertEquals(annotations, result.getMetadata().getAnnotations());
+ assertEquals(13, result.getSpec().getBackoffLimit());
+ }
+
@Test
void updateJobTest() {
Map<String, String> labels = Map.of("my.label.key", "my.label.value");
@@ -172,6 +199,7 @@ public class KubernetesJobProducerTest extends KubernetesTestSupport {
from("direct:listByLabels").to("kubernetes-job:foo?operation=listJobByLabels");
from("direct:get").to("kubernetes-job:foo?operation=getJob");
from("direct:create").to("kubernetes-job:foo?operation=createJob");
+ from("direct:createWithAnnotations").to("kubernetes-job:foo?operation=createJob");
from("direct:update").to("kubernetes-job:foo?operation=updateJob");
from("direct:delete").to("kubernetes-job:foo?operation=deleteJob");
}
diff --git a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/KubernetesJobEndpointBuilderFactory.java b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/KubernetesJobEndpointBuilderFactory.java
index 04b9138dec8..9733ca01443 100644
--- a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/KubernetesJobEndpointBuilderFactory.java
+++ b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/KubernetesJobEndpointBuilderFactory.java
@@ -572,6 +572,18 @@ public interface KubernetesJobEndpointBuilderFactory {
public String kubernetesJobLabels() {
return "CamelKubernetesJobLabels";
}
+ /**
+ * The Job annotations.
+ *
+ * The option is a: {@code Map<String, String>} type.
+ *
+ * Group: producer
+ *
+ * @return the name of the header {@code KubernetesJobAnnotations}.
+ */
+ public String kubernetesJobAnnotations() {
+ return "CamelKubernetesJobAnnotations";
+ }
}
static KubernetesJobEndpointBuilder endpointBuilder(String componentName, String path) {
class KubernetesJobEndpointBuilderImpl extends AbstractEndpointBuilder implements KubernetesJobEndpointBuilder, AdvancedKubernetesJobEndpointBuilder {