Repository: incubator-brooklyn Updated Branches: refs/heads/master 514541241 -> d9295ce18
Support scriptDir location config This modifies SshMachineLocation to propagate certain config keys to flags on SshTool execCommand and execScript invocations; the first use of this is to propagate the "scriptDir" config. JcloudsLocation is also modified to propagate this configuration. The result is that "scriptDir" can be specified in the configuration for a jclouds-based location, and the value of this property will be passed to every invocation of SshTool.execScript(). The use case for this is to allow Brooklyn to be usable on locations where the VM image mounts "/tmp" with "noexec". Also adds some integration tests to verify the correct operation of the scriptDir flag. Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/6c9dc76f Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/6c9dc76f Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/6c9dc76f Branch: refs/heads/master Commit: 6c9dc76f2265fcc186fd2fe6c32a6f995e2189a5 Parents: 512344c Author: Richard Downer <[email protected]> Authored: Tue Jan 27 16:06:07 2015 +0000 Committer: Richard Downer <[email protected]> Committed: Fri Jan 30 16:03:01 2015 +0000 ---------------------------------------------------------------------- .../location/basic/SshMachineLocation.java | 24 +++++++++++-- .../SshMachineLocationIntegrationTest.java | 38 +++++++++++++++++++- .../ssh/SshToolAbstractIntegrationTest.java | 13 +++++++ .../location/jclouds/JcloudsLocation.java | 1 + 4 files changed, 73 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/6c9dc76f/core/src/main/java/brooklyn/location/basic/SshMachineLocation.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/location/basic/SshMachineLocation.java b/core/src/main/java/brooklyn/location/basic/SshMachineLocation.java index 4a165f2..9482d02 100644 --- a/core/src/main/java/brooklyn/location/basic/SshMachineLocation.java +++ b/core/src/main/java/brooklyn/location/basic/SshMachineLocation.java @@ -19,6 +19,8 @@ package brooklyn.location.basic; import static brooklyn.util.GroovyJavaMethods.truth; + +import com.google.common.annotations.Beta; import groovy.lang.Closure; import java.io.Closeable; @@ -110,6 +112,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; +import com.google.common.collect.Maps; import com.google.common.collect.Sets; import com.google.common.net.HostAndPort; @@ -216,6 +219,14 @@ public class SshMachineLocation extends AbstractLocation implements MachineLocat } })); + /** + * The set of config keys on this location which become default values for properties when invoking an SSH + * operation. + */ + @Beta + public static final Set<ConfigKey<?>> SSH_CONFIG_GIVEN_TO_PROPS = ImmutableSet.<ConfigKey<?>>of( + SCRIPT_DIR); + private Task<?> cleanupTask; /** callers should use {@link #getSshPoolCache()} */ @Nullable @@ -610,7 +621,7 @@ public class SshMachineLocation extends AbstractLocation implements MachineLocat return execCommands(MutableMap.<String,Object>of(), summaryForLogging, commands, env); } public int execCommands(Map<String,?> props, String summaryForLogging, List<String> commands, Map<String,?> env) { - return newExecWithLoggingHelpers().execCommands(props, summaryForLogging, commands, env); + return newExecWithLoggingHelpers().execCommands(augmentPropertiesWithSshConfigGivenToProps(props), summaryForLogging, commands, env); } /** @@ -630,7 +641,16 @@ public class SshMachineLocation extends AbstractLocation implements MachineLocat return execScript(MutableMap.<String,Object>of(), summaryForLogging, commands, env); } public int execScript(Map<String,?> props, String summaryForLogging, List<String> commands, Map<String,?> env) { - return newExecWithLoggingHelpers().execScript(props, summaryForLogging, commands, env); + return newExecWithLoggingHelpers().execScript(augmentPropertiesWithSshConfigGivenToProps(props), summaryForLogging, commands, env); + } + + private Map<String, Object> augmentPropertiesWithSshConfigGivenToProps(Map<String, ?> props) { + Map<String,Object> augmentedProps = Maps.newHashMap(props); + for (ConfigKey<?> config : SSH_CONFIG_GIVEN_TO_PROPS) { + if (!props.containsKey(config.getName())) + augmentedProps.put(config.getName(), getConfig(config)); + } + return augmentedProps; } protected ExecWithLoggingHelpers newExecWithLoggingHelpers() { http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/6c9dc76f/core/src/test/java/brooklyn/location/basic/SshMachineLocationIntegrationTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/brooklyn/location/basic/SshMachineLocationIntegrationTest.java b/core/src/test/java/brooklyn/location/basic/SshMachineLocationIntegrationTest.java index 5fbe030..63f5902 100644 --- a/core/src/test/java/brooklyn/location/basic/SshMachineLocationIntegrationTest.java +++ b/core/src/test/java/brooklyn/location/basic/SshMachineLocationIntegrationTest.java @@ -21,7 +21,11 @@ package brooklyn.location.basic; import java.io.ByteArrayOutputStream; import java.security.KeyPair; import java.util.Arrays; +import java.util.Map; +import brooklyn.util.internal.ssh.SshTool; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; import org.testng.Assert; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; @@ -38,6 +42,8 @@ import brooklyn.util.internal.ssh.sshj.SshjTool.SshjToolBuilder; import com.google.common.base.Preconditions; +import static org.testng.Assert.assertEquals; + public class SshMachineLocationIntegrationTest { protected TestApplication app; @@ -75,7 +81,37 @@ public class SshMachineLocationIntegrationTest { ByteArrayOutputStream out = new ByteArrayOutputStream(); int result = tool.execCommands(MutableMap.<String,Object>of("out", out), Arrays.asList("date")); Assert.assertTrue(out.toString().contains(" 20"), "out="+out); - Assert.assertEquals(result, 0); + assertEquals(result, 0); + } + + @Test(groups = "Integration") + public void testExecScriptScriptDirFlagIsRespected() throws Exception { + // For explanation of (some of) the magic behind this command, see http://stackoverflow.com/a/229606/68898 + final String command = "if [[ \"$0\" == \"/var/tmp/\"* ]]; then true; else false; fi"; + + LocalhostMachineProvisioningLocation lhp = (LocalhostMachineProvisioningLocation) mgmt.getLocationRegistry().resolve("localhost", true, null).orNull(); + SshMachineLocation sm = lhp.obtain(); + + Map<String, Object> props = ImmutableMap.<String, Object>builder() + .put(SshTool.PROP_SCRIPT_DIR.getName(), "/var/tmp") + .build(); + int rc = sm.execScript(props, "Test script directory execution", ImmutableList.of(command)); + assertEquals(rc, 0); } + @Test(groups = "Integration") + public void testLocationScriptDirConfigIsRespected() throws Exception { + // For explanation of (some of) the magic behind this command, see http://stackoverflow.com/a/229606/68898 + final String command = "if [[ \"$0\" == \"/var/tmp/\"* ]]; then true; else false; fi"; + + Map<String, Object> locationConfig = ImmutableMap.<String, Object>builder() + .put(SshMachineLocation.SCRIPT_DIR.getName(), "/var/tmp") + .build(); + + LocalhostMachineProvisioningLocation lhp = (LocalhostMachineProvisioningLocation) mgmt.getLocationRegistry().resolve("localhost", locationConfig); + SshMachineLocation sm = lhp.obtain(); + + int rc = sm.execScript("Test script directory execution", ImmutableList.of(command)); + assertEquals(rc, 0); + } } http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/6c9dc76f/core/src/test/java/brooklyn/util/internal/ssh/SshToolAbstractIntegrationTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/brooklyn/util/internal/ssh/SshToolAbstractIntegrationTest.java b/core/src/test/java/brooklyn/util/internal/ssh/SshToolAbstractIntegrationTest.java index 1501585..84b1029 100644 --- a/core/src/test/java/brooklyn/util/internal/ssh/SshToolAbstractIntegrationTest.java +++ b/core/src/test/java/brooklyn/util/internal/ssh/SshToolAbstractIntegrationTest.java @@ -285,4 +285,17 @@ public abstract class SshToolAbstractIntegrationTest extends ShellToolAbstractTe Assert.assertEquals(CONTENTS.trim(), contents.trim()); } + @Test(groups = {"Integration"}) + public void testScriptDirPropertiesIsRespected() { + // For explanation of (some of) the magic behind this command, see http://stackoverflow.com/a/229606/68898 + final String command = "if [[ \"$0\" == \"/var/tmp/\"* ]]; then true; else false; fi"; + + SshTool sshTool = newTool(ImmutableMap.<String, Object>builder() + .put(SshTool.PROP_HOST.getName(), "localhost") + .build()); + int rc = sshTool.execScript(ImmutableMap.<String, Object>builder() + .put(SshTool.PROP_SCRIPT_DIR.getName(), "/var/tmp") + .build(), ImmutableList.of(command)); + assertEquals(rc, 0); + } } http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/6c9dc76f/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java ---------------------------------------------------------------------- diff --git a/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java b/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java index b10973d..7abbaca 100644 --- a/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java +++ b/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java @@ -1694,6 +1694,7 @@ public class JcloudsLocation extends AbstractCloudMachineProvisioningLocation im .configureIfNotNull(CLOUD_REGION_ID, nodeRegion) .configure(CALLER_CONTEXT, setup.get(CALLER_CONTEXT)) .configure(SshMachineLocation.DETECT_MACHINE_DETAILS, setup.get(SshMachineLocation.DETECT_MACHINE_DETAILS)) + .configure(SshMachineLocation.SCRIPT_DIR, setup.get(SshMachineLocation.SCRIPT_DIR)) .configureIfNotNull(USE_PORT_FORWARDING, setup.get(USE_PORT_FORWARDING)) .configureIfNotNull(PORT_FORWARDER, setup.get(PORT_FORWARDER)) .configureIfNotNull(PORT_FORWARDING_MANAGER, setup.get(PORT_FORWARDING_MANAGER)));
