You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by dr...@apache.org on 2017/04/10 11:43:51 UTC
[3/4] brooklyn-server git commit: Adds TestSshCommand.maxAttempts
Adds TestSshCommand.maxAttempts
Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/2c1547ce
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/2c1547ce
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/2c1547ce
Branch: refs/heads/master
Commit: 2c1547ce3e3e0689d95f3f84558b13897fc186d8
Parents: 2b3c241
Author: Aled Sage <al...@gmail.com>
Authored: Wed Apr 5 21:24:44 2017 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Wed Apr 5 21:24:44 2017 +0100
----------------------------------------------------------------------
.../brooklyn/test/framework/TestSshCommand.java | 4 +
.../test/framework/TestSshCommandImpl.java | 2 +
.../test/framework/TestSshCommandTest.java | 78 +++++++++++++++++++-
3 files changed, 81 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/2c1547ce/test-framework/src/main/java/org/apache/brooklyn/test/framework/TestSshCommand.java
----------------------------------------------------------------------
diff --git a/test-framework/src/main/java/org/apache/brooklyn/test/framework/TestSshCommand.java b/test-framework/src/main/java/org/apache/brooklyn/test/framework/TestSshCommand.java
index 85d402c..df6df72 100644
--- a/test-framework/src/main/java/org/apache/brooklyn/test/framework/TestSshCommand.java
+++ b/test-framework/src/main/java/org/apache/brooklyn/test/framework/TestSshCommand.java
@@ -106,4 +106,8 @@ public interface TestSshCommand extends BaseTest {
ConfigKey<Object> ASSERT_ERR = ConfigKeys.newConfigKey(Object.class, "assert.err", "Assertions on command standard error",
ImmutableList.<Map<String, Object>>of());
+ /**
+ * The maximum number of times to execute the ssh command, before throwing an exception.
+ */
+ ConfigKey<Integer> MAX_ATTEMPTS = ConfigKeys.newIntegerConfigKey("maxAttempts", "Maximum number of attempts");
}
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/2c1547ce/test-framework/src/main/java/org/apache/brooklyn/test/framework/TestSshCommandImpl.java
----------------------------------------------------------------------
diff --git a/test-framework/src/main/java/org/apache/brooklyn/test/framework/TestSshCommandImpl.java b/test-framework/src/main/java/org/apache/brooklyn/test/framework/TestSshCommandImpl.java
index 3f0f116..b8b0e1d 100644
--- a/test-framework/src/main/java/org/apache/brooklyn/test/framework/TestSshCommandImpl.java
+++ b/test-framework/src/main/java/org/apache/brooklyn/test/framework/TestSshCommandImpl.java
@@ -125,6 +125,7 @@ public class TestSshCommandImpl extends TargetableTestComponentImpl implements T
final SshMachineLocation machineLocation =
Machines.findUniqueMachineLocation(resolveTarget().getLocations(), SshMachineLocation.class).get();
final Duration timeout = getRequiredConfig(TIMEOUT);
+ final Integer maxAttempts = getConfig(MAX_ATTEMPTS);
final Duration backoffToPeriod = getRequiredConfig(BACKOFF_TO_PERIOD);
// TODO use TestFrameworkAssertions (or use Repeater in the same way as that does)?
@@ -132,6 +133,7 @@ public class TestSshCommandImpl extends TargetableTestComponentImpl implements T
// for limitTimeTo, backoffTo, etc?
ReferenceWithError<Boolean> result = Repeater.create("Running ssh-command tests")
.limitTimeTo(timeout)
+ .limitIterationsTo((maxAttempts != null) ? maxAttempts : Integer.MAX_VALUE)
.backoffTo((backoffToPeriod != null) ? backoffToPeriod : Duration.millis(500))
.until(new Callable<Boolean>() {
@Override
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/2c1547ce/test-framework/src/test/java/org/apache/brooklyn/test/framework/TestSshCommandTest.java
----------------------------------------------------------------------
diff --git a/test-framework/src/test/java/org/apache/brooklyn/test/framework/TestSshCommandTest.java b/test-framework/src/test/java/org/apache/brooklyn/test/framework/TestSshCommandTest.java
index 344c53d..094433f 100644
--- a/test-framework/src/test/java/org/apache/brooklyn/test/framework/TestSshCommandTest.java
+++ b/test-framework/src/test/java/org/apache/brooklyn/test/framework/TestSshCommandTest.java
@@ -18,6 +18,8 @@
*/
package org.apache.brooklyn.test.framework;
+import static org.apache.brooklyn.core.entity.EntityAsserts.assertEntityFailed;
+import static org.apache.brooklyn.core.entity.EntityAsserts.assertEntityHealthy;
import static org.apache.brooklyn.test.framework.BaseTest.TIMEOUT;
import static org.apache.brooklyn.test.framework.TargetableTestComponent.TARGET_ENTITY;
import static org.apache.brooklyn.test.framework.TestFrameworkAssertions.CONTAINS;
@@ -25,18 +27,21 @@ import static org.apache.brooklyn.test.framework.TestFrameworkAssertions.EQUALS;
import static org.apache.brooklyn.test.framework.TestSshCommand.ASSERT_ERR;
import static org.apache.brooklyn.test.framework.TestSshCommand.ASSERT_OUT;
import static org.apache.brooklyn.test.framework.TestSshCommand.ASSERT_STATUS;
+import static org.apache.brooklyn.test.framework.TestSshCommand.BACKOFF_TO_PERIOD;
import static org.apache.brooklyn.test.framework.TestSshCommand.COMMAND;
import static org.apache.brooklyn.test.framework.TestSshCommand.DOWNLOAD_URL;
+import static org.apache.brooklyn.test.framework.TestSshCommand.MAX_ATTEMPTS;
import static org.apache.brooklyn.test.framework.TestSshCommand.SHELL_ENVIRONMENT;
import static org.assertj.core.api.Assertions.assertThat;
-import static org.apache.brooklyn.core.entity.EntityAsserts.assertEntityFailed;
-import static org.apache.brooklyn.core.entity.EntityAsserts.assertEntityHealthy;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertTrue;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
import java.util.Map;
+import java.util.concurrent.atomic.AtomicInteger;
import org.apache.brooklyn.api.entity.EntitySpec;
import org.apache.brooklyn.api.location.Location;
@@ -46,7 +51,10 @@ import org.apache.brooklyn.core.test.entity.TestEntity;
import org.apache.brooklyn.location.ssh.SshMachineLocation;
import org.apache.brooklyn.test.Asserts;
import org.apache.brooklyn.util.core.internal.ssh.RecordingSshTool;
+import org.apache.brooklyn.util.core.internal.ssh.RecordingSshTool.CustomResponse;
import org.apache.brooklyn.util.core.internal.ssh.RecordingSshTool.ExecCmd;
+import org.apache.brooklyn.util.core.internal.ssh.RecordingSshTool.ExecCmdPredicates;
+import org.apache.brooklyn.util.core.internal.ssh.RecordingSshTool.ExecParams;
import org.apache.brooklyn.util.exceptions.Exceptions;
import org.apache.brooklyn.util.text.Identifiers;
import org.apache.brooklyn.util.time.Duration;
@@ -58,6 +66,7 @@ import org.testng.annotations.Test;
import com.google.common.base.Stopwatch;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Iterables;
public class TestSshCommandTest extends BrooklynAppUnitTestSupport {
@@ -140,6 +149,7 @@ public class TestSshCommandTest extends BrooklynAppUnitTestSupport {
RecordingSshTool.setCustomResponse(cmd, new RecordingSshTool.CustomResponse(1, null, null));
TestSshCommand test = app.createAndManageChild(EntitySpec.create(TestSshCommand.class)
+ .configure(MAX_ATTEMPTS, 1)
.configure(TARGET_ENTITY, testEntity)
.configure(COMMAND, cmd));
@@ -176,6 +186,7 @@ public class TestSshCommandTest extends BrooklynAppUnitTestSupport {
RecordingSshTool.setCustomResponse(cmd, new RecordingSshTool.CustomResponse(0, "wrongstdout", null));
TestSshCommand test = app.createAndManageChild(EntitySpec.create(TestSshCommand.class)
+ .configure(MAX_ATTEMPTS, 1)
.configure(TARGET_ENTITY, testEntity)
.configure(COMMAND, cmd)
.configure(ASSERT_OUT, makeAssertions(ImmutableMap.of(CONTAINS, "mystdout"))));
@@ -196,6 +207,7 @@ public class TestSshCommandTest extends BrooklynAppUnitTestSupport {
RecordingSshTool.setCustomResponse(cmd, new RecordingSshTool.CustomResponse(0, null, "wrongstderr"));
TestSshCommand test = app.createAndManageChild(EntitySpec.create(TestSshCommand.class)
+ .configure(MAX_ATTEMPTS, 1)
.configure(TARGET_ENTITY, testEntity)
.configure(COMMAND, cmd)
.configure(ASSERT_ERR, makeAssertions(ImmutableMap.of(CONTAINS, "mystderr"))));
@@ -211,12 +223,13 @@ public class TestSshCommandTest extends BrooklynAppUnitTestSupport {
}
@Test
- public void shouldNotBeUpIfAssertionsFail() {
+ public void shouldFailOnUnmatchedExitCode() {
Map<String, ?> equalsOne = ImmutableMap.of(EQUALS, 1);
Map<String, ?> equals255 = ImmutableMap.of(EQUALS, 255);
TestSshCommand test = app.createAndManageChild(EntitySpec.create(TestSshCommand.class)
+ .configure(MAX_ATTEMPTS, 1)
.configure(TARGET_ENTITY, testEntity)
.configure(COMMAND, "uptime")
.configure(ASSERT_STATUS, makeAssertions(equalsOne, equals255)));
@@ -315,6 +328,65 @@ public class TestSshCommandTest extends BrooklynAppUnitTestSupport {
assertThat(cmdExecuted.env).isEqualTo(env);
}
+ @Test
+ public void testRetries() {
+ String cmd = "commandExpectedToFail-" + Identifiers.randomLong();
+ RecordingSshTool.setCustomResponse(cmd, new RecordingSshTool.CustomResponseGenerator() {
+ final AtomicInteger counter = new AtomicInteger();
+ @Override public CustomResponse generate(ExecParams execParams) throws Exception {
+ // First call fails; subsequent calls succeed
+ int code = (counter.incrementAndGet() > 1) ? 0 : 1;
+ return new RecordingSshTool.CustomResponse(code, null, null);
+ }
+ });
+
+ TestSshCommand test = app.createAndManageChild(EntitySpec.create(TestSshCommand.class)
+ .configure(BACKOFF_TO_PERIOD, Duration.millis(1))
+ .configure(TIMEOUT, Duration.minutes(1))
+ .configure(TARGET_ENTITY, testEntity)
+ .configure(COMMAND, cmd));
+
+ Stopwatch stopwatch = Stopwatch.createStarted();
+
+ app.start(ImmutableList.<Location>of());
+ assertEntityHealthy(test);
+
+ Iterable<ExecCmd> calls = Iterables.filter(RecordingSshTool.getExecCmds(), ExecCmdPredicates.containsCmd(cmd));
+ assertEquals(Iterables.size(calls), 2, "matchingCalls="+calls);
+
+ Duration duration = Duration.of(stopwatch);
+ assertTrue(duration.isShorterThan(Asserts.DEFAULT_LONG_TIMEOUT), "duration="+duration);
+ }
+
+ @Test
+ public void testMaxAttempts() {
+ String cmd = "commandExpectedToFail-" + Identifiers.randomLong();
+ RecordingSshTool.setCustomResponse(cmd, new RecordingSshTool.CustomResponse(1, null, null));
+
+ TestSshCommand test = app.createAndManageChild(EntitySpec.create(TestSshCommand.class)
+ .configure(MAX_ATTEMPTS, 2)
+ .configure(BACKOFF_TO_PERIOD, Duration.millis(1))
+ .configure(TIMEOUT, Duration.minutes(1))
+ .configure(TARGET_ENTITY, testEntity)
+ .configure(COMMAND, cmd));
+
+ Stopwatch stopwatch = Stopwatch.createStarted();
+ try {
+ app.start(ImmutableList.<Location>of());
+ Asserts.shouldHaveFailedPreviously();
+ } catch (Throwable t) {
+ Asserts.expectedFailureContains(t, "exit code expected equals 0 but found 1");
+ }
+
+ assertEntityFailed(test);
+
+ Iterable<ExecCmd> calls = Iterables.filter(RecordingSshTool.getExecCmds(), ExecCmdPredicates.containsCmd(cmd));
+ assertEquals(Iterables.size(calls), 2, "matchingCalls="+calls);
+
+ Duration duration = Duration.of(stopwatch);
+ assertTrue(duration.isShorterThan(Asserts.DEFAULT_LONG_TIMEOUT), "duration="+duration);
+ }
+
private Path createTempScript(String filename, String contents) {
try {
Path tempFile = Files.createTempFile("TestSshCommandTest-" + filename, ".sh");