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 2022/07/29 13:53:38 UTC

[brooklyn-server] 05/06: tweak signatures so machines are preferred over entities, and short key name accepted

This is an automated email from the ASF dual-hosted git repository.

heneveld pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/brooklyn-server.git

commit 401f26d347f2a24fd16e08c881ce7e5e7785cc35
Author: Alex Heneveld <al...@cloudsoft.io>
AuthorDate: Fri Jul 29 11:12:52 2022 +0100

    tweak signatures so machines are preferred over entities, and short key name accepted
    
    to bring it in line with other ssh config
---
 .../brooklyn/location/ssh/SshMachineLocation.java  | 10 ++---
 .../brooklyn/util/core/file/ArchiveUtils.java      |  2 +-
 .../util/core/file/BrooklynOsCommands.java         | 51 +++++++++++++++++++---
 .../brooklyn/util/core/task/ssh/SshTasks.java      |  4 +-
 .../brooklyn/location/jclouds/JcloudsLocation.java |  2 +-
 .../policy/jclouds/os/CreateUserPolicy.java        |  2 +-
 ...eJcloudsLocationUserLoginAndConfigLiveTest.java |  2 +-
 .../entity/brooklynnode/BrooklynNodeSshDriver.java |  4 +-
 .../entity/java/JavaSoftwareProcessSshDriver.java  |  4 +-
 .../brooklyn/entity/machine/MachineInitTasks.java  |  2 +-
 .../entity/machine/SetHostnameCustomizer.java      |  2 +-
 .../base/AbstractSoftwareProcessSshDriver.java     |  2 +-
 .../base/VanillaSoftwareProcessSshDriver.java      |  2 +-
 .../system_service/InitdServiceInstaller.java      |  2 +-
 .../entity/AbstractMultiDistroLiveTest.java        |  2 +-
 .../test/mysql/DynamicToyMySqlEntityBuilder.java   |  6 +--
 16 files changed, 68 insertions(+), 31 deletions(-)

