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

acosentino pushed a commit to branch CAMEL-21107-sec
in repository https://gitbox.apache.org/repos/asf/camel.git

commit a816498009dad2a4fc9b39d13f2257be8c36ec6e
Author: Andrea Cosentino <[email protected]>
AuthorDate: Fri Aug 30 11:36:58 2024 +0200

    CAMEL-21107 - Camel-Kubernetes: Add ability to add annotation to create 
resources operation - Secrets
    
    Signed-off-by: Andrea Cosentino <[email protected]>
---
 .../kubernetes/secrets/kubernetes-secrets.json     |  3 ++-
 .../component/kubernetes/KubernetesConstants.java  |  3 +++
 .../secrets/KubernetesSecretsProducer.java         |  6 ++++++
 .../producer/KubernetesSecretsProducerTest.java    | 25 ++++++++++++++++++++++
 4 files changed, 36 insertions(+), 1 deletion(-)

diff --git 
a/components/camel-kubernetes/src/generated/resources/META-INF/org/apache/camel/component/kubernetes/secrets/kubernetes-secrets.json
 
b/components/camel-kubernetes/src/generated/resources/META-INF/org/apache/camel/component/kubernetes/secrets/kubernetes-secrets.json
index ea82a5dd4e7..52933b1ace2 100644
--- 
a/components/camel-kubernetes/src/generated/resources/META-INF/org/apache/camel/component/kubernetes/secrets/kubernetes-secrets.json
+++ 
b/components/camel-kubernetes/src/generated/resources/META-INF/org/apache/camel/component/kubernetes/secrets/kubernetes-secrets.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"
 },
     "CamelKubernetesSecretsLabels": { "index": 2, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "Map<String, String>", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "The secret labels", 
"constantName": 
"org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_SECRETS_LABELS"
 },
     "CamelKubernetesSecretName": { "index": 3, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The secret name", "constantName": 
"org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_SECRET_NAME"
 },
