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: <code>java.lang.String</code> 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: <code>java.lang.String</code> type.
@@ -969,6 +983,20 @@ public interface MongoDbEndpointBuilderFactory {
return this;
}
/**
+ * The database name associated with the user's credentials.
+ *
+ * The option is a: <code>java.lang.String</code> 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: <code>java.lang.String</code> type.
@@ -1375,6 +1403,20 @@ public interface MongoDbEndpointBuilderFactory {
return this;
}
/**
+ * The database name associated with the user's credentials.
+ *
+ * The option is a: <code>java.lang.String</code> 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: <code>java.lang.String</code> type.