ssh command sensor allows configuring the dir where it runs

fixes bug if ssh sensor used with empty software process entity, where run dir 
isn't yet created


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

Branch: refs/heads/master
Commit: 44273ad5042dc11a9d1dee07df264f7c03a88144
Parents: 776ad43
Author: Alex Heneveld <alex.henev...@cloudsoftcorp.com>
Authored: Thu May 21 23:42:12 2015 +0100
Committer: Alex Heneveld <alex.henev...@cloudsoftcorp.com>
Committed: Thu May 21 23:50:34 2015 +0100

----------------------------------------------------------------------
 .../entity/software/ssh/SshCommandEffector.java |  6 ++--
 .../entity/software/ssh/SshCommandSensor.java   | 37 ++++++++++++++++----
 2 files changed, 35 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/44273ad5/software/base/src/main/java/brooklyn/entity/software/ssh/SshCommandEffector.java
----------------------------------------------------------------------
diff --git 
a/software/base/src/main/java/brooklyn/entity/software/ssh/SshCommandEffector.java
 
b/software/base/src/main/java/brooklyn/entity/software/ssh/SshCommandEffector.java
index 4cc1b5c..200d0ce 100644
--- 
a/software/base/src/main/java/brooklyn/entity/software/ssh/SshCommandEffector.java
+++ 
b/software/base/src/main/java/brooklyn/entity/software/ssh/SshCommandEffector.java
@@ -40,6 +40,7 @@ import com.google.common.base.Preconditions;
 public final class SshCommandEffector extends AddEffector {
     
     public static final ConfigKey<String> EFFECTOR_COMMAND = 
ConfigKeys.newStringConfigKey("command");
+    public static final ConfigKey<String> EFFECTOR_EXECUTION_DIR = 
SshCommandSensor.SENSOR_EXECUTION_DIR;
     
     public SshCommandEffector(ConfigBag params) {
         super(newEffectorBuilder(params).build());
@@ -59,10 +60,12 @@ public final class SshCommandEffector extends AddEffector {
     protected static class Body extends EffectorBody<String> {
         private final Effector<?> effector;
         private final String command;
+        private final String executionDir;
 
         public Body(Effector<?> eff, ConfigBag params) {
             this.effector = eff;
             this.command = 
Preconditions.checkNotNull(params.get(EFFECTOR_COMMAND), "command must be 
supplied when defining this effector");
+            this.executionDir = params.get(EFFECTOR_EXECUTION_DIR);
             // TODO could take a custom "env" aka effectorShellEnv
         }
 
@@ -70,8 +73,7 @@ public final class SshCommandEffector extends AddEffector {
         public String call(ConfigBag params) {
             String command = this.command;
             
-            String runDir = entity().getAttribute(SoftwareProcess.RUN_DIR);
-            if (runDir!=null) command = "cd '"+runDir+"'\n"+command;
+            command = 
SshCommandSensor.makeCommandExecutingInDirectory(command, executionDir, 
entity());
             
             MutableMap<String, String> env = MutableMap.of();
             // first set all declared parameters, including default values

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/44273ad5/software/base/src/main/java/brooklyn/entity/software/ssh/SshCommandSensor.java
----------------------------------------------------------------------
diff --git 
a/software/base/src/main/java/brooklyn/entity/software/ssh/SshCommandSensor.java
 
b/software/base/src/main/java/brooklyn/entity/software/ssh/SshCommandSensor.java
index 51e2917..2c918f9 100644
--- 
a/software/base/src/main/java/brooklyn/entity/software/ssh/SshCommandSensor.java
+++ 
b/software/base/src/main/java/brooklyn/entity/software/ssh/SshCommandSensor.java
@@ -37,6 +37,7 @@ import brooklyn.event.feed.ssh.SshValueFunctions;
 import brooklyn.util.collections.MutableMap;
 import brooklyn.util.config.ConfigBag;
 import brooklyn.util.flags.TypeCoercions;
+import brooklyn.util.os.Os;
 import brooklyn.util.text.Strings;
 
 import com.google.common.annotations.Beta;
@@ -59,14 +60,20 @@ public final class SshCommandSensor<T> extends AddSensor<T> 
{
     private static final Logger LOG = 
LoggerFactory.getLogger(SshCommandSensor.class);
 
     public static final ConfigKey<String> SENSOR_COMMAND = 
ConfigKeys.newStringConfigKey("command", "SSH command to execute for sensor");
+    public static final ConfigKey<String> SENSOR_EXECUTION_DIR = 
ConfigKeys.newStringConfigKey("executionDir", "Directory where the command 
should run; "
+        + "if not supplied, executes in the entity's run dir (or home dir if 
no run dir is defined); "
+        + "use '~' to always execute in the home dir, or 'custom-feed/' to 
execute in a custom-feed dir relative to the run dir");
 
     protected final String command;
+    protected final String executionDir;
 
     public SshCommandSensor(final ConfigBag params) {
         super(params);
 
         // TODO create a supplier for the command string to support attribute 
embedding
         command = Preconditions.checkNotNull(params.get(SENSOR_COMMAND), 
"command");
+        
+        executionDir = params.get(SENSOR_EXECUTION_DIR);
     }
 
     @Override
@@ -87,12 +94,7 @@ public final class SshCommandSensor<T> extends AddSensor<T> {
         Supplier<String> commandSupplier = new Supplier<String>() {
             @Override
             public String get() {
-                String finalCommand = command;
-                String runDir = entity.getAttribute(SoftwareProcess.RUN_DIR);
-                if (runDir != null) {
-                    finalCommand = "cd '"+runDir+"' && "+finalCommand;
-                }
-                return finalCommand;
+                return makeCommandExecutingInDirectory(command, executionDir, 
entity);
             }
         };
 
@@ -115,4 +117,27 @@ public final class SshCommandSensor<T> extends 
AddSensor<T> {
                 .build();
     }
 
+    static String makeCommandExecutingInDirectory(String command, String 
executionDir, EntityLocal entity) {
+        String finalCommand = command;
+        String execDir = executionDir;
+        if (Strings.isBlank(execDir)) {
+            // default to run dir
+            execDir = entity.getAttribute(SoftwareProcess.RUN_DIR);
+            // if no run dir, default to home
+            if (Strings.isBlank(execDir)) {
+                execDir = "~";
+            }
+        } else if (!Os.isAbsolutish(execDir)) {
+            // relative paths taken wrt run dir
+            String runDir = entity.getAttribute(SoftwareProcess.RUN_DIR);
+            if (!Strings.isBlank(runDir)) {
+                execDir = Os.mergePaths(runDir, execDir);
+            }
+        }
+        if (!"~".equals(execDir)) {
+            finalCommand = "mkdir -p '"+execDir+"' && cd '"+execDir+"' && 
"+finalCommand;
+        }
+        return finalCommand;
+    }
+
 }

Reply via email to