make initialize database optional
Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/3fff6417 Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/3fff6417 Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/3fff6417 Branch: refs/heads/master Commit: 3fff64171269356387f5e2a45a2eb392a3e6f356 Parents: 8cba4d3 Author: Robert Moss <[email protected]> Authored: Tue Aug 18 11:37:57 2015 +0100 Committer: Robert Moss <[email protected]> Committed: Tue Aug 18 11:37:57 2015 +0100 ---------------------------------------------------------------------- .../database/postgresql/PostgreSqlNode.java | 13 +++- .../postgresql/PostgreSqlSshDriver.java | 75 ++++++++++++-------- 2 files changed, 55 insertions(+), 33 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/3fff6417/software/database/src/main/java/brooklyn/entity/database/postgresql/PostgreSqlNode.java ---------------------------------------------------------------------- diff --git a/software/database/src/main/java/brooklyn/entity/database/postgresql/PostgreSqlNode.java b/software/database/src/main/java/brooklyn/entity/database/postgresql/PostgreSqlNode.java index b90d19e..eccb870 100644 --- a/software/database/src/main/java/brooklyn/entity/database/postgresql/PostgreSqlNode.java +++ b/software/database/src/main/java/brooklyn/entity/database/postgresql/PostgreSqlNode.java @@ -82,10 +82,15 @@ public interface PostgreSqlNode extends SoftwareProcess, HasShortName, Datastore ConfigKey<Long> POLL_PERIOD = ConfigKeys.newLongConfigKey( "postgresql.sensorpoll", "Poll period (in milliseconds)", 1000L); + @SetFromFlag("initializeDB") + ConfigKey<Boolean> INITIALIZE_DB = ConfigKeys.newBooleanConfigKey( + "postgresql.initialize", "If true, PostgreSQL will create a new user and database", false); + @SetFromFlag("username") BasicAttributeSensorAndConfigKey<String> USERNAME = new BasicAttributeSensorAndConfigKey<>( - String.class, "postgresql.username", "Username of the database user", - "postgresuser"); + String.class, "postgresql.username", "Username of the database user"); + + String DEFAULT_USERNAME = "postgresqluser"; @SetFromFlag("password") BasicAttributeSensorAndConfigKey<String> PASSWORD = new BasicAttributeSensorAndConfigKey<>( @@ -94,7 +99,9 @@ public interface PostgreSqlNode extends SoftwareProcess, HasShortName, Datastore @SetFromFlag("database") BasicAttributeSensorAndConfigKey<String> DATABASE = new BasicAttributeSensorAndConfigKey<>( - String.class, "postgresql.database", "Database to be used", "db"); + String.class, "postgresql.database", "Database to be used"); + + String DEFAULT_DB_NAME = "db"; Effector<String> EXECUTE_SCRIPT = Effectors.effector(DatastoreMixins.EXECUTE_SCRIPT) .description("Executes the given script contents using psql") http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/3fff6417/software/database/src/main/java/brooklyn/entity/database/postgresql/PostgreSqlSshDriver.java ---------------------------------------------------------------------- diff --git a/software/database/src/main/java/brooklyn/entity/database/postgresql/PostgreSqlSshDriver.java b/software/database/src/main/java/brooklyn/entity/database/postgresql/PostgreSqlSshDriver.java index b7b5722..f8133f8 100644 --- a/software/database/src/main/java/brooklyn/entity/database/postgresql/PostgreSqlSshDriver.java +++ b/software/database/src/main/java/brooklyn/entity/database/postgresql/PostgreSqlSshDriver.java @@ -38,6 +38,12 @@ import java.io.InputStream; import javax.annotation.Nullable; +import org.apache.brooklyn.api.location.OsDetails; +import org.apache.brooklyn.core.util.task.DynamicTasks; +import org.apache.brooklyn.core.util.task.ssh.SshTasks; +import org.apache.brooklyn.core.util.task.ssh.SshTasks.OnFailingTask; +import org.apache.brooklyn.core.util.task.system.ProcessTaskWrapper; +import org.apache.brooklyn.location.basic.SshMachineLocation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -46,15 +52,7 @@ import brooklyn.entity.basic.Attributes; import brooklyn.entity.basic.SoftwareProcess; import brooklyn.entity.database.DatastoreMixins; import brooklyn.entity.software.SshEffectorTasks; - -import org.apache.brooklyn.api.entity.basic.EntityLocal; -import org.apache.brooklyn.api.location.OsDetails; -import org.apache.brooklyn.core.util.task.DynamicTasks; -import org.apache.brooklyn.core.util.task.ssh.SshTasks; -import org.apache.brooklyn.core.util.task.ssh.SshTasks.OnFailingTask; -import org.apache.brooklyn.core.util.task.system.ProcessTaskWrapper; -import org.apache.brooklyn.location.basic.SshMachineLocation; - +import brooklyn.event.basic.BasicAttributeSensorAndConfigKey; import brooklyn.util.collections.MutableList; import brooklyn.util.collections.MutableMap; import brooklyn.util.exceptions.Exceptions; @@ -296,15 +294,32 @@ public class PostgreSqlSshDriver extends AbstractSoftwareProcessSshDriver implem // Wait for commands to complete before running the creation script DynamicTasks.waitForLast(); + if(entity.getConfig(PostgreSqlNode.INITIALIZE_DB)){ + initializeNewDatabase(); + } + // Capture log file contents if there is an error configuring the database + try { + executeDatabaseCreationScript(); + } catch (RuntimeException r) { + logTailOfPostgresLog(); + throw Exceptions.propagate(r); + } + + // Try establishing an external connection. If you get a "Connection refused...accepting TCP/IP connections + // on port 5432?" error then the port is probably closed. Check that the firewall allows external TCP/IP + // connections (netstat -nap). You can open a port with lokkit or by configuring the iptables. + } + + private void initializeNewDatabase() { String createUserCommand = String.format( "\"CREATE USER %s WITH PASSWORD '%s'; \"", - StringEscapes.escapeSql(entity.getConfig(PostgreSqlNode.USERNAME)), + StringEscapes.escapeSql(getUsername()), StringEscapes.escapeSql(getUserPassword()) ); String createDatabaseCommand = String.format( "\"CREATE DATABASE %s OWNER %s\"", - StringEscapes.escapeSql(entity.getConfig(PostgreSqlNode.DATABASE)), - StringEscapes.escapeSql(entity.getConfig(PostgreSqlNode.USERNAME))); + StringEscapes.escapeSql(getDatabaseName()), + StringEscapes.escapeSql(getUsername())); newScript("initializing user and database") .body.append( "cd " + getInstallDir(), @@ -315,28 +330,28 @@ public class PostgreSqlSshDriver extends AbstractSoftwareProcessSshDriver implem " --command="+ createDatabaseCommand), callPgctl("stop", true)) .failOnNonZeroResultCode().execute(); - // Capture log file contents if there is an error configuring the database - try { - executeDatabaseCreationScript(); - } catch (RuntimeException r) { - logTailOfPostgresLog(); - throw Exceptions.propagate(r); + } + + private String getConfigOrDefault(BasicAttributeSensorAndConfigKey<String> key, String def) { + String config = entity.getConfig(key); + if(Strings.isEmpty(config)) { + config = def; + log.debug(entity + " has no config specified for " + key + "; using default `" + def + "`"); + entity.setAttribute(key, config); } - - // Try establishing an external connection. If you get a "Connection refused...accepting TCP/IP connections - // on port 5432?" error then the port is probably closed. Check that the firewall allows external TCP/IP - // connections (netstat -nap). You can open a port with lokkit or by configuring the iptables. + return config; + } + + protected String getDatabaseName() { + return getConfigOrDefault(PostgreSqlNode.DATABASE, PostgreSqlNode.DEFAULT_DB_NAME); + } + + protected String getUsername(){ + return getConfigOrDefault(PostgreSqlNode.USERNAME, PostgreSqlNode.DEFAULT_USERNAME); } protected String getUserPassword() { - String password = entity.getConfig(PostgreSqlNode.PASSWORD); - if (Strings.isEmpty(password)) { - log.debug(entity + " has no password specified for " + PostgreSqlNode.PASSWORD + "; using a random string"); - password = brooklyn.util.text.Strings.makeRandomId(8); - entity.setAttribute(PostgreSqlNode.PASSWORD, password); - entity.config().set(PostgreSqlNode.PASSWORD, password); - } - return password; + return getConfigOrDefault(PostgreSqlNode.PASSWORD, Strings.makeRandomId(8)); } protected void executeDatabaseCreationScript() {
