From a70e3adb200289096325f663541d10440b835019 Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Sun, 26 Aug 2012 23:37:15 -0700 Subject: [PATCH] Issue 1075:switch to use jetty for java install/web service tests --- .../compute/domain/CIMOperatingSystem.java | 6 +- .../org/jclouds/compute/JettyStatements.java | 74 ++++++ .../org/jclouds/compute/RunScriptData.java | 101 ------- .../StubComputeServiceIntegrationTest.java | 57 ++-- .../internal/BaseComputeServiceLiveTest.java | 168 +++++------- ...with_jboss.sh => initscript_with_jetty.sh} | 37 ++- compute/src/test/resources/runscript_jboss.sh | 247 ------------------ .../src/test/resources/standalone-basic.xml | 103 -------- .../NodePoolComputeServiceLiveTest.java | 86 +----- 9 files changed, 175 insertions(+), 704 deletions(-) create mode 100644 compute/src/test/java/org/jclouds/compute/JettyStatements.java delete mode 100644 compute/src/test/java/org/jclouds/compute/RunScriptData.java rename compute/src/test/resources/{initscript_with_jboss.sh => initscript_with_jetty.sh} (86%) delete mode 100644 compute/src/test/resources/runscript_jboss.sh delete mode 100644 compute/src/test/resources/standalone-basic.xml diff --git a/compute/src/main/java/org/jclouds/compute/domain/CIMOperatingSystem.java b/compute/src/main/java/org/jclouds/compute/domain/CIMOperatingSystem.java index 601b673bf1..2d46a8203d 100644 --- a/compute/src/main/java/org/jclouds/compute/domain/CIMOperatingSystem.java +++ b/compute/src/main/java/org/jclouds/compute/domain/CIMOperatingSystem.java @@ -23,6 +23,7 @@ import org.jclouds.javax.annotation.Nullable; import org.jclouds.ovf.Envelope; import com.google.common.annotations.Beta; +import com.google.common.base.Objects.ToStringHelper; /** * Operating system based on DMTF CIM model. @@ -175,8 +176,7 @@ public class CIMOperatingSystem extends OperatingSystem { } @Override - public String toString() { - return "[name=" + name + ", family=" + family + ", version=" + version + ", arch=" + arch + ", is64Bit=" - + is64Bit + ", description=" + description + ", osType=" + osType+ "]"; + protected ToStringHelper string() { + return super.string().add("osType", osType); } } \ No newline at end of file diff --git a/compute/src/test/java/org/jclouds/compute/JettyStatements.java b/compute/src/test/java/org/jclouds/compute/JettyStatements.java new file mode 100644 index 0000000000..1a629e5547 --- /dev/null +++ b/compute/src/test/java/org/jclouds/compute/JettyStatements.java @@ -0,0 +1,74 @@ +/** + * Licensed to jclouds, Inc. (jclouds) under one or more + * contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. jclouds 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.jclouds.compute; + +import static org.jclouds.scriptbuilder.domain.Statements.exec; +import static org.jclouds.scriptbuilder.domain.Statements.extractTargzAndFlattenIntoDirectory; + +import java.net.URI; + +import org.jclouds.scriptbuilder.domain.Statement; +import org.jclouds.scriptbuilder.domain.StatementList; +import org.jclouds.scriptbuilder.statements.java.InstallJDK; +import org.jclouds.scriptbuilder.statements.login.AdminAccess; + +/** + * + * @author Adrian Cole + */ +public class JettyStatements { + + public static final URI JETTY_URL = URI.create(System.getProperty("test.jetty-url",// + "http://download.eclipse.org/jetty/8.1.5.v20120716/dist/jetty-distribution-8.1.5.v20120716.tar.gz")); + + public static final String JETTY_HOME = "/usr/local/jetty"; + + public static final int port = 8080; + + public static Statement version() { + return exec(String.format("head -1 %s/VERSION.txt | cut -f1 -d ' '", JETTY_HOME)); + } + + public static Statement install() { + return new StatementList( + AdminAccess.builder().adminUsername("web").build(), + InstallJDK.fromOpenJDK(), + authorizePortInIpTables(), + extractTargzAndFlattenIntoDirectory(JETTY_URL, JETTY_HOME), + exec("chown -R web " + JETTY_HOME)); + } + + private static Statement authorizePortInIpTables() { + return new StatementList( + exec("iptables -I INPUT 1 -p tcp --dport " + port + " -j ACCEPT"), + exec("iptables-save")); + } + + public static Statement start() { + return new StatementList( + exec("cd " + JETTY_HOME), + exec("./bin/jetty.sh start")); + } + + public static Statement stop() { + return new StatementList( + exec("cd " + JETTY_HOME), + exec("./bin/jetty.sh stop")); + } +} diff --git a/compute/src/test/java/org/jclouds/compute/RunScriptData.java b/compute/src/test/java/org/jclouds/compute/RunScriptData.java deleted file mode 100644 index 3087d11e66..0000000000 --- a/compute/src/test/java/org/jclouds/compute/RunScriptData.java +++ /dev/null @@ -1,101 +0,0 @@ -/** - * Licensed to jclouds, Inc. (jclouds) under one or more - * contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. jclouds 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.jclouds.compute; - -import static java.lang.String.format; -import static org.jclouds.compute.util.ComputeServiceUtils.extractTargzIntoDirectory; -import static org.jclouds.scriptbuilder.domain.Statements.appendFile; -import static org.jclouds.scriptbuilder.domain.Statements.exec; -import static org.jclouds.scriptbuilder.domain.Statements.interpret; - -import java.io.IOException; -import java.net.URI; - -import org.jclouds.compute.domain.OperatingSystem; -import org.jclouds.scriptbuilder.InitScript; -import org.jclouds.scriptbuilder.domain.Statement; -import org.jclouds.scriptbuilder.domain.StatementList; -import org.jclouds.scriptbuilder.statements.java.InstallJDK; -import org.jclouds.scriptbuilder.statements.login.AdminAccess; - -import com.google.common.base.Splitter; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableList.Builder; - -/** - * - * @author Adrian Cole - */ -public class RunScriptData { - - public static final URI JBOSS7_URL = URI.create(System.getProperty("test.jboss7-url",// - "http://download.jboss.org/jbossas/7.0/jboss-as-7.0.2.Final/jboss-as-web-7.0.2.Final.tar.gz")); - - public static String JBOSS_HOME = "/usr/local/jboss"; - - public static Statement authorizePortsInIpTables(int... ports) { - Builder builder = ImmutableList.builder(); - for (int port : ports) - builder.add(exec("iptables -I INPUT 1 -p tcp --dport " + port + " -j ACCEPT")); - builder.add(exec("iptables-save")); - return new StatementList(builder.build()); - } - - public static StatementList installAdminUserJBossAndOpenPorts(OperatingSystem os) throws IOException { - return new StatementList(// - AdminAccess.builder().adminUsername("web").build(),// - InstallJDK.fromOpenJDK(),// - authorizePortsInIpTables(22, 8080),// - extractTargzIntoDirectory(JBOSS7_URL, "/usr/local"),// - exec("{md} " + JBOSS_HOME), exec("mv /usr/local/jboss-*/* " + JBOSS_HOME),// - changeStandaloneConfigToListenOnAllIPAddresses(), - exec("chmod -R oug+r+w " + JBOSS_HOME), - exec("chown -R web " + JBOSS_HOME)); - } - - // NOTE do not name this the same as your login user, or the init process may kill you! - public static InitScript startJBoss(String configuration) { - return InitScript.builder() - .name("jboss") - .home(JBOSS_HOME) - .exportVariables(ImmutableMap.of("JBOSS_HOME", JBOSS_HOME)) - .init(appendFile(JBOSS_HOME + "/standalone/configuration/standalone-custom.xml", Splitter.on('\n').split(configuration))) - .run(interpret(new StringBuilder().append("java ").append(' ') - .append("-server -Xms128m -Xmx128m -XX:MaxPermSize=128m -Djava.net.preferIPv4Stack=true -XX:+UseFastAccessorMethods -XX:+TieredCompilation -Xverify:none -Dorg.jboss.resolver.warning=true -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000").append(' ') - .append("-Djboss.modules.system.pkgs=org.jboss.byteman").append(' ') - .append("-Dorg.jboss.boot.log.file=$JBOSS_HOME/standalone/log/boot.log").append(' ') - .append("-Dlogging.configuration=file:$JBOSS_HOME/standalone/configuration/logging.properties").append(' ') - .append("-jar $JBOSS_HOME/jboss-modules.jar").append(' ') - .append("-mp $JBOSS_HOME/modules").append(' ') - .append("-logmodule org.jboss.logmanager").append(' ') - .append("-jaxpmodule javax.xml.jaxp-provider").append(' ') - .append("org.jboss.as.standalone").append(' ') - .append("-Djboss.home.dir=$JBOSS_HOME").append(' ') - .append("--server-config=standalone-custom.xml") - .toString())).build(); - } - - // TODO make this a cli option - private static Statement changeStandaloneConfigToListenOnAllIPAddresses() { - return exec(format( - "(cd %s/standalone/configuration && sed 's~inet-address value=.*/~any-address/~g' standalone.xml > standalone.xml.new && mv standalone.xml.new standalone.xml)", - JBOSS_HOME)); - } -} diff --git a/compute/src/test/java/org/jclouds/compute/StubComputeServiceIntegrationTest.java b/compute/src/test/java/org/jclouds/compute/StubComputeServiceIntegrationTest.java index b8e71c6a82..32da4bb7f7 100644 --- a/compute/src/test/java/org/jclouds/compute/StubComputeServiceIntegrationTest.java +++ b/compute/src/test/java/org/jclouds/compute/StubComputeServiceIntegrationTest.java @@ -36,6 +36,7 @@ import org.easymock.IArgumentMatcher; import org.jclouds.compute.domain.ExecResponse; import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.internal.BaseComputeServiceLiveTest; +import org.jclouds.compute.util.OpenSocketFinder; import org.jclouds.crypto.Pems; import org.jclouds.domain.LoginCredentials; import org.jclouds.io.Payload; @@ -81,12 +82,19 @@ public class StubComputeServiceIntegrationTest extends BaseComputeServiceLiveTes SocketOpen socketOpen = createMock(SocketOpen.class); expect(socketOpen.apply(HostAndPort.fromParts("144.175.1.1", 22))).andReturn(true).times(5); - // restart of jboss - expect(socketOpen.apply(HostAndPort.fromParts("144.175.1.1", 8080))).andReturn(true).times(2); replay(socketOpen); - preciseSocketTester = socketTester = new RetryablePredicate(socketOpen, 1, 1, TimeUnit.MILLISECONDS); + socketTester = new RetryablePredicate(socketOpen, 1, 1, TimeUnit.MILLISECONDS); + + openSocketFinder = new OpenSocketFinder(){ + + @Override + public HostAndPort findOpenSocketOnNode(NodeMetadata node, int port, long timeoutValue, TimeUnit timeUnits) { + return HostAndPort.fromParts("144.175.1.1", 8080); + } + + }; } @Override @@ -283,9 +291,9 @@ public class StubComputeServiceIntegrationTest extends BaseComputeServiceLiveTes client.connect(); try { - String scriptName = "configure-jboss"; + String scriptName = "configure-jetty"; client.put("/tmp/init-" + scriptName, Strings2.toStringAndClose(StubComputeServiceIntegrationTest.class - .getResourceAsStream("/initscript_with_jboss.sh"))); + .getResourceAsStream("/initscript_with_jetty.sh"))); expect(client.exec("chmod 755 /tmp/init-" + scriptName)).andReturn(EXEC_GOOD); expect(client.exec("ln -fs /tmp/init-" + scriptName + " " + scriptName)).andReturn(EXEC_GOOD); expect(client.getUsername()).andReturn("root").atLeastOnce(); @@ -303,52 +311,27 @@ public class StubComputeServiceIntegrationTest extends BaseComputeServiceLiveTes client.disconnect(); clientNew.connect(); - expect(clientNew.exec("ls /usr/local/jboss/bundles/org/jboss/as/osgi/configadmin/main|sed -e 's/.*-//g' -e 's/.jar//g'\n")).andReturn(EXEC_GOOD); + expect(clientNew.getUsername()).andReturn("web").atLeastOnce(); + expect(clientNew.getHostAddress()).andReturn("localhost").atLeastOnce(); + expect(clientNew.exec("head -1 /usr/local/jetty/VERSION.txt | cut -f1 -d ' '\n")).andReturn(EXEC_GOOD); clientNew.disconnect(); - - clientNew.connect(); - expect(clientNew.exec("nslookup -query=a -timeout=5 download.jboss.org|grep Address|tail -1|sed 's/.* //g'\n")).andReturn(EXEC_GOOD); - clientNew.disconnect(); - - clientNew.connect(); - expect(clientNew.exec("nslookup -query=a -timeout=5 download.oracle.com|grep Address|tail -1|sed 's/.* //g'\n")).andReturn(EXEC_GOOD); - clientNew.disconnect(); - - clientNew.connect(); - expect(clientNew.exec("curl -q -s -S -L --connect-timeout 10 --max-time 600 --retry 20 http://checkip.amazonaws.com/\n")).andReturn(EXEC_GOOD); - clientNew.disconnect(); - + clientNew.connect(); expect(clientNew.exec("java -fullversion\n")).andReturn(EXEC_GOOD); clientNew.disconnect(); clientNew.connect(); - scriptName = "jboss"; - clientNew.put("/tmp/init-" + scriptName, Strings2 - .toStringAndClose(StubComputeServiceIntegrationTest.class - .getResourceAsStream("/runscript_jboss.sh"))); - expect(clientNew.exec("chmod 755 /tmp/init-" + scriptName)).andReturn(EXEC_GOOD); - expect(clientNew.exec("ln -fs /tmp/init-" + scriptName + " " + scriptName)).andReturn(EXEC_GOOD); - expect(clientNew.getUsername()).andReturn("web").atLeastOnce(); - expect(clientNew.getHostAddress()).andReturn("localhost").atLeastOnce(); - expect(clientNew.exec("/tmp/init-" + scriptName + " init")).andReturn(EXEC_GOOD); - expect(clientNew.exec("/tmp/init-" + scriptName + " start")).andReturn(EXEC_GOOD); - clientNew.disconnect(); - clientNew.connect(); - expect(clientNew.exec("/tmp/init-" + scriptName + " stdout\n")).andReturn(EXEC_GOOD); + expect(clientNew.exec("cd /usr/local/jetty\n./bin/jetty.sh start\n")).andReturn(EXEC_GOOD); clientNew.disconnect(); clientNew.connect(); - expect(clientNew.exec("/tmp/init-" + scriptName + " stop\n")).andReturn(EXEC_GOOD); + expect(clientNew.exec("cd /usr/local/jetty\n./bin/jetty.sh stop\n")).andReturn(EXEC_GOOD); clientNew.disconnect(); clientNew.connect(); - expect(clientNew.exec("/tmp/init-" + scriptName + " start\n")).andReturn(EXEC_GOOD); + expect(clientNew.exec("cd /usr/local/jetty\n./bin/jetty.sh start\n")).andReturn(EXEC_GOOD); clientNew.disconnect(); - clientNew.connect(); - expect(clientNew.exec("/tmp/init-" + scriptName + " stdout\n")).andReturn(EXEC_GOOD); - clientNew.disconnect(); } catch (IOException e) { Throwables.propagate(e); } diff --git a/compute/src/test/java/org/jclouds/compute/internal/BaseComputeServiceLiveTest.java b/compute/src/test/java/org/jclouds/compute/internal/BaseComputeServiceLiveTest.java index c2cecc0253..7c6624a551 100644 --- a/compute/src/test/java/org/jclouds/compute/internal/BaseComputeServiceLiveTest.java +++ b/compute/src/test/java/org/jclouds/compute/internal/BaseComputeServiceLiveTest.java @@ -31,9 +31,6 @@ import static com.google.common.collect.Sets.newTreeSet; import static java.lang.String.format; import static java.lang.System.currentTimeMillis; import static java.util.logging.Logger.getAnonymousLogger; -import static org.jclouds.compute.RunScriptData.JBOSS_HOME; -import static org.jclouds.compute.RunScriptData.installAdminUserJBossAndOpenPorts; -import static org.jclouds.compute.RunScriptData.startJBoss; import static org.jclouds.compute.options.RunScriptOptions.Builder.nameTask; import static org.jclouds.compute.options.RunScriptOptions.Builder.wrapInInitScript; import static org.jclouds.compute.options.TemplateOptions.Builder.inboundPorts; @@ -60,17 +57,14 @@ import java.util.SortedSet; import java.util.concurrent.Callable; import java.util.concurrent.CancellationException; import java.util.concurrent.ExecutionException; -import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import org.jclouds.compute.ComputeService; import org.jclouds.compute.ComputeServiceContext; import org.jclouds.compute.ComputeTestUtils; +import org.jclouds.compute.JettyStatements; import org.jclouds.compute.RunNodesException; -import org.jclouds.compute.RunScriptData; import org.jclouds.compute.RunScriptOnNodesException; import org.jclouds.compute.domain.ComputeMetadata; import org.jclouds.compute.domain.ComputeType; @@ -83,6 +77,7 @@ import org.jclouds.compute.domain.OperatingSystem; import org.jclouds.compute.domain.Template; import org.jclouds.compute.domain.TemplateBuilder; import org.jclouds.compute.options.TemplateOptions; +import org.jclouds.compute.util.OpenSocketFinder; import org.jclouds.domain.Credentials; import org.jclouds.domain.Location; import org.jclouds.domain.LocationScope; @@ -90,12 +85,12 @@ import org.jclouds.domain.LoginCredentials; import org.jclouds.predicates.RetryablePredicate; import org.jclouds.predicates.SocketOpen; import org.jclouds.rest.AuthorizationException; +import org.jclouds.scriptbuilder.domain.Statement; import org.jclouds.scriptbuilder.domain.Statements; import org.jclouds.scriptbuilder.statements.java.InstallJDK; import org.jclouds.scriptbuilder.statements.login.AdminAccess; import org.jclouds.ssh.SshClient; import org.jclouds.ssh.SshException; -import org.jclouds.util.Strings2; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeGroups; import org.testng.annotations.Test; @@ -124,7 +119,7 @@ public abstract class BaseComputeServiceLiveTest extends BaseComputeServiceConte protected String group; protected Predicate socketTester; - protected Predicate preciseSocketTester; + protected OpenSocketFinder openSocketFinder; protected SortedSet nodes; protected ComputeService client; @@ -159,12 +154,9 @@ public abstract class BaseComputeServiceLiveTest extends BaseComputeServiceConte SocketOpen socketOpen = view.utils().injector().getInstance(SocketOpen.class); socketTester = new RetryablePredicate(socketOpen, 60, 1, TimeUnit.SECONDS); // wait a maximum of 60 seconds for port 8080 to open. - long maxWait = TimeUnit.SECONDS.toMillis(60); - long interval = 50; - // get more precise than default socket tester - preciseSocketTester = new RetryablePredicate(socketOpen, maxWait, interval, interval, - TimeUnit.MILLISECONDS); + openSocketFinder = context.utils().injector().getInstance(OpenSocketFinder.class); } + @Override protected void initializeContext() { super.initializeContext(); @@ -606,54 +598,38 @@ public abstract class BaseComputeServiceLiveTest extends BaseComputeServiceConte static class ServiceStats { long backgroundProcessMilliseconds; long socketOpenMilliseconds; - long reportedStartupTimeMilliseconds; @Override public String toString() { - return String.format( - "[backgroundProcessMilliseconds=%s, socketOpenMilliseconds=%s, reportedStartupTimeMilliseconds=%s]", - backgroundProcessMilliseconds, socketOpenMilliseconds, reportedStartupTimeMilliseconds); + return String.format("[backgroundProcessMilliseconds=%s, socketOpenMilliseconds=%s]", + backgroundProcessMilliseconds, socketOpenMilliseconds); } } - protected ServiceStats trackAvailabilityOfProcessOnNode(Future bgProcess, String processName, - NodeMetadata node, Pattern parseReported) throws InterruptedException, ExecutionException { + protected ServiceStats trackAvailabilityOfProcessOnNode(Statement process, String processName, NodeMetadata node) { ServiceStats stats = new ServiceStats(); Stopwatch watch = new Stopwatch().start(); - - ExecResponse exec = bgProcess.get(); + ExecResponse exec = client.runScriptOnNode(node.getId(), process, runAsRoot(false).wrapInInitScript(false)); stats.backgroundProcessMilliseconds = watch.elapsedTime(TimeUnit.MILLISECONDS); watch.reset().start(); + + HostAndPort socket = null; + try { + socket = openSocketFinder.findOpenSocketOnNode(node, 8080, 60, TimeUnit.SECONDS); + } catch (NoSuchElementException e) { + throw new NoSuchElementException(String.format("%s%n%s%s", e.getMessage(), exec.getOutput(), exec.getError())); + } - HostAndPort socket = HostAndPort.fromParts(Iterables.get(node.getPublicAddresses(), 0), 8080); - assert preciseSocketTester.apply(socket) : String.format("failed to open socket %s on node %s:%n%s%s", socket, - node, init(node, processName, "stdout"), init(node, processName, "stderr")); stats.socketOpenMilliseconds = watch.elapsedTime(TimeUnit.MILLISECONDS); - exec = init(node, processName, "stdout"); - - Matcher matcher = parseReported.matcher(exec.getOutput()); - if (matcher.find()) - stats.reportedStartupTimeMilliseconds = Long.valueOf(matcher.group(1)); - - getAnonymousLogger().info(format("<< %s on node(%s) %s", bgProcess, node.getId(), stats)); + getAnonymousLogger().info(format("<< %s on node(%s)[%s] %s", processName, node.getId(), socket, stats)); return stats; } - public ExecResponse init(NodeMetadata node, String processName, String command) { - return client.runScriptOnNode(node.getId(), "/tmp/init-" + processName + " " + command, runAsRoot(false) - .wrapInInitScript(false)); - } - - // started in 6462ms - - public static final Pattern JBOSS_PATTERN = Pattern.compile("started in ([0-9]+)ms -"); - @Test(enabled = true) public void testCreateAndRunAService() throws Exception { String group = this.group + "s"; - final String configuration = Strings2.toStringAndClose(RunScriptData.class - .getResourceAsStream("/standalone-basic.xml")); try { client.destroyNodesMatching(inGroup(group)); } catch (Exception e) { @@ -661,80 +637,54 @@ public abstract class BaseComputeServiceLiveTest extends BaseComputeServiceConte } try { - ImmutableMap userMetadata = ImmutableMap. of("Name", group); - ImmutableSet tags = ImmutableSet. of(group); - Stopwatch watch = new Stopwatch().start(); - NodeMetadata node = getOnlyElement(client.createNodesInGroup(group, 1, - inboundPorts(22, 8080).blockOnPort(22, 300).userMetadata(userMetadata).tags(tags))); - long createSeconds = watch.elapsedTime(TimeUnit.SECONDS); - - final String nodeId = node.getId(); - - checkUserMetadataInNodeEquals(node, userMetadata); - checkTagsInNodeEquals(node, tags); - - getAnonymousLogger().info( - format("<< available node(%s) os(%s) in %ss", node.getId(), node.getOperatingSystem(), createSeconds)); - - watch.reset().start(); - - // note this is a dependency on the template resolution so we have the - // right process per - // operating system. moreover, we wish this to run as root, so that it - // can change ip - // tables rules and setup our admin user - client.runScriptOnNode(nodeId, installAdminUserJBossAndOpenPorts(node.getOperatingSystem()), - nameTask("configure-jboss")); - - long configureSeconds = watch.elapsedTime(TimeUnit.SECONDS); - - getAnonymousLogger().info( - format( - "<< configured node(%s) with %s and JBoss %s in %ss", - nodeId, - exec(nodeId, "java -fullversion"), - // version of the jboss jar - exec(nodeId, - format("ls %s/bundles/org/jboss/as/osgi/configadmin/main|sed -e 's/.*-//g' -e 's/.jar//g'", - JBOSS_HOME)), configureSeconds)); - - trackAvailabilityOfProcessOnNode(view.utils().userExecutor().submit(new Callable() { - @Override - public ExecResponse call() { - return client.runScriptOnNode(nodeId, startJBoss(configuration), runAsRoot(false).blockOnComplete(false) - .nameTask("jboss")); - } - - @Override - public String toString() { - return "initial start of jboss"; - } - - }), "jboss", node, JBOSS_PATTERN); - - client.runScriptOnNode(nodeId, "/tmp/init-jboss stop", runAsRoot(false).wrapInInitScript(false)); - - trackAvailabilityOfProcessOnNode(view.utils().userExecutor().submit(new Callable() { - - @Override - public ExecResponse call() { - return client.runScriptOnNode(nodeId, "/tmp/init-jboss start", runAsRoot(false).wrapInInitScript(false)); - } - - @Override - public String toString() { - return "warm start of jboss"; - } - - }), "jboss", node, JBOSS_PATTERN); - + createAndRunAServiceInGroup(group); } finally { client.destroyNodesMatching(inGroup(group)); } } + protected void createAndRunAServiceInGroup(String group) throws RunNodesException { + ImmutableMap userMetadata = ImmutableMap. of("Name", group); + ImmutableSet tags = ImmutableSet. of(group); + Stopwatch watch = new Stopwatch().start(); + NodeMetadata node = getOnlyElement(client.createNodesInGroup(group, 1, + inboundPorts(22, 8080).blockOnPort(22, 300).userMetadata(userMetadata).tags(tags))); + long createSeconds = watch.elapsedTime(TimeUnit.SECONDS); + + final String nodeId = node.getId(); + + checkUserMetadataInNodeEquals(node, userMetadata); + checkTagsInNodeEquals(node, tags); + + getAnonymousLogger().info( + format("<< available node(%s) os(%s) in %ss", node.getId(), node.getOperatingSystem(), createSeconds)); + + watch.reset().start(); + + client.runScriptOnNode(nodeId, JettyStatements.install(), nameTask("configure-jetty")); + + long configureSeconds = watch.elapsedTime(TimeUnit.SECONDS); + + getAnonymousLogger().info( + format( + "<< configured node(%s) with %s and jetty %s in %ss", + nodeId, + exec(nodeId, "java -fullversion"), + exec(nodeId, JettyStatements.version()), configureSeconds)); + + trackAvailabilityOfProcessOnNode(JettyStatements.start(), "start jetty", node); + + client.runScriptOnNode(nodeId, JettyStatements.stop(), runAsRoot(false).wrapInInitScript(false)); + + trackAvailabilityOfProcessOnNode(JettyStatements.start(), "start jetty", node); + } + protected String exec(final String nodeId, String command) { + return exec(nodeId, Statements.exec(command)); + } + + protected String exec(final String nodeId, Statement command) { return client.runScriptOnNode(nodeId, command, runAsRoot(false).wrapInInitScript(false)).getOutput().trim(); } diff --git a/compute/src/test/resources/initscript_with_jboss.sh b/compute/src/test/resources/initscript_with_jetty.sh similarity index 86% rename from compute/src/test/resources/initscript_with_jboss.sh rename to compute/src/test/resources/initscript_with_jetty.sh index 5e4fd84fe7..7881e9e76f 100644 --- a/compute/src/test/resources/initscript_with_jboss.sh +++ b/compute/src/test/resources/initscript_with_jetty.sh @@ -8,12 +8,12 @@ function abort { exit 1 } function default { - export INSTANCE_NAME="configure-jboss" -export INSTANCE_HOME="/tmp/configure-jboss" + export INSTANCE_NAME="configure-jetty" +export INSTANCE_HOME="/tmp/configure-jetty" export LOG_DIR="$INSTANCE_HOME" return $? } -function configure-jboss { +function configure-jetty { return $? } function findPid { @@ -58,27 +58,27 @@ export PATH=/usr/ucb/bin:/bin:/sbin:/usr/bin:/usr/sbin case $1 in init) default || exit 1 - configure-jboss || exit 1 + configure-jetty || exit 1 mkdir -p $INSTANCE_HOME # create runscript header - cat > $INSTANCE_HOME/configure-jboss.sh <<-'END_OF_JCLOUDS_SCRIPT' + cat > $INSTANCE_HOME/configure-jetty.sh <<-'END_OF_JCLOUDS_SCRIPT' #!/bin/bash set +u shopt -s xpg_echo shopt -s expand_aliases - PROMPT_COMMAND='echo -ne \"\033]0;configure-jboss\007\"' + PROMPT_COMMAND='echo -ne \"\033]0;configure-jetty\007\"' export PATH=/usr/ucb/bin:/bin:/sbin:/usr/bin:/usr/sbin - export INSTANCE_NAME='configure-jboss' + export INSTANCE_NAME='configure-jetty' END_OF_JCLOUDS_SCRIPT - cat >> $INSTANCE_HOME/configure-jboss.sh <<-END_OF_JCLOUDS_SCRIPT + cat >> $INSTANCE_HOME/configure-jetty.sh <<-END_OF_JCLOUDS_SCRIPT export INSTANCE_NAME='$INSTANCE_NAME' export INSTANCE_HOME='$INSTANCE_HOME' export LOG_DIR='$LOG_DIR' END_OF_JCLOUDS_SCRIPT - cat >> $INSTANCE_HOME/configure-jboss.sh <<-'END_OF_JCLOUDS_SCRIPT' + cat >> $INSTANCE_HOME/configure-jetty.sh <<-'END_OF_JCLOUDS_SCRIPT' function abort { echo "aborting: $@" 1>&2 exit 1 @@ -191,7 +191,7 @@ function installOpenJDK() { END_OF_JCLOUDS_SCRIPT # add desired commands from the user - cat >> $INSTANCE_HOME/configure-jboss.sh <<-'END_OF_JCLOUDS_SCRIPT' + cat >> $INSTANCE_HOME/configure-jetty.sh <<-'END_OF_JCLOUDS_SCRIPT' cd $INSTANCE_HOME rm -f $INSTANCE_HOME/rc trap 'echo $?>$INSTANCE_HOME/rc' 0 1 2 3 15 @@ -217,25 +217,24 @@ END_OF_JCLOUDS_SCRIPT test -f /etc/shadow.${SUDO_USER:=${USER}} && mv /etc/shadow.${SUDO_USER:=${USER}} /etc/shadow setupPublicCurl || return 1 installOpenJDK || return 1 - iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT iptables -I INPUT 1 -p tcp --dport 8080 -j ACCEPT iptables-save - curl -q -s -S -L --connect-timeout 10 --max-time 600 --retry 20 -X GET http://download.jboss.org/jbossas/7.0/jboss-as-7.0.2.Final/jboss-as-web-7.0.2.Final.tar.gz |(mkdir -p /usr/local &&cd /usr/local &&tar -xpzf -) - mkdir -p /usr/local/jboss - mv /usr/local/jboss-*/* /usr/local/jboss - (cd /usr/local/jboss/standalone/configuration && sed 's~inet-address value=.*/~any-address/~g' standalone.xml > standalone.xml.new && mv standalone.xml.new standalone.xml) - chmod -R oug+r+w /usr/local/jboss - chown -R web /usr/local/jboss + mkdir /tmp/$$ + curl -q -s -S -L --connect-timeout 10 --max-time 600 --retry 20 -X GET http://download.eclipse.org/jetty/8.1.5.v20120716/dist/jetty-distribution-8.1.5.v20120716.tar.gz |(mkdir -p /tmp/$$ &&cd /tmp/$$ &&tar -xpzf -) + mkdir -p /usr/local/jetty + mv /tmp/$$/*/* /usr/local/jetty + rm -rf /tmp/$$ + chown -R web /usr/local/jetty END_OF_JCLOUDS_SCRIPT # add runscript footer - cat >> $INSTANCE_HOME/configure-jboss.sh <<-'END_OF_JCLOUDS_SCRIPT' + cat >> $INSTANCE_HOME/configure-jetty.sh <<-'END_OF_JCLOUDS_SCRIPT' exit $? END_OF_JCLOUDS_SCRIPT - chmod u+x $INSTANCE_HOME/configure-jboss.sh + chmod u+x $INSTANCE_HOME/configure-jetty.sh ;; status) default || exit 1 diff --git a/compute/src/test/resources/runscript_jboss.sh b/compute/src/test/resources/runscript_jboss.sh deleted file mode 100644 index 172cb9eab7..0000000000 --- a/compute/src/test/resources/runscript_jboss.sh +++ /dev/null @@ -1,247 +0,0 @@ -#!/bin/bash -set +u -shopt -s xpg_echo -shopt -s expand_aliases -unset PATH JAVA_HOME LD_LIBRARY_PATH -function abort { - echo "aborting: $@" 1>&2 - exit 1 -} -function default { - export INSTANCE_NAME="jboss" -export INSTANCE_HOME="/usr/local/jboss" -export LOG_DIR="$INSTANCE_HOME" - return $? -} -function jboss { - export JBOSS_HOME="/usr/local/jboss" - return $? -} -function findPid { - unset FOUND_PID; - [ $# -eq 1 ] || { - abort "findPid requires a parameter of pattern to match" - return 1 - } - local PATTERN="$1"; shift - local _FOUND=`ps auxwww|grep "$PATTERN"|grep -v " $0"|grep -v grep|grep -v $$|awk '{print $2}'` - [ -n "$_FOUND" ] && { - export FOUND_PID=$_FOUND - return 0 - } || { - return 1 - } -} -function forget { - unset FOUND_PID; - [ $# -eq 3 ] || { - abort "forget requires parameters INSTANCE_NAME SCRIPT LOG_DIR" - return 1 - } - local INSTANCE_NAME="$1"; shift - local SCRIPT="$1"; shift - local LOG_DIR="$1"; shift - mkdir -p $LOG_DIR - findPid $INSTANCE_NAME - [ -n "$FOUND_PID" -a -f $LOG_DIR/stdout.log ] && { - echo $INSTANCE_NAME already running pid $FOUND_PID - return 1; - } || { - nohup $SCRIPT >$LOG_DIR/stdout.log 2>$LOG_DIR/stderr.log & - RETURN=$? - # this is generally followed by findPid, so we shouldn't exit - # immediately as the proc may not have registered in ps, yet - test $RETURN && sleep 1 - return $RETURN; - } -} -export PATH=/usr/ucb/bin:/bin:/sbin:/usr/bin:/usr/sbin -case $1 in -init) - default || exit 1 - jboss || exit 1 - cat >> /usr/local/jboss/standalone/configuration/standalone-custom.xml <<-'END_OF_JCLOUDS_FILE' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -END_OF_JCLOUDS_FILE - mkdir -p $INSTANCE_HOME - - # create runscript header - cat > $INSTANCE_HOME/jboss.sh <<-'END_OF_JCLOUDS_SCRIPT' - #!/bin/bash - set +u - shopt -s xpg_echo - shopt -s expand_aliases - - PROMPT_COMMAND='echo -ne \"\033]0;jboss\007\"' - export PATH=/usr/ucb/bin:/bin:/sbin:/usr/bin:/usr/sbin - - export INSTANCE_NAME='jboss' -END_OF_JCLOUDS_SCRIPT - cat >> $INSTANCE_HOME/jboss.sh <<-END_OF_JCLOUDS_SCRIPT - export JBOSS_HOME='$JBOSS_HOME' - export INSTANCE_NAME='$INSTANCE_NAME' - export INSTANCE_HOME='$INSTANCE_HOME' - export LOG_DIR='$LOG_DIR' -END_OF_JCLOUDS_SCRIPT - - # add desired commands from the user - cat >> $INSTANCE_HOME/jboss.sh <<-'END_OF_JCLOUDS_SCRIPT' - cd $INSTANCE_HOME - rm -f $INSTANCE_HOME/rc - trap 'echo $?>$INSTANCE_HOME/rc' 0 1 2 3 15 - java -server -Xms128m -Xmx128m -XX:MaxPermSize=128m -Djava.net.preferIPv4Stack=true -XX:+UseFastAccessorMethods -XX:+TieredCompilation -Xverify:none -Dorg.jboss.resolver.warning=true -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 -Djboss.modules.system.pkgs=org.jboss.byteman -Dorg.jboss.boot.log.file=$JBOSS_HOME/standalone/log/boot.log -Dlogging.configuration=file:$JBOSS_HOME/standalone/configuration/logging.properties -jar $JBOSS_HOME/jboss-modules.jar -mp $JBOSS_HOME/modules -logmodule org.jboss.logmanager -jaxpmodule javax.xml.jaxp-provider org.jboss.as.standalone -Djboss.home.dir=$JBOSS_HOME --server-config=standalone-custom.xml -END_OF_JCLOUDS_SCRIPT - - # add runscript footer - cat >> $INSTANCE_HOME/jboss.sh <<-'END_OF_JCLOUDS_SCRIPT' - exit $? - -END_OF_JCLOUDS_SCRIPT - - chmod u+x $INSTANCE_HOME/jboss.sh - ;; -status) - default || exit 1 - findPid $INSTANCE_NAME || exit 1 - echo $FOUND_PID - ;; -stop) - default || exit 1 - findPid $INSTANCE_NAME || exit 1 - [ -n "$FOUND_PID" ] && { - echo stopping $FOUND_PID - kill -9 $FOUND_PID - } - ;; -start) - default || exit 1 - forget $INSTANCE_NAME $INSTANCE_HOME/$INSTANCE_NAME.sh $LOG_DIR || exit 1 - ;; -stdout) - default || exit 1 - cat $LOG_DIR/stdout.log - ;; -stderr) - default || exit 1 - cat $LOG_DIR/stderr.log - ;; -exitstatus) - default || exit 1 - [ -f $LOG_DIR/rc ] && cat $LOG_DIR/rc;; -tail) - default || exit 1 - tail $LOG_DIR/stdout.log - ;; -tailerr) - default || exit 1 - tail $LOG_DIR/stderr.log - ;; -run) - default || exit 1 - $INSTANCE_HOME/$INSTANCE_NAME.sh - ;; -esac -exit $? diff --git a/compute/src/test/resources/standalone-basic.xml b/compute/src/test/resources/standalone-basic.xml deleted file mode 100644 index 5a967492bc..0000000000 --- a/compute/src/test/resources/standalone-basic.xml +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/labs/nodepool/src/test/java/org/jclouds/nodepool/NodePoolComputeServiceLiveTest.java b/labs/nodepool/src/test/java/org/jclouds/nodepool/NodePoolComputeServiceLiveTest.java index 7f8d32014a..9967252d30 100644 --- a/labs/nodepool/src/test/java/org/jclouds/nodepool/NodePoolComputeServiceLiveTest.java +++ b/labs/nodepool/src/test/java/org/jclouds/nodepool/NodePoolComputeServiceLiveTest.java @@ -19,17 +19,8 @@ package org.jclouds.nodepool; -import static com.google.common.collect.Iterables.getOnlyElement; -import static java.lang.String.format; -import static java.util.logging.Logger.getAnonymousLogger; -import static org.jclouds.compute.RunScriptData.JBOSS_HOME; -import static org.jclouds.compute.RunScriptData.installAdminUserJBossAndOpenPorts; -import static org.jclouds.compute.RunScriptData.startJBoss; import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_PORT_OPEN; import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_SCRIPT_COMPLETE; -import static org.jclouds.compute.options.RunScriptOptions.Builder.nameTask; -import static org.jclouds.compute.options.TemplateOptions.Builder.inboundPorts; -import static org.jclouds.compute.options.TemplateOptions.Builder.runAsRoot; import static org.jclouds.nodepool.config.NodePoolProperties.BASEDIR; import static org.jclouds.nodepool.config.NodePoolProperties.MAX_SIZE; import static org.jclouds.nodepool.config.NodePoolProperties.MIN_SIZE; @@ -41,12 +32,8 @@ import static org.testng.Assert.assertTrue; import java.util.NoSuchElementException; import java.util.Properties; -import java.util.concurrent.Callable; -import java.util.concurrent.TimeUnit; import org.jclouds.compute.RunNodesException; -import org.jclouds.compute.RunScriptData; -import org.jclouds.compute.domain.ExecResponse; import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.internal.BaseComputeServiceLiveTest; import org.jclouds.compute.predicates.NodePredicates; @@ -54,13 +41,9 @@ import org.jclouds.logging.config.LoggingModule; import org.jclouds.logging.slf4j.config.SLF4JLoggingModule; import org.jclouds.rest.AuthorizationException; import org.jclouds.sshj.config.SshjSshClientModule; -import org.jclouds.util.Strings2; import org.testng.annotations.AfterClass; import org.testng.annotations.Test; -import com.google.common.base.Stopwatch; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import com.google.common.collect.Sets; import com.google.common.io.Closeables; @@ -108,74 +91,7 @@ public class NodePoolComputeServiceLiveTest extends BaseComputeServiceLiveTest { @Override @Test(enabled = true, groups = "live") public void testCreateAndRunAService() throws Exception { - final String configuration = Strings2.toStringAndClose(RunScriptData.class - .getResourceAsStream("/standalone-basic.xml")); - - ImmutableMap userMetadata = ImmutableMap. of("Name", group); - ImmutableSet tags = ImmutableSet.of(group); - Stopwatch watch = new Stopwatch().start(); - NodeMetadata node = getOnlyElement(client.createNodesInGroup(group, 1, inboundPorts(22, 8080) - .blockOnPort(22, 300).userMetadata(userMetadata).tags(tags))); - long createSeconds = watch.elapsedTime(TimeUnit.SECONDS); - - final String nodeId = node.getId(); - - checkUserMetadataInNodeEquals(node, userMetadata); - checkTagsInNodeEquals(node, tags); - - getAnonymousLogger().info( - format("<< available node(%s) os(%s) in %ss", node.getId(), node.getOperatingSystem(), createSeconds)); - - watch.reset().start(); - - // note this is a dependency on the template resolution so we have the - // right process per - // operating system. moreover, we wish this to run as root, so that it - // can change ip - // tables rules and setup our admin user - client.runScriptOnNode(nodeId, installAdminUserJBossAndOpenPorts(node.getOperatingSystem()), - nameTask("configure-jboss")); - - long configureSeconds = watch.elapsedTime(TimeUnit.SECONDS); - - getAnonymousLogger() - .info(format("<< configured node(%s) with %s and JBoss %s in %ss", - nodeId, - exec(nodeId, "java -fullversion"), - // version of the jboss jar - exec(nodeId, - format("ls %s/bundles/org/jboss/as/osgi/configadmin/main|sed -e 's/.*-//g' -e 's/.jar//g'", - JBOSS_HOME)), configureSeconds)); - - trackAvailabilityOfProcessOnNode(view.utils().userExecutor().submit(new Callable() { - @Override - public ExecResponse call() { - return client.runScriptOnNode(nodeId, startJBoss(configuration), runAsRoot(false).blockOnComplete(false) - .nameTask("jboss")); - } - - @Override - public String toString() { - return "initial start of jboss"; - } - - }), "jboss", node, JBOSS_PATTERN); - - client.runScriptOnNode(nodeId, "/tmp/init-jboss stop", runAsRoot(false).wrapInInitScript(false)); - - trackAvailabilityOfProcessOnNode(view.utils().userExecutor().submit(new Callable() { - - @Override - public ExecResponse call() { - return client.runScriptOnNode(nodeId, "/tmp/init-jboss start", runAsRoot(false).wrapInInitScript(false)); - } - - @Override - public String toString() { - return "warm start of jboss"; - } - - }), "jboss", node, JBOSS_PATTERN); + createAndRunAServiceInGroup(group); } @Test(enabled = true, groups = "live", dependsOnMethods = "testCreateAndRunAService")