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 9beee642566 CAMEL-21330 - Camel-AWS-Secrets-Manager: Support Properties Function with Localstack (#16060) 9beee642566 is described below commit 9beee642566b87b819e01db67e39e36ffe40db2c Author: Andrea Cosentino <anco...@gmail.com> AuthorDate: Wed Oct 23 11:43:45 2024 +0200 CAMEL-21330 - Camel-AWS-Secrets-Manager: Support Properties Function with Localstack (#16060) * CAMEL-21330 - Camel-AWS-Secrets-Manager: Support Properties Function with Localstack Signed-off-by: Andrea Cosentino <anco...@gmail.com> * CAMEL-21330 - Camel-AWS-Secrets-Manager: Support Properties Function with Localstack Signed-off-by: Andrea Cosentino <anco...@gmail.com> --------- Signed-off-by: Andrea Cosentino <anco...@gmail.com> --- .../main/camel-main-configuration-metadata.json | 2 + .../SecretsManagerPropertiesFunction.java | 29 +++++++++++ .../integration/AwsSecretsManagerBaseTest.java | 48 ++++++++++++++++++ ...etsManagerPropertiesSourceTestLocalstackIT.java | 56 +++++++++++++++++++++ .../apache/camel/vault/AwsVaultConfiguration.java | 27 ++++++++++ .../main/AwsVaultConfigurationConfigurer.java | 12 +++++ .../AwsVaultConfigurationPropertiesConfigurer.java | 14 ++++++ .../camel-main-configuration-metadata.json | 2 + core/camel-main/src/main/docs/main.adoc | 4 +- .../main/AwsVaultConfigurationProperties.java | 17 +++++++ .../java/org/apache/camel/main/MainVaultTest.java | 58 ++++++++++++++++++++++ 11 files changed, 268 insertions(+), 1 deletion(-) diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/main/camel-main-configuration-metadata.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/main/camel-main-configuration-metadata.json index 908b4a774bd..289eec71365 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/main/camel-main-configuration-metadata.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/main/camel-main-configuration-metadata.json @@ -335,6 +335,7 @@ { "name": "camel.trace.traceTemplates", "description": "Whether to trace routes that is created from route templates or kamelets.", "sourceType": "org.apache.camel.main.TracerConfigurationProperties", "type": "boolean", "javaType": "boolean", "defaultValue": "false" }, { "name": "camel.vault.aws.accessKey", "description": "The AWS access key", "sourceType": "org.apache.camel.vault.AwsVaultConfiguration", "type": "string", "javaType": "java.lang.String" }, { "name": "camel.vault.aws.defaultCredentialsProvider", "description": "Define if we want to use the AWS Default Credentials Provider or not", "sourceType": "org.apache.camel.vault.AwsVaultConfiguration", "type": "boolean", "javaType": "boolean", "defaultValue": "false" }, + { "name": "camel.vault.aws.overrideEndpoint", "description": "Set the need for overriding the endpoint. This option needs to be used in combination with the uriEndpointOverride option", "sourceType": "org.apache.camel.vault.AwsVaultConfiguration", "type": "boolean", "javaType": "boolean", "defaultValue": "false" }, { "name": "camel.vault.aws.profileCredentialsProvider", "description": "Define if we want to use the AWS Profile Credentials Provider or not", "sourceType": "org.apache.camel.vault.AwsVaultConfiguration", "type": "boolean", "javaType": "boolean", "defaultValue": "false" }, { "name": "camel.vault.aws.profileName", "description": "Define the profile name to use if Profile Credentials Provider is selected", "sourceType": "org.apache.camel.vault.AwsVaultConfiguration", "type": "string", "javaType": "java.lang.String" }, { "name": "camel.vault.aws.refreshEnabled", "description": "Whether to automatically reload Camel upon secrets being updated in AWS.", "sourceType": "org.apache.camel.vault.AwsVaultConfiguration", "type": "boolean", "javaType": "boolean", "defaultValue": "false" }, @@ -343,6 +344,7 @@ { "name": "camel.vault.aws.secretKey", "description": "The AWS secret key", "sourceType": "org.apache.camel.vault.AwsVaultConfiguration", "type": "string", "javaType": "java.lang.String" }, { "name": "camel.vault.aws.secrets", "description": "Specify the secret names (or pattern) to check for updates. Multiple secrets can be separated by comma.", "sourceType": "org.apache.camel.vault.AwsVaultConfiguration", "type": "string", "javaType": "java.lang.String" }, { "name": "camel.vault.aws.sqsQueueUrl", "description": "In case of usage of SQS notification this field will specified the Queue URL to use", "sourceType": "org.apache.camel.vault.AwsVaultConfiguration", "type": "string", "javaType": "java.lang.String" }, + { "name": "camel.vault.aws.uriEndpointOverride", "description": "Set the overriding uri endpoint. This option needs to be used in combination with overrideEndpoint option", "sourceType": "org.apache.camel.vault.AwsVaultConfiguration", "type": "string", "javaType": "java.lang.String" }, { "name": "camel.vault.aws.useSqsNotification", "description": "Whether to use AWS SQS for secrets updates notification, this will require setting up Eventbridge\/Cloudtrail\/SQS communication", "sourceType": "org.apache.camel.vault.AwsVaultConfiguration", "type": "boolean", "javaType": "boolean", "defaultValue": "false" }, { "name": "camel.vault.azure.azureIdentityEnabled", "description": "Whether the Azure Identity Authentication should be used or not.", "sourceType": "org.apache.camel.vault.AzureVaultConfiguration", "type": "boolean", "javaType": "boolean", "defaultValue": "false" }, { "name": "camel.vault.azure.blobAccessKey", "description": "The Eventhubs Blob Access Key for CheckpointStore purpose", "sourceType": "org.apache.camel.vault.AzureVaultConfiguration", "type": "string", "javaType": "java.lang.String" }, diff --git a/components/camel-aws/camel-aws-secrets-manager/src/main/java/org/apache/camel/component/aws/secretsmanager/SecretsManagerPropertiesFunction.java b/components/camel-aws/camel-aws-secrets-manager/src/main/java/org/apache/camel/component/aws/secretsmanager/SecretsManagerPropertiesFunction.java index 7ab78ae2d2c..51d0713f158 100644 --- a/components/camel-aws/camel-aws-secrets-manager/src/main/java/org/apache/camel/component/aws/secretsmanager/SecretsManagerPropertiesFunction.java +++ b/components/camel-aws/camel-aws-secrets-manager/src/main/java/org/apache/camel/component/aws/secretsmanager/SecretsManagerPropertiesFunction.java @@ -16,6 +16,7 @@ */ package org.apache.camel.component.aws.secretsmanager; +import java.net.URI; import java.util.Base64; import java.util.HashSet; import java.util.Set; @@ -94,6 +95,11 @@ public class SecretsManagerPropertiesFunction extends ServiceSupport implements private static final String CAMEL_AWS_VAULT_PROFILE_NAME_ENV = "CAMEL_AWS_VAULT_PROFILE_NAME"; + private static final String CAMEL_AWS_VAULT_IS_OVERRIDE_ENDPOINT + = "CAMEL_AWS_VAULT_IS_OVERRIDE_ENDPOINT"; + + private static final String CAMEL_AWS_VAULT_URI_ENDPOINT_OVERRIDE = "CAMEL_AWS_VAULT_URI_ENDPOINT_OVERRIDE"; + private CamelContext camelContext; private SecretsManagerClient client; @@ -106,6 +112,10 @@ public class SecretsManagerPropertiesFunction extends ServiceSupport implements private String profileName; + private boolean isOverrideEndpoint; + + private String uriEndpointOverride; + public SecretsManagerPropertiesFunction() { super(); } @@ -127,6 +137,8 @@ public class SecretsManagerPropertiesFunction extends ServiceSupport implements boolean useProfileCredentialsProvider = Boolean.parseBoolean(System.getenv(CAMEL_AWS_VAULT_USE_PROFILE_CREDENTIALS_PROVIDER_ENV)); String profileName = System.getenv(CAMEL_AWS_VAULT_PROFILE_NAME_ENV); + boolean isOverrideEndpoint = Boolean.parseBoolean(System.getenv(CAMEL_AWS_VAULT_IS_OVERRIDE_ENDPOINT)); + String uriEndpointOverride = System.getenv(CAMEL_AWS_VAULT_URI_ENDPOINT_OVERRIDE); if (ObjectHelper.isEmpty(accessKey) && ObjectHelper.isEmpty(secretKey) && ObjectHelper.isEmpty(region)) { AwsVaultConfiguration awsVaultConfiguration = getCamelContext().getVaultConfiguration().aws(); if (ObjectHelper.isNotEmpty(awsVaultConfiguration)) { @@ -136,6 +148,8 @@ public class SecretsManagerPropertiesFunction extends ServiceSupport implements useDefaultCredentialsProvider = awsVaultConfiguration.isDefaultCredentialsProvider(); useProfileCredentialsProvider = awsVaultConfiguration.isProfileCredentialsProvider(); profileName = awsVaultConfiguration.getProfileName(); + isOverrideEndpoint = awsVaultConfiguration.isOverrideEndpoint(); + uriEndpointOverride = awsVaultConfiguration.getUriEndpointOverride(); } } this.region = region; @@ -144,11 +158,21 @@ public class SecretsManagerPropertiesFunction extends ServiceSupport implements AwsBasicCredentials cred = AwsBasicCredentials.create(accessKey, secretKey); clientBuilder = clientBuilder.credentialsProvider(StaticCredentialsProvider.create(cred)); clientBuilder.region(Region.of(region)); + if (isOverrideEndpoint) { + if (ObjectHelper.isNotEmpty(uriEndpointOverride)) { + clientBuilder.endpointOverride(URI.create(uriEndpointOverride)); + } + } client = clientBuilder.build(); } else if (useDefaultCredentialsProvider && ObjectHelper.isNotEmpty(region)) { this.defaultCredentialsProvider = true; SecretsManagerClientBuilder clientBuilder = SecretsManagerClient.builder(); clientBuilder.region(Region.of(region)); + if (isOverrideEndpoint) { + if (ObjectHelper.isNotEmpty(uriEndpointOverride)) { + clientBuilder.endpointOverride(URI.create(uriEndpointOverride)); + } + } client = clientBuilder.build(); } else if (useProfileCredentialsProvider && ObjectHelper.isNotEmpty(profileName)) { this.profleCredentialsProvider = true; @@ -156,6 +180,11 @@ public class SecretsManagerPropertiesFunction extends ServiceSupport implements SecretsManagerClientBuilder clientBuilder = SecretsManagerClient.builder(); clientBuilder.credentialsProvider(ProfileCredentialsProvider.create(profileName)); clientBuilder.region(Region.of(region)); + if (isOverrideEndpoint) { + if (ObjectHelper.isNotEmpty(uriEndpointOverride)) { + clientBuilder.endpointOverride(URI.create(uriEndpointOverride)); + } + } client = clientBuilder.build(); } else { throw new RuntimeCamelException( diff --git a/components/camel-aws/camel-aws-secrets-manager/src/test/java/org/apache/camel/component/aws/secretsmanager/integration/AwsSecretsManagerBaseTest.java b/components/camel-aws/camel-aws-secrets-manager/src/test/java/org/apache/camel/component/aws/secretsmanager/integration/AwsSecretsManagerBaseTest.java index 02b838f4adc..9effb457490 100644 --- a/components/camel-aws/camel-aws-secrets-manager/src/test/java/org/apache/camel/component/aws/secretsmanager/integration/AwsSecretsManagerBaseTest.java +++ b/components/camel-aws/camel-aws-secrets-manager/src/test/java/org/apache/camel/component/aws/secretsmanager/integration/AwsSecretsManagerBaseTest.java @@ -16,6 +16,8 @@ */ package org.apache.camel.component.aws.secretsmanager.integration; +import java.net.URI; + import org.apache.camel.CamelContext; import org.apache.camel.component.aws.secretsmanager.SecretsManagerComponent; import org.apache.camel.test.infra.aws.common.services.AWSService; @@ -24,6 +26,11 @@ import org.apache.camel.test.infra.aws2.services.AWSServiceFactory; import org.apache.camel.test.junit5.CamelTestSupport; import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.extension.RegisterExtension; +import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; +import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; +import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.secretsmanager.SecretsManagerClient; +import software.amazon.awssdk.services.secretsmanager.SecretsManagerClientBuilder; @TestInstance(TestInstance.Lifecycle.PER_CLASS) public abstract class AwsSecretsManagerBaseTest extends CamelTestSupport { @@ -37,4 +44,45 @@ public abstract class AwsSecretsManagerBaseTest extends CamelTestSupport { smComponent.getConfiguration().setSecretsManagerClient(AWSSDKClientUtils.newSecretsManagerClient()); return context; } + + // {aws.secret.key=secretkey, aws.region=us-east-1, aws.access.key=accesskey, aws.host=localhost:32775, aws.protocol=http} + public static SecretsManagerClient getSecretManagerClient() { + String accessKey = service.getConnectionProperties().getProperty("aws.access.key"); + String region = service.getConnectionProperties().getProperty("aws.region"); + String secretKey = service.getConnectionProperties().getProperty("aws.secret.key"); + String host = service.getConnectionProperties().getProperty("aws.host"); + String protocol = service.getConnectionProperties().getProperty("aws.protocol"); + SecretsManagerClient client = null; + SecretsManagerClientBuilder clientBuilder = SecretsManagerClient.builder(); + AwsBasicCredentials cred = AwsBasicCredentials.create(accessKey, secretKey); + clientBuilder = clientBuilder.credentialsProvider(StaticCredentialsProvider.create(cred)); + clientBuilder = clientBuilder.region(Region.of(region)); + clientBuilder.endpointOverride(URI.create(protocol + "://" + host)); + return clientBuilder.build(); + } + + public String getSecretKey() { + return service.getConnectionProperties().getProperty("aws.secret.key"); + } + + public String getAccessKey() { + return service.getConnectionProperties().getProperty("aws.access.key"); + } + + public String getRegion() { + return service.getConnectionProperties().getProperty("aws.region"); + } + + public String getProtocol() { + return service.getConnectionProperties().getProperty("aws.protocol"); + } + + public String getHost() { + return service.getConnectionProperties().getProperty("aws.host"); + } + + public String getUrlOverride() { + return getProtocol() + "://" + getHost(); + } + } diff --git a/components/camel-aws/camel-aws-secrets-manager/src/test/java/org/apache/camel/component/aws/secretsmanager/integration/SecretsManagerPropertiesSourceTestLocalstackIT.java b/components/camel-aws/camel-aws-secrets-manager/src/test/java/org/apache/camel/component/aws/secretsmanager/integration/SecretsManagerPropertiesSourceTestLocalstackIT.java new file mode 100644 index 00000000000..444af412e0e --- /dev/null +++ b/components/camel-aws/camel-aws-secrets-manager/src/test/java/org/apache/camel/component/aws/secretsmanager/integration/SecretsManagerPropertiesSourceTestLocalstackIT.java @@ -0,0 +1,56 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.aws.secretsmanager.integration; + +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.mock.MockEndpoint; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import software.amazon.awssdk.services.secretsmanager.model.CreateSecretRequest; + +public class SecretsManagerPropertiesSourceTestLocalstackIT extends AwsSecretsManagerBaseTest { + + @BeforeAll + public static void setup() { + CreateSecretRequest.Builder builder = CreateSecretRequest.builder(); + builder.name("test"); + builder.secretString("hello"); + getSecretManagerClient().createSecret(builder.build()); + } + + @Test + public void testFunction() throws Exception { + context.getVaultConfiguration().aws().setAccessKey(getAccessKey()); + context.getVaultConfiguration().aws().setSecretKey(getSecretKey()); + context.getVaultConfiguration().aws().setRegion(getRegion()); + context.getVaultConfiguration().aws().setOverrideEndpoint(true); + context.getVaultConfiguration().aws().setUriEndpointOverride(getUrlOverride()); + context.addRoutes(new RouteBuilder() { + @Override + public void configure() { + from("direct:start").setBody(simple("{{aws:test}}")).to("mock:bar"); + } + }); + context.start(); + + getMockEndpoint("mock:bar").expectedBodiesReceived("hello"); + + template.sendBody("direct:start", "Hello World"); + + MockEndpoint.assertIsSatisfied(context); + } +} diff --git a/core/camel-api/src/main/java/org/apache/camel/vault/AwsVaultConfiguration.java b/core/camel-api/src/main/java/org/apache/camel/vault/AwsVaultConfiguration.java index 0423e106ade..ce79dedb7b2 100644 --- a/core/camel-api/src/main/java/org/apache/camel/vault/AwsVaultConfiguration.java +++ b/core/camel-api/src/main/java/org/apache/camel/vault/AwsVaultConfiguration.java @@ -45,6 +45,10 @@ public class AwsVaultConfiguration extends VaultConfiguration { private boolean useSqsNotification; @Metadata private String sqsQueueUrl; + @Metadata + private boolean overrideEndpoint; + @Metadata + private String uriEndpointOverride; public String getAccessKey() { return accessKey; @@ -167,4 +171,27 @@ public class AwsVaultConfiguration extends VaultConfiguration { public void setSqsQueueUrl(String sqsQueueUrl) { this.sqsQueueUrl = sqsQueueUrl; } + + public boolean isOverrideEndpoint() { + return overrideEndpoint; + } + + /** + * Set the need for overriding the endpoint. This option needs to be used in combination with the + * uriEndpointOverride option + */ + public void setOverrideEndpoint(boolean overrideEndpoint) { + this.overrideEndpoint = overrideEndpoint; + } + + public String getUriEndpointOverride() { + return uriEndpointOverride; + } + + /** + * Set the overriding uri endpoint. This option needs to be used in combination with overrideEndpoint option + */ + public void setUriEndpointOverride(String uriEndpointOverride) { + this.uriEndpointOverride = uriEndpointOverride; + } } diff --git a/core/camel-main/src/generated/java/org/apache/camel/main/AwsVaultConfigurationConfigurer.java b/core/camel-main/src/generated/java/org/apache/camel/main/AwsVaultConfigurationConfigurer.java index 50136343622..3bd64e971d6 100644 --- a/core/camel-main/src/generated/java/org/apache/camel/main/AwsVaultConfigurationConfigurer.java +++ b/core/camel-main/src/generated/java/org/apache/camel/main/AwsVaultConfigurationConfigurer.java @@ -37,6 +37,8 @@ public class AwsVaultConfigurationConfigurer extends org.apache.camel.support.co case "hashicorpVaultConfiguration": target.setHashicorpVaultConfiguration(property(camelContext, org.apache.camel.vault.HashicorpVaultConfiguration.class, value)); return true; case "kubernetesvaultconfiguration": case "kubernetesVaultConfiguration": target.setKubernetesVaultConfiguration(property(camelContext, org.apache.camel.vault.KubernetesVaultConfiguration.class, value)); return true; + case "overrideendpoint": + case "overrideEndpoint": target.setOverrideEndpoint(property(camelContext, boolean.class, value)); return true; case "profilecredentialsprovider": case "profileCredentialsProvider": target.setProfileCredentialsProvider(property(camelContext, boolean.class, value)); return true; case "profilename": @@ -51,6 +53,8 @@ public class AwsVaultConfigurationConfigurer extends org.apache.camel.support.co case "secrets": target.setSecrets(property(camelContext, java.lang.String.class, value)); return true; case "sqsqueueurl": case "sqsQueueUrl": target.setSqsQueueUrl(property(camelContext, java.lang.String.class, value)); return true; + case "uriendpointoverride": + case "uriEndpointOverride": target.setUriEndpointOverride(property(camelContext, java.lang.String.class, value)); return true; case "usesqsnotification": case "useSqsNotification": target.setUseSqsNotification(property(camelContext, boolean.class, value)); return true; default: return false; @@ -74,6 +78,8 @@ public class AwsVaultConfigurationConfigurer extends org.apache.camel.support.co case "hashicorpVaultConfiguration": return org.apache.camel.vault.HashicorpVaultConfiguration.class; case "kubernetesvaultconfiguration": case "kubernetesVaultConfiguration": return org.apache.camel.vault.KubernetesVaultConfiguration.class; + case "overrideendpoint": + case "overrideEndpoint": return boolean.class; case "profilecredentialsprovider": case "profileCredentialsProvider": return boolean.class; case "profilename": @@ -88,6 +94,8 @@ public class AwsVaultConfigurationConfigurer extends org.apache.camel.support.co case "secrets": return java.lang.String.class; case "sqsqueueurl": case "sqsQueueUrl": return java.lang.String.class; + case "uriendpointoverride": + case "uriEndpointOverride": return java.lang.String.class; case "usesqsnotification": case "useSqsNotification": return boolean.class; default: return null; @@ -112,6 +120,8 @@ public class AwsVaultConfigurationConfigurer extends org.apache.camel.support.co case "hashicorpVaultConfiguration": return target.getHashicorpVaultConfiguration(); case "kubernetesvaultconfiguration": case "kubernetesVaultConfiguration": return target.getKubernetesVaultConfiguration(); + case "overrideendpoint": + case "overrideEndpoint": return target.isOverrideEndpoint(); case "profilecredentialsprovider": case "profileCredentialsProvider": return target.isProfileCredentialsProvider(); case "profilename": @@ -126,6 +136,8 @@ public class AwsVaultConfigurationConfigurer extends org.apache.camel.support.co case "secrets": return target.getSecrets(); case "sqsqueueurl": case "sqsQueueUrl": return target.getSqsQueueUrl(); + case "uriendpointoverride": + case "uriEndpointOverride": return target.getUriEndpointOverride(); case "usesqsnotification": case "useSqsNotification": return target.isUseSqsNotification(); default: return null; diff --git a/core/camel-main/src/generated/java/org/apache/camel/main/AwsVaultConfigurationPropertiesConfigurer.java b/core/camel-main/src/generated/java/org/apache/camel/main/AwsVaultConfigurationPropertiesConfigurer.java index 5fe91949794..82b5eb73123 100644 --- a/core/camel-main/src/generated/java/org/apache/camel/main/AwsVaultConfigurationPropertiesConfigurer.java +++ b/core/camel-main/src/generated/java/org/apache/camel/main/AwsVaultConfigurationPropertiesConfigurer.java @@ -29,6 +29,7 @@ public class AwsVaultConfigurationPropertiesConfigurer extends org.apache.camel. map.put("GcpVaultConfiguration", org.apache.camel.vault.GcpVaultConfiguration.class); map.put("HashicorpVaultConfiguration", org.apache.camel.vault.HashicorpVaultConfiguration.class); map.put("KubernetesVaultConfiguration", org.apache.camel.vault.KubernetesVaultConfiguration.class); + map.put("OverrideEndpoint", boolean.class); map.put("ProfileCredentialsProvider", boolean.class); map.put("ProfileName", java.lang.String.class); map.put("RefreshEnabled", boolean.class); @@ -37,6 +38,7 @@ public class AwsVaultConfigurationPropertiesConfigurer extends org.apache.camel. map.put("SecretKey", java.lang.String.class); map.put("Secrets", java.lang.String.class); map.put("SqsQueueUrl", java.lang.String.class); + map.put("UriEndpointOverride", java.lang.String.class); map.put("UseSqsNotification", boolean.class); ALL_OPTIONS = map; ConfigurerStrategy.addBootstrapConfigurerClearer(AwsVaultConfigurationPropertiesConfigurer::clearBootstrapConfigurers); @@ -60,6 +62,8 @@ public class AwsVaultConfigurationPropertiesConfigurer extends org.apache.camel. case "hashicorpVaultConfiguration": target.setHashicorpVaultConfiguration(property(camelContext, org.apache.camel.vault.HashicorpVaultConfiguration.class, value)); return true; case "kubernetesvaultconfiguration": case "kubernetesVaultConfiguration": target.setKubernetesVaultConfiguration(property(camelContext, org.apache.camel.vault.KubernetesVaultConfiguration.class, value)); return true; + case "overrideendpoint": + case "overrideEndpoint": target.setOverrideEndpoint(property(camelContext, boolean.class, value)); return true; case "profilecredentialsprovider": case "profileCredentialsProvider": target.setProfileCredentialsProvider(property(camelContext, boolean.class, value)); return true; case "profilename": @@ -74,6 +78,8 @@ public class AwsVaultConfigurationPropertiesConfigurer extends org.apache.camel. case "secrets": target.setSecrets(property(camelContext, java.lang.String.class, value)); return true; case "sqsqueueurl": case "sqsQueueUrl": target.setSqsQueueUrl(property(camelContext, java.lang.String.class, value)); return true; + case "uriendpointoverride": + case "uriEndpointOverride": target.setUriEndpointOverride(property(camelContext, java.lang.String.class, value)); return true; case "usesqsnotification": case "useSqsNotification": target.setUseSqsNotification(property(camelContext, boolean.class, value)); return true; default: return false; @@ -106,6 +112,8 @@ public class AwsVaultConfigurationPropertiesConfigurer extends org.apache.camel. case "hashicorpVaultConfiguration": return org.apache.camel.vault.HashicorpVaultConfiguration.class; case "kubernetesvaultconfiguration": case "kubernetesVaultConfiguration": return org.apache.camel.vault.KubernetesVaultConfiguration.class; + case "overrideendpoint": + case "overrideEndpoint": return boolean.class; case "profilecredentialsprovider": case "profileCredentialsProvider": return boolean.class; case "profilename": @@ -120,6 +128,8 @@ public class AwsVaultConfigurationPropertiesConfigurer extends org.apache.camel. case "secrets": return java.lang.String.class; case "sqsqueueurl": case "sqsQueueUrl": return java.lang.String.class; + case "uriendpointoverride": + case "uriEndpointOverride": return java.lang.String.class; case "usesqsnotification": case "useSqsNotification": return boolean.class; default: return null; @@ -144,6 +154,8 @@ public class AwsVaultConfigurationPropertiesConfigurer extends org.apache.camel. case "hashicorpVaultConfiguration": return target.getHashicorpVaultConfiguration(); case "kubernetesvaultconfiguration": case "kubernetesVaultConfiguration": return target.getKubernetesVaultConfiguration(); + case "overrideendpoint": + case "overrideEndpoint": return target.isOverrideEndpoint(); case "profilecredentialsprovider": case "profileCredentialsProvider": return target.isProfileCredentialsProvider(); case "profilename": @@ -158,6 +170,8 @@ public class AwsVaultConfigurationPropertiesConfigurer extends org.apache.camel. case "secrets": return target.getSecrets(); case "sqsqueueurl": case "sqsQueueUrl": return target.getSqsQueueUrl(); + case "uriendpointoverride": + case "uriEndpointOverride": return target.getUriEndpointOverride(); case "usesqsnotification": case "useSqsNotification": return target.isUseSqsNotification(); default: return null; diff --git a/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json b/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json index 908b4a774bd..289eec71365 100644 --- a/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json +++ b/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json @@ -335,6 +335,7 @@ { "name": "camel.trace.traceTemplates", "description": "Whether to trace routes that is created from route templates or kamelets.", "sourceType": "org.apache.camel.main.TracerConfigurationProperties", "type": "boolean", "javaType": "boolean", "defaultValue": "false" }, { "name": "camel.vault.aws.accessKey", "description": "The AWS access key", "sourceType": "org.apache.camel.vault.AwsVaultConfiguration", "type": "string", "javaType": "java.lang.String" }, { "name": "camel.vault.aws.defaultCredentialsProvider", "description": "Define if we want to use the AWS Default Credentials Provider or not", "sourceType": "org.apache.camel.vault.AwsVaultConfiguration", "type": "boolean", "javaType": "boolean", "defaultValue": "false" }, + { "name": "camel.vault.aws.overrideEndpoint", "description": "Set the need for overriding the endpoint. This option needs to be used in combination with the uriEndpointOverride option", "sourceType": "org.apache.camel.vault.AwsVaultConfiguration", "type": "boolean", "javaType": "boolean", "defaultValue": "false" }, { "name": "camel.vault.aws.profileCredentialsProvider", "description": "Define if we want to use the AWS Profile Credentials Provider or not", "sourceType": "org.apache.camel.vault.AwsVaultConfiguration", "type": "boolean", "javaType": "boolean", "defaultValue": "false" }, { "name": "camel.vault.aws.profileName", "description": "Define the profile name to use if Profile Credentials Provider is selected", "sourceType": "org.apache.camel.vault.AwsVaultConfiguration", "type": "string", "javaType": "java.lang.String" }, { "name": "camel.vault.aws.refreshEnabled", "description": "Whether to automatically reload Camel upon secrets being updated in AWS.", "sourceType": "org.apache.camel.vault.AwsVaultConfiguration", "type": "boolean", "javaType": "boolean", "defaultValue": "false" }, @@ -343,6 +344,7 @@ { "name": "camel.vault.aws.secretKey", "description": "The AWS secret key", "sourceType": "org.apache.camel.vault.AwsVaultConfiguration", "type": "string", "javaType": "java.lang.String" }, { "name": "camel.vault.aws.secrets", "description": "Specify the secret names (or pattern) to check for updates. Multiple secrets can be separated by comma.", "sourceType": "org.apache.camel.vault.AwsVaultConfiguration", "type": "string", "javaType": "java.lang.String" }, { "name": "camel.vault.aws.sqsQueueUrl", "description": "In case of usage of SQS notification this field will specified the Queue URL to use", "sourceType": "org.apache.camel.vault.AwsVaultConfiguration", "type": "string", "javaType": "java.lang.String" }, + { "name": "camel.vault.aws.uriEndpointOverride", "description": "Set the overriding uri endpoint. This option needs to be used in combination with overrideEndpoint option", "sourceType": "org.apache.camel.vault.AwsVaultConfiguration", "type": "string", "javaType": "java.lang.String" }, { "name": "camel.vault.aws.useSqsNotification", "description": "Whether to use AWS SQS for secrets updates notification, this will require setting up Eventbridge\/Cloudtrail\/SQS communication", "sourceType": "org.apache.camel.vault.AwsVaultConfiguration", "type": "boolean", "javaType": "boolean", "defaultValue": "false" }, { "name": "camel.vault.azure.azureIdentityEnabled", "description": "Whether the Azure Identity Authentication should be used or not.", "sourceType": "org.apache.camel.vault.AzureVaultConfiguration", "type": "boolean", "javaType": "boolean", "defaultValue": "false" }, { "name": "camel.vault.azure.blobAccessKey", "description": "The Eventhubs Blob Access Key for CheckpointStore purpose", "sourceType": "org.apache.camel.vault.AzureVaultConfiguration", "type": "string", "javaType": "java.lang.String" }, diff --git a/core/camel-main/src/main/docs/main.adoc b/core/camel-main/src/main/docs/main.adoc index 82f9d33882f..e9899e5ae41 100644 --- a/core/camel-main/src/main/docs/main.adoc +++ b/core/camel-main/src/main/docs/main.adoc @@ -367,13 +367,14 @@ The camel.rest supports 29 options, which are listed below. === Camel AWS Vault configurations -The camel.vault.aws supports 11 options, which are listed below. +The camel.vault.aws supports 13 options, which are listed below. [width="100%",cols="2,5,^1,2",options="header"] |=== | Name | Description | Default | Type | *camel.vault.aws.accessKey* | The AWS access key | | String | *camel.vault.aws.default{zwsp}CredentialsProvider* | Define if we want to use the AWS Default Credentials Provider or not | false | boolean +| *camel.vault.aws.override{zwsp}Endpoint* | Set the need for overriding the endpoint. This option needs to be used in combination with the uriEndpointOverride option | false | boolean | *camel.vault.aws.profile{zwsp}CredentialsProvider* | Define if we want to use the AWS Profile Credentials Provider or not | false | boolean | *camel.vault.aws.profileName* | Define the profile name to use if Profile Credentials Provider is selected | | String | *camel.vault.aws.refreshEnabled* | Whether to automatically reload Camel upon secrets being updated in AWS. | false | boolean @@ -382,6 +383,7 @@ The camel.vault.aws supports 11 options, which are listed below. | *camel.vault.aws.secretKey* | The AWS secret key | | String | *camel.vault.aws.secrets* | Specify the secret names (or pattern) to check for updates. Multiple secrets can be separated by comma. | | String | *camel.vault.aws.sqsQueueUrl* | In case of usage of SQS notification this field will specified the Queue URL to use | | String +| *camel.vault.aws.uriEndpoint{zwsp}Override* | Set the overriding uri endpoint. This option needs to be used in combination with overrideEndpoint option | | String | *camel.vault.aws.useSqs{zwsp}Notification* | Whether to use AWS SQS for secrets updates notification, this will require setting up Eventbridge/Cloudtrail/SQS communication | false | boolean |=== diff --git a/core/camel-main/src/main/java/org/apache/camel/main/AwsVaultConfigurationProperties.java b/core/camel-main/src/main/java/org/apache/camel/main/AwsVaultConfigurationProperties.java index 0ef8f299f14..31abefa851e 100644 --- a/core/camel-main/src/main/java/org/apache/camel/main/AwsVaultConfigurationProperties.java +++ b/core/camel-main/src/main/java/org/apache/camel/main/AwsVaultConfigurationProperties.java @@ -138,4 +138,21 @@ public class AwsVaultConfigurationProperties extends AwsVaultConfiguration imple return this; } + /** + * Set the need for overriding the endpoint. This option needs to be used in combination with the + * uriEndpointOverride option + */ + public AwsVaultConfigurationProperties isOverrideEndpoint(boolean overrideEndpoint) { + setOverrideEndpoint(overrideEndpoint); + return this; + } + + /** + * Set the overriding uri endpoint. This option needs to be used in combination with overrideEndpoint option + */ + public AwsVaultConfigurationProperties withUriEndpointOverride(String uriEndpointOverride) { + setUriEndpointOverride(uriEndpointOverride); + return this; + } + } diff --git a/core/camel-main/src/test/java/org/apache/camel/main/MainVaultTest.java b/core/camel-main/src/test/java/org/apache/camel/main/MainVaultTest.java index 124ee478a77..9105e9fba78 100644 --- a/core/camel-main/src/test/java/org/apache/camel/main/MainVaultTest.java +++ b/core/camel-main/src/test/java/org/apache/camel/main/MainVaultTest.java @@ -50,6 +50,34 @@ public class MainVaultTest { main.stop(); } + @Test + public void testMainOverrideEndpointAws() { + Main main = new Main(); + + main.addInitialProperty("camel.vault.aws.accessKey", "myKey"); + main.addInitialProperty("camel.vault.aws.secretKey", "mySecret"); + main.addInitialProperty("camel.vault.aws.region", "myRegion"); + main.addInitialProperty("camel.vault.aws.defaultCredentialsProvider", "false"); + main.addInitialProperty("camel.vault.aws.overrideEndpoint", "true"); + main.addInitialProperty("camel.vault.aws.uriEndpointOverride", "http://localhost:8080"); + + main.start(); + + CamelContext context = main.getCamelContext(); + assertNotNull(context); + + AwsVaultConfiguration cfg = context.getVaultConfiguration().aws(); + assertNotNull(cfg); + + Assertions.assertEquals("myKey", cfg.getAccessKey()); + Assertions.assertEquals("mySecret", cfg.getSecretKey()); + Assertions.assertEquals("myRegion", cfg.getRegion()); + Assertions.assertFalse(cfg.isDefaultCredentialsProvider()); + Assertions.assertTrue(cfg.isOverrideEndpoint()); + Assertions.assertEquals("http://localhost:8080", cfg.getUriEndpointOverride()); + main.stop(); + } + @Test public void testMainProfileAws() { final Main main = getMain(); @@ -108,6 +136,36 @@ public class MainVaultTest { main.stop(); } + @Test + public void testMainOverrideEndpointAwsFluent() { + Main main = new Main(); + main.configure().vault().aws() + .withAccessKey("myKey") + .withSecretKey("mySecret") + .withRegion("myRegion") + .isOverrideEndpoint(true) + .withUriEndpointOverride("http://localhost:8080") + .withDefaultCredentialsProvider(false) + .end(); + + main.start(); + + CamelContext context = main.getCamelContext(); + assertNotNull(context); + + AwsVaultConfiguration cfg = context.getVaultConfiguration().aws(); + assertNotNull(cfg); + + Assertions.assertEquals("myKey", cfg.getAccessKey()); + Assertions.assertEquals("mySecret", cfg.getSecretKey()); + Assertions.assertEquals("myRegion", cfg.getRegion()); + Assertions.assertFalse(cfg.isDefaultCredentialsProvider()); + Assertions.assertTrue(cfg.isOverrideEndpoint()); + Assertions.assertEquals("http://localhost:8080", cfg.getUriEndpointOverride()); + + main.stop(); + } + @Test public void testMainAwsFluent() { Main main = new Main();