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() {