Skip to content

Commit ddd5625

Browse files
[#552] Allow to specify mongo authentication database different from data database
# New features and improvements Now the user can specify an authentication database to mongo that is different from the data database through the configuration key `wasp.mongo.authentication-db`. Default value is `${wasp.mongo.db-name}` so that the default behavior is consistent. # Breaking changes Potentially binary incompatible change: `ConfigManager` was a Scala `object`, making it hard to test dynamically injected configuration values. I split it into a `class` (with the whole implementation) and an `object` extending the `class`. In this way all usages do not need any source change. # Migration None. # Bug fixes None. # How this feature was tested `ConfigManagerSpec` and existing tests. # Related issue Closes #552
1 parent 5b19e2e commit ddd5625

File tree

8 files changed

+47
-12
lines changed

8 files changed

+47
-12
lines changed

core/src/main/resources/reference.conf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ wasp {
121121
password = ""
122122
timeout = ${wasp.services-timeout-millis}
123123
collection-prefix = ""
124+
authentication-db = ${wasp.mongo.db-name}
124125
}
125126

126127
kafka {

core/src/main/scala/it/agilelab/bigdata/wasp/core/models/configuration/ValidationRule.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ package it.agilelab.bigdata.wasp.core.models.configuration
22

33
import it.agilelab.bigdata.wasp.core.utils.ConfigManager
44

5-
class ValidationRule(val key: String, val func: (ConfigManager.type) => Either[String, Unit])
5+
class ValidationRule(val key: String, val func: (ConfigManager) => Either[String, Unit])
66

77
object ValidationRule {
88
def apply(key: String)
9-
(func: (ConfigManager.type) => Either[String, Unit]): ValidationRule = new ValidationRule(key, func)
9+
(func: (ConfigManager) => Either[String, Unit]): ValidationRule = new ValidationRule(key, func)
1010
}

core/src/main/scala/it/agilelab/bigdata/wasp/core/utils/ConfigManager.scala

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ import scala.collection.JavaConverters._
1616
import scala.reflect.ClassTag
1717
import scala.reflect.runtime.universe._
1818

19-
object ConfigManager extends Logging with CanOverrideNameInstances {
19+
object ConfigManager extends ConfigManager
20+
class ConfigManager extends Logging with CanOverrideNameInstances {
2021
val conf: Config = ConfigFactory.load.getConfig("wasp") // grab the "wasp" subtree, as everything we need is in that namespace
2122

2223
val kafkaConfigName = "Kafka"
@@ -237,6 +238,7 @@ object ConfigManager extends Logging with CanOverrideNameInstances {
237238
mongoDBSubConfig.getString("db-name"),
238239
mongoDBSubConfig.getString("username"),
239240
mongoDBSubConfig.getString("password"),
241+
mongoDBSubConfig.getString("authentication-db"),
240242
mongoDBSubConfig.getInt("timeout"),
241243
mongoDBSubConfig.getString("collection-prefix")
242244
)
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package it.agilelab.bigdata.wasp.core.utils
2+
3+
import com.typesafe.config.{Config, ConfigFactory, ConfigValueFactory}
4+
import org.scalatest.{FlatSpec, Matchers}
5+
6+
class ConfigManagerSpec extends FlatSpec with Matchers {
7+
8+
it should "load the basic Mongo configuration without errors" in {
9+
noException shouldBe thrownBy(ConfigManager.getMongoDBConfig)
10+
}
11+
12+
it should "use the default database as the credential database" in {
13+
val mongoConf = ConfigManager.getMongoDBConfig
14+
mongoConf.credentialDb shouldBe mongoConf.databaseName
15+
}
16+
17+
it should "be possible to override the credential database" in {
18+
val anotherConfigManager = new ConfigManager {
19+
override val conf: Config = ConfigFactory.load().getConfig("wasp").withValue("mongo.authentication-db", ConfigValueFactory.fromAnyRef("admin"))
20+
}
21+
anotherConfigManager.getMongoDBConfig.credentialDb shouldBe "admin"
22+
}
23+
24+
}

model/src/main/scala/it/agilelab/bigdata/wasp/models/configuration/MongoDBConfigModel.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,6 @@ case class MongoDBConfigModel(address: String,
44
databaseName: String,
55
username: String,
66
password: String,
7+
credentialDb: String,
78
millisecondsTimeoutConnection: Int,
89
collectionPrefix: String)

repository/mongo/src/main/scala/it/agilelab/bigdata/wasp/repository/mongo/WaspMongoDB.scala

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -507,7 +507,7 @@ object WaspMongoDB extends Logging {
507507
println(s"Dropping MongoDB database '${mongoDBConfig.databaseName}'")
508508
val mongoDBDatabase = MongoDBHelper.getDatabase(mongoDBConfig)
509509
val dropFuture = mongoDBDatabase.drop().toFuture()
510-
Await.result(dropFuture, Duration(10, TimeUnit.SECONDS))
510+
Await.result(dropFuture, Duration(mongoDBConfig.millisecondsTimeoutConnection, TimeUnit.MILLISECONDS))
511511
println(s"Dropped MongoDB database '${mongoDBConfig.databaseName}'")
512512
System.exit(0)
513513

@@ -518,9 +518,7 @@ object WaspMongoDB extends Logging {
518518
def initializeDB(): WaspMongoDB = {
519519
// MongoDB initialization
520520
val mongoDBConfig = ConfigManager.getMongoDBConfig
521-
logger.info(
522-
s"Create connection to MongoDB: address ${mongoDBConfig.address}, databaseName: ${mongoDBConfig.databaseName}"
523-
)
521+
logger.info(s"Create connection to MongoDB:\n" + printMongoConfigModel(mongoDBConfig))
524522

525523
val codecRegistry = fromRegistries(
526524
fromProviders(codecProviders),

repository/mongo/src/main/scala/it/agilelab/bigdata/wasp/repository/mongo/utils/MongoDBHelper.scala

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ object MongoDBHelper extends Logging {
192192
val settings = if(mongoDBConfig.username != ""){
193193
settingsBuilder.credential(MongoCredential.createCredential(
194194
mongoDBConfig.username,
195-
mongoDBConfig.databaseName,
195+
mongoDBConfig.credentialDb,
196196
mongoDBConfig.password.toCharArray)).build()
197197
} else {
198198
settingsBuilder.build()
@@ -201,11 +201,8 @@ object MongoDBHelper extends Logging {
201201
resultTimeout = Duration(mongoDBConfig.millisecondsTimeoutConnection, TimeUnit.MILLISECONDS)
202202

203203
mongoClient = MongoClient(settings)
204-
//sys.addShutdownHook(() -> {
205-
// close()
206-
//})
207204
val mongoDatabase = mongoClient.getDatabase(mongoDBConfig.databaseName)
208-
205+
// this is done to eagerly initialize connection and fail as early as possible if something is wrong
209206
mongoDatabase.listCollectionNames().results()
210207
mongoDatabase
211208
}
@@ -246,4 +243,15 @@ object MongoDBHelper extends Logging {
246243
key -> value
247244
} toMap
248245
}
246+
247+
def printMongoConfigModel(mongoDBConfigModel: MongoDBConfigModel): String = {
248+
249+
s"""address: ${mongoDBConfigModel.address},
250+
|databaseName: ${mongoDBConfigModel.databaseName},
251+
|username: ${mongoDBConfigModel.username},
252+
|password: ************,
253+
|credentialDb: ${mongoDBConfigModel.credentialDb},
254+
|millisecondsTimeoutConnection: ${mongoDBConfigModel.millisecondsTimeoutConnection},
255+
|collectionPrefix: ${mongoDBConfigModel.collectionPrefix}""".stripMargin
256+
}
249257
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
wasp.mongo.authentication-db: admin

0 commit comments

Comments
 (0)