You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by he...@apache.org on 2015/08/18 13:06:00 UTC

[02/24] incubator-brooklyn git commit: add the creation of default database and user with generated password.

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 <ro...@gmail.com>
Authored: Mon Aug 17 13:45:42 2015 +0100
Committer: Robert Moss <ro...@gmail.com>
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()) {