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 c9775d16949 CAMEL-21107 - Camel-Kubernetes: Add ability to add 
annotation to create resources operation - Namespaces (#15587)
c9775d16949 is described below

commit c9775d16949492c50b00f43fb2c9500912ddc8b5
Author: Andrea Cosentino <[email protected]>
AuthorDate: Tue Sep 17 10:36:12 2024 +0200

    CAMEL-21107 - Camel-Kubernetes: Add ability to add annotation to create 
resources operation - Namespaces (#15587)
    
    Signed-off-by: Andrea Cosentino <[email protected]>
---
 .../catalog/components/kubernetes-namespaces.json   |  5 +++--
 .../namespaces/kubernetes-namespaces.json           |  5 +++--
 .../component/kubernetes/KubernetesConstants.java   |  3 +++
 .../namespaces/KubernetesNamespacesProducer.java    | 12 ++++++++++--
 .../producer/KubernetesNamespacesProducerTest.java  | 21 +++++++++++++++++++++
 .../KubernetesNamespacesEndpointBuilderFactory.java | 13 +++++++++++++
 6 files changed, 53 insertions(+), 6 deletions(-)

diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/kubernetes-namespaces.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/kubernetes-namespaces.json
index 532bb6963ec..bed8df49823 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/kubernetes-namespaces.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/kubernetes-namespaces.json
@@ -33,8 +33,9 @@
     "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"
 },
     "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"
 },
     "CamelKubernetesNamespaceLabels": { "index": 2, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "Map<String, String>", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "The namespace labels", 
"constantName": 
"org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_NAMESPACE_LABELS"
 },
-    "CamelKubernetesEventAction": { "index": 3, "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": 4, "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"
 }
+    "CamelKubernetesNamespaceAnnotations": { "index": 3, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "Map<String, String>", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "The namespace 
annotations", "constantName": 
"org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_NAMESPACE_ANNOTATIONS"
 },
+    "CamelKubernetesEventAction": { "index": 4, "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": 5, "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/namespaces/kubernetes-namespaces.json
 
b/components/camel-kubernetes/src/generated/resources/META-INF/org/apache/camel/component/kubernetes/namespaces/kubernetes-namespaces.json
index 532bb6963ec..bed8df49823 100644
--- 
a/components/camel-kubernetes/src/generated/resources/META-INF/org/apache/camel/component/kubernetes/namespaces/kubernetes-namespaces.json
+++ 
b/components/camel-kubernetes/src/generated/resources/META-INF/org/apache/camel/component/kubernetes/namespaces/kubernetes-namespaces.json
@@ -33,8 +33,9 @@
     "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"
 },
     "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"
 },
     "CamelKubernetesNamespaceLabels": { "index": 2, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "Map<String, String>", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "The namespace labels", 
"constantName": 
"org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_NAMESPACE_LABELS"
 },
-    "CamelKubernetesEventAction": { "index": 3, "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": 4, "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"
 }
+    "CamelKubernetesNamespaceAnnotations": { "index": 3, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "Map<String, String>", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "The namespace 
annotations", "constantName": 
"org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_NAMESPACE_ANNOTATIONS"
 },
