You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by al...@apache.org on 2014/11/03 16:51:55 UTC

[11/29] git commit: add support for extra CLI parameters to BrooklynNode, use those to run in persistence mode, and final fixes to the in-place upgrade effector

add support for extra CLI parameters to BrooklynNode, use those to run in persistence mode, and final fixes to the in-place upgrade effector


Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/634b66b9
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/634b66b9
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/634b66b9

Branch: refs/heads/master
Commit: 634b66b9fe423a599146fc7d9c0e7bdb75cb5e9c
Parents: 6432a12
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Fri Oct 24 23:52:37 2014 +0100
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Fri Oct 31 09:38:19 2014 -0500

----------------------------------------------------------------------
 .../entity/brooklynnode/BrooklynNode.java       |  4 +++
 .../brooklynnode/BrooklynNodeSshDriver.java     |  3 ++
 .../brooklynnode/BrooklynUpgradeEffector.java   | 33 +++++++++++++++++---
 .../entity/brooklynnode/brooklyn-node.yaml      |  7 +++++
 .../brooklyn/launcher/BrooklynLauncher.java     |  6 ++--
 5 files changed, 44 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/634b66b9/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynNode.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynNode.java b/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynNode.java
index 3d8683f..9bf385e 100644
--- a/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynNode.java
+++ b/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynNode.java
@@ -120,6 +120,10 @@ public interface BrooklynNode extends SoftwareProcess, UsesJava {
         "Path to the script to launch Brooklyn / the app relative to the subpath in the archive, defaulting to 'bin/brooklyn'", 
         "bin/brooklyn");
 
