/* * 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.entity.webapp.jboss; import static org.apache.brooklyn.test.HttpTestUtils.assertHttpStatusCodeEquals; import static org.apache.brooklyn.test.HttpTestUtils.assertHttpStatusCodeEventuallyEquals; import static org.apache.brooklyn.test.HttpTestUtils.assertUrlUnreachableEventually; import static org.testng.Assert.assertEquals; import java.io.File; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import org.apache.brooklyn.api.entity.Entity; import org.apache.brooklyn.api.entity.EntitySpec; import org.apache.brooklyn.core.entity.Entities; import org.apache.brooklyn.core.entity.factory.ApplicationBuilder; import org.apache.brooklyn.core.mgmt.internal.LocalManagementContext; import org.apache.brooklyn.core.mgmt.rebind.RebindTestUtils; import org.apache.brooklyn.core.test.entity.TestApplication; import org.apache.brooklyn.entity.webapp.DynamicWebAppCluster; import org.apache.brooklyn.test.WebAppMonitor; import org.apache.brooklyn.test.support.TestResourceUnavailableException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import org.apache.brooklyn.location.localhost.LocalhostMachineProvisioningLocation; import com.google.common.base.Predicates; import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; import com.google.common.io.Files; public class DynamicWebAppClusterRebindIntegrationTest { private static final Logger LOG = LoggerFactory.getLogger(DynamicWebAppClusterRebindIntegrationTest.class); private LocalhostMachineProvisioningLocation localhostProvisioningLocation; private TestApplication origApp; private TestApplication newApp; private List<WebAppMonitor> webAppMonitors = new CopyOnWriteArrayList<WebAppMonitor>(); private ExecutorService executor; private ClassLoader classLoader = getClass().getClassLoader(); private LocalManagementContext origManagementContext; private File mementoDir; @BeforeMethod(groups = "Integration") public void setUp() { executor = Executors.newCachedThreadPool(); mementoDir = Files.createTempDir(); origManagementContext = RebindTestUtils.newPersistingManagementContext(mementoDir, classLoader); localhostProvisioningLocation = new LocalhostMachineProvisioningLocation(); origApp = ApplicationBuilder.newManagedApp(TestApplication.class, origManagementContext); } @AfterMethod(groups = "Integration", alwaysRun=true) public void tearDown() throws Exception { for (WebAppMonitor monitor : webAppMonitors) { monitor.terminate(); } if (executor != null) executor.shutdownNow(); if (newApp != null) Entities.destroyAll(newApp.getManagementContext()); if (origApp != null) Entities.destroyAll(origApp.getManagementContext()); if (mementoDir != null) RebindTestUtils.deleteMementoDir(mementoDir); } public String getTestWar() { TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), "/hello-world.war"); return "classpath://hello-world.war"; } private TestApplication rebind() throws Exception { RebindTestUtils.waitForPersisted(origApp); // Stop the old management context, so original nginx won't interfere origManagementContext.terminate(); return (TestApplication) RebindTestUtils.rebind(mementoDir, getClass().getClassLoader()); } private WebAppMonitor newWebAppMonitor(String url) { WebAppMonitor monitor = new WebAppMonitor(url) // .delayMillis(0) .logFailures(LOG); webAppMonitors.add(monitor); executor.execute(monitor); return monitor; } /* Exception java.lang.NoClassDefFoundError Message: org/apache/brooklyn/test/HttpTestUtils$3 Stacktrace: at org.apache.brooklyn.test.HttpTestUtils.assertHttpStatusCodeEventuallyEquals(HttpTestUtils.java:208) at org.apache.brooklyn.test.HttpTestUtils.assertHttpStatusCodeEventuallyEquals(HttpTestUtils.java:204) at org.apache.brooklyn.entity.webapp.jboss.DynamicWebAppClusterRebindIntegrationTest.testRebindsToRunningCluster(DynamicWebAppClusterRebindIntegrationTest.java:122) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:84) at org.testng.internal.Invoker.invokeMethod(Invoker.java:714) at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901) at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231) at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127) at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111) at org.testng.TestRunner.privateRun(TestRunner.java:767) at org.testng.TestRunner.run(TestRunner.java:617) at org.testng.SuiteRunner.runTest(SuiteRunner.java:348) at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:343) at org.testng.SuiteRunner.privateRun(SuiteRunner.java:305) at org.testng.SuiteRunner.run(SuiteRunner.java:254) at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86) at org.testng.TestNG.runSuitesSequentially(TestNG.java:1224) at org.testng.TestNG.runSuitesLocally(TestNG.java:1149) at org.testng.TestNG.run(TestNG.java:1057) at org.apache.maven.surefire.testng.TestNGExecutor.run(TestNGExecutor.java:115) at org.apache.maven.surefire.testng.TestNGDirectoryTestSuite.executeMulti(TestNGDirectoryTestSuite.java:205) at org.apache.maven.surefire.testng.TestNGDirectoryTestSuite.execute(TestNGDirectoryTestSuite.java:108) at org.apache.maven.surefire.testng.TestNGProvider.invoke(TestNGProvider.java:111) at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:203) at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:155) at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103) */ @Test(groups = {"Integration","Broken"}) public void testRebindsToRunningCluster() throws Exception { DynamicWebAppCluster origCluster = origApp.createAndManageChild(EntitySpec.create(DynamicWebAppCluster.class) .configure("memberSpec", EntitySpec.create(JBoss7Server.class).configure("war", getTestWar())) .configure("initialSize", 1)); origApp.start(ImmutableList.of(localhostProvisioningLocation)); JBoss7Server origJboss = (JBoss7Server) Iterables.find(origCluster.getChildren(), Predicates.instanceOf(JBoss7Server.class)); String jbossUrl = origJboss.getAttribute(JBoss7Server.ROOT_URL); assertHttpStatusCodeEventuallyEquals(jbossUrl, 200); WebAppMonitor monitor = newWebAppMonitor(jbossUrl); // Rebind newApp = rebind(); DynamicWebAppCluster newCluster = (DynamicWebAppCluster) Iterables.find(newApp.getChildren(), Predicates.instanceOf(DynamicWebAppCluster.class)); assertHttpStatusCodeEquals(jbossUrl, 200); // Confirm the cluster is usable: we can scale-up assertEquals(newCluster.getCurrentSize(), (Integer)1); newCluster.resize(2); Iterable<Entity> newJbosses = Iterables.filter(newCluster.getChildren(), Predicates.instanceOf(JBoss7Server.class)); assertEquals(Iterables.size(newJbosses), 2); for (Entity j : newJbosses) { assertHttpStatusCodeEventuallyEquals(j.getAttribute(JBoss7Server.ROOT_URL), 200); } // Ensure while doing all of this the original jboss server remained reachable assertEquals(monitor.getFailures(), 0); // Ensure cluster is usable: we can scale back to stop the original jboss server newCluster.resize(0); assertUrlUnreachableEventually(jbossUrl); } }