diff --git a/core/src/main/java/org/apache/brooklyn/location/ssh/SshMachineLocation.java b/core/src/main/java/org/apache/brooklyn/location/ssh/SshMachineLocation.java
index 99f81a9994..9f7a8e3d1d 100644
--- a/core/src/main/java/org/apache/brooklyn/location/ssh/SshMachineLocation.java
+++ b/core/src/main/java/org/apache/brooklyn/location/ssh/SshMachineLocation.java
@@ -870,7 +870,7 @@ public class SshMachineLocation extends AbstractMachineLocation implements Machi
         LOG.debug("installing {} to {} on {}, attempting remote curl", new Object[] { url, destPath, this });
 
         try {
-            BashCommandsConfigurable bash = BrooklynOsCommands.bash(getManagementContext());
+            BashCommandsConfigurable bash = BrooklynOsCommands.bash(this);
             PipedInputStream insO = new PipedInputStream(); OutputStream outO = new PipedOutputStream(insO);
             PipedInputStream insE = new PipedInputStream(); OutputStream outE = new PipedOutputStream(insE);
             StreamGobbler sgsO = new StreamGobbler(insO, null, LOG); sgsO.setLogPrefix("[curl @ "+address+":stdout] ").start();
@@ -1063,10 +1063,10 @@ public class SshMachineLocation extends AbstractMachineLocation implements Machi
     @Override
     public String resolveOnBoxDirFor(Entity entity, String unresolvedPath) {
         ProcessTaskWrapper<Integer> baseTask = SshEffectorTasks.ssh(
-            BrooklynOsCommands.bash(entity).alternatives("mkdir -p \"${BASE_DIR}\"",
-                BrooklynOsCommands.bash(entity).chain(
-                    BrooklynOsCommands.bash(entity).sudo("mkdir -p \"${BASE_DIR}\""),
-                    BrooklynOsCommands.bash(entity).sudo("chown "+getUser()+" \"${BASE_DIR}\""))),
+            BrooklynOsCommands.bash(this).alternatives("mkdir -p \"${BASE_DIR}\"",
+                BrooklynOsCommands.bash(this).chain(
+                    BrooklynOsCommands.bash(this).sudo("mkdir -p \"${BASE_DIR}\""),
+                    BrooklynOsCommands.bash(this).sudo("chown "+getUser()+" \"${BASE_DIR}\""))),
             "cd ~",
             "cd ${BASE_DIR}",
             "echo BASE_DIR_RESULT':'`pwd`:BASE_DIR_RESULT")
diff --git a/core/src/main/java/org/apache/brooklyn/util/core/file/ArchiveUtils.java b/core/src/main/java/org/apache/brooklyn/util/core/file/ArchiveUtils.java
index 2f16f0baed..1a5dc08a1f 100644
--- a/core/src/main/java/org/apache/brooklyn/util/core/file/ArchiveUtils.java
+++ b/core/src/main/java/org/apache/brooklyn/util/core/file/ArchiveUtils.java
@@ -286,7 +286,7 @@ public class ArchiveUtils {
             }
 
             // extract, now using task if available
-            MutableList<String> commands = MutableList.copyOf(installCommands(BrooklynOsCommands.bash(machine.getManagementContext()), destFile))
+            MutableList<String> commands = MutableList.copyOf(installCommands(BrooklynOsCommands.bash(machine), destFile))
                     .appendAll(extractCommands(destFile, tmpDir, destDir, false, keepArchiveAfterUnpacking));
             if (DynamicTasks.getTaskQueuingContext()!=null) {
                 result = DynamicTasks.queue(SshTasks.newSshExecTaskFactory(machine, commands.toArray(new String[0])).summary("extracting archive").requiringExitCodeZero()).get();
diff --git a/core/src/main/java/org/apache/brooklyn/util/core/file/BrooklynOsCommands.java b/core/src/main/java/org/apache/brooklyn/util/core/file/BrooklynOsCommands.java
index ca636becc8..2e9a27a141 100644
--- a/core/src/main/java/org/apache/brooklyn/util/core/file/BrooklynOsCommands.java
+++ b/core/src/main/java/org/apache/brooklyn/util/core/file/BrooklynOsCommands.java
@@ -19,18 +19,27 @@
 package org.apache.brooklyn.util.core.file;
 
 import org.apache.brooklyn.api.entity.Entity;
+import org.apache.brooklyn.api.location.Location;
+import org.apache.brooklyn.api.location.MachineLocation;
 import org.apache.brooklyn.api.mgmt.ManagementContext;
+import org.apache.brooklyn.api.objs.BrooklynObject;
 import org.apache.brooklyn.config.ConfigKey;
 import org.apache.brooklyn.core.config.ConfigKeys;
 import org.apache.brooklyn.core.entity.BrooklynConfigKeys;
-import org.apache.brooklyn.core.entity.EntityInternal;
 import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal;
+import org.apache.brooklyn.core.objs.BrooklynObjectInternal;
+import org.apache.brooklyn.util.collections.MutableList;
 import org.apache.brooklyn.util.ssh.BashCommandsConfigurable;
 import org.apache.brooklyn.util.ssh.IptablesCommandsConfigurable;
 
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
 public class BrooklynOsCommands {
 
     public static final ConfigKey<Boolean> SSH_CONFIG_SCRIPT_IGNORE_CERTS = BrooklynConfigKeys.SSH_CONFIG_SCRIPTS_IGNORE_CERTS;
+    public static final ConfigKey<Boolean> SCRIPT_IGNORE_CERTS = ConfigKeys.newConfigKeyWithPrefixRemoved(BrooklynConfigKeys.BROOKLYN_SSH_CONFIG_KEY_PREFIX, SSH_CONFIG_SCRIPT_IGNORE_CERTS);
 
     public static BashCommandsConfigurable bash(ManagementContext mgmt) {
         return BashCommandsConfigurable.newInstance().withIgnoreCerts( ((ManagementContextInternal)mgmt).getBrooklynProperties().getConfig(SSH_CONFIG_SCRIPT_IGNORE_CERTS) );
@@ -40,14 +49,42 @@ public class BrooklynOsCommands {
         return new IptablesCommandsConfigurable(bash(mgmt));
     }
 
-    public static BashCommandsConfigurable bash(Entity entity) {
-        Boolean ignoreCerts = entity.config().get(SSH_CONFIG_SCRIPT_IGNORE_CERTS);
-        if (ignoreCerts!=null) return BashCommandsConfigurable.newInstance().withIgnoreCerts(ignoreCerts);
-        return bash( ((EntityInternal)entity).getManagementContext() );
+    public static BashCommandsConfigurable bash(Entity entity, boolean includeMachineLocations) {
+        return bashForBrooklynObjects(includeMachineLocations, entity);
+    }
+
+    public static BashCommandsConfigurable bash(Location location) {
+        return bashForBrooklynObjects(false, location);
+    }
+
+    public static BashCommandsConfigurable bashForBrooklynObjects(boolean includeMachineLocations, BrooklynObject ...brooklynObjects) {
+        return bashForBrooklynObjects(includeMachineLocations, Arrays.asList(brooklynObjects));
+    }
+    public static BashCommandsConfigurable bashForBrooklynObjects(boolean includeMachineLocations, List<BrooklynObject> brooklynObjects0) {
+        ManagementContext mgmt = null;
+        List<BrooklynObject> brooklynObjects = MutableList.of();
+        for (BrooklynObject bo: brooklynObjects0) {
+            if (includeMachineLocations && bo instanceof Entity) brooklynObjects.addAll( ((Entity)bo).getLocations().stream().filter(l -> l instanceof MachineLocation).collect(Collectors.toList()) );
+
+            brooklynObjects.add(bo);
+        }
+
+        for (BrooklynObject bo: brooklynObjects) {
+            Boolean ignoreCerts = null;
+            // unprefixed key allowed for locations
+            if (bo instanceof Location) ignoreCerts = bo.config().get(SCRIPT_IGNORE_CERTS);
+
+            if (ignoreCerts==null) ignoreCerts = bo.config().get(SSH_CONFIG_SCRIPT_IGNORE_CERTS);
+            if (ignoreCerts!=null) return BashCommandsConfigurable.newInstance().withIgnoreCerts(ignoreCerts);
+
+            if (mgmt==null) mgmt = ((BrooklynObjectInternal)bo).getManagementContext();
+        }
+
+        return bash(mgmt);
     }
 
-    public static IptablesCommandsConfigurable bashIptables(Entity entity) {
-        return new IptablesCommandsConfigurable(bash(entity));
+    public static IptablesCommandsConfigurable bashIptables(BrooklynObject entityOrOtherBrooklynObject) {
+        return new IptablesCommandsConfigurable(bashForBrooklynObjects(true, entityOrOtherBrooklynObject));
     }
 
 }
diff --git a/core/src/main/java/org/apache/brooklyn/util/core/task/ssh/SshTasks.java b/core/src/main/java/org/apache/brooklyn/util/core/task/ssh/SshTasks.java
index 16066e9967..ae51d76cd7 100644
--- a/core/src/main/java/org/apache/brooklyn/util/core/task/ssh/SshTasks.java
+++ b/core/src/main/java/org/apache/brooklyn/util/core/task/ssh/SshTasks.java
@@ -184,8 +184,8 @@ public class SshTasks {
                 .commandModifier(x -> {
                     Entity entity = BrooklynTaskTags.getTargetOrContextEntity(Tasks.current());
                     BashCommandsConfigurable bash;
-                    if (entity!=null) bash = BrooklynOsCommands.bash(entity);
-                    else bash = BrooklynOsCommands.bash(machine.getManagementContext());
+                    if (entity!=null) bash = BrooklynOsCommands.bash(machine);
+                    else bash = BrooklynOsCommands.bash(machine);
                     return MutableList.of(
                         bash.dontRequireTtyForSudo(),
                         // strange quotes are to ensure we don't match against echoed stdin
diff --git a/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/JcloudsLocation.java b/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/JcloudsLocation.java
index 764b9021e1..a7b3d13bf3 100644
--- a/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/JcloudsLocation.java
+++ b/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/JcloudsLocation.java
@@ -404,7 +404,7 @@ public class JcloudsLocation extends AbstractCloudMachineProvisioningLocation im
                 : (OsFamily.WINDOWS == confFamily);
     }
 
-    private BashCommandsConfigurable bashCommands() { return BrooklynOsCommands.bash(getManagementContext()); }
+    private BashCommandsConfigurable bashCommands() { return BrooklynOsCommands.bash(this); }
     private IptablesCommandsConfigurable iptablesCommands() { return new IptablesCommandsConfigurable(bashCommands()); }
 
     public boolean isLocationFirewalldEnabled(SshMachineLocation location) {
diff --git a/locations/jclouds/src/main/java/org/apache/brooklyn/policy/jclouds/os/CreateUserPolicy.java b/locations/jclouds/src/main/java/org/apache/brooklyn/policy/jclouds/os/CreateUserPolicy.java
index abf0c8d8a0..300b45c1e8 100644
--- a/locations/jclouds/src/main/java/org/apache/brooklyn/policy/jclouds/os/CreateUserPolicy.java
+++ b/locations/jclouds/src/main/java/org/apache/brooklyn/policy/jclouds/os/CreateUserPolicy.java
@@ -149,7 +149,7 @@ public class CreateUserPolicy extends AbstractPolicy implements SensorEventListe
         String cmd = adminAccess.render(scriptOsFamily);
 
         // Exec command to create the user
-        BashCommandsConfigurable bash = BrooklynOsCommands.bash(entity);
+        BashCommandsConfigurable bash = BrooklynOsCommands.bash(machine);
         int result = machine.execScript(ImmutableMap.of(SshTool.PROP_RUN_AS_ROOT.getName(), true), "create-user-"+user, ImmutableList.of(cmd), ImmutableMap.of("PATH", bash.sbinPath()));
         if (result != 0) {
             throw new IllegalStateException("Failed to auto-generate user, using command "+cmd);
diff --git a/locations/jclouds/src/test/java/org/apache/brooklyn/location/jclouds/SimpleJcloudsLocationUserLoginAndConfigLiveTest.java b/locations/jclouds/src/test/java/org/apache/brooklyn/location/jclouds/SimpleJcloudsLocationUserLoginAndConfigLiveTest.java
index 230bc78f4a..980fb0dd69 100644
--- a/locations/jclouds/src/test/java/org/apache/brooklyn/location/jclouds/SimpleJcloudsLocationUserLoginAndConfigLiveTest.java
+++ b/locations/jclouds/src/test/java/org/apache/brooklyn/location/jclouds/SimpleJcloudsLocationUserLoginAndConfigLiveTest.java
@@ -215,7 +215,7 @@ public class SimpleJcloudsLocationUserLoginAndConfigLiveTest extends AbstractJcl
                 "grantUserSudo", false,
                 "waitForSshable", 30*1000));
 
-        int exitCode = execWithExitCode(m, ImmutableList.of(BrooklynOsCommands.bash(m.getManagementContext()).sudo("echo yes")));
+        int exitCode = execWithExitCode(m, ImmutableList.of(BrooklynOsCommands.bash(m).sudo("echo yes")));
         Assert.assertFalse(exitCode == 0, "exit code for sudo command should not have been 0");
     }
 
diff --git a/software/base/src/main/java/org/apache/brooklyn/entity/brooklynnode/BrooklynNodeSshDriver.java b/software/base/src/main/java/org/apache/brooklyn/entity/brooklynnode/BrooklynNodeSshDriver.java
index 67a0d8689e..15120b570d 100644
--- a/software/base/src/main/java/org/apache/brooklyn/entity/brooklynnode/BrooklynNodeSshDriver.java
+++ b/software/base/src/main/java/org/apache/brooklyn/entity/brooklynnode/BrooklynNodeSshDriver.java
@@ -154,9 +154,9 @@ public class BrooklynNodeSshDriver extends JavaSoftwareProcessSshDriver implemen
                 getMachine().copyTo(distroStream, getInstallDir()+"/"+saveAs);
             }
         } else {
-            commands.addAll(BrooklynOsCommands.bash(getEntity()).commandsToDownloadUrlsAs(urls, saveAs));
+            commands.addAll(BrooklynOsCommands.bash(getMachine()).commandsToDownloadUrlsAs(urls, saveAs));
         }
-        commands.add(BrooklynOsCommands.bash(getEntity()).INSTALL_TAR);
+        commands.add(BrooklynOsCommands.bash(getMachine()).INSTALL_TAR);
         commands.add("tar xzfv " + saveAs);
         
         newScript(INSTALLING).
diff --git a/software/base/src/main/java/org/apache/brooklyn/entity/java/JavaSoftwareProcessSshDriver.java b/software/base/src/main/java/org/apache/brooklyn/entity/java/JavaSoftwareProcessSshDriver.java
index 636d1d35e3..54a403ac7b 100644
--- a/software/base/src/main/java/org/apache/brooklyn/entity/java/JavaSoftwareProcessSshDriver.java
+++ b/software/base/src/main/java/org/apache/brooklyn/entity/java/JavaSoftwareProcessSshDriver.java
@@ -292,7 +292,7 @@ public abstract class JavaSoftwareProcessSshDriver extends AbstractSoftwareProce
                 return true;
             }
         }
-        return tryJavaInstall(requiredVersion, BrooklynOsCommands.bash(getEntity()).installJava(requiredJavaMinor)) == 0;
+        return tryJavaInstall(requiredVersion, BrooklynOsCommands.bash(getMachine()).installJava(requiredJavaMinor)) == 0;
     }
 
     /**
@@ -417,7 +417,7 @@ public abstract class JavaSoftwareProcessSshDriver extends AbstractSoftwareProce
                     // http://mail.openjdk.java.net/pipermail/net-dev/2012-July/004603.html
                     String newHostname = "br-"+getEntity().getId().toLowerCase();
                     log.info("Detected likelihood of Java hostname bug with hostname length "+len+" for "+getEntity()+"; renaming "+getMachine()+"  to hostname "+newHostname);
-                    DynamicTasks.queue(SshEffectorTasks.ssh(BrooklynOsCommands.bash(getEntity()).setHostname(newHostname, null))).block();
+                    DynamicTasks.queue(SshEffectorTasks.ssh(BrooklynOsCommands.bash(getMachine()).setHostname(newHostname, null))).block();
                 }
             } else {
                 log.debug("Hostname length could not be determined for location "+EffectorTasks.findSshMachine()+"; not doing Java hostname bug check");
diff --git a/software/base/src/main/java/org/apache/brooklyn/entity/machine/MachineInitTasks.java b/software/base/src/main/java/org/apache/brooklyn/entity/machine/MachineInitTasks.java
index c1bbe1e63a..59be0e1642 100644
--- a/software/base/src/main/java/org/apache/brooklyn/entity/machine/MachineInitTasks.java
+++ b/software/base/src/main/java/org/apache/brooklyn/entity/machine/MachineInitTasks.java
@@ -70,7 +70,7 @@ public class MachineInitTasks {
         });
     }
 
-    private IptablesCommandsConfigurable iptablesCommands(SshMachineLocation m) { return new IptablesCommandsConfigurable(BrooklynOsCommands.bash(m.getManagementContext())); }
+    private IptablesCommandsConfigurable iptablesCommands(SshMachineLocation m) { return BrooklynOsCommands.bashIptables(m); }
 
     protected void stopIptablesImpl(final SshMachineLocation machine) {
 
diff --git a/software/base/src/main/java/org/apache/brooklyn/entity/machine/SetHostnameCustomizer.java b/software/base/src/main/java/org/apache/brooklyn/entity/machine/SetHostnameCustomizer.java
index 128ad9b66c..5c91698c5e 100644
--- a/software/base/src/main/java/org/apache/brooklyn/entity/machine/SetHostnameCustomizer.java
+++ b/software/base/src/main/java/org/apache/brooklyn/entity/machine/SetHostnameCustomizer.java
@@ -174,7 +174,7 @@ public class SetHostnameCustomizer extends BasicMachineLocationCustomizer {
         boolean hasDomain = Strings.isNonBlank(domainFixed);
         String fqdn = hasDomain ? hostName+"."+domainFixed : hostName;
 
-        BashCommandsConfigurable bash = BrooklynOsCommands.bash(machine.getManagementContext());
+        BashCommandsConfigurable bash = BrooklynOsCommands.bash(machine);
         exec(machine, true, 
                 bash.sudo(String.format("sed -i.bak -e '1i127.0.0.1 %s %s' -e '/^127.0.0.1/d' /etc/hosts", fqdn, hostName)),
                 bash.sudo(String.format("sed -i.bak -e 's/^HOSTNAME=.*$/HOSTNAME=%s/' /etc/sysconfig/network", fqdn)),
diff --git a/software/base/src/main/java/org/apache/brooklyn/entity/software/base/AbstractSoftwareProcessSshDriver.java b/software/base/src/main/java/org/apache/brooklyn/entity/software/base/AbstractSoftwareProcessSshDriver.java
index 697fa6bdf0..20c3dbc282 100644
--- a/software/base/src/main/java/org/apache/brooklyn/entity/software/base/AbstractSoftwareProcessSshDriver.java
+++ b/software/base/src/main/java/org/apache/brooklyn/entity/software/base/AbstractSoftwareProcessSshDriver.java
@@ -362,7 +362,7 @@ public abstract class AbstractSoftwareProcessSshDriver extends AbstractSoftwareP
         return result;
     }
 
-    protected BashCommandsConfigurable bashCommands() { return BrooklynOsCommands.bash(getEntity()); }
+    protected BashCommandsConfigurable bashCommands() { return BrooklynOsCommands.bash(getMachine()); }
 
     public void checkNoHostnameBug() {
         try {
diff --git a/software/base/src/main/java/org/apache/brooklyn/entity/software/base/VanillaSoftwareProcessSshDriver.java b/software/base/src/main/java/org/apache/brooklyn/entity/software/base/VanillaSoftwareProcessSshDriver.java
index 2cc3575075..4779a449d7 100644
--- a/software/base/src/main/java/org/apache/brooklyn/entity/software/base/VanillaSoftwareProcessSshDriver.java
+++ b/software/base/src/main/java/org/apache/brooklyn/entity/software/base/VanillaSoftwareProcessSshDriver.java
@@ -91,7 +91,7 @@ public class VanillaSoftwareProcessSshDriver extends AbstractSoftwareProcessSshD
             downloadedFilename = resolver.getFilename();
 
             List<String> commands = new LinkedList<String>();
-            BashCommandsConfigurable bash = BrooklynOsCommands.bash(getEntity());
+            BashCommandsConfigurable bash = BrooklynOsCommands.bash(getMachine());
             commands.addAll(bash.commandsToDownloadUrlsAs(urls, downloadedFilename));
             commands.addAll(ArchiveUtils.installCommands(bash, downloadedFilename));
 
diff --git a/software/base/src/main/java/org/apache/brooklyn/entity/system_service/InitdServiceInstaller.java b/software/base/src/main/java/org/apache/brooklyn/entity/system_service/InitdServiceInstaller.java
index 6c47b9b20b..6713dfb0ed 100644
--- a/software/base/src/main/java/org/apache/brooklyn/entity/system_service/InitdServiceInstaller.java
+++ b/software/base/src/main/java/org/apache/brooklyn/entity/system_service/InitdServiceInstaller.java
@@ -80,7 +80,7 @@ public class InitdServiceInstaller implements SystemServiceInstaller {
         SshPutTaskWrapper putServiceTask = SshTasks.newSshPutTaskFactory(sshMachine, tmpServicePath)
                 .contents(service)
                 .newTask();
-        BashCommandsConfigurable bash = BrooklynOsCommands.bash(sshMachine.getManagementContext());
+        BashCommandsConfigurable bash = BrooklynOsCommands.bash(sshMachine);
         ProcessTaskWrapper<Integer> installServiceTask = SshTasks.newSshExecTaskFactory(sshMachine,
                 bash.chain(
                     bash.sudo("mv " + tmpServicePath + " " + servicePath),
diff --git a/software/base/src/test/java/org/apache/brooklyn/entity/AbstractMultiDistroLiveTest.java b/software/base/src/test/java/org/apache/brooklyn/entity/AbstractMultiDistroLiveTest.java
index 66f2485ec1..e8d54bc6c1 100644
--- a/software/base/src/test/java/org/apache/brooklyn/entity/AbstractMultiDistroLiveTest.java
+++ b/software/base/src/test/java/org/apache/brooklyn/entity/AbstractMultiDistroLiveTest.java
@@ -144,7 +144,7 @@ public abstract class AbstractMultiDistroLiveTest extends BrooklynAppLiveTestSup
         Asserts.succeedsEventually(ImmutableMap.of("timeout", Duration.FIVE_MINUTES), new Runnable() {
             @Override
             public void run() {
-                assertExecSsh(server, ImmutableList.of(BrooklynOsCommands.bash(server).installPackage("curl"), "netstat -antp", "curl -k --retry 3 "+url));
+                assertExecSsh(server, ImmutableList.of(BrooklynOsCommands.bash(server, true).installPackage("curl"), "netstat -antp", "curl -k --retry 3 "+url));
             }});
     }
 }
diff --git a/software/base/src/test/java/org/apache/brooklyn/entity/software/base/test/mysql/DynamicToyMySqlEntityBuilder.java b/software/base/src/test/java/org/apache/brooklyn/entity/software/base/test/mysql/DynamicToyMySqlEntityBuilder.java
index 98ce92a8a9..940152ce07 100644
--- a/software/base/src/test/java/org/apache/brooklyn/entity/software/base/test/mysql/DynamicToyMySqlEntityBuilder.java
+++ b/software/base/src/test/java/org/apache/brooklyn/entity/software/base/test/mysql/DynamicToyMySqlEntityBuilder.java
@@ -108,10 +108,10 @@ public class DynamicToyMySqlEntityBuilder {
                         SshEffectorTasks.ssh(
                             "mkdir "+dir(entity),
                             "cd "+dir(entity),
-                            BrooklynOsCommands.bash(entity).downloadToStdout(downloadUrl(entity, isLocalhost(machineS)))+" | tar xvz"
+                            BrooklynOsCommands.bash(machineS.get()).downloadToStdout(downloadUrl(entity, isLocalhost(machineS)))+" | tar xvz"
                         ).summary("download mysql").returning(SshTasks.returningStdoutLoggingInfo(log, true)));
                 if (isLinux(machineS)) {
-                    DynamicTasks.queue(SshEffectorTasks.ssh(BrooklynOsCommands.bash(entity).installPackage("libaio1")));
+                    DynamicTasks.queue(SshEffectorTasks.ssh(BrooklynOsCommands.bash(machineS.get()).installPackage("libaio1")));
                 }
                 DynamicTasks.queue(
                         SshEffectorTasks.put(".my.cnf")
@@ -127,7 +127,7 @@ public class DynamicToyMySqlEntityBuilder {
             protected void postStartCustom(ConfigBag parameters) {
                 // if it's still up after 5s assume we are good
                 Time.sleep(Duration.FIVE_SECONDS);
-                if (!DynamicTasks.queue(SshEffectorTasks.isPidFromFileRunning(BrooklynOsCommands.bash(entity()), dir(entity)+"/*/data/*.pid")).get()) {
+                if (!DynamicTasks.queue(SshEffectorTasks.isPidFromFileRunning(BrooklynOsCommands.bash(entity(), true), dir(entity)+"/*/data/*.pid")).get()) {
                     // but if it's not up add a bunch of other info
                     log.warn("MySQL did not start: "+dir(entity));
                     ProcessTaskWrapper<Integer> info = DynamicTasks.queue(SshEffectorTasks.ssh(