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"); }
