add the creation of default database and user with generated password. Also publishes these credentials as sensors
Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/9458e151 Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/9458e151 Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/9458e151 Branch: refs/heads/master Commit: 9458e15167555f5fce4f7cc0ba66056f92d0cf78 Parents: 5ef0b61 Author: Robert Moss <[email protected]> Authored: Mon Aug 17 13:45:42 2015 +0100 Committer: Robert Moss <[email protected]> Committed: Mon Aug 17 13:45:42 2015 +0100 ---------------------------------------------------------------------- .../database/postgresql/PostgreSqlNode.java | 17 ++++++++++- .../postgresql/PostgreSqlSshDriver.java | 31 +++++++++++++++++++- 2 files changed, 46 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/9458e151/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 793debf..e8496f3 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 @@ -22,6 +22,7 @@ import org.apache.brooklyn.api.catalog.Catalog; import org.apache.brooklyn.api.entity.Effector; import org.apache.brooklyn.api.entity.proxying.ImplementedBy; import org.apache.brooklyn.api.entity.trait.HasShortName; +import org.apache.brooklyn.location.basic.PortRanges; import brooklyn.config.ConfigKey; import brooklyn.entity.basic.ConfigKeys; @@ -30,8 +31,8 @@ import brooklyn.entity.database.DatabaseNode; import brooklyn.entity.database.DatastoreMixins; import brooklyn.entity.database.DatastoreMixins.DatastoreCommon; import brooklyn.entity.effector.Effectors; +import brooklyn.event.basic.BasicAttributeSensorAndConfigKey; import brooklyn.event.basic.PortAttributeSensorAndConfigKey; -import org.apache.brooklyn.location.basic.PortRanges; import brooklyn.util.flags.SetFromFlag; /** @@ -80,6 +81,20 @@ public interface PostgreSqlNode extends SoftwareProcess, HasShortName, Datastore @SetFromFlag("pollPeriod") ConfigKey<Long> POLL_PERIOD = ConfigKeys.newLongConfigKey( "postgresql.sensorpoll", "Poll period (in milliseconds)", 1000L); + + @SetFromFlag("username") + BasicAttributeSensorAndConfigKey<String> USERNAME = new BasicAttributeSensorAndConfigKey<>( + String.class, "postgresql.username", "Username of the database user", + "postgresuser"); + + @SetFromFlag("password") + BasicAttributeSensorAndConfigKey<String> PASSWORD = new BasicAttributeSensorAndConfigKey<>( + String.class, "postgresql.password", + "Password for the database user, auto-generated if not set"); + + @SetFromFlag("database") + BasicAttributeSensorAndConfigKey<String> DATABASE = new BasicAttributeSensorAndConfigKey<>( + String.class, "postgresql.database", "Database to be used", "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/9458e151/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 a23f2bc..18dc9a4 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 @@ -47,6 +47,7 @@ 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.location.basic.SshMachineLocation; @@ -294,7 +295,24 @@ public class PostgreSqlSshDriver extends AbstractSoftwareProcessSshDriver implem // Wait for commands to complete before running the creation script DynamicTasks.waitForLast(); - + String createUserCommand = String.format( + "\"CREATE USER %s WITH PASSWORD '%s'; \"", + entity.getConfig(PostgreSqlNode.USERNAME), getUserPassword() + ); + String createDatabaseCommand = String.format( + "\"CREATE DATABASE %s OWNER %s\"", + entity.getConfig(PostgreSqlNode.DATABASE), + entity.getConfig(PostgreSqlNode.USERNAME)); + newScript("initializing user and database") + .body.append( + "cd " + getInstallDir(), + callPgctl("start", true), + sudoAsUser("postgres", getInstallDir() + "/bin/psql -p " + entity.getAttribute(PostgreSqlNode.POSTGRESQL_PORT) + + " --command="+ createUserCommand), + sudoAsUser("postgres", getInstallDir() + "/bin/psql -p " + entity.getAttribute(PostgreSqlNode.POSTGRESQL_PORT) + + " --command="+ createDatabaseCommand), + callPgctl("stop", true)) + .failOnNonZeroResultCode().execute(); // Capture log file contents if there is an error configuring the database try { executeDatabaseCreationScript(); @@ -307,6 +325,17 @@ public class PostgreSqlSshDriver extends AbstractSoftwareProcessSshDriver implem // 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. } + + 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; + } protected void executeDatabaseCreationScript() { if (copyDatabaseCreationScript()) {