+    @SetFromFlag("launchParameters")
+    ConfigKey<String> EXTRA_LAUNCH_PARAMETERS = ConfigKeys.newStringConfigKey("brooklynnode.launch.parameters.extra",
+        "Launch parameters passed on the CLI, in addition to 'launch' and parameters implied by other config keys (and placed afterwards on the command line)");
+
     @SetFromFlag("launchCommandCreatesPidFile")
     ConfigKey<Boolean> LAUNCH_COMMAND_CREATES_PID_FILE = ConfigKeys.newBooleanConfigKey("brooklynnode.launch.command.pid.updated",
         "Whether the launch script creates/updates the PID file, if not the entity will do so, "

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/634b66b9/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynNodeSshDriver.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynNodeSshDriver.java b/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynNodeSshDriver.java
index cbe1535..d5d9c01 100644
--- a/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynNodeSshDriver.java
+++ b/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynNodeSshDriver.java
@@ -285,6 +285,9 @@ public class BrooklynNodeSshDriver extends JavaSoftwareProcessSshDriver implemen
         if (getEntity().getConfig(BrooklynNode.NO_SHUTDOWN_ON_EXIT)) {
             cmd += " --noShutdownOnExit ";
         }
+        if (!Strings.isBlank(getEntity().getConfig(BrooklynNode.EXTRA_LAUNCH_PARAMETERS))) {
+            cmd += " "+getEntity().getConfig(BrooklynNode.EXTRA_LAUNCH_PARAMETERS);
+        }
         cmd += format(" >> %s/console 2>&1 </dev/null &", getRunDir());
         
         log.info("Starting brooklyn on {} using command {}", getMachine(), cmd);

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/634b66b9/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynUpgradeEffector.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynUpgradeEffector.java b/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynUpgradeEffector.java
index a55f077..3dc2015 100644
--- a/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynUpgradeEffector.java
+++ b/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynUpgradeEffector.java
@@ -49,6 +49,7 @@ import brooklyn.util.repeat.Repeater;
 import brooklyn.util.task.DynamicTasks;
 import brooklyn.util.task.Tasks;
 import brooklyn.util.text.Identifiers;
+import brooklyn.util.text.Strings;
 import brooklyn.util.time.Duration;
 
 import com.google.common.base.Functions;
@@ -58,8 +59,10 @@ import com.google.common.base.Predicates;
 import com.google.common.reflect.TypeToken;
 
 @SuppressWarnings("serial")
-/** Upgrades a brooklyn node in-place on the box, by creating a child brooklyn node and ensuring it can rebind in HOT_STANDBY;
- * requires the target node to have persistence enabled 
+/** Upgrades a brooklyn node in-place on the box, 
+ * by creating a child brooklyn node and ensuring it can rebind in HOT_STANDBY
+ * <p>
+ * Requires the target node to have persistence enabled. 
  */
 public class BrooklynUpgradeEffector {
 
@@ -69,13 +72,21 @@ public class BrooklynUpgradeEffector {
     public static final ConfigKey<Map<String,Object>> EXTRA_CONFIG = MapConfigKey.builder(new TypeToken<Map<String,Object>>() {}).name("extraConfig").description("Additional new config to set on this entity as part of upgrading").build();
 
     public static final Effector<Void> UPGRADE = Effectors.effector(Void.class, "upgrade")
-        .description("Changes the Brooklyn build used to run this node, by spawning a dry-run node then copying the installed files across")
+        .description("Changes the Brooklyn build used to run this node, by spawning a dry-run node then copying the installed files across. "
+            + "This node must be running for persistence for in-place upgrading to work.")
         .parameter(BrooklynNode.SUGGESTED_VERSION).parameter(DOWNLOAD_URL).parameter(EXTRA_CONFIG)
         .impl(new UpgradeImpl()).build();
     
     public static class UpgradeImpl extends EffectorBody<Void> {
         @Override
         public Void call(ConfigBag parametersO) {
+            if (!isPersistenceModeEnabled(entity())) {
+                // would could try a `forcePersistNow`, but that's sloppy; 
+                // for now, require HA/persistence for upgrading 
+                DynamicTasks.queue( Tasks.warning("Persistence does not appear to be enabled at this node. "
+                    + "In-place upgrade is unlikely to succeed.", null) );
+            }
+            
             ConfigBag parameters = ConfigBag.newInstanceCopying(parametersO);
             
             /*
@@ -103,8 +114,11 @@ public class BrooklynUpgradeEffector {
                 .configure(parameters.getAllConfig()));
             
             //force this to start as hot-standby
-            String launchCommand = dryRunChild.getConfig(BrooklynNode.LAUNCH_COMMAND);
-            ((EntityInternal)dryRunChild).setConfig(BrooklynNode.LAUNCH_COMMAND, launchCommand + " --highAvailability "+HighAvailabilityMode.HOT_STANDBY);
+            String launchParameters = dryRunChild.getConfig(BrooklynNode.EXTRA_LAUNCH_PARAMETERS);
+            if (Strings.isBlank(launchParameters)) launchParameters = "";
+            else launchParameters += " ";
+            launchParameters += "--highAvailability "+HighAvailabilityMode.HOT_STANDBY;
+            ((EntityInternal)dryRunChild).setConfig(BrooklynNode.EXTRA_LAUNCH_PARAMETERS, launchParameters);
             
             Entities.manage(dryRunChild);
             final String dryRunNodeUid = dryRunChild.getId();
@@ -152,6 +166,15 @@ public class BrooklynUpgradeEffector {
             return null;
         }
 
+        private boolean isPersistenceModeEnabled(EntityInternal entity) {
+            // TODO when there are PERSIST* options in BrooklynNode, look at them here!
+            // or, better, have a sensor for persistence
+            String params = entity.getConfig(BrooklynNode.EXTRA_LAUNCH_PARAMETERS);
+            if (params==null) return false;
+            if (params.indexOf("persist")==0) return false;
+            return true;
+        }
+
     }
 
     private static class WaitForRepeaterCallable implements Callable<Boolean> {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/634b66b9/software/base/src/test/resources/brooklyn/entity/brooklynnode/brooklyn-node.yaml
----------------------------------------------------------------------
diff --git a/software/base/src/test/resources/brooklyn/entity/brooklynnode/brooklyn-node.yaml b/software/base/src/test/resources/brooklyn/entity/brooklynnode/brooklyn-node.yaml
index 9e6300f..bd91f77 100644
--- a/software/base/src/test/resources/brooklyn/entity/brooklynnode/brooklyn-node.yaml
+++ b/software/base/src/test/resources/brooklyn/entity/brooklynnode/brooklyn-node.yaml
@@ -17,11 +17,18 @@
 # under the License.
 #
 
+name: Example Brooklyn Node
+
 services:
 - type: brooklyn.entity.brooklynnode.BrooklynNode
+
   ## to use a local file, specify something such as the following:
   downloadUrl: file:///Users/alex/.m2/repository/org/apache/brooklyn/brooklyn-dist/0.7.0-SNAPSHOT/brooklyn-dist-0.7.0-SNAPSHOT-dist.tar.gz
   # downloadUrl: file:///tmp/brooklyn-dist-0.7.0-SNAPSHOT-dist.tar.gz
+  
+  ## to persist
+#  launchParameters: --persist auto --persistenceDir /tmp/brooklyn-persistence-example/
+
 
 ## NB if deploying to a remote machine you must also supply management{Username,Password} and a brooklyn properties with those values set 
 location: localhost

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/634b66b9/usage/launcher/src/main/java/brooklyn/launcher/BrooklynLauncher.java
----------------------------------------------------------------------
diff --git a/usage/launcher/src/main/java/brooklyn/launcher/BrooklynLauncher.java b/usage/launcher/src/main/java/brooklyn/launcher/BrooklynLauncher.java
index 598d176..158c7c4 100644
--- a/usage/launcher/src/main/java/brooklyn/launcher/BrooklynLauncher.java
+++ b/usage/launcher/src/main/java/brooklyn/launcher/BrooklynLauncher.java
@@ -19,9 +19,6 @@
 package brooklyn.launcher;
 
 import static com.google.common.base.Preconditions.checkNotNull;
-
-import brooklyn.entity.rebind.transformer.CompoundTransformer;
-import brooklyn.management.ha.ManagementPlaneSyncRecord;
 import io.brooklyn.camp.CampPlatform;
 import io.brooklyn.camp.brooklyn.BrooklynCampPlatformLauncherNoServer;
 import io.brooklyn.camp.brooklyn.spi.creation.BrooklynAssemblyTemplateInstantiator;
@@ -68,6 +65,7 @@ import brooklyn.entity.rebind.persister.FileBasedObjectStore;
 import brooklyn.entity.rebind.persister.PersistMode;
 import brooklyn.entity.rebind.persister.PersistenceObjectStore;
 import brooklyn.entity.rebind.persister.jclouds.JcloudsBlobStoreBasedObjectStore;
+import brooklyn.entity.rebind.transformer.CompoundTransformer;
 import brooklyn.entity.trait.Startable;
 import brooklyn.internal.BrooklynFeatureEnablement;
 import brooklyn.launcher.config.StopWhichAppsOnShutdown;
@@ -81,6 +79,7 @@ import brooklyn.management.ha.HighAvailabilityManager;
 import brooklyn.management.ha.HighAvailabilityManagerImpl;
 import brooklyn.management.ha.HighAvailabilityMode;
 import brooklyn.management.ha.ManagementNodeState;
+import brooklyn.management.ha.ManagementPlaneSyncRecord;
 import brooklyn.management.ha.ManagementPlaneSyncRecordPersister;
 import brooklyn.management.ha.ManagementPlaneSyncRecordPersisterToObjectStore;
 import brooklyn.management.internal.LocalManagementContext;
@@ -104,7 +103,6 @@ import brooklyn.util.time.Time;
 
 import com.google.common.base.Splitter;
 import com.google.common.base.Stopwatch;
-import com.google.common.base.Throwables;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;