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/11/23 19:29:33 UTC

[04/20] incubator-brooklyn git commit: Initial restructuring due to review comments.

Initial restructuring due to review comments.

Removes as much as possible of the driver/lifecycle material, in response to
https://github.com/apache/incubator-brooklyn/pull/1030#issuecomment-156714424

Driver related classes removed.

SshEffectorTasks used where possible.

The lifecycle class is slimmed down but retained as it takes care of getting
hold of the MachineLocation.


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

Branch: refs/heads/master
Commit: b30489ed043da00162f5102dbb6ccfd8582d05df
Parents: 014b6bf
Author: Geoff Macartney <ge...@cloudsoftcorp.com>
Authored: Tue Nov 17 10:41:42 2015 +0000
Committer: Geoff Macartney <ge...@cloudsoftcorp.com>
Committed: Tue Nov 17 11:33:10 2015 +0000

----------------------------------------------------------------------
 .../brooklyn/test/framework/SimpleCommand.java  |   9 +
 .../test/framework/SimpleCommandImpl.java       | 226 +++++++++++++------
 .../SimpleCommandLifecycleEffectorTasks.java    |  23 +-
 .../test/framework/SimpleCommandSshDriver.java  | 192 ----------------
 .../test/framework/SimpleCommandTestImpl.java   |   2 +-
 5 files changed, 165 insertions(+), 287 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/b30489ed/usage/test-framework/src/main/java/org/apache/brooklyn/test/framework/SimpleCommand.java