-    "CamelKubernetesSecret": { "index": 4, "kind": "header", "displayName": 
"", "group": "producer", "label": "producer", "required": false, "javaType": 
"io.fabric8.kubernetes.api.model.Secret", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": "A 
secret object", "constantName": 
"org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_SECRET" }
+    "CamelKubernetesSecret": { "index": 4, "kind": "header", "displayName": 
"", "group": "producer", "label": "producer", "required": false, "javaType": 
"io.fabric8.kubernetes.api.model.Secret", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": "A 
secret object", "constantName": 
"org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_SECRET" },
+    "CamelKubernetesSecretsAnnotations": { "index": 5, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "Map<String, String>", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "The secret annotations", 
"constantName": 
"org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_SECRETS_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..45726956f0c 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
@@ -135,6 +135,9 @@ public final class KubernetesConstants {
     @Metadata(label = "producer", description = "A secret object", javaType = 
"io.fabric8.kubernetes.api.model.Secret",
               applicableFor = SCHEME_SECRETS)
     public static final String KUBERNETES_SECRET = "CamelKubernetesSecret";
+    @Metadata(label = "producer", description = "The secret annotations", 
javaType = "Map<String, String>",
+              applicableFor = SCHEME_SECRETS)
+    public static final String KUBERNETES_SECRETS_ANNOTATIONS = 
"CamelKubernetesSecretsAnnotations";
     @Metadata(label = "producer", description = "The resource quota labels", 
javaType = "Map<String, String>",
               applicableFor = SCHEME_RESOURCES_QUOTA)
     public static final String KUBERNETES_RESOURCES_QUOTA_LABELS = 
"CamelKubernetesResourcesQuotaLabels";
diff --git 
a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/secrets/KubernetesSecretsProducer.java
 
b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/secrets/KubernetesSecretsProducer.java
index f811d4dd174..9328ebd8b1b 100644
--- 
a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/secrets/KubernetesSecretsProducer.java
+++ 
b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/secrets/KubernetesSecretsProducer.java
@@ -16,6 +16,7 @@
  */
 package org.apache.camel.component.kubernetes.secrets;
 
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.function.Function;
@@ -138,6 +139,8 @@ public class KubernetesSecretsProducer extends 
DefaultProducer {
     private void doCreateOrUpdateSecret(Exchange exchange, String 
operationName, Function<Resource<Secret>, Secret> operation) {
         String namespaceName = 
exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, 
String.class);
         Secret secretToCreate = 
exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_SECRET, Secret.class);
+        HashMap<String, String> secretAnnotations
+                = 
exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_SECRETS_ANNOTATIONS, 
HashMap.class);
         if (ObjectHelper.isEmpty(namespaceName)) {
             LOG.error("{} a specific secret require specify a namespace name", 
operationName);
             throw new IllegalArgumentException(
@@ -148,6 +151,9 @@ public class KubernetesSecretsProducer extends 
DefaultProducer {
             throw new IllegalArgumentException(
                     String.format("%s a specific secret require specify a 
secret bean", operationName));
         }
+        if (ObjectHelper.isNotEmpty(secretAnnotations)) {
+            secretToCreate.getMetadata().setAnnotations(secretAnnotations);
+        }
         Secret secret
                 = operation.apply(
                         
getEndpoint().getKubernetesClient().secrets().inNamespace(namespaceName).resource(secretToCreate));
diff --git 
a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesSecretsProducerTest.java
 
b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesSecretsProducerTest.java
index d175f855054..a8afce45a87 100644
--- 
a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesSecretsProducerTest.java
+++ 
b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesSecretsProducerTest.java
@@ -107,6 +107,29 @@ public class KubernetesSecretsProducerTest extends 
KubernetesTestSupport {
         assertEquals("sc1", result.getMetadata().getName());
     }
 
+    @Test
+    void createSecretWithAnnotations() {
+        HashMap<String, String> annotations = new HashMap<>();
+        annotations.put("environment", "prod");
+        annotations.put("version", "v3");
+
+        Secret sc1 = new 
SecretBuilder().withNewMetadata().withName("sc1").withNamespace("test").withAnnotations(annotations)
+                .and().build();
+        
server.expect().post().withPath("/api/v1/namespaces/test/secrets").andReturn(200,
 sc1).once();
+
+        Exchange ex = template.request("direct:createWithAnnotations", 
exchange -> {
+            
exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, 
"test");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_SECRET, 
sc1);
+            
exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_SECRETS_ANNOTATIONS, 
annotations);
+        });
+
+        Secret result = ex.getMessage().getBody(Secret.class);
+
+        assertEquals("test", result.getMetadata().getNamespace());
+        assertEquals("sc1", result.getMetadata().getName());
+        assertEquals(annotations, result.getMetadata().getAnnotations());
+    }
+
     @Test
     void updateSecret() {
         Secret sc1 = new 
SecretBuilder().withNewMetadata().withName("sc1").withNamespace("test").and().build();
@@ -149,6 +172,8 @@ public class KubernetesSecretsProducerTest extends 
KubernetesTestSupport {
                         
.to("kubernetes-secrets:///?kubernetesClient=#kubernetesClient&operation=listSecretsByLabels");
                 
from("direct:get").to("kubernetes-secrets:///?kubernetesClient=#kubernetesClient&operation=getSecret");
                 
from("direct:create").to("kubernetes-secrets:///?kubernetesClient=#kubernetesClient&operation=createSecret");
+                from("direct:createWithAnnotations")
+                        
.to("kubernetes-secrets:///?kubernetesClient=#kubernetesClient&operation=createSecret");
                 
from("direct:update").to("kubernetes-secrets:///?kubernetesClient=#kubernetesClient&operation=updateSecret");
                 
from("direct:delete").to("kubernetes-secrets:///?kubernetesClient=#kubernetesClient&operation=deleteSecret");
             }

Reply via email to