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 1429b990f3a CAMEL-21105 - Camel-Kubernetes: Configmap creation should allow to add annotations (#15267) 1429b990f3a is described below commit 1429b990f3ae95761b26d5342208f04f68f63c54 Author: Andrea Cosentino <anco...@gmail.com> AuthorDate: Thu Aug 22 09:16:12 2024 +0200 CAMEL-21105 - Camel-Kubernetes: Configmap creation should allow to add annotations (#15267) * CAMEL-21105 - Camel-Kubernetes: Configmap creation should allow to add annotations Signed-off-by: Andrea Cosentino <anco...@gmail.com> * CAMEL-21105 - Camel-Kubernetes: Configmap creation should allow to add annotations Signed-off-by: Andrea Cosentino <anco...@gmail.com> --------- Signed-off-by: Andrea Cosentino <anco...@gmail.com> --- .../catalog/components/kubernetes-config-maps.json | 5 +++-- .../config_maps/kubernetes-config-maps.json | 5 +++-- .../component/kubernetes/KubernetesConstants.java | 3 +++ .../config_maps/KubernetesConfigMapsProducer.java | 14 +++++++++--- .../producer/KubernetesConfigMapsProducerTest.java | 26 ++++++++++++++++++++++ ...KubernetesConfigMapsEndpointBuilderFactory.java | 13 +++++++++++ 6 files changed, 59 insertions(+), 7 deletions(-) diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/kubernetes-config-maps.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/kubernetes-config-maps.json index 9964bd1522d..b182140317a 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/kubernetes-config-maps.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/kubernetes-config-maps.json @@ -34,8 +34,9 @@ "CamelKubernetesConfigMapsLabels": { "index": 2, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Map<String, String>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The ConfigMap labels", "constantName": "org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_CONFIGMAPS_LABELS" }, "CamelKubernetesConfigMapName": { "index": 3, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The ConfigMap name", "constantName": "org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_CONFIGMAP_NAME" }, "CamelKubernetesConfigData": { "index": 4, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Map<String, String>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The ConfigMap Data", "constantName": "org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_CONFIGMAP_DATA" }, - "CamelKubernetesEventAction": { "index": 5, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "io.fabric8.kubernetes.client.Watcher.Action", "enum": [ "ADDED", "MODIFIED", "DELETED", "ERROR", "BOOKMARK" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Action watched by the consumer", "constantName": "org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_EVENT_ [...] - "CamelKubernetesEventTimestamp": { "index": 6, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Timestamp of the action watched by the consumer", "constantName": "org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_EVENT_TIMESTAMP" } + "CamelKubernetesConfigMapsAnnotations": { "index": 5, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Map<String, String>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The ConfigMap annotations", "constantName": "org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_CONFIGMAPS_ANNOTATIONS" }, + "CamelKubernetesEventAction": { "index": 6, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "io.fabric8.kubernetes.client.Watcher.Action", "enum": [ "ADDED", "MODIFIED", "DELETED", "ERROR", "BOOKMARK" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Action watched by the consumer", "constantName": "org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_EVENT_ [...] + "CamelKubernetesEventTimestamp": { "index": 7, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Timestamp of the action watched by the consumer", "constantName": "org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_EVENT_TIMESTAMP" } }, "properties": { "masterUrl": { "index": 0, "kind": "path", "displayName": "Master Url", "group": "common", "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 i [...] diff --git a/components/camel-kubernetes/src/generated/resources/META-INF/org/apache/camel/component/kubernetes/config_maps/kubernetes-config-maps.json b/components/camel-kubernetes/src/generated/resources/META-INF/org/apache/camel/component/kubernetes/config_maps/kubernetes-config-maps.json index 9964bd1522d..b182140317a 100644 --- a/components/camel-kubernetes/src/generated/resources/META-INF/org/apache/camel/component/kubernetes/config_maps/kubernetes-config-maps.json +++ b/components/camel-kubernetes/src/generated/resources/META-INF/org/apache/camel/component/kubernetes/config_maps/kubernetes-config-maps.json @@ -34,8 +34,9 @@ "CamelKubernetesConfigMapsLabels": { "index": 2, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Map<String, String>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The ConfigMap labels", "constantName": "org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_CONFIGMAPS_LABELS" }, "CamelKubernetesConfigMapName": { "index": 3, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The ConfigMap name", "constantName": "org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_CONFIGMAP_NAME" }, "CamelKubernetesConfigData": { "index": 4, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Map<String, String>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The ConfigMap Data", "constantName": "org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_CONFIGMAP_DATA" }, - "CamelKubernetesEventAction": { "index": 5, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "io.fabric8.kubernetes.client.Watcher.Action", "enum": [ "ADDED", "MODIFIED", "DELETED", "ERROR", "BOOKMARK" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Action watched by the consumer", "constantName": "org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_EVENT_ [...] - "CamelKubernetesEventTimestamp": { "index": 6, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Timestamp of the action watched by the consumer", "constantName": "org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_EVENT_TIMESTAMP" } + "CamelKubernetesConfigMapsAnnotations": { "index": 5, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Map<String, String>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The ConfigMap annotations", "constantName": "org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_CONFIGMAPS_ANNOTATIONS" }, + "CamelKubernetesEventAction": { "index": 6, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "io.fabric8.kubernetes.client.Watcher.Action", "enum": [ "ADDED", "MODIFIED", "DELETED", "ERROR", "BOOKMARK" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Action watched by the consumer", "constantName": "org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_EVENT_ [...] + "CamelKubernetesEventTimestamp": { "index": 7, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Timestamp of the action watched by the consumer", "constantName": "org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_EVENT_TIMESTAMP" } }, "properties": { "masterUrl": { "index": 0, "kind": "path", "displayName": "Master Url", "group": "common", "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 i [...] 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 c8967e066b1..dad4a517e7b 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 @@ -178,6 +178,9 @@ public final class KubernetesConstants { @Metadata(label = "producer", description = "The ConfigMap Data", javaType = "Map<String, String>", applicableFor = SCHEME_CONFIG_MAPS) public static final String KUBERNETES_CONFIGMAP_DATA = "CamelKubernetesConfigData"; + @Metadata(label = "producer", description = "The ConfigMap annotations", javaType = "Map<String, String>", + applicableFor = SCHEME_CONFIG_MAPS) + public static final String KUBERNETES_CONFIGMAPS_ANNOTATIONS = "CamelKubernetesConfigMapsAnnotations"; @Metadata(label = "producer", description = "The Openshift build labels", javaType = "Map<String, String>", applicableFor = SCHEME_BUILDS) public static final String KUBERNETES_BUILDS_LABELS = "CamelKubernetesBuildsLabels"; diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/config_maps/KubernetesConfigMapsProducer.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/config_maps/KubernetesConfigMapsProducer.java index 267d9c3fe91..1e94bc08546 100644 --- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/config_maps/KubernetesConfigMapsProducer.java +++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/config_maps/KubernetesConfigMapsProducer.java @@ -134,6 +134,8 @@ public class KubernetesConfigMapsProducer extends DefaultProducer { String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class); HashMap<String, String> configMapData = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_CONFIGMAP_DATA, HashMap.class); + HashMap<String, String> configMapAnnotations + = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_CONFIGMAPS_ANNOTATIONS, HashMap.class); if (ObjectHelper.isEmpty(cfMapName)) { LOG.error("{} a specific configMap require specify a configMap name", operationName); throw new IllegalArgumentException( @@ -150,11 +152,17 @@ public class KubernetesConfigMapsProducer extends DefaultProducer { String.format("%s a specific configMap require specify a data map", operationName)); } Map<String, String> labels = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_CONFIGMAPS_LABELS, Map.class); - ConfigMap cfMapCreating = new ConfigMapBuilder().withNewMetadata().withName(cfMapName).withLabels(labels).endMetadata() - .withData(configMapData).build(); + ConfigMapBuilder cfMapCreating = new ConfigMapBuilder(); + if (ObjectHelper.isEmpty(configMapAnnotations)) { + cfMapCreating.withNewMetadata().withName(cfMapName).withLabels(labels).endMetadata().withData(configMapData); + } else { + cfMapCreating.withNewMetadata().withName(cfMapName).withLabels(labels).withAnnotations(configMapAnnotations) + .endMetadata().withData(configMapData); + } ConfigMap configMap = operation.apply( - getEndpoint().getKubernetesClient().configMaps().inNamespace(namespaceName).resource(cfMapCreating)); + getEndpoint().getKubernetesClient().configMaps().inNamespace(namespaceName) + .resource(cfMapCreating.build())); prepareOutboundMessage(exchange, configMap); } diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesConfigMapsProducerTest.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesConfigMapsProducerTest.java index fed8b6fab74..a7278043cbc 100644 --- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesConfigMapsProducerTest.java +++ b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesConfigMapsProducerTest.java @@ -131,6 +131,32 @@ public class KubernetesConfigMapsProducerTest extends KubernetesTestSupport { assertEquals(labels, result.getMetadata().getLabels()); } + @Test + void createConfigMapWithAnnotations() { + Map<String, String> labels = Map.of("my.label.key", "my.label.value"); + Map<String, String> annotations = Map.of("my.annotation.key", "my.annotation.value"); + Map<String, String> data = Map.of("my.data.key", "my.data.value"); + ConfigMap cm1 = new ConfigMapBuilder().withNewMetadata().withName("cmAnnotated").withNamespace("test") + .withLabels(labels).withAnnotations(annotations).and() + .withData(data).build(); + server.expect().post().withPath("/api/v1/namespaces/test/configmaps").andReturn(200, cm1).once(); + + Exchange ex = template.request("direct:createConfigMap", exchange -> { + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test"); + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_CONFIGMAPS_LABELS, labels); + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_CONFIGMAP_NAME, "cmAnnotated"); + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_CONFIGMAP_DATA, data); + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_CONFIGMAPS_ANNOTATIONS, annotations); + }); + + ConfigMap result = ex.getMessage().getBody(ConfigMap.class); + + assertEquals("test", result.getMetadata().getNamespace()); + assertEquals("cmAnnotated", result.getMetadata().getName()); + assertEquals(labels, result.getMetadata().getLabels()); + assertEquals(annotations, result.getMetadata().getAnnotations()); + } + @Test void updateConfigMap() { 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/KubernetesConfigMapsEndpointBuilderFactory.java b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/KubernetesConfigMapsEndpointBuilderFactory.java index 968b3c5d989..3f664fc184d 100644 --- a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/KubernetesConfigMapsEndpointBuilderFactory.java +++ b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/KubernetesConfigMapsEndpointBuilderFactory.java @@ -1510,6 +1510,19 @@ public interface KubernetesConfigMapsEndpointBuilderFactory { public String kubernetesConfigData() { return "CamelKubernetesConfigData"; } + /** + * The ConfigMap annotations. + * + * The option is a: {@code Map<String, String>} type. + * + * Group: producer + * + * @return the name of the header {@code + * KubernetesConfigMapsAnnotations}. + */ + public String kubernetesConfigMapsAnnotations() { + return "CamelKubernetesConfigMapsAnnotations"; + } /** * Action watched by the consumer. *