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

orpiske 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 74b77de  CAMEL-17564: Added authSource param to MongoDB connection 
endpoint
74b77de is described below

commit 74b77ded6f4070ffb8d3f016b59b35ae78319b59
Author: Darren Coleman <[email protected]>
AuthorDate: Fri Feb 11 14:05:01 2022 +0000

    CAMEL-17564: Added authSource param to MongoDB connection endpoint
---
 .../apache/camel/catalog/components/mongodb.json   |  1 +
 .../mongodb/MongoDbEndpointConfigurer.java         |  6 ++++
 .../mongodb/MongoDbEndpointUriFactory.java         |  3 +-
 .../apache/camel/component/mongodb/mongodb.json    |  1 +
 .../camel/component/mongodb/MongoDbEndpoint.java   | 18 +++++++++-
 .../integration/AbstractMongoDbITSupport.java      | 16 +++++----
 .../MongoDbCredentialsFromUriConnectionIT.java     | 33 ++++++++++++++++-
 .../dsl/MongoDbEndpointBuilderFactory.java         | 42 ++++++++++++++++++++++
 8 files changed, 111 insertions(+), 9 deletions(-)

diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/mongodb.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/mongodb.json
index 21051c26..d87c475 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/mongodb.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/mongodb.json
@@ -48,6 +48,7 @@
     "writeConcern": { "kind": "parameter", "displayName": "Write Concern", 
"group": "advanced", "label": "advanced", "required": false, "type": "string", 
"javaType": "java.lang.String", "enum": [ "ACKNOWLEDGED", "W1", "W2", "W3", 
"UNACKNOWLEDGED", "JOURNALED", "MAJORITY" ], "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": "ACKNOWLEDGED", "description": 
"Configure the connection bean with the level of acknowledgment requested from 
MongoDB for write operations to a [...]
     "writeResultAsHeader": { "kind": "parameter", "displayName": "Write Result 
As Header", "group": "advanced", "label": "advanced", "required": false, 
"type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": false, "description": "In write 
operations, it determines whether instead of returning WriteResult as the body 
of the OUT message, we transfer the IN message to the OUT and attach the 
WriteResult as a header." },
     "streamFilter": { "kind": "parameter", "displayName": "Stream Filter", 
"group": "changeStream", "label": "consumer,changeStream", "required": false, 
"type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "Filter condition for 
change streams consumer." },
+    "authSource": { "kind": "parameter", "displayName": "Auth Source", 
"group": "security", "label": "security", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": false, "description": "The database name associated with the user's 
credentials." },
     "password": { "kind": "parameter", "displayName": "Password", "group": 
"security", "label": "security", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": true, "description": "User password for mongodb connection" },
     "username": { "kind": "parameter", "displayName": "Username", "group": 
"security", "label": "security", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": true, "description": "Username for mongodb connection" },
     "persistentId": { "kind": "parameter", "displayName": "Persistent Id", 
"group": "tail", "label": "consumer,tail", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": false, "description": "One tail tracking collection can host many 
trackers for several tailable consumers. To keep them separate, each tracker 
should have its own unique persistentId." },
diff --git 
a/components/camel-mongodb/src/generated/java/org/apache/camel/component/mongodb/MongoDbEndpointConfigurer.java
 
b/components/camel-mongodb/src/generated/java/org/apache/camel/component/mongodb/MongoDbEndpointConfigurer.java
index 0176f8c..a1ad130 100644
--- 
a/components/camel-mongodb/src/generated/java/org/apache/camel/component/mongodb/MongoDbEndpointConfigurer.java
+++ 
b/components/camel-mongodb/src/generated/java/org/apache/camel/component/mongodb/MongoDbEndpointConfigurer.java
@@ -21,6 +21,8 @@ public class MongoDbEndpointConfigurer extends 
PropertyConfigurerSupport impleme
     public boolean configure(CamelContext camelContext, Object obj, String 
name, Object value, boolean ignoreCase) {
         MongoDbEndpoint target = (MongoDbEndpoint) obj;
         switch (ignoreCase ? name.toLowerCase() : name) {
+        case "authsource":
+        case "authSource": target.setAuthSource(property(camelContext, 
java.lang.String.class, value)); return true;
         case "bridgeerrorhandler":
         case "bridgeErrorHandler": 
target.setBridgeErrorHandler(property(camelContext, boolean.class, value)); 
return true;
         case "collection": target.setCollection(property(camelContext, 
java.lang.String.class, value)); return true;
@@ -75,6 +77,8 @@ public class MongoDbEndpointConfigurer extends 
PropertyConfigurerSupport impleme
     @Override
     public Class<?> getOptionType(String name, boolean ignoreCase) {
         switch (ignoreCase ? name.toLowerCase() : name) {
+        case "authsource":
+        case "authSource": return java.lang.String.class;
         case "bridgeerrorhandler":
         case "bridgeErrorHandler": return boolean.class;
         case "collection": return java.lang.String.class;
@@ -130,6 +134,8 @@ public class MongoDbEndpointConfigurer extends 
PropertyConfigurerSupport impleme
     public Object getOptionValue(Object obj, String name, boolean ignoreCase) {
         MongoDbEndpoint target = (MongoDbEndpoint) obj;
         switch (ignoreCase ? name.toLowerCase() : name) {
+        case "authsource":
+        case "authSource": return target.getAuthSource();
         case "bridgeerrorhandler":
         case "bridgeErrorHandler": return target.isBridgeErrorHandler();
         case "collection": return target.getCollection();
diff --git 
a/components/camel-mongodb/src/generated/java/org/apache/camel/component/mongodb/MongoDbEndpointUriFactory.java
 
b/components/camel-mongodb/src/generated/java/org/apache/camel/component/mongodb/MongoDbEndpointUriFactory.java
index cff0364..91e4276 100644
--- 
a/components/camel-mongodb/src/generated/java/org/apache/camel/component/mongodb/MongoDbEndpointUriFactory.java
+++ 
b/components/camel-mongodb/src/generated/java/org/apache/camel/component/mongodb/MongoDbEndpointUriFactory.java
@@ -21,8 +21,9 @@ public class MongoDbEndpointUriFactory extends 
org.apache.camel.support.componen
     private static final Set<String> SECRET_PROPERTY_NAMES;
     private static final Set<String> MULTI_VALUE_PREFIXES;
     static {
-        Set<String> props = new HashSet<>(28);
+        Set<String> props = new HashSet<>(29);
         props.add("connectionBean");
+        props.add("authSource");
         props.add("outputType");
         props.add("writeConcern");
         props.add("database");
diff --git 
a/components/camel-mongodb/src/generated/resources/org/apache/camel/component/mongodb/mongodb.json
 
b/components/camel-mongodb/src/generated/resources/org/apache/camel/component/mongodb/mongodb.json
index 21051c26..d87c475 100644
--- 
a/components/camel-mongodb/src/generated/resources/org/apache/camel/component/mongodb/mongodb.json
+++ 
b/components/camel-mongodb/src/generated/resources/org/apache/camel/component/mongodb/mongodb.json
@@ -48,6 +48,7 @@
     "writeConcern": { "kind": "parameter", "displayName": "Write Concern", 
"group": "advanced", "label": "advanced", "required": false, "type": "string", 
"javaType": "java.lang.String", "enum": [ "ACKNOWLEDGED", "W1", "W2", "W3", 
"UNACKNOWLEDGED", "JOURNALED", "MAJORITY" ], "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": "ACKNOWLEDGED", "description": 
"Configure the connection bean with the level of acknowledgment requested from 
MongoDB for write operations to a [...]
     "writeResultAsHeader": { "kind": "parameter", "displayName": "Write Result 
As Header", "group": "advanced", "label": "advanced", "required": false, 
"type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": false, "description": "In write 
operations, it determines whether instead of returning WriteResult as the body 
of the OUT message, we transfer the IN message to the OUT and attach the 
WriteResult as a header." },
     "streamFilter": { "kind": "parameter", "displayName": "Stream Filter", 
"group": "changeStream", "label": "consumer,changeStream", "required": false, 
"type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "Filter condition for 
change streams consumer." },
+    "authSource": { "kind": "parameter", "displayName": "Auth Source", 
"group": "security", "label": "security", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": false, "description": "The database name associated with the user's 
credentials." },
     "password": { "kind": "parameter", "displayName": "Password", "group": 
"security", "label": "security", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": true, "description": "User password for mongodb connection" },
     "username": { "kind": "parameter", "displayName": "Username", "group": 
"security", "label": "security", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": true, "description": "Username for mongodb connection" },
     "persistentId": { "kind": "parameter", "displayName": "Persistent Id", 
"group": "tail", "label": "consumer,tail", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": false, "description": "One tail tracking collection can host many 
trackers for several tailable consumers. To keep them separate, each tracker 
should have its own unique persistentId." },
diff --git 
a/components/camel-mongodb/src/main/java/org/apache/camel/component/mongodb/MongoDbEndpoint.java
 
b/components/camel-mongodb/src/main/java/org/apache/camel/component/mongodb/MongoDbEndpoint.java
index 8c92596..ed614ec 100644
--- 
a/components/camel-mongodb/src/main/java/org/apache/camel/component/mongodb/MongoDbEndpoint.java
+++ 
b/components/camel-mongodb/src/main/java/org/apache/camel/component/mongodb/MongoDbEndpoint.java
@@ -76,6 +76,8 @@ public class MongoDbEndpoint extends DefaultEndpoint {
     private String password;
     @UriParam
     private String hosts;
+    @UriParam(label = "security")
+    private String authSource;
     @UriParam
     private String database;
     @UriParam
@@ -341,7 +343,9 @@ public class MongoDbEndpoint extends DefaultEndpoint {
                 credentials += this.password == null ? "@" : ":" + password + 
"@";
             }
 
-            mongoClient = MongoClients.create(String.format("mongodb://%s%s", 
credentials, hosts));
+            String connectionOptions = authSource == null ? "" : 
"/?authSource=" + authSource;
+
+            mongoClient = 
MongoClients.create(String.format("mongodb://%s%s%s", credentials, hosts, 
connectionOptions));
             LOG.debug("Connection created using provided credentials");
         } else {
             mongoClient = 
CamelContextHelper.mandatoryLookup(getCamelContext(), connectionBean, 
MongoClient.class);
@@ -741,4 +745,16 @@ public class MongoDbEndpoint extends DefaultEndpoint {
         this.hosts = hosts;
     }
 
+    public String getAuthSource() {
+        return authSource;
+    }
+
+    /**
+     * The database name associated with the user's credentials.
+     * 
+     * @param authSource
+     */
+    public void setAuthSource(String authSource) {
+        this.authSource = authSource;
+    }
 }
diff --git 
a/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/integration/AbstractMongoDbITSupport.java
 
b/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/integration/AbstractMongoDbITSupport.java
index d86dcb4..0e79a39 100644
--- 
a/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/integration/AbstractMongoDbITSupport.java
+++ 
b/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/integration/AbstractMongoDbITSupport.java
@@ -112,17 +112,21 @@ public abstract class AbstractMongoDbITSupport extends 
CamelTestSupport {
      * Useful to simulate the presence of an authenticated user with name 
{@value #USER} and password {@value #PASSWORD}
      */
     protected void createAuthorizationUser() {
-        MongoDatabase admin = mongo.getDatabase("admin");
-        MongoCollection<Document> usersCollection = 
admin.getCollection("system.users");
-        if (usersCollection.countDocuments() == 0) {
+        createAuthorizationUser("admin", USER, PASSWORD);
+    }
 
+    protected void createAuthorizationUser(String database, String user, 
String password) {
+        MongoDatabase adminDb = mongo.getDatabase("admin");
+        MongoCollection<Document> usersCollection = 
adminDb.getCollection("system.users");
+        if (usersCollection.countDocuments(new Document("user", user)) == 0) {
+            MongoDatabase db = mongo.getDatabase(database);
             Map<String, Object> commandArguments = new LinkedHashMap<>();
-            commandArguments.put("createUser", USER);
-            commandArguments.put("pwd", PASSWORD);
+            commandArguments.put("createUser", user);
+            commandArguments.put("pwd", password);
             String[] roles = { "readWrite" };
             commandArguments.put("roles", roles);
             BasicDBObject command = new BasicDBObject(commandArguments);
-            admin.runCommand(command);
+            db.runCommand(command);
         }
     }
 
diff --git 
a/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/integration/MongoDbCredentialsFromUriConnectionIT.java
 
b/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/integration/MongoDbCredentialsFromUriConnectionIT.java
index ed142df..212d919 100644
--- 
a/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/integration/MongoDbCredentialsFromUriConnectionIT.java
+++ 
b/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/integration/MongoDbCredentialsFromUriConnectionIT.java
@@ -21,15 +21,24 @@ import org.apache.camel.CamelContext;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mongodb.MongoDbConstants;
 import org.apache.camel.impl.DefaultCamelContext;
+import org.bson.Document;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 // Test class performs the same tests as DBOperationsIT but with modified URIs
 public class MongoDbCredentialsFromUriConnectionIT extends MongoDbOperationsIT 
{
 
+    protected static final String AUTH_SOURCE_USER = "auth-source-user";
+    protected static final String AUTH_SOURCE_PASSWORD = 
"auth-source-password";
+
     @Override
     public void doPreSetup() throws Exception {
         // create user in db
         super.doPreSetup();
         createAuthorizationUser();
+        createAuthorizationUser(dbName, AUTH_SOURCE_USER, 
AUTH_SOURCE_PASSWORD);
     }
 
     @Override
@@ -41,6 +50,22 @@ public class MongoDbCredentialsFromUriConnectionIT extends 
MongoDbOperationsIT {
         return ctx;
     }
 
+    @Test
+    public void testCountOperationAuthUser() {
+        // Test that the collection has 0 documents in it
+        assertEquals(0, testCollection.countDocuments());
+        Object result = template.requestBody("direct:testAuthSource", 
"irrelevantBody");
+        assertTrue(result instanceof Long, "Result is not of type Long");
+        assertEquals(0L, result, "Test collection should not contain any 
records");
+
+        // Insert a record and test that the endpoint now returns 1
+        testCollection.insertOne(Document.parse("{a:60}"));
+        result = template.requestBody("direct:testAuthSource", 
"irrelevantBody");
+        assertTrue(result instanceof Long, "Result is not of type Long");
+        assertEquals(1L, result, "Test collection should contain 1 record");
+        testCollection.deleteOne(new Document());
+    }
+
     @Override
     protected RouteBuilder createRouteBuilder() throws Exception {
         return new RouteBuilder() {
@@ -50,6 +75,10 @@ public class MongoDbCredentialsFromUriConnectionIT extends 
MongoDbOperationsIT {
                 //connecting with credentials for created user
                 String uriWithCredentials = 
String.format("%susername=%s&password=%s&", uriHostnameOnly, USER, PASSWORD);
 
+                String uriWithAuthSource = String.format(
+                        "%susername=%s&password=%s&authSource=%s&",
+                        uriHostnameOnly, AUTH_SOURCE_USER, 
AUTH_SOURCE_PASSWORD, dbName);
+
                 from("direct:count").to(
                         uriHostnameOnly + 
"database={{mongodb.testDb}}&collection={{mongodb.testCollection}}&operation=count&dynamicity=true");
                 from("direct:insert")
@@ -80,7 +109,9 @@ public class MongoDbCredentialsFromUriConnectionIT extends 
MongoDbOperationsIT {
                 from("direct:getColStats").to(
                         uriWithCredentials + 
"database={{mongodb.testDb}}&collection={{mongodb.testCollection}}&operation=getColStats");
                 from("direct:command").to(uriWithCredentials + 
"database={{mongodb.testDb}}&operation=command");
-
+                from("direct:testAuthSource")
+                        .to(uriWithAuthSource
+                            + 
"database={{mongodb.testDb}}&collection={{mongodb.testCollection}}&operation=count&dynamicity=true");
             }
         };
     }
diff --git 
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/MongoDbEndpointBuilderFactory.java
 
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/MongoDbEndpointBuilderFactory.java
index 1bd0354..a2176a6 100644
--- 
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/MongoDbEndpointBuilderFactory.java
+++ 
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/MongoDbEndpointBuilderFactory.java
@@ -315,6 +315,20 @@ public interface MongoDbEndpointBuilderFactory {
             return this;
         }
         /**
+         * The database name associated with the user's credentials.
+         * 
+         * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.
+         * 
+         * Group: security
+         * 
+         * @param authSource the value to set
+         * @return the dsl builder
+         */
+        default MongoDbEndpointConsumerBuilder authSource(String authSource) {
+            doSetProperty("authSource", authSource);
+            return this;
+        }
+        /**
          * User password for mongodb connection.
          * 
          * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.
@@ -969,6 +983,20 @@ public interface MongoDbEndpointBuilderFactory {
             return this;
         }
         /**
+         * The database name associated with the user's credentials.
+         * 
+         * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.
+         * 
+         * Group: security
+         * 
+         * @param authSource the value to set
+         * @return the dsl builder
+         */
+        default MongoDbEndpointProducerBuilder authSource(String authSource) {
+            doSetProperty("authSource", authSource);
+            return this;
+        }
+        /**
          * User password for mongodb connection.
          * 
          * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.
@@ -1375,6 +1403,20 @@ public interface MongoDbEndpointBuilderFactory {
             return this;
         }
         /**
+         * The database name associated with the user's credentials.
+         * 
+         * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.
+         * 
+         * Group: security
+         * 
+         * @param authSource the value to set
+         * @return the dsl builder
+         */
+        default MongoDbEndpointBuilder authSource(String authSource) {
+            doSetProperty("authSource", authSource);
+            return this;
+        }
+        /**
          * User password for mongodb connection.
          * 
          * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.

Reply via email to