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:43 UTC

[14/20] incubator-brooklyn git commit: Additional tests and improvements.

Additional tests and improvements.


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

Branch: refs/heads/master
Commit: 60178809b3c51a429e6871bb68404245baa86269
Parents: 89d6926
Author: Geoff Macartney <ge...@cloudsoftcorp.com>
Authored: Tue Nov 17 16:23:23 2015 +0000
Committer: Geoff Macartney <ge...@cloudsoftcorp.com>
Committed: Wed Nov 18 01:12:24 2015 +0000

----------------------------------------------------------------------
 .../test/framework/SimpleShellCommand.java      |   2 +-
 .../test/framework/SimpleShellCommandImpl.java  | 106 ++++++++-------
 .../framework/SimpleShellCommandTestImpl.java   |   3 +-
 .../SimpleShellCommandIntegrationTest.java      | 133 +++++++++++++------
 4 files changed, 152 insertions(+), 92 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/60178809/usage/test-framework/src/main/java/org/apache/brooklyn/test/framework/SimpleShellCommand.java
----------------------------------------------------------------------
diff --git a/usage/test-framework/src/main/java/org/apache/brooklyn/test/framework/SimpleShellCommand.java b/usage/test-framework/src/main/java/org/apache/brooklyn/test/framework/SimpleShellCommand.java
index 1f430a7..fc182ef 100644
--- a/usage/test-framework/src/main/java/org/apache/brooklyn/test/framework/SimpleShellCommand.java
+++ b/usage/test-framework/src/main/java/org/apache/brooklyn/test/framework/SimpleShellCommand.java
@@ -71,5 +71,5 @@ public interface SimpleShellCommand extends Entity, Startable {
      * The working directory that the script will be run from on the target machine.
      */
     @SetFromFlag("runDir")
-    ConfigKey<String> RUN_DIR = newConfigKey("run.dir", "directory where downloaded scripts should be put", TMP_DEFAULT);
+    ConfigKey<String> RUN_DIR = newConfigKey(String.class, "run.dir", "directory where downloaded scripts should be run from");
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/60178809/usage/test-framework/src/main/java/org/apache/brooklyn/test/framework/SimpleShellCommandImpl.java
----------------------------------------------------------------------
diff --git a/usage/test-framework/src/main/java/org/apache/brooklyn/test/framework/SimpleShellCommandImpl.java b/usage/test-framework/src/main/java/org/apache/brooklyn/test/framework/SimpleShellCommandImpl.java
index 1ccce5e..c63e1fc 100644
--- a/usage/test-framework/src/main/java/org/apache/brooklyn/test/framework/SimpleShellCommandImpl.java
+++ b/usage/test-framework/src/main/java/org/apache/brooklyn/test/framework/SimpleShellCommandImpl.java
@@ -42,10 +42,7 @@ 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 java.util.*;
 
 import static org.apache.brooklyn.core.entity.lifecycle.Lifecycle.*;
 import static org.apache.brooklyn.core.entity.lifecycle.ServiceStateLogic.setExpectedState;
@@ -61,7 +58,6 @@ public class SimpleShellCommandImpl extends AbstractEntity implements SimpleShel
     private static final int A_LINE = 80;
     public static final String DEFAULT_NAME = "download.sh";
     private static final String CD = "cd";
-    private static final String SHELL_AND = "&&";
 
     @Override
     public void init() {
@@ -69,6 +65,25 @@ public class SimpleShellCommandImpl extends AbstractEntity implements SimpleShel
         getLifecycleEffectorTasks().attachLifecycleEffectors(this);
     }
 
+    @Override
+    public void start(Collection<? extends Location> locations) {
+        addLocations(filterLocations(locations));
+        setExpectedState(this, STARTING);
+    }
+
+
+    @Override
+    public void stop() {
+        LOG.debug("{} Stopping simple command", this);
+        setUpAndRunState(false, STOPPED);
+    }
+
+    @Override
+    public void restart() {
+        LOG.debug("{} Restarting simple command", this);
+        setUpAndRunState(true, RUNNING);
+    }
+
     protected SimpleShellCommandLifecycleEffectorTasks getLifecycleEffectorTasks() {
         return new SimpleShellCommandLifecycleEffectorTasks();
     }
@@ -78,7 +93,7 @@ public class SimpleShellCommandImpl extends AbstractEntity implements SimpleShel
      */
     protected void handle(SimpleShellCommand.Result result) {
         LOG.debug("{}, Result is {}\nwith output [\n{}\n] and error [\n{}\n]", new Object[] {
-                this, result.getExitCode(), shorten(result.getStdout()), shorten(result.getStderr())
+            this, result.getExitCode(), shorten(result.getStdout()), shorten(result.getStderr())
         });
     }
 
@@ -93,25 +108,6 @@ public class SimpleShellCommandImpl extends AbstractEntity implements SimpleShel
         return locations;
     }
 
