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:19 UTC

[21/24] incubator-brooklyn git commit: make initialize database optional

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 <ro...@gmail.com>
Authored: Tue Aug 18 11:37:57 2015 +0100
Committer: Robert Moss <ro...@gmail.com>
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() {