+    "CamelKubernetesEventAction": { "index": 4, "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": 5, "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 aa8fe4561af..ff64cf084d1 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
@@ -53,6 +53,9 @@ public final class KubernetesConstants {
     @Metadata(label = "producer", description = "The namespace labels", 
javaType = "Map<String, String>",
               applicableFor = SCHEME_NAMESPACES)
     public static final String KUBERNETES_NAMESPACE_LABELS = 
"CamelKubernetesNamespaceLabels";
+    @Metadata(label = "producer", description = "The namespace annotations", 
javaType = "Map<String, String>",
+              applicableFor = SCHEME_NAMESPACES)
+    public static final String KUBERNETES_NAMESPACE_ANNOTATIONS = 
"CamelKubernetesNamespaceAnnotations";
     @Metadata(label = "producer", description = "The service labels", javaType 
= "Map<String, String>",
               applicableFor = SCHEME_SERVICES)
     public static final String KUBERNETES_SERVICE_LABELS = 
"CamelKubernetesServiceLabels";
diff --git 
a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/namespaces/KubernetesNamespacesProducer.java
 
b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/namespaces/KubernetesNamespacesProducer.java
index b04eb669fd8..6502110bfb2 100644
--- 
a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/namespaces/KubernetesNamespacesProducer.java
+++ 
b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/namespaces/KubernetesNamespacesProducer.java
@@ -16,6 +16,7 @@
  */
 package org.apache.camel.component.kubernetes.namespaces;
 
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.function.Function;
@@ -131,8 +132,15 @@ public class KubernetesNamespacesProducer extends 
DefaultProducer {
                     String.format("%s a specific namespace require specify a 
namespace name", operationName));
         }
         Map<String, String> labels = 
exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_LABELS, 
Map.class);
-        Namespace ns
-                = new 
NamespaceBuilder().withNewMetadata().withName(namespaceName).withLabels(labels).endMetadata().build();
+        HashMap<String, String> annotations
+                = 
exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_ANNOTATIONS,
 HashMap.class);
+        Namespace ns;
+        if (ObjectHelper.isEmpty(annotations)) {
+            ns = new 
NamespaceBuilder().withNewMetadata().withName(namespaceName).withLabels(labels).endMetadata().build();
+        } else {
+            ns = new 
NamespaceBuilder().withNewMetadata().withName(namespaceName).withLabels(labels)
+                    .withAnnotations(annotations).endMetadata().build();
+        }
         Namespace namespace = 
operation.apply(getEndpoint().getKubernetesClient().namespaces().resource(ns));
 
         prepareOutboundMessage(exchange, namespace);
diff --git 
a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesNamespacesProducerTest.java
 
b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesNamespacesProducerTest.java
index 846465bc7a8..c7d351d42d4 100644
--- 
a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesNamespacesProducerTest.java
+++ 
b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesNamespacesProducerTest.java
@@ -89,6 +89,27 @@ public class KubernetesNamespacesProducerTest extends 
KubernetesTestSupport {
         assertEquals(labels, result.getMetadata().getLabels());
     }
 
+    @Test
+    void createNamespaceWithAnnotations() {
+        Map<String, String> labels = Map.of("my.label.key", "my.label.value");
+        Map<String, String> annotations = Map.of("my.annotation.key", 
"my.annotation.value");
+        Namespace ns1 = new 
NamespaceBuilder().withNewMetadata().withName("ns1").withLabels(labels).withAnnotations(annotations)
+                .endMetadata().build();
+        server.expect().post().withPath("/api/v1/namespaces").andReturn(200, 
ns1).once();
+
+        Exchange ex = template.request("direct:createNamespace", exchange -> {
+            
exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, 
"ns1");
+            
exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_LABELS, 
labels);
+            
exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_ANNOTATIONS,
 annotations);
+        });
+
+        Namespace result = ex.getMessage().getBody(Namespace.class);
+
+        assertEquals("ns1", result.getMetadata().getName());
+        assertEquals(labels, result.getMetadata().getLabels());
+        assertEquals(annotations, result.getMetadata().getAnnotations());
+    }
+
     @Test
     void updateNamespace() {
         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/KubernetesNamespacesEndpointBuilderFactory.java
 
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/KubernetesNamespacesEndpointBuilderFactory.java
index 1657ee7cd47..d458d47bf13 100644
--- 
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/KubernetesNamespacesEndpointBuilderFactory.java
+++ 
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/KubernetesNamespacesEndpointBuilderFactory.java
@@ -1486,6 +1486,19 @@ public interface 
KubernetesNamespacesEndpointBuilderFactory {
         public String kubernetesNamespaceLabels() {
             return "CamelKubernetesNamespaceLabels";
         }
+        /**
+         * The namespace annotations.
+         * 
+         * The option is a: {@code Map<String, String>} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code
+         * KubernetesNamespaceAnnotations}.
+         */
+        public String kubernetesNamespaceAnnotations() {
+            return "CamelKubernetesNamespaceAnnotations";
+        }
         /**
          * Action watched by the consumer.
          * 

Reply via email to