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 2022/03/30 12:57:27 UTC

[camel] 07/13: CAMEL-17687 - Create a Camel Azure Key Vault component

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

commit 1dfe2ff432fd0cb6d94c49daf975ea0f066d516e
Author: Andrea Cosentino <an...@gmail.com>
AuthorDate: Wed Mar 30 11:51:02 2022 +0200

    CAMEL-17687 - Create a Camel Azure Key Vault component
---
 .../azure/key/vault/KeyVaultConstants.java         |  4 +++
 .../azure/key/vault/KeyVaultEndpoint.java          | 38 ++++++++++++++++++++++
 .../azure/key/vault/KeyVaultProducer.java          | 28 +++++-----------
 .../operations/KeyVaultOperationsTest.java         |  8 ++---
 4 files changed, 54 insertions(+), 24 deletions(-)

diff --git a/components/camel-azure/camel-azure-key-vault/src/main/java/org/apache/camel/component/azure/key/vault/KeyVaultConstants.java b/components/camel-azure/camel-azure-key-vault/src/main/java/org/apache/camel/component/azure/key/vault/KeyVaultConstants.java
index fad06dd..d5696eb 100644
--- a/components/camel-azure/camel-azure-key-vault/src/main/java/org/apache/camel/component/azure/key/vault/KeyVaultConstants.java
+++ b/components/camel-azure/camel-azure-key-vault/src/main/java/org/apache/camel/component/azure/key/vault/KeyVaultConstants.java
@@ -25,6 +25,10 @@ public final class KeyVaultConstants {
     @Metadata(label = "producer", description = "Overrides the desired operation to be used in the producer.",
               javaType = "org.apache.camel.component.azure.key.vault.KeyVaultOperationDefinition")
     public static final String OPERATION = HEADER_PREFIX + "ProducerOperation";
+    // headers set by the producer only
+    @Metadata(label = "producer", description = "The secret name to be used in Key Vault",
+            javaType = "String")
+    public static final String SECRET_NAME = HEADER_PREFIX + "SecretName";
 
     private KeyVaultConstants() {
     }
diff --git a/components/camel-azure/camel-azure-key-vault/src/main/java/org/apache/camel/component/azure/key/vault/KeyVaultEndpoint.java b/components/camel-azure/camel-azure-key-vault/src/main/java/org/apache/camel/component/azure/key/vault/KeyVaultEndpoint.java
index 1af5e11..a3219b0 100644
--- a/components/camel-azure/camel-azure-key-vault/src/main/java/org/apache/camel/component/azure/key/vault/KeyVaultEndpoint.java
+++ b/components/camel-azure/camel-azure-key-vault/src/main/java/org/apache/camel/component/azure/key/vault/KeyVaultEndpoint.java
@@ -16,6 +16,10 @@
  */
 package org.apache.camel.component.azure.key.vault;
 
+import com.azure.identity.ClientSecretCredential;
+import com.azure.identity.ClientSecretCredentialBuilder;
+import com.azure.security.keyvault.secrets.SecretClient;
+import com.azure.security.keyvault.secrets.SecretClientBuilder;
 import org.apache.camel.Category;
 import org.apache.camel.Component;
 import org.apache.camel.Consumer;
@@ -34,6 +38,8 @@ import org.apache.camel.support.DefaultEndpoint;
              headersClass = KeyVaultConstants.class)
 public class KeyVaultEndpoint extends DefaultEndpoint {
 
+    private SecretClient secretClient;
+
     @UriParam
     private KeyVaultConfiguration configuration;
 
@@ -43,6 +49,27 @@ public class KeyVaultEndpoint extends DefaultEndpoint {
     }
 
     @Override
+    public void doInit() throws Exception {
+        super.doInit();
+
+        // Build key vault URI
+        String keyVaultUri = "https://" + getConfiguration().getVaultName() + ".vault.azure.net";
+
+        // Credential
+        ClientSecretCredential credential = new ClientSecretCredentialBuilder()
+                .tenantId(getConfiguration().getTenantId())
+                .clientId(getConfiguration().getClientId())
+                .clientSecret(getConfiguration().getClientSecret())
+                .build();
+
+        // Build Client
+        secretClient = new SecretClientBuilder()
+                .vaultUrl(keyVaultUri)
+                .credential(credential)
+                .buildClient();
+    }
+
+    @Override
     public Producer createProducer() throws Exception {
         return new KeyVaultProducer(this);
     }
@@ -62,4 +89,15 @@ public class KeyVaultEndpoint extends DefaultEndpoint {
     public void setConfiguration(KeyVaultConfiguration configuration) {
         this.configuration = configuration;
     }
+
+    /**
+     * The secret Client
+     */
+    public SecretClient getSecretClient() {
+        return secretClient;
+    }
+
+    public void setSecretClient(SecretClient secretClient) {
+        this.secretClient = secretClient;
+    }
 }
diff --git a/components/camel-azure/camel-azure-key-vault/src/main/java/org/apache/camel/component/azure/key/vault/KeyVaultProducer.java b/components/camel-azure/camel-azure-key-vault/src/main/java/org/apache/camel/component/azure/key/vault/KeyVaultProducer.java
index f760d8b..b9c1e52 100644
--- a/components/camel-azure/camel-azure-key-vault/src/main/java/org/apache/camel/component/azure/key/vault/KeyVaultProducer.java
+++ b/components/camel-azure/camel-azure-key-vault/src/main/java/org/apache/camel/component/azure/key/vault/KeyVaultProducer.java
@@ -23,8 +23,10 @@ import com.azure.security.keyvault.secrets.SecretClientBuilder;
 import com.azure.security.keyvault.secrets.models.KeyVaultSecret;
 import org.apache.camel.Endpoint;
 import org.apache.camel.Exchange;
+import org.apache.camel.InvalidPayloadException;
 import org.apache.camel.Message;
 import org.apache.camel.support.DefaultProducer;
+import org.apache.camel.util.ObjectHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -32,8 +34,6 @@ public class KeyVaultProducer extends DefaultProducer {
 
     private static final Logger LOG = LoggerFactory.getLogger(KeyVaultProducer.class);
 
-    protected SecretClient secretClient;
-
     public KeyVaultProducer(final Endpoint endpoint) {
         super(endpoint);
     }
@@ -46,22 +46,6 @@ public class KeyVaultProducer extends DefaultProducer {
     @Override
     protected void doStart() throws Exception {
         super.doStart();
-
-        // Build key vault URI
-        String keyVaultUri = "https://" + getConfiguration().getVaultName() + ".vault.azure.net";
-
-        // Credential
-        ClientSecretCredential credential = new ClientSecretCredentialBuilder()
-                .tenantId(getConfiguration().getTenantId())
-                .clientId(getConfiguration().getClientId())
-                .clientSecret(getConfiguration().getClientSecret())
-                .build();
-
-        // Build Client
-        secretClient = new SecretClientBuilder()
-                .vaultUrl(keyVaultUri)
-                .credential(credential)
-                .buildClient();
     }
 
     @Override
@@ -76,8 +60,12 @@ public class KeyVaultProducer extends DefaultProducer {
         }
     }
 
-    private void createSecret(Exchange exchange) {
-        KeyVaultSecret p = secretClient.setSecret(new KeyVaultSecret("pippo", "peppe"));
+    private void createSecret(Exchange exchange) throws InvalidPayloadException {
+        final String secretName =  exchange.getMessage().getHeader(KeyVaultConstants.SECRET_NAME, String.class);
+        if (ObjectHelper.isEmpty(secretName)) {
+            throw new IllegalArgumentException("Secret Name must be specified for createSecret Operation");
+        }
+        KeyVaultSecret p = getEndpoint().getSecretClient().setSecret(new KeyVaultSecret(secretName, exchange.getMessage().getMandatoryBody(String.class)));
         Message message = getMessageForResponse(exchange);
         message.setBody(p);
     }
diff --git a/components/camel-azure/camel-azure-key-vault/src/test/java/org/apache/camel/component/azure/key/vault/integration/operations/KeyVaultOperationsTest.java b/components/camel-azure/camel-azure-key-vault/src/test/java/org/apache/camel/component/azure/key/vault/integration/operations/KeyVaultOperationsTest.java
index 9c1832a..73de7a5 100644
--- a/components/camel-azure/camel-azure-key-vault/src/test/java/org/apache/camel/component/azure/key/vault/integration/operations/KeyVaultOperationsTest.java
+++ b/components/camel-azure/camel-azure-key-vault/src/test/java/org/apache/camel/component/azure/key/vault/integration/operations/KeyVaultOperationsTest.java
@@ -29,13 +29,13 @@ import org.junit.jupiter.api.TestInstance;
 import org.junit.jupiter.api.condition.EnabledIfSystemProperty;
 
 @EnabledIfSystemProperty(named = "vaultName", matches = ".*",
-        disabledReason = "Make sure to supply azure key vault Vault Name, e.g:  mvn verify -DvaultName=string")
+                         disabledReason = "Make sure to supply azure key vault Vault Name, e.g:  mvn verify -DvaultName=string")
 @EnabledIfSystemProperty(named = "clientId", matches = ".*",
-        disabledReason = "Make sure to supply azure key vault Client Id, e.g:  mvn verify -DclientId=string")
+                         disabledReason = "Make sure to supply azure key vault Client Id, e.g:  mvn verify -DclientId=string")
 @EnabledIfSystemProperty(named = "clientSecret", matches = ".*",
-        disabledReason = "Make sure to supply azure key vault Client Secret, e.g:  mvn verify -DclientSecret=string")
+                         disabledReason = "Make sure to supply azure key vault Client Secret, e.g:  mvn verify -DclientSecret=string")
 @EnabledIfSystemProperty(named = "tenantId", matches = ".*",
-        disabledReason = "Make sure to supply azure key vault Tenant Id, e.g:  mvn verify -DtenantId=string")
+                         disabledReason = "Make sure to supply azure key vault Tenant Id, e.g:  mvn verify -DtenantId=string")
 @TestInstance(TestInstance.Lifecycle.PER_CLASS)
 public class KeyVaultOperationsTest extends CamelTestSupport {