Fix jboss6: use correct jmx-port or pid-file - twiddle.sh needs configured with the correct rmi-registry port - if using jmxmp, then can't use twiddle; instead use pid file (and rely on JmxFeed to get the service-up)
Project: http://git-wip-us.apache.org/repos/asf/brooklyn-library/repo Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-library/commit/2b5afd16 Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-library/tree/2b5afd16 Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-library/diff/2b5afd16 Branch: refs/heads/0.6.0 Commit: 2b5afd16cfc499bd5bcced2f9357c9510c2c88fc Parents: e4b5835 Author: Aled Sage <[email protected]> Authored: Fri Nov 15 13:15:06 2013 +0000 Committer: Aled Sage <[email protected]> Committed: Fri Nov 15 14:56:46 2013 +0000 ---------------------------------------------------------------------- .../entity/webapp/jboss/JBoss6Server.java | 5 ++ .../entity/webapp/jboss/JBoss6SshDriver.java | 78 ++++++++++------- .../jboss/Jboss6ServerIntegrationTest.java | 88 ++++++++++++++++++++ 3 files changed, 140 insertions(+), 31 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/2b5afd16/software/webapp/src/main/java/brooklyn/entity/webapp/jboss/JBoss6Server.java ---------------------------------------------------------------------- diff --git a/software/webapp/src/main/java/brooklyn/entity/webapp/jboss/JBoss6Server.java b/software/webapp/src/main/java/brooklyn/entity/webapp/jboss/JBoss6Server.java index ae82371..7c10af8 100644 --- a/software/webapp/src/main/java/brooklyn/entity/webapp/jboss/JBoss6Server.java +++ b/software/webapp/src/main/java/brooklyn/entity/webapp/jboss/JBoss6Server.java @@ -15,6 +15,11 @@ import brooklyn.util.flags.SetFromFlag; @ImplementedBy(JBoss6ServerImpl.class) public interface JBoss6Server extends JavaWebAppSoftwareProcess, JavaWebAppService, UsesJmx { + // TODO Instead of using portIncrement, would prefer to use http_port as "8080+" etc. + // On localhost, if an existing jboss6 is running and consuming the required port(s), + // then we don't spot that and don't claim a different port. + // Things then fail silently! + @SetFromFlag("version") ConfigKey<String> SUGGESTED_VERSION = ConfigKeys.newConfigKeyWithDefault(SoftwareProcess.SUGGESTED_VERSION, "6.0.0.Final"); http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/2b5afd16/software/webapp/src/main/java/brooklyn/entity/webapp/jboss/JBoss6SshDriver.java ---------------------------------------------------------------------- diff --git a/software/webapp/src/main/java/brooklyn/entity/webapp/jboss/JBoss6SshDriver.java b/software/webapp/src/main/java/brooklyn/entity/webapp/jboss/JBoss6SshDriver.java index 4855c4f..be8c585 100644 --- a/software/webapp/src/main/java/brooklyn/entity/webapp/jboss/JBoss6SshDriver.java +++ b/software/webapp/src/main/java/brooklyn/entity/webapp/jboss/JBoss6SshDriver.java @@ -11,8 +11,11 @@ import java.util.Map; import brooklyn.entity.basic.Attributes; import brooklyn.entity.drivers.downloads.DownloadResolver; +import brooklyn.entity.java.UsesJmx; +import brooklyn.entity.java.UsesJmx.JmxAgentModes; import brooklyn.entity.webapp.JavaWebAppSshDriver; import brooklyn.location.basic.SshMachineLocation; +import brooklyn.util.collections.MutableMap; import brooklyn.util.net.Networking; import brooklyn.util.ssh.BashCommands; @@ -115,8 +118,8 @@ public class JBoss6SshDriver extends JavaWebAppSshDriver implements JBoss6Driver String clusterArg = isEmpty(getClusterName()) ? "":"-g "+getClusterName(); // run.sh must be backgrounded otherwise the script will never return. - Map<String,Object> flags = new HashMap<String, Object>(); - flags.put("usePidFile",false); + // Don't automatically create pid; instead set JBOSS_PIDFILE to create the pid file we need + Map<String,?> flags = MutableMap.of("usePidFile", false); // We wait for evidence of tomcat running because, using // brooklyn.ssh.config.tool.class=brooklyn.util.internal.ssh.cli.SshCliTool, @@ -125,6 +128,7 @@ public class JBoss6SshDriver extends JavaWebAppSshDriver implements JBoss6Driver newScript(flags, LAUNCHING). body.append( format("export JBOSS_CLASSPATH=%s/lib/jboss-logmanager.jar",getExpandedInstallDir()), + format("export JBOSS_PIDFILE=%s/%s", getRunDir(), PID_FILENAME), format("%s/bin/run.sh -Djboss.service.binding.set=%s -Djboss.server.base.dir=$RUN_DIR/server ",getExpandedInstallDir(),PORT_GROUP_NAME) + format("-Djboss.server.base.url=file://$RUN_DIR/server -Djboss.messaging.ServerPeerID=%s ",entity.getId())+ format("-Djboss.boot.server.log.dir=%s/server/%s/log ",getRunDir(),SERVER_TYPE) + @@ -141,39 +145,51 @@ public class JBoss6SshDriver extends JavaWebAppSshDriver implements JBoss6Driver @Override public boolean isRunning() { - String host = entity.getAttribute(Attributes.HOSTNAME); - Integer port = entity.getAttribute(Attributes.JMX_PORT); - - List<String> checkRunningScript = new LinkedList<String>(); - checkRunningScript.add( - format("%s/bin/twiddle.sh --host %s --port %s get \"jboss.system:type=Server\" Started | grep true || exit 1", - getExpandedInstallDir(), host, port)); - - //have to override the CLI/JMX options - - Map<String, Object> flags = new LinkedHashMap<String, Object>(); - flags.put("env", new LinkedHashMap<String, String>()); - - int result = execute(flags, checkRunningScript, "checkRunning " + entity + " on " + getMachine()); - if (result == 0) return true; - if (result == 1) return false; - throw new IllegalStateException(format("%s running check gave result code %s",getEntity(),result)); + JmxAgentModes jmxMode = entity.getConfig(UsesJmx.JMX_AGENT_MODE); + if (jmxMode == JmxAgentModes.JMX_RMI_CUSTOM_AGENT) { + String host = entity.getAttribute(Attributes.HOSTNAME); + Integer port = entity.getAttribute(UsesJmx.RMI_REGISTRY_PORT); + + List<String> checkRunningScript = new LinkedList<String>(); + checkRunningScript.add( + format("%s/bin/twiddle.sh --host %s --port %s get \"jboss.system:type=Server\" Started | grep true || exit 1", + getExpandedInstallDir(), host, port)); + + //have to override the CLI/JMX options + + Map<String, Object> flags = new LinkedHashMap<String, Object>(); + flags.put("env", new LinkedHashMap<String, String>()); + + int result = execute(flags, checkRunningScript, "checkRunning " + entity + " on " + getMachine()); + if (result == 0) return true; + if (result == 1) return false; + throw new IllegalStateException(format("%s running check gave result code %s",getEntity(),result)); + } else { + Map<String,?> flags = MutableMap.of("usePidFile", true); + return newScript(flags, CHECK_RUNNING).execute() == 0; + } } @Override public void stop() { - String host = entity.getAttribute(Attributes.HOSTNAME); - Integer port = entity.getAttribute(Attributes.JMX_PORT); - List<String> shutdownScript = new LinkedList<String>(); - shutdownScript.add(format("%s/bin/shutdown.sh --host %s --port %s -S", getExpandedInstallDir(), host, port)); - - //again, messy copy of parent; but new driver scheme could allow script-helper to customise parameters - log.debug("invoking shutdown script for {}: {}", entity, shutdownScript); - Map<String, Object> flags = new LinkedHashMap<String, Object>(); - flags.put("env", new LinkedHashMap<String, String>()); - int result = execute(flags, shutdownScript, "shutdown " + entity + " on " + getMachine()); - if (result != 0) log.warn("non-zero result code terminating {}: {}", entity, result); - log.debug("done invoking shutdown script for {}", entity); + JmxAgentModes jmxMode = entity.getConfig(UsesJmx.JMX_AGENT_MODE); + if (jmxMode == JmxAgentModes.JMX_RMI_CUSTOM_AGENT) { + String host = entity.getAttribute(Attributes.HOSTNAME); + Integer port = entity.getAttribute(UsesJmx.RMI_REGISTRY_PORT); + List<String> shutdownScript = new LinkedList<String>(); + shutdownScript.add(format("%s/bin/shutdown.sh --host %s --port %s -S", getExpandedInstallDir(), host, port)); + + //again, messy copy of parent; but new driver scheme could allow script-helper to customise parameters + log.debug("invoking shutdown script for {}: {}", entity, shutdownScript); + Map<String, Object> flags = new LinkedHashMap<String, Object>(); + flags.put("env", new LinkedHashMap<String, String>()); + int result = execute(flags, shutdownScript, "shutdown " + entity + " on " + getMachine()); + if (result != 0) log.warn("non-zero result code terminating {}: {}", entity, result); + log.debug("done invoking shutdown script for {}", entity); + } else { + Map<String,?> flags = MutableMap.of("usePidFile", true); + newScript(flags, STOPPING).execute(); + } } @Override http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/2b5afd16/software/webapp/src/test/java/brooklyn/entity/webapp/jboss/Jboss6ServerIntegrationTest.java ---------------------------------------------------------------------- diff --git a/software/webapp/src/test/java/brooklyn/entity/webapp/jboss/Jboss6ServerIntegrationTest.java b/software/webapp/src/test/java/brooklyn/entity/webapp/jboss/Jboss6ServerIntegrationTest.java new file mode 100644 index 0000000..b7f261f --- /dev/null +++ b/software/webapp/src/test/java/brooklyn/entity/webapp/jboss/Jboss6ServerIntegrationTest.java @@ -0,0 +1,88 @@ +package brooklyn.entity.webapp.jboss; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNotNull; + +import java.net.URL; + +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import brooklyn.entity.basic.ApplicationBuilder; +import brooklyn.entity.basic.Entities; +import brooklyn.entity.java.UsesJmx; +import brooklyn.entity.proxying.EntitySpec; +import brooklyn.location.basic.LocalhostMachineProvisioningLocation; +import brooklyn.test.Asserts; +import brooklyn.test.HttpTestUtils; +import brooklyn.test.entity.TestApplication; + +import com.google.common.collect.ImmutableList; + +/** + * TODO re-write this like WebAppIntegrationTest, rather than being jboss6 specific. + */ +public class Jboss6ServerIntegrationTest { + + // Port increment for JBoss 6. + public static final int PORT_INCREMENT = 400; + + private URL warUrl; + private LocalhostMachineProvisioningLocation localhostProvisioningLocation; + private TestApplication app; + + @BeforeMethod(alwaysRun=true) + public void setUp() throws Exception { + String warPath = "hello-world.war"; + warUrl = getClass().getClassLoader().getResource(warPath); + + localhostProvisioningLocation = new LocalhostMachineProvisioningLocation(); + app = ApplicationBuilder.newManagedApp(TestApplication.class); + } + + @AfterMethod(alwaysRun=true) + public void tearDown() throws Exception { + if (app != null) Entities.destroyAll(app.getManagementContext()); + } + + @Test(groups = "Integration") + public void testJmxmp() throws Exception { + runTest(UsesJmx.JmxAgentModes.JMXMP); + } + + @Test(groups = "Integration") + public void testJmxRmi() throws Exception { + runTest(UsesJmx.JmxAgentModes.JMX_RMI_CUSTOM_AGENT); + } + + @Test(groups = "Integration") + public void testJmxAutodetect() throws Exception { + runTest(UsesJmx.JmxAgentModes.AUTODETECT); + } + + protected void runTest(UsesJmx.JmxAgentModes jmxAgentMode) throws Exception { + final JBoss6Server server = app.createAndManageChild(EntitySpec.create(JBoss6Server.class) + .configure(JBoss6Server.PORT_INCREMENT, PORT_INCREMENT) + .configure(UsesJmx.JMX_AGENT_MODE, jmxAgentMode) + .configure("war", warUrl.toString())); + + app.start(ImmutableList.of(localhostProvisioningLocation)); + + String httpUrl = "http://"+server.getAttribute(JBoss6Server.HOSTNAME)+":"+server.getAttribute(JBoss6Server.HTTP_PORT)+"/"; + + assertEquals(server.getAttribute(JBoss6Server.ROOT_URL).toLowerCase(), httpUrl.toLowerCase()); + + HttpTestUtils.assertHttpStatusCodeEventuallyEquals(httpUrl, 200); + HttpTestUtils.assertContentContainsText(httpUrl, "Hello"); + + + Asserts.succeedsEventually(new Runnable() { + @Override public void run() { + // TODO Could test other attributes as well; see jboss7 test + assertNotNull(server.getAttribute(JBoss6Server.REQUEST_COUNT)); + assertNotNull(server.getAttribute(JBoss6Server.ERROR_COUNT)); + assertNotNull(server.getAttribute(JBoss6Server.TOTAL_PROCESSING_TIME)); + }}); + } +}
