diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/embedded/EmbeddedMongoAutoConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/embedded/EmbeddedMongoAutoConfiguration.java index cd9257f664..fbbce32bc0 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/embedded/EmbeddedMongoAutoConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/embedded/EmbeddedMongoAutoConfiguration.java @@ -35,6 +35,7 @@ import de.flapdoodle.embed.mongo.config.IMongodConfig; import de.flapdoodle.embed.mongo.config.MongodConfigBuilder; import de.flapdoodle.embed.mongo.config.Net; import de.flapdoodle.embed.mongo.config.RuntimeConfigBuilder; +import de.flapdoodle.embed.mongo.config.Storage; import de.flapdoodle.embed.mongo.distribution.Feature; import de.flapdoodle.embed.mongo.distribution.IFeatureAwareVersion; import de.flapdoodle.embed.process.config.IRuntimeConfig; @@ -69,6 +70,7 @@ import org.springframework.util.Assert; * * @author Henryk Konsek * @author Andy Wilkinson + * @author Yogesh Lonkar * @since 1.3.0 */ @Configuration @@ -125,6 +127,14 @@ public class EmbeddedMongoAutoConfiguration { this.embeddedProperties.getFeatures()); MongodConfigBuilder builder = new MongodConfigBuilder() .version(featureAwareVersion); + if (this.embeddedProperties.getStorage() != null) { + builder.replication( + new Storage(this.embeddedProperties.getStorage().getDatabaseDir(), + this.embeddedProperties.getStorage().getReplSetName(), + this.embeddedProperties.getStorage().getOplogSize() != null + ? this.embeddedProperties.getStorage().getOplogSize() + : 0)); + } if (getPort() > 0) { builder.net(new Net(getHost().getHostAddress(), getPort(), Network.localhostIsIPv6())); diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/embedded/EmbeddedMongoProperties.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/embedded/EmbeddedMongoProperties.java index a006a4016f..1e9d6f3de0 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/embedded/EmbeddedMongoProperties.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/embedded/EmbeddedMongoProperties.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2015 the original author or authors. + * Copyright 2012-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,6 +28,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties; * Configuration properties for Embedded Mongo. * * @author Andy Wilkinson + * @author Yogesh Lonkar * @since 1.3.0 */ @ConfigurationProperties(prefix = "spring.mongodb.embedded") @@ -38,6 +39,8 @@ public class EmbeddedMongoProperties { */ private String version = "2.6.10"; + private Storage storage; + /** * Comma-separated list of features to enable. */ @@ -60,4 +63,55 @@ public class EmbeddedMongoProperties { this.features = features; } + public Storage getStorage() { + return this.storage; + } + + public void setStorage(Storage storage) { + this.storage = storage; + } + + public static class Storage { + + /** + * Maximum size of the oplog in megabytes. + */ + private Integer oplogSize; + + /** + * Name of the replica set. + */ + private String replSetName; + + /** + * Directory used for data storage. + */ + private String databaseDir; + + public Integer getOplogSize() { + return this.oplogSize; + } + + public void setOplogSize(Integer oplogSize) { + this.oplogSize = oplogSize; + } + + public String getReplSetName() { + return this.replSetName; + } + + public void setReplSetName(String replSetName) { + this.replSetName = replSetName; + } + + public String getDatabaseDir() { + return this.databaseDir; + } + + public void setDatabaseDir(String databaseDir) { + this.databaseDir = databaseDir; + } + + } + } diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/mongo/embedded/EmbeddedMongoAutoConfigurationTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/mongo/embedded/EmbeddedMongoAutoConfigurationTests.java index 5adbe497cd..1b705158d2 100644 --- a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/mongo/embedded/EmbeddedMongoAutoConfigurationTests.java +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/mongo/embedded/EmbeddedMongoAutoConfigurationTests.java @@ -16,10 +16,13 @@ package org.springframework.boot.autoconfigure.mongo.embedded; +import java.io.File; import java.net.UnknownHostException; import com.mongodb.CommandResult; import com.mongodb.MongoClient; +import de.flapdoodle.embed.mongo.config.IMongodConfig; +import de.flapdoodle.embed.mongo.config.Storage; import de.flapdoodle.embed.mongo.distribution.Feature; import org.junit.After; import org.junit.Test; @@ -34,6 +37,7 @@ import org.springframework.context.annotation.AnnotationConfigApplicationContext import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.util.FileSystemUtils; import org.springframework.util.SocketUtils; import static org.assertj.core.api.Assertions.assertThat; @@ -112,6 +116,63 @@ public class EmbeddedMongoAutoConfigurationTests { } } + @Test + public void defaultStorageConfiguration() { + this.context = new AnnotationConfigApplicationContext(); + EnvironmentTestUtils.addEnvironment(this.context, "spring.data.mongodb.port=0"); + this.context.register(EmbeddedMongoAutoConfiguration.class, + MongoClientConfiguration.class, + PropertyPlaceholderAutoConfiguration.class); + this.context.refresh(); + Storage replication = this.context.getBean(IMongodConfig.class).replication(); + assertThat(replication.getOplogSize()).isEqualTo(0); + assertThat(replication.getDatabaseDir()).isNull(); + assertThat(replication.getReplSetName()).isNull(); + } + + @Test + public void mongoWritesToCustomDatabaseDir() { + File customDatabaseDir = new File("target/custom-database-dir"); + FileSystemUtils.deleteRecursively(customDatabaseDir); + this.context = new AnnotationConfigApplicationContext(); + EnvironmentTestUtils.addEnvironment(this.context, "spring.data.mongodb.port=0", + "spring.mongodb.embedded.storage.databaseDir=" + + customDatabaseDir.getPath()); + this.context.register(EmbeddedMongoAutoConfiguration.class, + MongoClientConfiguration.class, + PropertyPlaceholderAutoConfiguration.class); + this.context.refresh(); + assertThat(customDatabaseDir).isDirectory(); + assertThat(customDatabaseDir.listFiles()).isNotEmpty(); + } + + @Test + public void customOpLogSizeIsAppliedToConfiguration() { + this.context = new AnnotationConfigApplicationContext(); + EnvironmentTestUtils.addEnvironment(this.context, "spring.data.mongodb.port=0", + "spring.mongodb.embedded.storage.oplogSize=10"); + this.context.register(EmbeddedMongoAutoConfiguration.class, + MongoClientConfiguration.class, + PropertyPlaceholderAutoConfiguration.class); + this.context.refresh(); + assertThat(this.context.getBean(IMongodConfig.class).replication().getOplogSize()) + .isEqualTo(10); + } + + @Test + public void customReplicaSetNameIsAppliedToConfiguration() { + this.context = new AnnotationConfigApplicationContext(); + EnvironmentTestUtils.addEnvironment(this.context, "spring.data.mongodb.port=0", + "spring.mongodb.embedded.storage.replSetName=testing"); + this.context.register(EmbeddedMongoAutoConfiguration.class, + MongoClientConfiguration.class, + PropertyPlaceholderAutoConfiguration.class); + this.context.refresh(); + assertThat( + this.context.getBean(IMongodConfig.class).replication().getReplSetName()) + .isEqualTo("testing"); + } + private void assertVersionConfiguration(String configuredVersion, String expectedVersion) { this.context = new AnnotationConfigApplicationContext(); diff --git a/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc b/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc index 1c1cce0c3b..4b58d908b6 100644 --- a/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc +++ b/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc @@ -730,6 +730,9 @@ content into your application; rather pick only the properties that you need. # EMBEDDED MONGODB ({sc-spring-boot-autoconfigure}/mongo/embedded/EmbeddedMongoProperties.{sc-ext}[EmbeddedMongoProperties]) spring.mongodb.embedded.features=SYNC_DELAY # Comma-separated list of features to enable. + spring.mongodb.embedded.storage.databaseDir= # Directory used for data storage. + spring.mongodb.embedded.storage.oplogSize= # Maximum size of the oplog in megabytes. + spring.mongodb.embedded.storage.replSetName= # Name of the replica set. spring.mongodb.embedded.version=2.6.10 # Version of Mongo to use. # REDIS ({sc-spring-boot-autoconfigure}/redis/RedisProperties.{sc-ext}[RedisProperties])