diff --git a/src/main/java/io/ebean/config/ServerConfig.java b/src/main/java/io/ebean/config/ServerConfig.java index 0b42551b1..679692b88 100644 --- a/src/main/java/io/ebean/config/ServerConfig.java +++ b/src/main/java/io/ebean/config/ServerConfig.java @@ -2878,6 +2878,22 @@ public class ServerConfig { ddlInitSql = p.get("ddl.initSql", ddlInitSql); ddlSeedSql = p.get("ddl.seedSql", ddlSeedSql); + // read tenant-configuration from config: + // tenant.mode = NONE | DB | SCHEMA | CATALOG | PARTITION + String mode = p.get("tenant.mode"); + if (mode != null) { + for (TenantMode value : TenantMode.values()) { + if (value.name().equalsIgnoreCase(mode)) { + tenantMode = value; + break; + } + } + } + + currentTenantProvider = createInstance(p, CurrentTenantProvider.class, "tenant.currentTenantProvider", currentTenantProvider); + tenantCatalogProvider = createInstance(p, TenantCatalogProvider.class, "tenant.catalogProvider", tenantCatalogProvider); + tenantSchemaProvider = createInstance(p, TenantSchemaProvider.class, "tenant.schemaProvider", tenantSchemaProvider); + tenantPartitionColumn = p.get("tenant.partitionColumn", tenantPartitionColumn); classes = getClasses(p); } diff --git a/src/main/java/io/ebean/config/TenantMode.java b/src/main/java/io/ebean/config/TenantMode.java index 1205fca58..2f659704a 100644 --- a/src/main/java/io/ebean/config/TenantMode.java +++ b/src/main/java/io/ebean/config/TenantMode.java @@ -8,32 +8,40 @@ public enum TenantMode { /** * No multi-tenancy. */ - NONE(false), + NONE(false, true), /** * Each Tenant has their own Database (javax.sql.DataSource) */ - DB(true), + DB(true, false), /** * Each Tenant has their own Database schema. */ - SCHEMA(true), + SCHEMA(true, false), /** * Each Tenant has their own Database but with in connection pool */ - CATALOG(true), + CATALOG(true, false), /** * Tenants share tables but have a discriminator/partition column that partitions the data. */ - PARTITION(false); + PARTITION(false, true), + /** + * Each Tenant has their own Database (javax.sql.DataSource), and there is also one master-database + * (that holds configuration e.g.) + */ + DB_WITH_MASTER(true, true); + boolean dynamicDataSource; + boolean ddlEnabled; - TenantMode(boolean dynamicDataSource) { + TenantMode(boolean dynamicDataSource, boolean ddlEnabled) { this.dynamicDataSource = dynamicDataSource; + this.ddlEnabled = ddlEnabled; } /** @@ -42,4 +50,12 @@ public enum TenantMode { public boolean isDynamicDataSource() { return dynamicDataSource; } + + /** + * Returns true, if DDL is enabled. + */ + public boolean isDdlEnabled() { + return ddlEnabled; + } + } diff --git a/src/main/java/io/ebeaninternal/dbmigration/DdlGenerator.java b/src/main/java/io/ebeaninternal/dbmigration/DdlGenerator.java index 2a54e6f9a..ae1ef4d08 100644 --- a/src/main/java/io/ebeaninternal/dbmigration/DdlGenerator.java +++ b/src/main/java/io/ebeaninternal/dbmigration/DdlGenerator.java @@ -47,7 +47,7 @@ public class DdlGenerator { this.jaxbPresent = serverConfig.getClassLoadConfig().isJavaxJAXBPresent(); this.generateDdl = serverConfig.isDdlGenerate(); this.createOnly = serverConfig.isDdlCreateOnly(); - if (serverConfig.getTenantMode().isDynamicDataSource() && serverConfig.isDdlRun()) { + if (!serverConfig.getTenantMode().isDdlEnabled() && serverConfig.isDdlRun()) { log.warn("DDL can't be run on startup with TenantMode " + serverConfig.getTenantMode()); this.runDdl = false; } else { diff --git a/src/main/java/io/ebeaninternal/server/core/InternalConfiguration.java b/src/main/java/io/ebeaninternal/server/core/InternalConfiguration.java index 3702d1984..a65dd2194 100644 --- a/src/main/java/io/ebeaninternal/server/core/InternalConfiguration.java +++ b/src/main/java/io/ebeaninternal/server/core/InternalConfiguration.java @@ -409,6 +409,7 @@ public class InternalConfiguration { private DataSourceSupplier dataSource() { switch (serverConfig.getTenantMode()) { case DB: + case DB_WITH_MASTER: return new MultiTenantDbSupplier(serverConfig.getCurrentTenantProvider(), serverConfig.getTenantDataSourceProvider()); case SCHEMA: return new MultiTenantDbSchemaSupplier(serverConfig.getCurrentTenantProvider(), serverConfig.getDataSource(), serverConfig.getReadOnlyDataSource(), serverConfig.getTenantSchemaProvider());