----------------------------------------------------------------------
diff --git a/usage/test-framework/src/main/java/org/apache/brooklyn/test/framework/SimpleCommand.java b/usage/test-framework/src/main/java/org/apache/brooklyn/test/framework/SimpleCommand.java
index 3332a04..40e26a9 100644
--- a/usage/test-framework/src/main/java/org/apache/brooklyn/test/framework/SimpleCommand.java
+++ b/usage/test-framework/src/main/java/org/apache/brooklyn/test/framework/SimpleCommand.java
@@ -38,6 +38,15 @@ import static org.apache.brooklyn.core.config.ConfigKeys.newConfigKey;
 @ImplementedBy(SimpleCommandImpl.class)
 public interface SimpleCommand extends Entity, Startable {
 
+    /**
+     * Result of a command invocation.
+     */
+    interface Result {
+        int getExitCode();
+        String getStdout();
+        String getStderr();
+    }
+
     @SetFromFlag(nullable = false)
     ConfigKey<String> DEFAULT_COMMAND = ConfigKeys.newConfigKey(String.class, "defaultCommand",
             "Command to invoke if no script is provided via a downloadUrl");

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/b30489ed/usage/test-framework/src/main/java/org/apache/brooklyn/test/framework/SimpleCommandImpl.java
----------------------------------------------------------------------
diff --git a/usage/test-framework/src/main/java/org/apache/brooklyn/test/framework/SimpleCommandImpl.java b/usage/test-framework/src/main/java/org/apache/brooklyn/test/framework/SimpleCommandImpl.java
index 8b3d27f..6b5f87c 100644
--- a/usage/test-framework/src/main/java/org/apache/brooklyn/test/framework/SimpleCommandImpl.java
+++ b/usage/test-framework/src/main/java/org/apache/brooklyn/test/framework/SimpleCommandImpl.java
@@ -18,49 +18,69 @@
  */
 package org.apache.brooklyn.test.framework;
 
-import org.apache.brooklyn.api.entity.drivers.DriverDependentEntity;
-import org.apache.brooklyn.api.entity.drivers.EntityDriverManager;
+import com.google.common.base.Joiner;
+import com.google.common.base.Splitter;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
 import org.apache.brooklyn.api.location.Location;
 import org.apache.brooklyn.api.location.MachineLocation;
+import org.apache.brooklyn.api.mgmt.TaskFactory;
 import org.apache.brooklyn.core.annotation.EffectorParam;
+import org.apache.brooklyn.core.effector.ssh.SshEffectorTasks;
 import org.apache.brooklyn.core.entity.AbstractEntity;
 import org.apache.brooklyn.core.entity.lifecycle.Lifecycle;
+import org.apache.brooklyn.core.location.Locations;
+import org.apache.brooklyn.location.ssh.SshMachineLocation;
+import org.apache.brooklyn.util.collections.MutableList;
+import org.apache.brooklyn.util.core.ResourceUtils;
+import org.apache.brooklyn.util.core.task.DynamicTasks;
+import org.apache.brooklyn.util.core.task.ssh.SshPutTaskWrapper;
+import org.apache.brooklyn.util.core.task.ssh.SshTasks;
+import org.apache.brooklyn.util.core.task.system.ProcessTaskWrapper;
 import org.apache.brooklyn.util.exceptions.Exceptions;
+import org.apache.brooklyn.util.guava.Maybe;
 import org.apache.brooklyn.util.text.Strings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.net.MalformedURLException;
+import java.net.URL;
 import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.Random;
 
 import static org.apache.brooklyn.core.entity.lifecycle.Lifecycle.*;
 import static org.apache.brooklyn.core.entity.lifecycle.ServiceStateLogic.setExpectedState;
+import static org.apache.brooklyn.util.text.Strings.isBlank;
+import static org.apache.brooklyn.util.text.Strings.isNonBlank;
 
 /**
  * Implementation for {@link SimpleCommand}.
  */
-public class SimpleCommandImpl extends AbstractEntity
-        implements SimpleCommand, DriverDependentEntity<SimpleCommandDriver> {
+public class SimpleCommandImpl extends AbstractEntity implements SimpleCommand {
 
     private static final Logger LOG = LoggerFactory.getLogger(SimpleCommandImpl.class);
     private static final int A_LINE = 80;
-    private transient SimpleCommandDriver driver;
+    public static final String DEFAULT_NAME = "download.sh";
 
-    private Collection<? extends Location> locations;
+    private ResourceUtils resourceUtils;
 
     @Override
-    public SimpleCommandDriver getDriver() {
-        return driver;
+    public void init() {
+        super.init();
+        resourceUtils = ResourceUtils.create(this);
+        getLifecycleEffectorTasks().attachLifecycleEffectors(this);
     }
 
-    @Override
-    public Class<SimpleCommandDriver> getDriverInterface() {
-        return SimpleCommandDriver.class;
+    protected SimpleCommandLifecycleEffectorTasks getLifecycleEffectorTasks () {
+        return new SimpleCommandLifecycleEffectorTasks();
     }
 
     /**
      * Gives the opportunity to sub-classes to do additional work based on the result of the command.
      */
-    protected void handle(SimpleCommandDriver.Result result) {
+    protected void handle(SimpleCommand.Result result) {
         LOG.debug("Result is {}\nwith output [\n{}\n] and error [\n{}\n]", new Object[] {
                 result.getExitCode(), shorten(result.getStdout()), shorten(result.getStderr())
         });
@@ -79,99 +99,155 @@ public class SimpleCommandImpl extends AbstractEntity
 
 
     @Override
-    public void init() {
-        super.init();
-        getLifecycleEffectorTasks().attachLifecycleEffectors(this);
-    }
-
-
-    protected void initDriver(MachineLocation machine) {
-        LOG.debug("Initializing simple command driver");
-        SimpleCommandDriver newDriver = doInitDriver(machine);
-        if (newDriver == null) {
-            throw new UnsupportedOperationException("cannot start "+this+" on "+machine+": no driver available");
-        }
-        driver = newDriver;
+    public void start(@EffectorParam(name = "locations") Collection<? extends Location> locations) {
+        addLocations(locations);
+        setExpectedState(this, STARTING);
     }
 
-    protected SimpleCommandDriver doInitDriver(MachineLocation machine) {
-        if (driver!=null) {
-            if (machine.equals(driver.getLocation())) {
-                return driver; //just reuse
-            } else {
-                LOG.warn("driver/location change is untested for {} at {}; changing driver and continuing", this, machine);
-                return newDriver(machine);
-            }
-        } else {
-            return newDriver(machine);
-        }
+    @Override
+    public void stop() {
+        LOG.debug("Stopping simple command");
+        setUpAndRunState(false, STOPPED);
     }
 
-    protected SimpleCommandDriver newDriver(MachineLocation machine) {
-        LOG.debug("Creating new simple command driver for {} from management context", machine);
-        EntityDriverManager entityDriverManager = getManagementContext().getEntityDriverManager();
-        return entityDriverManager.build(this, machine);
+    @Override
+    public void restart() {
+        LOG.debug("Restarting simple command");
+        setUpAndRunState(true, RUNNING);
     }
 
-    @Override
-    public void start(@EffectorParam(name = "locations") Collection<? extends Location> locations) {
-        this.locations = locations;
-        startOnLocations();
+    private void setUpAndRunState(boolean up, Lifecycle status) {
+        sensors().set(SERVICE_UP, up);
+        setExpectedState(this, status);
     }
 
-    protected void startOnLocations() {
-        setExpectedState(this, STARTING);
-        int size = locations.size();
-        LOG.debug("Starting simple command at {} locations{}", size,
-                size > 0 ? " beginning " + locations.iterator().next() : "");
+    public void execute(MachineLocation machineLocation) {
         try {
-            execute(locations);
+            executeCommand(machineLocation);
             setUpAndRunState(true, RUNNING);
-
-        } catch (final Exception e) {
+        } catch (Exception e) {
             setUpAndRunState(false, ON_FIRE);
             throw Exceptions.propagate(e);
         }
     }
 
-    private void execute(Collection<? extends Location> locations) {
-        SimpleCommandDriver.Result result = null;
+    private void executeCommand(MachineLocation machineLocation) {
+
+        SimpleCommand.Result result = null;
         String downloadUrl = getConfig(DOWNLOAD_URL);
+        String command = getConfig(DEFAULT_COMMAND);
+
+        String downloadName = DOWNLOAD_URL.getName();
+        String commandName = DEFAULT_COMMAND.getName();
+
+        if (isNonBlank(downloadUrl) && isNonBlank(command)) {
+            throw illegal("Cannot specify both", downloadName, "and", commandName);
+        }
+
+        if (isBlank(downloadUrl) && isBlank(commandName)) {
+            throw illegal("No", downloadName, "and no", commandName, "provided");
+        }
+
         if (Strings.isNonBlank(downloadUrl)) {
             String scriptDir = getConfig(SCRIPT_DIR);
-            result = getDriver().executeDownloadedScript(locations, downloadUrl, scriptDir);
-
-        } else {
-            String command = getConfig(DEFAULT_COMMAND);
-            if (Strings.isBlank(command)) {
-                throw new IllegalArgumentException("No default command and no downloadUrl provided");
-            }
+            String destPath = calculateDestPath(downloadUrl, scriptDir);
+            result = executeDownloadedScript(machineLocation, downloadUrl, destPath);
+        }
 
-            result = getDriver().execute(locations, command);
+        if (Strings.isNonBlank(command)) {
+            result = executeShellCommand(machineLocation, command);
         }
+
         handle(result);
     }
 
+    private IllegalArgumentException illegal(String ...messages) {
+        return new IllegalArgumentException(Joiner.on(' ').join(this.toString() + ":", messages));
+    }
 
-    @Override
-    public void stop() {
-        LOG.debug("Stopping simple command");
-        setUpAndRunState(false, STOPPED);
+    private SimpleCommand.Result executeDownloadedScript(MachineLocation machineLocation, String downloadUrl, String destPath) {
+
+        SshMachineLocation machine = getSshMachine(ImmutableList.<Location>of(machineLocation));
+
+        TaskFactory<?> install = SshTasks.installFromUrl(ImmutableMap.<String, Object>of(), machine, downloadUrl, destPath);
+        DynamicTasks.queue(install);
+        DynamicTasks.waitForLast();
+
+        machine.execCommands("make the script executable", ImmutableList.<String>of("chmod u+x " + destPath));
+
+        return executeShellCommand(machineLocation, destPath);
     }
 
-    @Override
-    public void restart() {
-        LOG.debug("Restarting simple command");
-        setUpAndRunState(true, RUNNING);
+
+    private SimpleCommand.Result executeShellCommand(MachineLocation machineLocation, String command) {
+
+        SshMachineLocation machine = getSshMachine(ImmutableList.of(machineLocation));
+        SshEffectorTasks.SshEffectorTaskFactory<Integer> etf = SshEffectorTasks.ssh(machine, command);
+
+        LOG.debug("Creating task to execute '{}' on location {}", command, machine);
+        ProcessTaskWrapper<Integer> job = DynamicTasks.queue(etf);
+        DynamicTasks.waitForLast();
+        return buildResult(job);
     }
 
-    private void setUpAndRunState(boolean up, Lifecycle status) {
-        sensors().set(SERVICE_UP, up);
-        setExpectedState(this, status);
+
+    private <T> SimpleCommand.Result buildResult(final ProcessTaskWrapper<Integer> job) {
+        return new SimpleCommand.Result() {
+
+            @Override
+            public int getExitCode() {
+                return job.get();
+            }
+
+            @Override
+            public String getStdout() {
+                return job.getStdout().trim();
+            }
+
+            @Override
+            public String getStderr() {
+                return job.getStderr().trim();
+            }
+        };
     }
 
-    protected SimpleCommandLifecycleEffectorTasks getLifecycleEffectorTasks () {
-        return new SimpleCommandLifecycleEffectorTasks();
+    private SshMachineLocation getSshMachine(Collection<? extends Location> hostLocations) {
+        Maybe<SshMachineLocation> host = Locations.findUniqueSshMachineLocation(hostLocations);
+        if (host.isAbsent()) {
+            throw new IllegalArgumentException("No SSH machine found to run command");
+        }
+        return host.get();
+    }
+
+    private String calculateDestPath(String url, String directory) {
+        try {
+            URL asUrl = new URL(url);
+            Iterable<String> path = Splitter.on("/").split(asUrl.getPath());
+            String scriptName = getLastPartOfPath(path, DEFAULT_NAME);
+            return Joiner.on("/").join(directory, "test-" + randomDir(), scriptName);
+        } catch (MalformedURLException e) {
+            throw illegal("Malformed URL:", url);
+        }
+    }
+
+    private String randomDir() {
+        return Integer.valueOf(new Random(System.currentTimeMillis()).nextInt(100000)).toString();
+    }
+
+    private static String getLastPartOfPath(Iterable<String> path, String defaultName) {
+        MutableList<String> parts = MutableList.copyOf(path);
+        Collections.reverse(parts);
+        Iterator<String> it = parts.iterator();
+        String scriptName = null;
+
+        // strip any trailing "/" parts of URL
+        while (isBlank(scriptName) && it.hasNext()) {
+            scriptName = it.next();
+        }
+        if (isBlank(scriptName)) {
+            scriptName = defaultName;
+        }
+        return scriptName;
     }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/b30489ed/usage/test-framework/src/main/java/org/apache/brooklyn/test/framework/SimpleCommandLifecycleEffectorTasks.java
----------------------------------------------------------------------
diff --git a/usage/test-framework/src/main/java/org/apache/brooklyn/test/framework/SimpleCommandLifecycleEffectorTasks.java b/usage/test-framework/src/main/java/org/apache/brooklyn/test/framework/SimpleCommandLifecycleEffectorTasks.java
index d044212..ae318ed 100644
--- a/usage/test-framework/src/main/java/org/apache/brooklyn/test/framework/SimpleCommandLifecycleEffectorTasks.java
+++ b/usage/test-framework/src/main/java/org/apache/brooklyn/test/framework/SimpleCommandLifecycleEffectorTasks.java
@@ -32,38 +32,23 @@ import java.util.Collection;
 public class SimpleCommandLifecycleEffectorTasks extends MachineLifecycleEffectorTasks {
 
     private static final Logger LOG = LoggerFactory.getLogger(SimpleCommandLifecycleEffectorTasks.class);
-    private MachineLocation location;
 
     protected Location getLocation(@Nullable Collection<? extends Location> locations) {
         return super.getLocation(entity().filterLocations(locations));
     }
 
-    @Override
-    protected void preStartCustom(MachineLocation machine) {
-        location = machine;
-        super.preStartCustom(location);
-        LOG.debug("Performing lifecycle preStartCustom on simple command");
-        entity().initDriver(location);
-    }
-
-    @Override
-    protected void preRestartCustom() {
-        LOG.debug("Performing lifecycle preStartCustom on simple command");
-        Asserts.notNull(location, "Cannot restart with no location");
-        entity().initDriver(location);
-    }
 
     @Override
     protected String startProcessesAtMachine(Supplier<MachineLocation> machineS) {
         LOG.debug("Performing lifecycle startProcessesAtMachine on simple command");
-        entity().getDriver().start();
-        return "Started with driver " + entity().getDriver();
+        MachineLocation machineLocation = machineS.get();
+        entity().execute(machineLocation);
+        return "Started simple command on " + machineLocation;
     }
 
     @Override
     protected String stopProcessesAtMachine() {
-        LOG.debug("Performing lifecycle stopProcessesAtMachine on simple command");
-        entity().getDriver().stop();
+        LOG.debug("No action needed on simple command stopped");
         return "Stopped";
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/b30489ed/usage/test-framework/src/main/java/org/apache/brooklyn/test/framework/SimpleCommandSshDriver.java
----------------------------------------------------------------------
diff --git a/usage/test-framework/src/main/java/org/apache/brooklyn/test/framework/SimpleCommandSshDriver.java b/usage/test-framework/src/main/java/org/apache/brooklyn/test/framework/SimpleCommandSshDriver.java
deleted file mode 100644
index f386b1e..0000000
--- a/usage/test-framework/src/main/java/org/apache/brooklyn/test/framework/SimpleCommandSshDriver.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.brooklyn.test.framework;
-
-import com.google.common.base.Joiner;
-import com.google.common.base.Splitter;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import org.apache.brooklyn.api.entity.EntityLocal;
-import org.apache.brooklyn.api.location.Location;
-import org.apache.brooklyn.api.mgmt.TaskAdaptable;
-import org.apache.brooklyn.api.mgmt.TaskFactory;
-import org.apache.brooklyn.core.location.Locations;
-import org.apache.brooklyn.location.ssh.SshMachineLocation;
-import org.apache.brooklyn.util.collections.MutableList;
-import org.apache.brooklyn.util.core.ResourceUtils;
-import org.apache.brooklyn.util.core.task.DynamicTasks;
-import org.apache.brooklyn.util.core.task.ssh.SshTasks;
-import org.apache.brooklyn.util.core.task.system.ProcessTaskFactory;
-import org.apache.brooklyn.util.core.task.system.ProcessTaskWrapper;
-import org.apache.brooklyn.util.exceptions.Exceptions;
-import org.apache.brooklyn.util.exceptions.FatalRuntimeException;
-import org.apache.brooklyn.util.guava.Maybe;
-import org.apache.brooklyn.util.text.Strings;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.Random;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.apache.brooklyn.util.text.Strings.isBlank;
-
-/**
- * Driver for {@link SimpleCommand}.
- */
-public class SimpleCommandSshDriver implements SimpleCommandDriver {
-
-    private static final Logger LOG = LoggerFactory.getLogger(SimpleCommandSshDriver.class);
-    public static final String DEFAULT_NAME = "download.sh";
-
-    protected final EntityLocal entity;
-    protected final ResourceUtils resource;
-    protected final Location location;
-
-    public SimpleCommandSshDriver(EntityLocal entity, SshMachineLocation location) {
-        LOG.debug("Constructing SSH driver for simple command for {} at {}", entity, location);
-        this.entity = checkNotNull(entity, "entity");
-        this.location = checkNotNull(location, "location");
-        this.resource = ResourceUtils.create(entity);
-    }
-
-    @Override
-    public EntityLocal getEntity() {
-        return entity;
-    }
-
-    @Override
-    public void start() {
-        LOG.debug("Performing start in SSH driver for simple command");
-        invoke();
-    }
-
-    private void invoke() {
-        SimpleCommand simpleCommand = (SimpleCommand) getEntity();
-        simpleCommand.start(ImmutableList.of(location));
-    }
-
-    @Override
-    public void restart() {
-        LOG.debug("Performing restart in SSH driver for simple command");
-        invoke();
-    }
-
-    @Override
-    public void stop() {
-        LOG.debug("Performing stop in SSH driver for simple command");
-    }
-
-    @Override
-    public Result execute(Collection<? extends Location> hostLocations, String command) {
-
-        SshMachineLocation machine = getSshMachine(hostLocations);
-        ProcessTaskFactory<Integer> taskFactory = SshTasks.newSshExecTaskFactory(machine, command);
-
-        LOG.debug("Creating task to execute '{}' on location {}", command, machine);
-        final ProcessTaskWrapper<Integer> job = DynamicTasks.queue(taskFactory);
-        DynamicTasks.waitForLast();
-        return buildResult(job);
-    }
-
-    private <T> Result buildResult(final ProcessTaskWrapper<Integer> job) {
-        return new Result() {
-
-            @Override
-            public int getExitCode() {
-                return job.get();
-            }
-
-            @Override
-            public String getStdout() {
-                return job.getStdout().trim();
-            }
-
-            @Override
-            public String getStderr() {
-                return job.getStderr().trim();
-            }
-        };
-    }
-
-    @Override
-    public Result executeDownloadedScript(Collection<? extends Location> hostLocations,
-                                          String url, String directory) {
-
-        SshMachineLocation machine = getSshMachine(hostLocations);
-        String destPath = calculateDestPath(url, directory);
-
-        TaskFactory<?> install = SshTasks.installFromUrl(ImmutableMap.<String, Object>of(), machine, url, destPath);
-        DynamicTasks.queue(install);
-        DynamicTasks.waitForLast();
-
-        machine.execCommands("make the script executable", ImmutableList.<String>of("chmod u+x " + destPath));
-
-        return execute(hostLocations, destPath);
-    }
-
-    private String calculateDestPath(String url, String directory) {
-        try {
-            URL asUrl = new URL(url);
-            Iterable<String> path = Splitter.on("/").split(asUrl.getPath());
-            String scriptName = getLastPartOfPath(path, DEFAULT_NAME);
-            return Joiner.on("/").join(directory, "test-" + randomDir(), scriptName);
-        } catch (MalformedURLException e) {
-            throw Exceptions.propagate(new FatalRuntimeException("Malformed URL: " + url));
-        }
-    }
-
-    private String randomDir() {
-        return Integer.valueOf(new Random(System.currentTimeMillis()).nextInt(100000)).toString();
-    }
-
-    private static String getLastPartOfPath(Iterable<String> path, String defaultName) {
-        MutableList<String> parts = MutableList.copyOf(path);
-        Collections.reverse(parts);
-        Iterator<String> it = parts.iterator();
-        String scriptName = null;
-
-        // strip any trailing "/" parts of URL
-        while (isBlank(scriptName) && it.hasNext()) {
-            scriptName = it.next();
-        }
-        if (isBlank(scriptName)) {
-            scriptName = defaultName;
-        }
-        return scriptName;
-    }
-
-    private SshMachineLocation getSshMachine(Collection<? extends Location> hostLocations) {
-        Maybe<SshMachineLocation> host = Locations.findUniqueSshMachineLocation(hostLocations);
-        if (host.isAbsent()) {
-            throw new IllegalArgumentException("No SSH machine found to run command");
-        }
-        return host.get();
-    }
-
-    @Override
-    public Location getLocation() {
-        return location;
-    }
-
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/b30489ed/usage/test-framework/src/main/java/org/apache/brooklyn/test/framework/SimpleCommandTestImpl.java
----------------------------------------------------------------------
diff --git a/usage/test-framework/src/main/java/org/apache/brooklyn/test/framework/SimpleCommandTestImpl.java b/usage/test-framework/src/main/java/org/apache/brooklyn/test/framework/SimpleCommandTestImpl.java
index 261afe7..cf85b37 100644
--- a/usage/test-framework/src/main/java/org/apache/brooklyn/test/framework/SimpleCommandTestImpl.java
+++ b/usage/test-framework/src/main/java/org/apache/brooklyn/test/framework/SimpleCommandTestImpl.java
@@ -53,7 +53,7 @@ public class SimpleCommandTestImpl extends SimpleCommandImpl implements SimpleCo
     }
 
     @Override
-    protected void handle(SimpleCommandDriver.Result result) {
+    protected void handle(SimpleCommand.Result result) {
         AssertionSupport support = new AssertionSupport();
         checkAssertions(support, exitCodeAssertions(), "exit code", result.getExitCode());
         checkAssertions(support, getConfig(ASSERT_OUT), "stdout", result.getStdout());