diff --git a/client/tomcatconf/db.properties.in b/client/tomcatconf/db.properties.in index e38366706d4..b730f7ceccf 100644 --- a/client/tomcatconf/db.properties.in +++ b/client/tomcatconf/db.properties.in @@ -65,6 +65,10 @@ db.usage.maxWait=10000 db.usage.autoReconnect=true # awsapi database settings +db.awsapi.username=@DBUSER@ +db.awsapi.password=@DBPW@ +db.awsapi.host=@DBHOST@ +db.awsapi.port=3306 db.awsapi.name=cloudbridge # Simulator database settings diff --git a/developer/pom.xml b/developer/pom.xml index 95dfb9febdc..27849ea2825 100644 --- a/developer/pom.xml +++ b/developer/pom.xml @@ -90,200 +90,6 @@ - - - org.codehaus.mojo - sql-maven-plugin - 1.5 - - - - mysql - mysql-connector-java - ${cs.mysql.version} - - - - org.gjt.mm.mysql.Driver - jdbc:mysql://${db.cloud.host}:${db.cloud.port}/cloud - ${db.cloud.username} - ${db.cloud.password} - - ${maven.test.skip} - true - - - - drop-database - process-test-resources - - execute - - - root - ${db.root.password} - jdbc:mysql://${db.cloud.host}:${db.cloud.port} - drop database if exists `cloud` - - - - create-database - process-test-resources - - execute - - - root - ${db.root.password} - jdbc:mysql://${db.cloud.host}:${db.cloud.port} - create database `cloud` - - - - grant-user-cloud - process-test-resources - - execute - - - root - ${db.root.password} - jdbc:mysql://${db.cloud.host}:${db.cloud.port} - GRANT ALL ON cloud.* to - ${db.cloud.username}@`localhost` identified by - '${db.cloud.password}'; - - - - grant-user-cloud-all - process-test-resources - - execute - - - root - ${db.root.password} - jdbc:mysql://${db.cloud.host}:${db.cloud.port} - GRANT ALL ON cloud.* to - ${db.cloud.username}@`%` identified by - '${db.cloud.password}'; - - - - drop-database-usage - process-test-resources - - execute - - - root - ${db.root.password} - jdbc:mysql://${db.cloud.host}:${db.cloud.port} - drop database if exists `cloud_usage` - - - - create-database-usage - process-test-resources - - execute - - - root - ${db.root.password} - jdbc:mysql://${db.cloud.host}:${db.cloud.port} - create database `cloud_usage` - - - - grant-user-cloud-usage - process-test-resources - - execute - - - root - ${db.root.password} - jdbc:mysql://${db.cloud.host}:${db.cloud.port} - GRANT ALL ON cloud_usage.* to - ${db.cloud.username}@`localhost` identified by - '${db.cloud.password}'; - - - - grant-user-cloud-usage-all - process-test-resources - - execute - - - root - ${db.root.password} - jdbc:mysql://${db.cloud.host}:${db.cloud.port} - GRANT ALL ON cloud_usage.* to - ${db.cloud.username}@`%` identified by - '${db.cloud.password}'; - - - - drop-database-cloudbridge - process-test-resources - - execute - - - root - ${db.root.password} - jdbc:mysql://${db.cloud.host}:${db.cloud.port} - drop database if exists `cloudbridge` - - - - create-database-cloudbridge - process-test-resources - - execute - - - root - ${db.root.password} - jdbc:mysql://${db.cloud.host}:${db.cloud.port} - create database `cloudbridge` - - - - grant-user-cloudbridge - process-test-resources - - execute - - - root - ${db.root.password} - jdbc:mysql://${db.cloud.host}:${db.cloud.port} - GRANT ALL ON cloudbridge.* to - ${db.cloud.username}@`localhost` identified by - '${db.cloud.password}'; - - - - grant-user-cloudbridge-all - process-test-resources - - execute - - - root - ${db.root.password} - jdbc:mysql://${db.cloud.host}:${db.cloud.port} - GRANT ALL ON cloudbridge.* to - ${db.cloud.username}@`%` identified by - '${db.cloud.password}'; - - - - - org.codehaus.mojo @@ -365,6 +171,11 @@ ${basedir}/developer-prefill.sql com.cloud.upgrade.DatabaseUpgradeChecker + --database=cloud,usage,awsapi + --rootpassword=${db.root.password} + + + @@ -402,96 +213,75 @@ + org.codehaus.mojo - sql-maven-plugin - 1.5 + exec-maven-plugin + 1.2.1 + mysql mysql-connector-java ${cs.mysql.version} + + commons-dbcp + commons-dbcp + ${cs.dbcp.version} + + + commons-pool + commons-pool + ${cs.pool.version} + + + org.jasypt + jasypt + ${cs.jasypt.version} + + + org.apache.cloudstack + cloud-utils + ${project.version} + + + org.apache.cloudstack + cloud-server + ${project.version} + - - org.gjt.mm.mysql.Driver - jdbc:mysql://${db.simulator.host}:3306/simulator - ${db.simulator.username} - ${db.simulator.password} - ${maven.test.skip} - true - - drop-database process-test-resources - - execute - - - root - ${db.root.password} - jdbc:mysql://${db.simulator.host}:3306 - drop database if exists `simulator` - - - - create-database - process-test-resources - - execute - - - root - ${db.root.password} - jdbc:mysql://${db.simulator.host}:3306 - create database `simulator` - - - - grant-user-cloud - process-test-resources - - execute - - - root - ${db.root.password} - jdbc:mysql://${db.simulator.host}:3306 - GRANT ALL ON simulator.* to - ${db.simulator.username}@`localhost` identified by - '${db.simulator.password}'; - - - - grant-user-cloud-all - process-test-resources - - execute - - - root - ${db.root.password} - jdbc:mysql://${db.simulator.host}:3306 - GRANT ALL ON simulator.* to - ${db.simulator.username}@`%` identified by - '${db.simulator.password}'; - - - create-schema - process-test-resources - execute + java - - - ${basedir}/target/db/create-schema-simulator.sql - ${basedir}/target/db/templates.simulator.sql - - + + false + true + + org.apache.cloudstack + cloud-server + + com.cloud.upgrade.DatabaseCreator + + + ${project.parent.basedir}/utils/conf/db.properties + ${project.parent.basedir}/utils/conf/db.properties.override + + ${basedir}/target/db/create-schema-simulator.sql + ${basedir}/target/db/templates.simulator.sql + + com.cloud.upgrade.DatabaseUpgradeChecker + --database=simulator + --rootpassword=${db.root.password} + + + diff --git a/server/src/com/cloud/upgrade/DatabaseCreator.java b/server/src/com/cloud/upgrade/DatabaseCreator.java index 5dde0578b03..99e63a673c0 100755 --- a/server/src/com/cloud/upgrade/DatabaseCreator.java +++ b/server/src/com/cloud/upgrade/DatabaseCreator.java @@ -18,14 +18,14 @@ */ package com.cloud.upgrade; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; +import java.io.*; import java.sql.Connection; +import java.sql.DriverManager; import java.sql.SQLException; +import java.sql.Statement; import java.util.ArrayList; import java.util.List; +import java.util.Properties; import com.cloud.utils.PropertiesUtil; @@ -36,39 +36,128 @@ import com.cloud.utils.db.Transaction; // Creates the CloudStack Database by using the 4.0 schema and apply // upgrade steps to it. public class DatabaseCreator { + protected static void printHelp(String cmd) { System.out.println( - "DatabaseCreator creates the database schema by removing the \n" + + "\nDatabaseCreator creates the database schema by removing the \n" + "previous schema, creating the schema, and running \n" + "through the database updaters."); - System.out.println("Usage: " + cmd + " [db.properties files] [schema.sql files] [database upgrade class]"); + System.out.println("Usage: " + cmd + " [options] [db.properties file] [schema.sql files] [database upgrade class]\nOptions:" + + "\n --database=a,b comma separate databases to initialize, use the db name in db.properties defined as db.xyz.host, xyz should be passed" + + "\n --rootpassword=password, by default it will try with an empty password" + + "\n --dry or -d, this would not run any process, just does a dry run" + + "\n --verbose or -v to print running sql commands, by default it won't print them" + + "\n --help or -h for help"); + } + + private static boolean fileExists(String file) { + File f = new File(file); + if (!f.exists()) + System.out.println("========> WARNING: Provided file does not exist: " + file); + return f.exists(); + } + + private static void runScript(Connection conn, Reader reader, String filename, boolean verbosity) { + ScriptRunner runner = new ScriptRunner(conn, false, true, verbosity); + try { + runner.runScript(reader); + } catch (IOException e) { + System.err.println("Unable to read " + filename + ": " + e.getMessage()); + System.exit(1); + } catch (SQLException e) { + System.err.println("Unable to execute " + filename + ": " + e.getMessage()); + System.exit(1); + } + } + + private static void runQuery(String host, String port, String rootPassword, String query, boolean dryRun) { + System.out.println("============> Running query: " + query); + Connection conn = null; + try { + conn = DriverManager.getConnection(String.format("jdbc:mysql://%s:%s/", host, port), + "root", rootPassword); + Statement stmt = conn.createStatement(); + if (!dryRun) + stmt.executeUpdate(query); + conn.close(); + } catch (SQLException e) { + System.out.println("SQL exception in trying initDB: " + e); + System.exit(1); + } + } + + private static void initDB(String dbPropsFile, String rootPassword, String[] databases, boolean dryRun) { + Properties dbProperties = new Properties(); + try { + dbProperties.load(new FileInputStream(new File(dbPropsFile))); + } catch (IOException e) { + System.out.println("IOError: unable to load/read db properties file: " + e); + System.exit(1); + } + + for (String database: databases) { + String host = dbProperties.getProperty(String.format("db.%s.host", database)); + String port = dbProperties.getProperty(String.format("db.%s.port", database)); + String username = dbProperties.getProperty(String.format("db.%s.username", database)); + String password = dbProperties.getProperty(String.format("db.%s.password", database)); + String dbName = dbProperties.getProperty(String.format("db.%s.name", database)); + System.out.println(String.format("========> Initializing database=%s with host=%s port=%s username=%s password=%s", dbName, host, port, username, password)); + + List queries = new ArrayList(); + queries.add(String.format("drop database if exists `%s`", dbName)); + queries.add(String.format("create database `%s`", dbName)); + queries.add(String.format("GRANT ALL ON %s.* to '%s'@`localhost` identified by '%s'", dbName, username, password)); + queries.add(String.format("GRANT ALL ON %s.* to '%s'@`%%` identified by '%s'", dbName, username, password)); + + for (String query: queries) { + runQuery(host, port, rootPassword, query, dryRun); + } + } } public static void main(String[] args) { - List dbPropFiles = new ArrayList(); + String dbPropsFile = ""; List sqlFiles = new ArrayList(); List upgradeClasses = new ArrayList(); + String[] databases = new String[] {}; + String rootPassword = ""; + boolean verbosity = false; + boolean dryRun = false; + // Process opts for (String arg: args) { - if (arg.endsWith(".sql")) { + if (arg.equals("--help") || arg.equals("-h")) { + printHelp("DatabaseCreator"); + System.exit(0); + } else if (arg.equals("--verbose") || arg.equals("-v")) { + verbosity = true; + } else if (arg.equals("--dry") || arg.equals("-d")) { + dryRun = true; + } else if (arg.startsWith("--rootpassword=")) { + rootPassword = arg.substring(arg.lastIndexOf("=") + 1, arg.length()); + } else if (arg.startsWith("--database=")) { + databases = arg.substring(arg.lastIndexOf("=") + 1, arg.length()).split(","); + } else if (arg.endsWith(".sql")) { sqlFiles.add(arg); - } else if (arg.endsWith(".properties") || arg.endsWith("properties.override")) { - dbPropFiles.add(arg); + } else if (arg.endsWith(".properties")) { + if (!dbPropsFile.endsWith("properties.override") && fileExists(arg)) + dbPropsFile = arg; + } else if (arg.endsWith("properties.override")) { + if (fileExists(arg)) + dbPropsFile = arg; } else { upgradeClasses.add(arg); } } - if ((dbPropFiles.size() == 0) + if ((dbPropsFile.isEmpty()) || (sqlFiles.size() == 0) && upgradeClasses.size() == 0) { printHelp("DatabaseCreator"); System.exit(1); } - // Process db.properties files - for (String dbPropFile: dbPropFiles) { - - } + Transaction.initDataSource(dbPropsFile); + initDB(dbPropsFile, rootPassword, databases, dryRun); // Process sql files for (String sqlFile: sqlFiles) { @@ -79,12 +168,9 @@ public class DatabaseCreator { System.exit(1); } - System.out.println("=============> Processing SQL file at " + sqlScript.getAbsolutePath()); - + System.out.println("========> Processing SQL file at " + sqlScript.getAbsolutePath()); Connection conn = Transaction.getStandaloneConnection(); try { - - ScriptRunner runner = new ScriptRunner(conn, false, true); FileReader reader = null; try { reader = new FileReader(sqlScript); @@ -92,15 +178,8 @@ public class DatabaseCreator { System.err.println("Unable to read " + sqlFile + ": " + e.getMessage()); System.exit(1); } - try { - runner.runScript(reader); - } catch (IOException e) { - System.err.println("Unable to read " + sqlFile + ": " + e.getMessage()); - System.exit(1); - } catch (SQLException e) { - System.err.println("Unable to execute " + sqlFile + ": " + e.getMessage()); - System.exit(1); - } + if (!dryRun) + runScript(conn, reader, sqlFile, verbosity); } finally { try { conn.close(); @@ -112,7 +191,7 @@ public class DatabaseCreator { // Process db upgrade classes for (String upgradeClass: upgradeClasses) { - System.out.println("=============> Processing upgrade: " + upgradeClass); + System.out.println("========> Processing upgrade: " + upgradeClass); Class clazz = null; try { clazz = Class.forName(upgradeClass); diff --git a/utils/conf/db.properties b/utils/conf/db.properties index 18bf54c2b61..1dcfcdd135c 100644 --- a/utils/conf/db.properties +++ b/utils/conf/db.properties @@ -56,6 +56,10 @@ db.usage.maxWait=10000 db.usage.autoReconnect=true # awsapi database settings +db.awsapi.username=cloud +db.awsapi.password=cloud +db.awsapi.host=localhost +db.awsapi.port=3306 db.awsapi.name=cloudbridge # Simulator database settings diff --git a/utils/src/com/cloud/utils/db/ScriptRunner.java b/utils/src/com/cloud/utils/db/ScriptRunner.java index 5690fa10bea..d579de71b2a 100644 --- a/utils/src/com/cloud/utils/db/ScriptRunner.java +++ b/utils/src/com/cloud/utils/db/ScriptRunner.java @@ -43,6 +43,7 @@ public class ScriptRunner { private boolean stopOnError; private boolean autoCommit; + private boolean verbosity = true; private String delimiter = DEFAULT_DELIMITER; private boolean fullLineDelimiter = false; @@ -58,6 +59,13 @@ public class ScriptRunner { this.stopOnError = stopOnError; } + public ScriptRunner(Connection connection, boolean autoCommit, boolean stopOnError, boolean verbosity) { + this.connection = connection; + this.autoCommit = autoCommit; + this.stopOnError = stopOnError; + this.verbosity = verbosity; + } + public void setDelimiter(String delimiter, boolean fullLineDelimiter) { this.delimiter = delimiter; this.fullLineDelimiter = fullLineDelimiter; @@ -207,7 +215,8 @@ public class ScriptRunner { private void println(Object o) { _logBuffer.append(o); - s_logger.debug(_logBuffer.toString()); + if (verbosity) + s_logger.debug(_logBuffer.toString()); _logBuffer = new StringBuffer(); } diff --git a/utils/src/com/cloud/utils/db/Transaction.java b/utils/src/com/cloud/utils/db/Transaction.java index bcb78d7fabb..6884fb13d81 100755 --- a/utils/src/com/cloud/utils/db/Transaction.java +++ b/utils/src/com/cloud/utils/db/Transaction.java @@ -18,6 +18,7 @@ package com.cloud.utils.db; import java.io.File; import java.io.FileInputStream; +import java.io.IOException; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -996,19 +997,32 @@ public class Transaction { private static DataSource s_usageDS; private static DataSource s_awsapiDS; private static DataSource s_simulatorDS; + static { + // Initialize with assumed db.properties file + initDataSource("db.properties"); + } + + public static void initDataSource(String propsFileName) { try { - final File dbPropsFile = PropertiesUtil.findConfigFile("db.properties"); - final Properties dbProps; - - if(EncryptionSecretKeyChecker.useEncryption()){ - StandardPBEStringEncryptor encryptor = EncryptionSecretKeyChecker.getEncryptor(); - dbProps = new EncryptableProperties(encryptor); - } else { - dbProps = new Properties(); + File dbPropsFile = new File(propsFileName); + if (!dbPropsFile.exists()) { + dbPropsFile = PropertiesUtil.findConfigFile(propsFileName); } - dbProps.load(new FileInputStream(dbPropsFile)); - + final Properties dbProps; + if (EncryptionSecretKeyChecker.useEncryption()) { + StandardPBEStringEncryptor encryptor = EncryptionSecretKeyChecker.getEncryptor(); + dbProps = new EncryptableProperties(encryptor); + } else { + dbProps = new Properties(); + } + try { + dbProps.load(new FileInputStream(dbPropsFile)); + } catch (IOException e) { + s_logger.fatal("Unable to load db properties file, pl. check the classpath and file path configuration", e); + return; + } + // FIXME: If params are missing...default them???? final int cloudMaxActive = Integer.parseInt(dbProps.getProperty("db.cloud.maxActive")); final int cloudMaxIdle = Integer.parseInt(dbProps.getProperty("db.cloud.maxIdle")); @@ -1021,6 +1035,7 @@ public class Transaction { final boolean cloudAutoReconnect = Boolean.parseBoolean(dbProps.getProperty("db.cloud.autoReconnect")); final String cloudValidationQuery = dbProps.getProperty("db.cloud.validationQuery"); final String cloudIsolationLevel = dbProps.getProperty("db.cloud.isolation.level"); + int isolationLevel = Connection.TRANSACTION_READ_COMMITTED; if (cloudIsolationLevel == null) { isolationLevel = Connection.TRANSACTION_READ_COMMITTED; @@ -1035,14 +1050,16 @@ public class Transaction { } else { s_logger.warn("Unknown isolation level " + cloudIsolationLevel + ". Using read uncommitted"); } + final boolean cloudTestOnBorrow = Boolean.parseBoolean(dbProps.getProperty("db.cloud.testOnBorrow")); final boolean cloudTestWhileIdle = Boolean.parseBoolean(dbProps.getProperty("db.cloud.testWhileIdle")); final long cloudTimeBtwEvictionRunsMillis = Long.parseLong(dbProps.getProperty("db.cloud.timeBetweenEvictionRunsMillis")); final long cloudMinEvcitableIdleTimeMillis = Long.parseLong(dbProps.getProperty("db.cloud.minEvictableIdleTimeMillis")); final boolean cloudPoolPreparedStatements = Boolean.parseBoolean(dbProps.getProperty("db.cloud.poolPreparedStatements")); final String url = dbProps.getProperty("db.cloud.url.params"); + final boolean useSSL = Boolean.parseBoolean(dbProps.getProperty("db.cloud.useSSL")); - if(useSSL){ + if (useSSL) { System.setProperty("javax.net.ssl.keyStore", dbProps.getProperty("db.cloud.keyStore")); System.setProperty("javax.net.ssl.keyStorePassword", dbProps.getProperty("db.cloud.keyStorePassword")); System.setProperty("javax.net.ssl.trustStore", dbProps.getProperty("db.cloud.trustStore")); @@ -1051,14 +1068,19 @@ public class Transaction { final GenericObjectPool cloudConnectionPool = new GenericObjectPool(null, cloudMaxActive, GenericObjectPool.DEFAULT_WHEN_EXHAUSTED_ACTION, cloudMaxWait, cloudMaxIdle, cloudTestOnBorrow, false, cloudTimeBtwEvictionRunsMillis, 1, cloudMinEvcitableIdleTimeMillis, cloudTestWhileIdle); - final ConnectionFactory cloudConnectionFactory = new DriverManagerConnectionFactory("jdbc:mysql://"+cloudHost + ":" + cloudPort + "/" + cloudDbName + - "?autoReconnect="+cloudAutoReconnect + (url != null ? "&" + url : "")+ (useSSL ? "&useSSL=true" : ""), cloudUsername, cloudPassword); + + final ConnectionFactory cloudConnectionFactory = new DriverManagerConnectionFactory("jdbc:mysql://" + cloudHost + ":" + cloudPort + "/" + cloudDbName + + "?autoReconnect=" + cloudAutoReconnect + (url != null ? "&" + url : "") + (useSSL ? "&useSSL=true" : ""), cloudUsername, cloudPassword); + final KeyedObjectPoolFactory poolableObjFactory = (cloudPoolPreparedStatements ? new StackKeyedObjectPoolFactory() : null); + final PoolableConnectionFactory cloudPoolableConnectionFactory = new PoolableConnectionFactory(cloudConnectionFactory, cloudConnectionPool, poolableObjFactory, cloudValidationQuery, false, false, isolationLevel); + + // Default Data Source for CloudStack s_ds = new PoolingDataSource(cloudPoolableConnectionFactory.getPool()); - // configure the usage db + // Configure the usage db final int usageMaxActive = Integer.parseInt(dbProps.getProperty("db.usage.maxActive")); final int usageMaxIdle = Integer.parseInt(dbProps.getProperty("db.usage.maxIdle")); final long usageMaxWait = Long.parseLong(dbProps.getProperty("db.usage.maxWait")); @@ -1068,50 +1090,60 @@ public class Transaction { final int usagePort = Integer.parseInt(dbProps.getProperty("db.usage.port")); final String usageDbName = dbProps.getProperty("db.usage.name"); final boolean usageAutoReconnect = Boolean.parseBoolean(dbProps.getProperty("db.usage.autoReconnect")); + final GenericObjectPool usageConnectionPool = new GenericObjectPool(null, usageMaxActive, GenericObjectPool.DEFAULT_WHEN_EXHAUSTED_ACTION, usageMaxWait, usageMaxIdle); - final ConnectionFactory usageConnectionFactory = new DriverManagerConnectionFactory("jdbc:mysql://"+usageHost + ":" + usagePort + "/" + usageDbName + - "?autoReconnect="+usageAutoReconnect, usageUsername, usagePassword); + + final ConnectionFactory usageConnectionFactory = new DriverManagerConnectionFactory("jdbc:mysql://" + usageHost + ":" + usagePort + "/" + usageDbName + + "?autoReconnect=" + usageAutoReconnect, usageUsername, usagePassword); + final PoolableConnectionFactory usagePoolableConnectionFactory = new PoolableConnectionFactory(usageConnectionFactory, usageConnectionPool, new StackKeyedObjectPoolFactory(), null, false, false); + + // Data Source for usage server s_usageDS = new PoolingDataSource(usagePoolableConnectionFactory.getPool()); - - //configure awsapi db + + // Configure awsapi db final String awsapiDbName = dbProps.getProperty("db.awsapi.name"); final GenericObjectPool awsapiConnectionPool = new GenericObjectPool(null, usageMaxActive, GenericObjectPool.DEFAULT_WHEN_EXHAUSTED_ACTION, - usageMaxWait, usageMaxIdle); - final ConnectionFactory awsapiConnectionFactory = new DriverManagerConnectionFactory("jdbc:mysql://"+cloudHost + ":" + cloudPort + "/" + awsapiDbName + - "?autoReconnect="+usageAutoReconnect, cloudUsername, cloudPassword); + usageMaxWait, usageMaxIdle); + final ConnectionFactory awsapiConnectionFactory = new DriverManagerConnectionFactory("jdbc:mysql://" + cloudHost + ":" + cloudPort + "/" + awsapiDbName + + "?autoReconnect=" + usageAutoReconnect, cloudUsername, cloudPassword); final PoolableConnectionFactory awsapiPoolableConnectionFactory = new PoolableConnectionFactory(awsapiConnectionFactory, awsapiConnectionPool, - new StackKeyedObjectPoolFactory(), null, false, false); + new StackKeyedObjectPoolFactory(), null, false, false); + + // Data Source for awsapi s_awsapiDS = new PoolingDataSource(awsapiPoolableConnectionFactory.getPool()); - - try{ - // configure the simulator db - final int simulatorMaxActive = Integer.parseInt(dbProps.getProperty("db.simulator.maxActive")); - final int simulatorMaxIdle = Integer.parseInt(dbProps.getProperty("db.simulator.maxIdle")); - final long simulatorMaxWait = Long.parseLong(dbProps.getProperty("db.simulator.maxWait")); - final String simulatorUsername = dbProps.getProperty("db.simulator.username"); - final String simulatorPassword = dbProps.getProperty("db.simulator.password"); - final String simulatorHost = dbProps.getProperty("db.simulator.host"); - final int simulatorPort = Integer.parseInt(dbProps.getProperty("db.simulator.port")); - final String simulatorDbName = dbProps.getProperty("db.simulator.name"); - final boolean simulatorAutoReconnect = Boolean.parseBoolean(dbProps.getProperty("db.simulator.autoReconnect")); - final GenericObjectPool simulatorConnectionPool = new GenericObjectPool(null, simulatorMaxActive, GenericObjectPool.DEFAULT_WHEN_EXHAUSTED_ACTION, - simulatorMaxWait, simulatorMaxIdle); - final ConnectionFactory simulatorConnectionFactory = new DriverManagerConnectionFactory("jdbc:mysql://"+simulatorHost + ":" + simulatorPort + "/" + simulatorDbName + - "?autoReconnect="+simulatorAutoReconnect, simulatorUsername, simulatorPassword); - final PoolableConnectionFactory simulatorPoolableConnectionFactory = new PoolableConnectionFactory(simulatorConnectionFactory, simulatorConnectionPool, - new StackKeyedObjectPoolFactory(), null, false, false); - s_simulatorDS = new PoolingDataSource(simulatorPoolableConnectionFactory.getPool()); - } catch (Exception e){ - s_logger.debug("Simulator DB properties are not available. Not initializing simulator DS"); + + try { + // Configure the simulator db + final int simulatorMaxActive = Integer.parseInt(dbProps.getProperty("db.simulator.maxActive")); + final int simulatorMaxIdle = Integer.parseInt(dbProps.getProperty("db.simulator.maxIdle")); + final long simulatorMaxWait = Long.parseLong(dbProps.getProperty("db.simulator.maxWait")); + final String simulatorUsername = dbProps.getProperty("db.simulator.username"); + final String simulatorPassword = dbProps.getProperty("db.simulator.password"); + final String simulatorHost = dbProps.getProperty("db.simulator.host"); + final int simulatorPort = Integer.parseInt(dbProps.getProperty("db.simulator.port")); + final String simulatorDbName = dbProps.getProperty("db.simulator.name"); + final boolean simulatorAutoReconnect = Boolean.parseBoolean(dbProps.getProperty("db.simulator.autoReconnect")); + + final GenericObjectPool simulatorConnectionPool = new GenericObjectPool(null, simulatorMaxActive, GenericObjectPool.DEFAULT_WHEN_EXHAUSTED_ACTION, + simulatorMaxWait, simulatorMaxIdle); + + final ConnectionFactory simulatorConnectionFactory = new DriverManagerConnectionFactory("jdbc:mysql://" + simulatorHost + ":" + simulatorPort + "/" + simulatorDbName + + "?autoReconnect=" + simulatorAutoReconnect, simulatorUsername, simulatorPassword); + + final PoolableConnectionFactory simulatorPoolableConnectionFactory = new PoolableConnectionFactory(simulatorConnectionFactory, simulatorConnectionPool, + new StackKeyedObjectPoolFactory(), null, false, false); + s_simulatorDS = new PoolingDataSource(simulatorPoolableConnectionFactory.getPool()); + } catch (Exception e) { + s_logger.debug("Simulator DB properties are not available. Not initializing simulator DS"); } } catch (final Exception e) { s_ds = getDefaultDataSource("cloud"); s_usageDS = getDefaultDataSource("cloud_usage"); s_simulatorDS = getDefaultDataSource("cloud_simulator"); - s_logger.warn("Unable to load db configuration, using defaults with 5 connections. Please check your configuration", e); + s_logger.warn("Unable to load db configuration, using defaults with 5 connections. Falling back on assumed datasource on localhost:3306 using username:password=cloud:cloud. Please check your configuration", e); } }