-
-    @Override
-    public void start(Collection<? extends Location> locations) {
-        addLocations(locations);
-        setExpectedState(this, STARTING);
-    }
-
-    @Override
-    public void stop() {
-        LOG.debug("{} Stopping simple command", this);
-        setUpAndRunState(false, STOPPED);
-    }
-
-    @Override
-    public void restart() {
-        LOG.debug("{} Restarting simple command", this);
-        setUpAndRunState(true, RUNNING);
-    }
-
     private void setUpAndRunState(boolean up, Lifecycle status) {
         sensors().set(SERVICE_UP, up);
         setExpectedState(this, status);
@@ -136,31 +132,23 @@ public class SimpleShellCommandImpl extends AbstractEntity implements SimpleShel
         String downloadName = DOWNLOAD_URL.getName();
         String commandName = 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 (!(isNonBlank(downloadUrl) ^ isNonBlank(command))) {
+            throw illegal("Must specify exactly one of", downloadName, "and", commandName);
         }
 
-        if (Strings.isNonBlank(downloadUrl)) {
+        if (isNonBlank(downloadUrl)) {
             String scriptDir = getConfig(SCRIPT_DIR);
             String scriptPath = calculateDestPath(downloadUrl, scriptDir);
             result = executeDownloadedScript(machineLocation, downloadUrl, scriptPath);
         }
 
-        if (Strings.isNonBlank(command)) {
+        if (isNonBlank(command)) {
             result = executeShellCommand(machineLocation, command);
         }
 
         handle(result);
     }
 
-    private IllegalArgumentException illegal(String ...messages) {
-        return new IllegalArgumentException(Joiner.on(' ').join(this.toString() + ":", messages));
-    }
-
     private SimpleShellCommand.Result executeDownloadedScript(MachineLocation machineLocation, String url, String scriptPath) {
 
         SshMachineLocation machine = getSshMachine(ImmutableList.<Location>of(machineLocation));
@@ -169,47 +157,67 @@ public class SimpleShellCommandImpl extends AbstractEntity implements SimpleShel
         DynamicTasks.queue(install);
         DynamicTasks.waitForLast();
 
-        machine.execCommands("make the script executable", ImmutableList.<String>of("chmod u+x " + scriptPath));
+        List<String> commands = new ArrayList<>();
+        commands.add("chmod u+x " + scriptPath);
+        maybeCdToRunDir(commands);
+        commands.add(scriptPath);
 
-        String runDir = getConfig(RUN_DIR);
-        String cdAndRun = Joiner.on(' ').join(CD, runDir, SHELL_AND, scriptPath);
-
-        return executeShellCommand(machineLocation, cdAndRun);
+        return runCommands(machine, commands);
     }
 
-
     private SimpleShellCommand.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 {}", new Object[] {this, command, machine});
+        List<String> commands = new ArrayList<>();
+        maybeCdToRunDir(commands);
+        commands.add(command);
+
+        return runCommands(machine, commands);
+    }
+
+    private void maybeCdToRunDir(List<String> commands) {
+        String runDir = getConfig(RUN_DIR);
+        if (!isBlank(runDir)) {
+            commands.add(CD + " " + runDir);
+        }
+    }
+
+    private Result runCommands(SshMachineLocation machine, List<String> commands) {
+        SshEffectorTasks.SshEffectorTaskFactory<Integer> etf = SshEffectorTasks.ssh(machine, commands.toArray(new String[]{}));
+
         ProcessTaskWrapper<Integer> job = DynamicTasks.queue(etf);
         DynamicTasks.waitForLast();
         return buildResult(job);
     }
 
-
     private <T> SimpleShellCommand.Result buildResult(final ProcessTaskWrapper<Integer> job) {
+        final int exitCode = job.get();
+        final String stdout = job.getStdout().trim();
+        final String stderr = job.getStderr().trim();
         return new SimpleShellCommand.Result() {
 
             @Override
             public int getExitCode() {
-                return job.get();
+                return exitCode;
             }
 
             @Override
             public String getStdout() {
-                return job.getStdout().trim();
+                return stdout;
             }
 
             @Override
             public String getStderr() {
-                return job.getStderr().trim();
+                return stderr;
             }
         };
     }
 
+    private IllegalArgumentException illegal(String message, String ...messages) {
+        return new IllegalArgumentException(Joiner.on(' ').join(this.toString() + ":", message, messages));
+    }
+
     private SshMachineLocation getSshMachine(Collection<? extends Location> hostLocations) {
         Maybe<SshMachineLocation> host = Locations.findUniqueSshMachineLocation(hostLocations);
         if (host.isAbsent()) {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/60178809/usage/test-framework/src/main/java/org/apache/brooklyn/test/framework/SimpleShellCommandTestImpl.java
----------------------------------------------------------------------
diff --git a/usage/test-framework/src/main/java/org/apache/brooklyn/test/framework/SimpleShellCommandTestImpl.java b/usage/test-framework/src/main/java/org/apache/brooklyn/test/framework/SimpleShellCommandTestImpl.java
index 9c9a15a..6a35e73 100644
--- a/usage/test-framework/src/main/java/org/apache/brooklyn/test/framework/SimpleShellCommandTestImpl.java
+++ b/usage/test-framework/src/main/java/org/apache/brooklyn/test/framework/SimpleShellCommandTestImpl.java
@@ -47,7 +47,8 @@ public class SimpleShellCommandTestImpl extends SimpleShellCommandImpl implement
      */
     public Collection<? extends Location> filterLocations(Collection<? extends Location> locations) {
         Entity target = resolveTarget();
-        return target.getLocations();
+        Collection<Location> targetLocations = target.getLocations();
+        return targetLocations;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/60178809/usage/test-framework/src/test/java/org/apache/brooklyn/test/framework/SimpleShellCommandIntegrationTest.java
----------------------------------------------------------------------
diff --git a/usage/test-framework/src/test/java/org/apache/brooklyn/test/framework/SimpleShellCommandIntegrationTest.java b/usage/test-framework/src/test/java/org/apache/brooklyn/test/framework/SimpleShellCommandIntegrationTest.java
index 7b6c732..7f8f078 100644
--- a/usage/test-framework/src/test/java/org/apache/brooklyn/test/framework/SimpleShellCommandIntegrationTest.java
+++ b/usage/test-framework/src/test/java/org/apache/brooklyn/test/framework/SimpleShellCommandIntegrationTest.java
@@ -27,16 +27,17 @@ import org.apache.brooklyn.core.entity.lifecycle.ServiceStateLogic;
 import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport;
 import org.apache.brooklyn.core.test.entity.TestEntity;
 import org.apache.brooklyn.location.localhost.LocalhostMachineProvisioningLocation;
+import org.apache.brooklyn.test.Asserts;
 import org.apache.brooklyn.util.exceptions.Exceptions;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
 
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.Random;
-import java.util.UUID;
 
 import static org.apache.brooklyn.test.framework.BaseTest.TARGET_ENTITY;
 import static org.apache.brooklyn.test.framework.SimpleShellCommand.COMMAND;
@@ -44,7 +45,6 @@ import static org.apache.brooklyn.test.framework.SimpleShellCommandTest.*;
 import static org.assertj.core.api.Assertions.assertThat;
 
 public class SimpleShellCommandIntegrationTest extends BrooklynAppUnitTestSupport {
-    private static final Logger LOG = LoggerFactory.getLogger(SimpleShellCommandIntegrationTest.class);
 
     private static final String UP = "up";
     private LocalhostMachineProvisioningLocation localhost;
@@ -55,6 +55,48 @@ public class SimpleShellCommandIntegrationTest extends BrooklynAppUnitTestSuppor
             .createLocation(LocationSpec.create(LocalhostMachineProvisioningLocation.class));
     }
 
+    @DataProvider(name = "shouldInsistOnJustOneOfCommandAndScript")
+    public Object[][] createData1() {
+
+        return new Object[][] {
+            { "pwd", "pwd.sh", Boolean.FALSE },
+            { null, null, Boolean.FALSE },
+            { "pwd", null, Boolean.TRUE },
+            { null, "pwd.sh", Boolean.TRUE }
+        };
+    }
+
+    @Test(dataProvider = "shouldInsistOnJustOneOfCommandAndScript")
+    public void shouldInsistOnJustOneOfCommandAndScript(String command, String script, boolean valid) throws  Exception{
+        Path scriptPath = null;
+        String scriptUrl = null;
+        if (null != script) {
+            scriptPath = createTempScript("pwd", "pwd");
+            scriptUrl = "file:" + scriptPath;
+        }
+        TestEntity testEntity = app.createAndManageChild(EntitySpec.create(TestEntity.class));
+
+        app.createAndManageChild(EntitySpec.create(SimpleShellCommandTest.class)
+            .configure(TARGET_ENTITY, testEntity)
+            .configure(COMMAND, command)
+            .configure(DOWNLOAD_URL, scriptUrl));
+
+        try {
+            app.start(ImmutableList.of(localhost));
+            if (!valid) {
+                Asserts.shouldHaveFailedPreviously();
+            }
+
+        } catch (Exception e) {
+            Asserts.expectedFailureContains(e, "Must specify exactly one of download.url and command");
+
+        } finally {
+            if (null != scriptPath) {
+                Files.delete(scriptPath);
+            }
+        }
+    }
+
     @Test(groups = "Integration")
     public void shouldInvokeCommand() {
         TestEntity testEntity = app.createAndManageChild(EntitySpec.create(TestEntity.class));
@@ -95,67 +137,76 @@ public class SimpleShellCommandIntegrationTest extends BrooklynAppUnitTestSuppor
     }
 
     @Test(groups = "Integration")
-    public void shouldInvokeScript() {
+    public void shouldInvokeScript() throws Exception {
         TestEntity testEntity = app.createAndManageChild(EntitySpec.create(TestEntity.class));
 
         String text = "hello world";
-        String testUrl = createTempScript("script.sh", "echo " + text);
+        Path testScript = createTempScript("script", "echo " + text);
 
-        SimpleShellCommandTest uptime = app.createAndManageChild(EntitySpec.create(SimpleShellCommandTest.class)
-            .configure(TARGET_ENTITY, testEntity)
-            .configure(DOWNLOAD_URL, testUrl)
-            .configure(ASSERT_STATUS, ImmutableMap.of(EQUALS, 0))
-            .configure(ASSERT_OUT, ImmutableMap.of(CONTAINS, text)));
+        try {
+            SimpleShellCommandTest uptime = app.createAndManageChild(EntitySpec.create(SimpleShellCommandTest.class)
+                .configure(TARGET_ENTITY, testEntity)
+                .configure(DOWNLOAD_URL, "file:" + testScript)
+                .configure(ASSERT_STATUS, ImmutableMap.of(EQUALS, 0))
+                .configure(ASSERT_OUT, ImmutableMap.of(CONTAINS, text)));
 
-        app.start(ImmutableList.of(localhost));
+            app.start(ImmutableList.of(localhost));
 
-        assertThat(uptime.sensors().get(SERVICE_UP)).isTrue()
-            .withFailMessage("Service should be up");
-        assertThat(ServiceStateLogic.getExpectedState(uptime)).isEqualTo(Lifecycle.RUNNING)
-            .withFailMessage("Service should be marked running");
+            assertThat(uptime.sensors().get(SERVICE_UP)).isTrue()
+                .withFailMessage("Service should be up");
+            assertThat(ServiceStateLogic.getExpectedState(uptime)).isEqualTo(Lifecycle.RUNNING)
+                .withFailMessage("Service should be marked running");
+
+        } finally {
+            Files.delete(testScript);
+        }
     }
 
     @Test
-    public void shouldExecuteInTheRightPlace() throws Exception {
+    public void shouldExecuteInTheRunDir() throws Exception {
         TestEntity testEntity = app.createAndManageChild(EntitySpec.create(TestEntity.class));
 
-        String remoteTmp = randomName();
-        SimpleShellCommandTest uptime = app.createAndManageChild(EntitySpec.create(SimpleShellCommandTest.class)
-            .configure(TARGET_ENTITY, testEntity)
-            .configure(COMMAND, "mkdir " + remoteTmp)
-            .configure(ASSERT_STATUS, ImmutableMap.of(EQUALS, 0)));
+        Path pwdPath = createTempScript("pwd", "pwd");
 
-        String pwdUrl = createTempScript("pwd.sh", "pwd");
+        try {
+            SimpleShellCommandTest pwd = app.createAndManageChild(EntitySpec.create(SimpleShellCommandTest.class)
+                .configure(TARGET_ENTITY, testEntity)
+                .configure(DOWNLOAD_URL, "file:" + pwdPath)
+                .configure(RUN_DIR, "/tmp")
+                .configure(ASSERT_STATUS, ImmutableMap.of(EQUALS, 0))
+                .configure(ASSERT_OUT, ImmutableMap.of(CONTAINS, "/tmp")));
 
-        SimpleShellCommandTest pwd = app.createAndManageChild(EntitySpec.create(SimpleShellCommandTest.class)
-            .configure(TARGET_ENTITY, testEntity)
-            .configure(DOWNLOAD_URL, pwdUrl)
-            .configure(RUN_DIR, remoteTmp)
-            .configure(ASSERT_STATUS, ImmutableMap.of(EQUALS, 0))
-            .configure(ASSERT_OUT, ImmutableMap.of(CONTAINS, remoteTmp)));
 
-        app.start(ImmutableList.of(localhost));
+            SimpleShellCommandTest alsoPwd = app.createAndManageChild(EntitySpec.create(SimpleShellCommandTest.class)
+                .configure(TARGET_ENTITY, testEntity)
+                .configure(COMMAND, "pwd")
+                .configure(RUN_DIR, "/tmp")
+                .configure(ASSERT_STATUS, ImmutableMap.of(EQUALS, 0))
+                .configure(ASSERT_OUT, ImmutableMap.of(CONTAINS, "/tmp")));
 
-        assertThat(uptime.sensors().get(SERVICE_UP)).isTrue()
-            .withFailMessage("Service should be up");
-        assertThat(ServiceStateLogic.getExpectedState(uptime)).isEqualTo(Lifecycle.RUNNING)
-            .withFailMessage("Service should be marked running");
+            app.start(ImmutableList.of(localhost));
+
+            assertThat(pwd.sensors().get(SERVICE_UP)).isTrue().withFailMessage("Service should be up");
+            assertThat(ServiceStateLogic.getExpectedState(pwd)).isEqualTo(Lifecycle.RUNNING)
+                .withFailMessage("Service should be marked running");
+
+            assertThat(alsoPwd.sensors().get(SERVICE_UP)).isTrue().withFailMessage("Service should be up");
+            assertThat(ServiceStateLogic.getExpectedState(alsoPwd)).isEqualTo(Lifecycle.RUNNING)
+                .withFailMessage("Service should be marked running");
+
+        } finally {
+            Files.delete(pwdPath);
+        }
     }
 
-    private String createTempScript(String filename, String contents) {
+    private Path createTempScript(String filename, String contents) {
         try {
-            Path tempDirectory = Files.createTempDirectory(randomName());
-            tempDirectory.toFile().deleteOnExit();
-            Path tempFile = Files.createFile(tempDirectory.resolve(filename));
+            Path tempFile = Files.createTempFile("SimpleShellCommandIntegrationTest-" + filename, ".sh");
             Files.write(tempFile, contents.getBytes());
-            return "file:" + tempFile.toString();
+            return tempFile;
         } catch (IOException e) {
             throw Exceptions.propagate(e);
         }
     }
 
-    private String randomName() {
-        return Integer.valueOf(new Random(System.currentTimeMillis()).nextInt(100000)).toString();
-    }
-
 }