http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/77dff880/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxHttpsSslIntegrationTest.java ---------------------------------------------------------------------- diff --git a/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxHttpsSslIntegrationTest.java b/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxHttpsSslIntegrationTest.java deleted file mode 100644 index faed95c..0000000 --- a/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxHttpsSslIntegrationTest.java +++ /dev/null @@ -1,238 +0,0 @@ -/* - * 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 brooklyn.entity.proxy.nginx; - -import static org.testng.Assert.assertFalse; -import static org.testng.Assert.assertTrue; - -import java.io.File; - -import org.apache.brooklyn.test.HttpTestUtils; -import org.apache.brooklyn.test.TestResourceUnavailableException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.testng.Assert; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import brooklyn.entity.BrooklynAppLiveTestSupport; -import brooklyn.entity.Entity; -import brooklyn.entity.basic.EntityInternal; -import brooklyn.entity.basic.SoftwareProcess; -import brooklyn.entity.group.DynamicCluster; -import brooklyn.entity.proxy.LoadBalancer; -import brooklyn.entity.proxy.ProxySslConfig; -import brooklyn.entity.proxying.EntitySpec; -import brooklyn.entity.webapp.JavaWebAppService; -import brooklyn.entity.webapp.WebAppService; -import brooklyn.entity.webapp.jboss.JBoss7Server; -import brooklyn.event.basic.PortAttributeSensorAndConfigKey; -import brooklyn.location.Location; -import brooklyn.location.basic.PortRanges; -import brooklyn.test.Asserts; -import brooklyn.util.exceptions.Exceptions; - -import com.google.common.base.Preconditions; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Iterables; - -/** - * Test the operation of the {@link NginxController} class. - */ -public class NginxHttpsSslIntegrationTest extends BrooklynAppLiveTestSupport { - - private static final Logger log = LoggerFactory.getLogger(NginxHttpsSslIntegrationTest.class); - - private NginxController nginx; - private DynamicCluster cluster; - private Location localLoc; - - private static final String CERTIFICATE_URL = "classpath://ssl/certs/localhost/server.crt"; - private static final String KEY_URL = "classpath://ssl/certs/localhost/server.key"; - - @BeforeMethod(alwaysRun=true) - @Override - public void setUp() throws Exception { - super.setUp(); - localLoc = mgmt.getLocationRegistry().resolve("localhost"); - } - - private static void urlContainsPort(NginxController nginx, PortAttributeSensorAndConfigKey sensor, String portRange) { - Integer port = nginx.getAttribute(sensor); - Assert.assertTrue(Iterables.contains(PortRanges.fromString(portRange), port), "Port "+port+" not in range "+portRange); - String url = Preconditions.checkNotNull(nginx.getAttribute(LoadBalancer.MAIN_URI), "main uri").toString(); - Assert.assertTrue(url.contains(":"+port), "URL does not contain expected port; port "+port+", url "+url); - } - - public String getTestWar() { - TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), "/hello-world.war"); - return "classpath://hello-world.war"; - } - - /** - * Test that the Nginx proxy starts up and sets SERVICE_UP correctly. - */ - @Test(groups = "Integration") - public void testStartsWithGlobalSsl_withCertificateAndKeyCopy() { - cluster = app.createAndManageChild(EntitySpec.create(DynamicCluster.class) - .configure(DynamicCluster.MEMBER_SPEC, EntitySpec.create(JBoss7Server.class)) - .configure("initialSize", 1) - .configure(JavaWebAppService.ROOT_WAR, getTestWar())); - - ProxySslConfig ssl = ProxySslConfig.builder() - .certificateSourceUrl(CERTIFICATE_URL) - .keySourceUrl(KEY_URL) - .build(); - - nginx = app.createAndManageChild(EntitySpec.create(NginxController.class) - .configure("sticky", false) - .configure("serverPool", cluster) - .configure("domain", "localhost") - .configure("httpsPort", "8453+") - .configure("ssl", ssl)); - - app.start(ImmutableList.of(localLoc)); - - urlContainsPort(nginx, LoadBalancer.PROXY_HTTPS_PORT, "8453+"); - - final String url = nginx.getAttribute(WebAppService.ROOT_URL); - log.info("URL for nginx is "+url); - if (!url.startsWith("https://")) Assert.fail("URL should be https: "+url); - - Asserts.succeedsEventually(new Runnable() { - public void run() { - // Services are running - assertTrue(cluster.getAttribute(SoftwareProcess.SERVICE_UP)); - for (Entity member : cluster.getMembers()) { - assertTrue(member.getAttribute(SoftwareProcess.SERVICE_UP)); - } - - assertTrue(nginx.getAttribute(SoftwareProcess.SERVICE_UP)); - - // Nginx URL is available - HttpTestUtils.assertHttpStatusCodeEquals(url, 200); - - // Web-server URL is available - for (Entity member : cluster.getMembers()) { - HttpTestUtils.assertHttpStatusCodeEquals(member.getAttribute(WebAppService.ROOT_URL), 200); - } - }}); - - app.stop(); - - // Services have stopped - assertFalse(nginx.getAttribute(SoftwareProcess.SERVICE_UP)); - assertFalse(cluster.getAttribute(SoftwareProcess.SERVICE_UP)); - for (Entity member : cluster.getMembers()) { - assertFalse(member.getAttribute(SoftwareProcess.SERVICE_UP)); - } - } - - private String getFile(String file) { - return new File(getClass().getResource("/" + file).getFile()).getAbsolutePath(); - } - - @Test(groups = "Integration") - public void testStartsWithGlobalSsl_withPreinstalledCertificateAndKey() { - cluster = app.createAndManageChild(EntitySpec.create(DynamicCluster.class) - .configure(DynamicCluster.MEMBER_SPEC, EntitySpec.create(JBoss7Server.class)) - .configure("initialSize", 1) - .configure(JavaWebAppService.ROOT_WAR, getTestWar())); - - ProxySslConfig ssl = ProxySslConfig.builder() - .certificateDestination(getFile("ssl/certs/localhost/server.crt")) - .keyDestination(getFile("ssl/certs/localhost/server.key")) - .build(); - - nginx = app.createAndManageChild(EntitySpec.create(NginxController.class) - .configure("sticky", false) - .configure("serverPool", cluster) - .configure("domain", "localhost") - .configure("port", "8443+") - .configure("ssl", ssl)); - - app.start(ImmutableList.of(localLoc)); - - final String url = nginx.getAttribute(WebAppService.ROOT_URL); - if (!url.startsWith("https://")) Assert.fail("URL should be https: "+url); - - Asserts.succeedsEventually(new Runnable() { - public void run() { - // Services are running - assertTrue(cluster.getAttribute(SoftwareProcess.SERVICE_UP)); - for (Entity member : cluster.getMembers()) { - assertTrue(member.getAttribute(SoftwareProcess.SERVICE_UP)); - } - - assertTrue(nginx.getAttribute(SoftwareProcess.SERVICE_UP)); - - // Nginx URL is available - HttpTestUtils.assertHttpStatusCodeEquals(url, 200); - - // Web-server URL is available - for (Entity member : cluster.getMembers()) { - HttpTestUtils.assertHttpStatusCodeEquals(member.getAttribute(WebAppService.ROOT_URL), 200); - } - }}); - - app.stop(); - - // Services have stopped - assertFalse(nginx.getAttribute(SoftwareProcess.SERVICE_UP)); - assertFalse(cluster.getAttribute(SoftwareProcess.SERVICE_UP)); - for (Entity member : cluster.getMembers()) { - assertFalse(member.getAttribute(SoftwareProcess.SERVICE_UP)); - } - } - - @Test(groups = "Integration") - public void testStartsNonSslThenBecomesSsl() { - cluster = app.createAndManageChild(EntitySpec.create(DynamicCluster.class) - .configure(DynamicCluster.MEMBER_SPEC, EntitySpec.create(JBoss7Server.class)) - .configure("initialSize", 1) - .configure(JavaWebAppService.ROOT_WAR, getTestWar())); - - nginx = app.createAndManageChild(EntitySpec.create(NginxController.class) - .configure("serverPool", cluster) - .configure("domain", "localhost")); - - app.start(ImmutableList.of(localLoc)); - - urlContainsPort(nginx, LoadBalancer.PROXY_HTTP_PORT, "8000-8100"); - - ProxySslConfig ssl = ProxySslConfig.builder() - .certificateDestination(getFile("ssl/certs/localhost/server.crt")) - .keyDestination(getFile("ssl/certs/localhost/server.key")) - .build(); - ((EntityInternal)nginx).setConfig(LoadBalancer.PROXY_HTTPS_PORT, PortRanges.fromString("8443+")); - ((EntityInternal)nginx).setConfig(NginxController.SSL_CONFIG, ssl); - - try { - log.info("restarting nginx as ssl"); - nginx.restart(); - urlContainsPort(nginx, LoadBalancer.PROXY_HTTPS_PORT, "8443-8543"); - - app.stop(); - - } catch (Exception e) { - throw Exceptions.propagate(e); - } - } - -}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/77dff880/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxIntegrationTest.java ---------------------------------------------------------------------- diff --git a/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxIntegrationTest.java b/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxIntegrationTest.java deleted file mode 100644 index 1cf0920..0000000 --- a/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxIntegrationTest.java +++ /dev/null @@ -1,453 +0,0 @@ -/* - * 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 brooklyn.entity.proxy.nginx; - -import static org.apache.brooklyn.test.EntityTestUtils.assertAttributeEqualsEventually; -import static org.apache.brooklyn.test.HttpTestUtils.assertHttpStatusCodeEquals; -import static org.apache.brooklyn.test.HttpTestUtils.assertHttpStatusCodeEventuallyEquals; -import static org.testng.Assert.assertFalse; -import static org.testng.Assert.assertNotEquals; -import static org.testng.Assert.assertTrue; - -import java.util.Map; - -import org.apache.brooklyn.test.HttpTestUtils; -import org.apache.brooklyn.test.TestResourceUnavailableException; -import org.apache.brooklyn.test.WebAppMonitor; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import brooklyn.entity.BrooklynAppLiveTestSupport; -import brooklyn.entity.Entity; -import brooklyn.entity.basic.EntityFactory; -import brooklyn.entity.basic.SoftwareProcess; -import brooklyn.entity.group.DynamicCluster; -import brooklyn.entity.proxying.EntitySpec; -import brooklyn.entity.webapp.JavaWebAppService; -import brooklyn.entity.webapp.WebAppService; -import brooklyn.entity.webapp.jboss.JBoss7Server; -import brooklyn.location.Location; -import brooklyn.test.Asserts; -import brooklyn.util.time.Duration; -import brooklyn.util.time.Time; - -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Iterables; -/** - * Test the operation of the {@link NginxController} class. - */ -public class NginxIntegrationTest extends BrooklynAppLiveTestSupport { - private static final Logger log = LoggerFactory.getLogger(NginxIntegrationTest.class); - - private NginxController nginx; - private DynamicCluster serverPool; - private Location localLoc; - - @BeforeMethod(alwaysRun=true) - @Override - public void setUp() throws Exception { - super.setUp(); - localLoc = mgmt.getLocationRegistry().resolve("localhost"); - } - - public String getTestWar() { - TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), "/hello-world.war"); - return "classpath://hello-world.war"; - } - - /** - * Test that the Nginx proxy starts up and sets SERVICE_UP correctly. - */ - @Test(groups = "Integration") - public void testWhenNoServersReturns404() { - serverPool = app.createAndManageChild(EntitySpec.create(DynamicCluster.class) - .configure("initialSize", 0) - .configure(DynamicCluster.FACTORY, new EntityFactory<Entity>() { - @Override public Entity newEntity(Map flags, Entity parent) { - throw new UnsupportedOperationException(); - }})); - - nginx = app.createAndManageChild(EntitySpec.create(NginxController.class) - .configure("serverPool", serverPool) - .configure("domain", "localhost")); - - app.start(ImmutableList.of(localLoc)); - - assertAttributeEqualsEventually(nginx, SoftwareProcess.SERVICE_UP, true); - assertHttpStatusCodeEventuallyEquals(nginx.getAttribute(NginxController.ROOT_URL), 404); - } - - @Test(groups = "Integration") - public void testRestart() { - serverPool = app.createAndManageChild(EntitySpec.create(DynamicCluster.class) - .configure("initialSize", 0) - .configure(DynamicCluster.FACTORY, new EntityFactory<Entity>() { - @Override public Entity newEntity(Map flags, Entity parent) { - throw new UnsupportedOperationException(); - }})); - - nginx = app.createAndManageChild(EntitySpec.create(NginxController.class) - .configure("serverPool", serverPool) - .configure("domain", "localhost")); - - app.start(ImmutableList.of(localLoc)); - - nginx.restart(); - - assertAttributeEqualsEventually(nginx, SoftwareProcess.SERVICE_UP, true); - assertHttpStatusCodeEventuallyEquals(nginx.getAttribute(NginxController.ROOT_URL), 404); - } - - /** - * Test that the Nginx proxy starts up and sets SERVICE_UP correctly. - */ - @Test(groups = "Integration") - public void testCanStartupAndShutdown() { - serverPool = app.createAndManageChild(EntitySpec.create(DynamicCluster.class) - .configure(DynamicCluster.MEMBER_SPEC, EntitySpec.create(JBoss7Server.class)) - .configure("initialSize", 1) - .configure(JavaWebAppService.ROOT_WAR, getTestWar())); - - nginx = app.createAndManageChild(EntitySpec.create(NginxController.class) - .configure("serverPool", serverPool) - .configure("domain", "localhost") - .configure("portNumberSensor", WebAppService.HTTP_PORT)); - - app.start(ImmutableList.of(localLoc)); - - // App-servers and nginx has started - Asserts.succeedsEventually(new Runnable() { - public void run() { - for (Entity member : serverPool.getMembers()) { - assertTrue(member.getAttribute(SoftwareProcess.SERVICE_UP)); - } - assertTrue(nginx.getAttribute(SoftwareProcess.SERVICE_UP)); - }}); - - // URLs reachable - assertHttpStatusCodeEventuallyEquals(nginx.getAttribute(NginxController.ROOT_URL), 200); - for (Entity member : serverPool.getMembers()) { - assertHttpStatusCodeEventuallyEquals(member.getAttribute(WebAppService.ROOT_URL), 200); - } - - app.stop(); - - // Services have stopped - assertFalse(nginx.getAttribute(SoftwareProcess.SERVICE_UP)); - assertFalse(serverPool.getAttribute(SoftwareProcess.SERVICE_UP)); - for (Entity member : serverPool.getMembers()) { - assertFalse(member.getAttribute(SoftwareProcess.SERVICE_UP)); - } - } - - /** - * Test that the Nginx proxy starts up and sets SERVICE_UP correctly using the config file template. - */ - @Test(groups = "Integration") - public void testCanStartupAndShutdownUsingTemplate() { - serverPool = app.createAndManageChild(EntitySpec.create(DynamicCluster.class) - .configure(DynamicCluster.MEMBER_SPEC, EntitySpec.create(JBoss7Server.class)) - .configure("initialSize", 1) - .configure(JavaWebAppService.ROOT_WAR, getTestWar())); - - nginx = app.createAndManageChild(EntitySpec.create(NginxController.class) - .configure("serverPool", serverPool) - .configure("domain", "localhost") - .configure("portNumberSensor", WebAppService.HTTP_PORT) - .configure("configTemplate", "classpath://brooklyn/entity/proxy/nginx/server.conf")); - - app.start(ImmutableList.of(localLoc)); - - // App-servers and nginx has started - Asserts.succeedsEventually(new Runnable() { - public void run() { - for (Entity member : serverPool.getMembers()) { - assertTrue(member.getAttribute(SoftwareProcess.SERVICE_UP)); - } - assertTrue(nginx.getAttribute(SoftwareProcess.SERVICE_UP)); - }}); - - // URLs reachable - assertHttpStatusCodeEventuallyEquals(nginx.getAttribute(NginxController.ROOT_URL), 200); - for (Entity member : serverPool.getMembers()) { - assertHttpStatusCodeEventuallyEquals(member.getAttribute(WebAppService.ROOT_URL), 200); - } - - app.stop(); - - // Services have stopped - assertFalse(nginx.getAttribute(SoftwareProcess.SERVICE_UP)); - assertFalse(serverPool.getAttribute(SoftwareProcess.SERVICE_UP)); - for (Entity member : serverPool.getMembers()) { - assertFalse(member.getAttribute(SoftwareProcess.SERVICE_UP)); - } - } - - /** - * Test that the Nginx proxy works, serving all domains, if no domain is set - */ - @Test(groups = "Integration") - public void testDomainless() { - serverPool = app.createAndManageChild(EntitySpec.create(DynamicCluster.class) - .configure(DynamicCluster.MEMBER_SPEC, EntitySpec.create(JBoss7Server.class)) - .configure("initialSize", 1) - .configure(JavaWebAppService.ROOT_WAR, getTestWar())); - - nginx = app.createAndManageChild(EntitySpec.create(NginxController.class) - .configure("serverPool", serverPool) - .configure("domain", "localhost") - .configure("portNumberSensor", WebAppService.HTTP_PORT)); - - app.start(ImmutableList.of(localLoc)); - - // App-servers and nginx has started - assertAttributeEqualsEventually(serverPool, SoftwareProcess.SERVICE_UP, true); - for (Entity member : serverPool.getMembers()) { - assertAttributeEqualsEventually(member, SoftwareProcess.SERVICE_UP, true); - } - assertAttributeEqualsEventually(nginx, SoftwareProcess.SERVICE_UP, true); - - // URLs reachable - assertHttpStatusCodeEventuallyEquals(nginx.getAttribute(NginxController.ROOT_URL), 200); - for (Entity member : serverPool.getMembers()) { - assertHttpStatusCodeEventuallyEquals(member.getAttribute(WebAppService.ROOT_URL), 200); - } - - app.stop(); - - // Services have stopped - assertFalse(nginx.getAttribute(SoftwareProcess.SERVICE_UP)); - assertFalse(serverPool.getAttribute(SoftwareProcess.SERVICE_UP)); - for (Entity member : serverPool.getMembers()) { - assertFalse(member.getAttribute(SoftwareProcess.SERVICE_UP)); - } - } - - @Test(groups = "Integration") - public void testTwoNginxesGetDifferentPorts() { - serverPool = app.createAndManageChild(EntitySpec.create(DynamicCluster.class) - .configure("initialSize", 0) - .configure(DynamicCluster.FACTORY, new EntityFactory<Entity>() { - @Override public Entity newEntity(Map flags, Entity parent) { - throw new UnsupportedOperationException(); - }})); - - NginxController nginx1 = app.createAndManageChild(EntitySpec.create(NginxController.class) - .configure("serverPool", serverPool) - .configure("domain", "localhost") - .configure("port", "14000+")); - - NginxController nginx2 = app.createAndManageChild(EntitySpec.create(NginxController.class) - .configure("serverPool", serverPool) - .configure("domain", "localhost") - .configure("port", "14000+")); - - app.start(ImmutableList.of(localLoc)); - - String url1 = nginx1.getAttribute(NginxController.ROOT_URL); - String url2 = nginx2.getAttribute(NginxController.ROOT_URL); - - assertTrue(url1.contains(":1400"), url1); - assertTrue(url2.contains(":1400"), url2); - assertNotEquals(url1, url2, "Two nginxs should listen on different ports, not both on "+url1); - - // Nginx has started - assertAttributeEqualsEventually(nginx1, SoftwareProcess.SERVICE_UP, true); - assertAttributeEqualsEventually(nginx2, SoftwareProcess.SERVICE_UP, true); - - // Nginx reachable (returning default 404) - assertHttpStatusCodeEventuallyEquals(url1, 404); - assertHttpStatusCodeEventuallyEquals(url2, 404); - } - - /** Test that site access does not fail even while nginx is reloaded */ - // FIXME test disabled -- reload isn't a problem, but #365 is - @Test(enabled = false, groups = "Integration") - public void testServiceContinuity() throws Exception { - serverPool = app.createAndManageChild(EntitySpec.create(DynamicCluster.class) - .configure(DynamicCluster.MEMBER_SPEC, EntitySpec.create(JBoss7Server.class)) - .configure("initialSize", 1) - .configure(JavaWebAppService.ROOT_WAR, getTestWar())); - - nginx = app.createAndManageChild(EntitySpec.create(NginxController.class) - .configure("serverPool", serverPool)); - - app.start(ImmutableList.of(localLoc)); - - Asserts.succeedsEventually(new Runnable() { - public void run() { - for (Entity member : serverPool.getMembers()) { - assertHttpStatusCodeEquals(member.getAttribute(WebAppService.ROOT_URL), 200); - } - assertHttpStatusCodeEquals(nginx.getAttribute(WebAppService.ROOT_URL), 200); - }}); - - WebAppMonitor monitor = new WebAppMonitor(nginx.getAttribute(WebAppService.ROOT_URL)) - .logFailures(log) - .delayMillis(0); - Thread t = new Thread(monitor); - t.start(); - - try { - Thread.sleep(1*1000); - log.info("service continuity test, startup, "+monitor.getAttempts()+" requests made"); - monitor.assertAttemptsMade(10, "startup").assertNoFailures("startup").resetCounts(); - - for (int i=0; i<20; i++) { - nginx.reload(); - Thread.sleep(500); - log.info("service continuity test, iteration "+i+", "+monitor.getAttempts()+" requests made"); - monitor.assertAttemptsMade(10, "reloaded").assertNoFailures("reloaded").resetCounts(); - } - - } finally { - t.interrupt(); - } - - app.stop(); - - // Services have stopped - assertFalse(nginx.getAttribute(SoftwareProcess.SERVICE_UP)); - assertFalse(serverPool.getAttribute(SoftwareProcess.SERVICE_UP)); - for (Entity member : serverPool.getMembers()) { - assertFalse(member.getAttribute(SoftwareProcess.SERVICE_UP)); - } - } - - // FIXME test disabled -- issue #365 - /* - * This currently makes no assertions, but writes out the number of sequential reqs per sec - * supported with nginx and jboss. - * <p> - * jboss is (now) steady, at 6k+, since we close the connections in HttpTestUtils.getHttpStatusCode. - * but nginx still hits problems, after about 15k reqs, something is getting starved in nginx. - */ - @Test(enabled=false, groups = "Integration") - public void testContinuityNginxAndJboss() throws Exception { - serverPool = app.createAndManageChild(EntitySpec.create(DynamicCluster.class) - .configure(DynamicCluster.MEMBER_SPEC, EntitySpec.create(JBoss7Server.class)) - .configure("initialSize", 1) - .configure(JavaWebAppService.ROOT_WAR, getTestWar())); - - nginx = app.createAndManageChild(EntitySpec.create(NginxController.class) - .configure("serverPool", serverPool)); - - app.start(ImmutableList.of(localLoc)); - - final String nginxUrl = nginx.getAttribute(WebAppService.ROOT_URL); - - Asserts.succeedsEventually(new Runnable() { - public void run() { - for (Entity member : serverPool.getMembers()) { - String jbossUrl = member.getAttribute(WebAppService.ROOT_URL); - assertHttpStatusCodeEquals(jbossUrl, 200); - } - assertHttpStatusCodeEquals(nginxUrl, 200); - }}); - - final String jbossUrl = Iterables.get(serverPool.getMembers(), 0).getAttribute(WebAppService.ROOT_URL); - - Thread t = new Thread(new Runnable() { - public void run() { - long lastReportTime = System.currentTimeMillis(); - int num = 0; - while (true) { - try { - num++; - int code = HttpTestUtils.getHttpStatusCode(nginxUrl); - if (code!=200) log.info("NGINX GOT: "+code); - else log.debug("NGINX GOT: "+code); - if (System.currentTimeMillis()>=lastReportTime+1000) { - log.info("NGINX DID "+num+" requests in last "+(System.currentTimeMillis()-lastReportTime)+"ms"); - num=0; - lastReportTime = System.currentTimeMillis(); - } - } catch (Exception e) { - log.info("NGINX GOT: "+e); - } - } - }}); - t.start(); - - Thread t2 = new Thread(new Runnable() { - public void run() { - long lastReportTime = System.currentTimeMillis(); - int num = 0; - while (true) { - try { - num++; - int code = HttpTestUtils.getHttpStatusCode(jbossUrl); - if (code!=200) log.info("JBOSS GOT: "+code); - else log.debug("JBOSS GOT: "+code); - if (System.currentTimeMillis()>=1000+lastReportTime) { - log.info("JBOSS DID "+num+" requests in last "+(System.currentTimeMillis()-lastReportTime)+"ms"); - num=0; - lastReportTime = System.currentTimeMillis(); - } - } catch (Exception e) { - log.info("JBOSS GOT: "+e); - } - } - }}); - t2.start(); - - t2.join(); - } - - /** - * Test that the Nginx proxy starts up and sets SERVICE_UP correctly. - */ - @Test(groups = "Integration") - public void testCanRestart() { - nginx = app.createAndManageChild(EntitySpec.create(NginxController.class) - .configure("serverPool", serverPool) - .configure("domain", "localhost") - .configure("portNumberSensor", WebAppService.HTTP_PORT)); - - app.start(ImmutableList.of(localLoc)); - - // App-servers and nginx has started - Asserts.succeedsEventually(new Runnable() { - public void run() { - assertTrue(nginx.getAttribute(SoftwareProcess.SERVICE_UP)); - }}); - - log.info("started, will restart soon"); - Time.sleep(Duration.ONE_SECOND); - - nginx.restart(); - - Time.sleep(Duration.ONE_SECOND); - Asserts.succeedsEventually(new Runnable() { - public void run() { - assertTrue(nginx.getAttribute(SoftwareProcess.SERVICE_UP)); - }}); - log.info("restarted and got service up"); - } - -// public static void main(String[] args) { -// NginxIntegrationTest t = new NginxIntegrationTest(); -// t.setup(); -// t.testCanRestart(); -// t.shutdown(); -// } - -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/77dff880/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxLightIntegrationTest.java ---------------------------------------------------------------------- diff --git a/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxLightIntegrationTest.java b/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxLightIntegrationTest.java deleted file mode 100644 index b55e598..0000000 --- a/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxLightIntegrationTest.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * 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 brooklyn.entity.proxy.nginx; - -import static org.testng.Assert.assertEquals; - -import java.net.URL; -import java.util.Map; - -import org.testng.annotations.Test; - -import brooklyn.entity.BrooklynAppUnitTestSupport; -import brooklyn.entity.Entity; -import brooklyn.entity.basic.Attributes; -import brooklyn.entity.basic.BasicConfigurableEntityFactory; -import brooklyn.entity.basic.EntityFactory; -import brooklyn.entity.group.DynamicCluster; -import brooklyn.entity.proxy.StubAppServer; -import brooklyn.entity.proxying.EntitySpec; -import brooklyn.location.basic.LocalhostMachineProvisioningLocation; -import brooklyn.test.Asserts; - -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Maps; - -public class NginxLightIntegrationTest extends BrooklynAppUnitTestSupport { - - private NginxController nginx; - private DynamicCluster cluster; - - // FIXME Fails because getting addEntity callback for group members while nginx is still starting, - // so important nginx fields are still null. Therefore get NPE for cluster members, and thus targets - // is of size zero. - @Test(groups = {"Integration", "WIP"}) - public void testNginxTargetsMatchesClusterMembers() { - EntityFactory<StubAppServer> serverFactory = new BasicConfigurableEntityFactory<StubAppServer>(StubAppServer.class); - final DynamicCluster cluster = app.createAndManageChild(EntitySpec.create(DynamicCluster.class) - .configure("initialSize", 2) - .configure("factory", serverFactory)); - - nginx = app.createAndManageChild(EntitySpec.create(NginxController.class) - .configure("serverPool", cluster) - .configure("domain", "localhost")); - - app.start(ImmutableList.of(new LocalhostMachineProvisioningLocation())); - - // Wait for url-mapping to update its TARGET_ADDRESSES (through async subscription) - Asserts.succeedsEventually(new Runnable() { - @Override public void run() { - Map<Entity, String> expectedTargets = Maps.newLinkedHashMap(); - for (Entity member : cluster.getMembers()) { - expectedTargets.put(member, member.getAttribute(Attributes.HOSTNAME)+":"+member.getAttribute(Attributes.HTTP_PORT)); - } - assertEquals(nginx.getAttribute(NginxController.SERVER_POOL_TARGETS).size(), 2); - assertEquals(nginx.getAttribute(NginxController.SERVER_POOL_TARGETS), expectedTargets); - }}); - } -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/77dff880/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxRebindIntegrationTest.java ---------------------------------------------------------------------- diff --git a/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxRebindIntegrationTest.java b/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxRebindIntegrationTest.java deleted file mode 100644 index dcaaca5..0000000 --- a/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxRebindIntegrationTest.java +++ /dev/null @@ -1,292 +0,0 @@ -/* - * 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 brooklyn.entity.proxy.nginx; - -import static org.apache.brooklyn.test.EntityTestUtils.assertAttributeEqualsEventually; -import static org.apache.brooklyn.test.HttpTestUtils.assertHttpStatusCodeEquals; -import static org.apache.brooklyn.test.HttpTestUtils.assertHttpStatusCodeEventuallyEquals; -import static org.testng.Assert.assertEquals; - -import java.util.List; -import java.util.Map; -import java.util.concurrent.CopyOnWriteArrayList; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -import org.apache.brooklyn.management.ManagementContext; -import org.apache.brooklyn.test.EntityTestUtils; -import org.apache.brooklyn.test.TestResourceUnavailableException; -import org.apache.brooklyn.test.WebAppMonitor; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import brooklyn.entity.Entity; -import brooklyn.entity.Group; -import brooklyn.entity.basic.BasicGroup; -import brooklyn.entity.basic.Entities; -import brooklyn.entity.basic.Lifecycle; -import brooklyn.entity.basic.SoftwareProcess; -import brooklyn.entity.group.DynamicCluster; -import brooklyn.entity.proxying.EntitySpec; -import brooklyn.entity.rebind.RebindOptions; -import brooklyn.entity.rebind.RebindTestFixtureWithApp; -import brooklyn.entity.webapp.tomcat.Tomcat8Server; -import brooklyn.location.LocationSpec; -import brooklyn.location.basic.LocalhostMachineProvisioningLocation; -import brooklyn.test.Asserts; - -import com.google.common.base.Predicates; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Iterables; - -/** - * Test the operation of the {@link NginxController} class. - */ -public class NginxRebindIntegrationTest extends RebindTestFixtureWithApp { - - private static final Logger LOG = LoggerFactory.getLogger(NginxRebindIntegrationTest.class); - - private LocalhostMachineProvisioningLocation localhostProvisioningLocation; - private List<WebAppMonitor> webAppMonitors = new CopyOnWriteArrayList<WebAppMonitor>(); - private ExecutorService executor; - - @Override - protected boolean useLiveManagementContext() { - // For Aled, the test failed without own ~/.brooklyn/brooklyn.properties. - // Suspect that was caused by local environment, with custom brooklyn.ssh.config.scriptHeader - // to set things like correct Java on path. - return true; - } - - @BeforeMethod(alwaysRun=true) - public void setUp() throws Exception { - super.setUp(); - localhostProvisioningLocation = origManagementContext.getLocationManager().createLocation(LocationSpec.create(LocalhostMachineProvisioningLocation.class)); - executor = Executors.newCachedThreadPool(); - } - - public String getTestWar() { - TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), "/hello-world.war"); - return "classpath://hello-world.war"; - } - - @AfterMethod(alwaysRun=true) - public void tearDown() throws Exception { - for (WebAppMonitor monitor : webAppMonitors) { - monitor.terminate(); - } - webAppMonitors.clear(); - if (executor != null) executor.shutdownNow(); - super.tearDown(); - } - - private WebAppMonitor newWebAppMonitor(String url, int expectedResponseCode) { - WebAppMonitor monitor = new WebAppMonitor(url) -// .delayMillis(0) FIXME Re-enable to fast polling - .expectedResponseCode(expectedResponseCode) - .logFailures(LOG); - webAppMonitors.add(monitor); - executor.execute(monitor); - return monitor; - } - - /** - * Test can rebind to the simplest possible nginx configuration (i.e. no server pool). - */ - @Test(groups = "Integration") - public void testRebindsWithEmptyServerPool() throws Exception { - - // Set up nginx with a server pool - DynamicCluster origServerPool = origApp.createAndManageChild(EntitySpec.create(DynamicCluster.class) - .configure(DynamicCluster.MEMBER_SPEC, EntitySpec.create(Tomcat8Server.class)) - .configure("initialSize", 0)); - - NginxController origNginx = origApp.createAndManageChild(EntitySpec.create(NginxController.class) - .configure("serverPool", origServerPool) - .configure("domain", "localhost")); - - // Start the app, and ensure reachable; start polling the URL - origApp.start(ImmutableList.of(localhostProvisioningLocation)); - - String rootUrl = origNginx.getAttribute(NginxController.ROOT_URL); - int nginxPort = origNginx.getAttribute(NginxController.PROXY_HTTP_PORT); - - assertHttpStatusCodeEventuallyEquals(rootUrl, 404); - WebAppMonitor monitor = newWebAppMonitor(rootUrl, 404); - final String origConfigFile = origNginx.getConfigFile(); - - newApp = rebind(RebindOptions.create().terminateOrigManagementContext(true)); - final NginxController newNginx = (NginxController) Iterables.find(newApp.getChildren(), Predicates.instanceOf(NginxController.class)); - - assertEquals(newNginx.getConfigFile(), origConfigFile); - - EntityTestUtils.assertAttributeEqualsEventually(newNginx, NginxController.SERVICE_STATE_ACTUAL, Lifecycle.RUNNING); - assertEquals(newNginx.getAttribute(NginxController.PROXY_HTTP_PORT), (Integer)nginxPort); - assertEquals(newNginx.getAttribute(NginxController.ROOT_URL), rootUrl); - assertEquals(newNginx.getAttribute(NginxController.PROXY_HTTP_PORT), origNginx.getAttribute(NginxController.PROXY_HTTP_PORT)); - assertEquals(newNginx.getConfig(NginxController.STICKY), origNginx.getConfig(NginxController.STICKY)); - - assertAttributeEqualsEventually(newNginx, SoftwareProcess.SERVICE_UP, true); - assertHttpStatusCodeEventuallyEquals(rootUrl, 404); - - assertEquals(monitor.getFailures(), 0); - } - - /** - * Test can rebind with an active server pool. - */ - @Test(groups = "Integration") - public void testRebindsWithoutLosingServerPool() throws Exception { - - // Set up nginx with a server pool - DynamicCluster origServerPool = origApp.createAndManageChild(EntitySpec.create(DynamicCluster.class) - .configure(DynamicCluster.MEMBER_SPEC, EntitySpec.create(Tomcat8Server.class).configure("war", getTestWar())) - .configure("initialSize", 1)); - - NginxController origNginx = origApp.createAndManageChild(EntitySpec.create(NginxController.class) - .configure("serverPool", origServerPool) - .configure("domain", "localhost")); - - // Start the app, and ensure reachable; start polling the URL - origApp.start(ImmutableList.of(localhostProvisioningLocation)); - - String rootUrl = origNginx.getAttribute(NginxController.ROOT_URL); - Tomcat8Server origServer = (Tomcat8Server) Iterables.getOnlyElement(origServerPool.getMembers()); - assertEquals(origNginx.getAttribute(NginxController.SERVER_POOL_TARGETS).keySet(), ImmutableSet.of(origServer)); - - assertHttpStatusCodeEventuallyEquals(rootUrl, 200); - WebAppMonitor monitor = newWebAppMonitor(rootUrl, 200); - final String origConfigFile = origNginx.getConfigFile(); - - // Rebind - newApp = rebind(RebindOptions.create().terminateOrigManagementContext(true)); - ManagementContext newManagementContext = newApp.getManagementContext(); - final NginxController newNginx = (NginxController) Iterables.find(newApp.getChildren(), Predicates.instanceOf(NginxController.class)); - final DynamicCluster newServerPool = (DynamicCluster) newManagementContext.getEntityManager().getEntity(origServerPool.getId()); - final Tomcat8Server newServer = (Tomcat8Server) Iterables.getOnlyElement(newServerPool.getMembers()); - - // Expect continually to have same nginx members; should not lose them temporarily! - Asserts.succeedsContinually(new Runnable() { - public void run() { - Map<Entity, String> newNginxMemebers = newNginx.getAttribute(NginxController.SERVER_POOL_TARGETS); - assertEquals(newNginxMemebers.keySet(), ImmutableSet.of(newServer)); - }}); - - - assertAttributeEqualsEventually(newNginx, SoftwareProcess.SERVICE_UP, true); - assertHttpStatusCodeEventuallyEquals(rootUrl, 200); - - assertEquals(newNginx.getConfigFile(), origConfigFile); - - // Check that an update doesn't break things - newNginx.update(); - - assertHttpStatusCodeEquals(rootUrl, 200); - - // Resize new cluster, and confirm change takes affect. - // - Increase size - // - wait for nginx to definitely be updates (TODO nicer way to wait for updated?) - // - terminate old server - // - confirm can still route messages - newServerPool.resize(2); - - Thread.sleep(10*1000); - - newServer.stop(); - - assertHttpStatusCodeEventuallyEquals(rootUrl, 200); - - // Check that URLs have been constantly reachable - assertEquals(monitor.getFailures(), 0); - } - - - /** - * Test can rebind to the with server pool and URL remappings. - * NOTE: This requires a redirection from localhost1 to 127.0.0.1 in your /etc/hosts file - */ - @Test(groups = "Integration") - public void testRebindsWithoutLosingUrlMappings() throws Exception { - - // Set up nginx with a url-mapping - Group origUrlMappingsGroup = origApp.createAndManageChild(EntitySpec.create(BasicGroup.class) - .configure("childrenAsMembers", true)); - - DynamicCluster origServerPool = origApp.createAndManageChild(EntitySpec.create(DynamicCluster.class) - .configure(DynamicCluster.MEMBER_SPEC, EntitySpec.create(Tomcat8Server.class).configure("war", getTestWar())) - .configure("initialSize", 1)); - - UrlMapping origMapping = origApp.getManagementContext().getEntityManager().createEntity(EntitySpec.create(UrlMapping.class) - .configure("domain", "localhost1") - .configure("target", origServerPool) - .configure("rewrites", ImmutableList.of(new UrlRewriteRule("/foo/(.*)", "/$1"))) - .parent(origUrlMappingsGroup)); - Entities.manage(origMapping); - - NginxController origNginx = origApp.createAndManageChild(EntitySpec.create(NginxController.class) - .configure("domain", "localhost") - .configure("urlMappings", origUrlMappingsGroup)); - - // Start the app, and ensure reachable; start polling the URL - origApp.start(ImmutableList.of(localhostProvisioningLocation)); - - String mappingGroupUrl = "http://localhost1:"+origNginx.getAttribute(NginxController.PROXY_HTTP_PORT)+"/foo/"; - - assertHttpStatusCodeEventuallyEquals(mappingGroupUrl, 200); - WebAppMonitor monitor = newWebAppMonitor(mappingGroupUrl, 200); - final String origConfigFile = origNginx.getConfigFile(); - - // Create a rebinding - newApp = rebind(RebindOptions.create().terminateOrigManagementContext(true)); - ManagementContext newManagementContext = newApp.getManagementContext(); - final NginxController newNginx = (NginxController) Iterables.find(newApp.getChildren(), Predicates.instanceOf(NginxController.class)); - DynamicCluster newServerPool = (DynamicCluster) newManagementContext.getEntityManager().getEntity(origServerPool.getId()); - Tomcat8Server newServer = (Tomcat8Server) Iterables.getOnlyElement(newServerPool.getMembers()); - - assertAttributeEqualsEventually(newNginx, SoftwareProcess.SERVICE_UP, true); - assertHttpStatusCodeEventuallyEquals(mappingGroupUrl, 200); - - assertEquals(newNginx.getConfigFile(), origConfigFile); - - // Check that an update doesn't break things - newNginx.update(); - - assertHttpStatusCodeEquals(mappingGroupUrl, 200); - - // Resize new cluster, and confirm change takes affect. - // - Increase size - // - wait for nginx to definitely be updates (TODO nicer way to wait for updated?) - // - terminate old server - // - confirm can still route messages - newServerPool.resize(2); - - Thread.sleep(10*1000); - - newServer.stop(); - - assertHttpStatusCodeEquals(mappingGroupUrl, 200); - - // Check that URLs have been constantly reachable - assertEquals(monitor.getFailures(), 0); - } -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/77dff880/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxRebindWithHaIntegrationTest.java ---------------------------------------------------------------------- diff --git a/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxRebindWithHaIntegrationTest.java b/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxRebindWithHaIntegrationTest.java deleted file mode 100644 index 8e2681c..0000000 --- a/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxRebindWithHaIntegrationTest.java +++ /dev/null @@ -1,182 +0,0 @@ -/* - * 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 brooklyn.entity.proxy.nginx; - -import java.net.URL; -import java.util.Collection; -import java.util.List; -import java.util.concurrent.Callable; -import java.util.concurrent.CopyOnWriteArrayList; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -import org.apache.brooklyn.management.Task; -import org.apache.brooklyn.management.ha.HighAvailabilityMode; -import org.apache.brooklyn.test.EntityTestUtils; -import org.apache.brooklyn.test.TestResourceUnavailableException; -import org.apache.brooklyn.test.WebAppMonitor; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.testng.Assert; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import brooklyn.entity.Feed; -import brooklyn.entity.basic.Attributes; -import brooklyn.entity.basic.Entities; -import brooklyn.entity.basic.EntityInternal; -import brooklyn.entity.basic.Lifecycle; -import brooklyn.entity.group.DynamicCluster; -import brooklyn.entity.proxying.EntitySpec; -import brooklyn.entity.rebind.RebindTestFixtureWithApp; -import brooklyn.entity.rebind.RebindTestUtils; -import brooklyn.entity.webapp.tomcat.TomcatServer; -import brooklyn.internal.BrooklynFeatureEnablement; -import brooklyn.location.LocationSpec; -import brooklyn.location.basic.LocalhostMachineProvisioningLocation; -import brooklyn.location.basic.SshMachineLocationReuseIntegrationTest.RecordingSshjTool; -import brooklyn.management.internal.LocalManagementContext; -import brooklyn.test.entity.TestApplication; -import brooklyn.util.internal.ssh.SshTool; -import brooklyn.util.net.Networking; -import brooklyn.util.repeat.Repeater; -import brooklyn.util.task.BasicExecutionManager; -import brooklyn.util.time.Duration; - -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Iterables; - -/** - * Test the operation of the {@link NginxController} class. - */ -public class NginxRebindWithHaIntegrationTest extends RebindTestFixtureWithApp { - - private static final Logger LOG = LoggerFactory.getLogger(NginxRebindWithHaIntegrationTest.class); - - private List<WebAppMonitor> webAppMonitors = new CopyOnWriteArrayList<WebAppMonitor>(); - private ExecutorService executor; - private LocalhostMachineProvisioningLocation loc; - - private Boolean feedRegistration; - - @Override - protected boolean useLiveManagementContext() { - // For Aled, the test failed without own ~/.brooklyn/brooklyn.properties. - // Suspect that was caused by local environment, with custom brooklyn.ssh.config.scriptHeader - // to set things like correct Java on path. - return true; - } - - public String getTestWar() { - TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), "/hello-world.war"); - return "classpath://hello-world.war"; - } - - @BeforeMethod(alwaysRun=true) - public void setUp() throws Exception { - super.setUp(); - loc = origManagementContext.getLocationManager().createLocation(LocationSpec.create(LocalhostMachineProvisioningLocation.class) - .configure("address", Networking.getLocalHost()) - .configure(SshTool.PROP_TOOL_CLASS, RecordingSshjTool.class.getName())); - executor = Executors.newCachedThreadPool(); - - feedRegistration = BrooklynFeatureEnablement.isEnabled(BrooklynFeatureEnablement.FEATURE_FEED_REGISTRATION_PROPERTY); - BrooklynFeatureEnablement.setEnablement(BrooklynFeatureEnablement.FEATURE_FEED_REGISTRATION_PROPERTY, true); - } - - @AfterMethod(alwaysRun=true) - public void tearDown() throws Exception { - try { - if (feedRegistration!=null) - BrooklynFeatureEnablement.setEnablement(BrooklynFeatureEnablement.FEATURE_FEED_REGISTRATION_PROPERTY, feedRegistration); - - for (WebAppMonitor monitor : webAppMonitors) { - monitor.terminate(); - } - webAppMonitors.clear(); - if (executor != null) executor.shutdownNow(); - super.tearDown(); - } finally { - RecordingSshjTool.reset(); - } - } - - @Override - protected TestApplication createApp() { - origManagementContext.getHighAvailabilityManager().changeMode(HighAvailabilityMode.MASTER); - return super.createApp(); - } - - @Test(groups = "Integration") - public void testChangeModeFailureStopsTasksButHappyUponResumption() throws Exception { - DynamicCluster origServerPool = origApp.createAndManageChild(EntitySpec.create(DynamicCluster.class) - .configure(DynamicCluster.MEMBER_SPEC, EntitySpec.create(TomcatServer.class).configure("war", getTestWar())) - .configure("initialSize", 1)); - - NginxController origNginx = origApp.createAndManageChild(EntitySpec.create(NginxController.class) - .configure("serverPool", origServerPool) - .configure("domain", "localhost")); - - origApp.start(ImmutableList.of(loc)); - Assert.assertTrue(RecordingSshjTool.connectionCount.get()>0); - - Collection<Feed> origFeeds = ((EntityInternal)origNginx).feeds().getFeeds(); - LOG.info("feeds before rebind are: "+origFeeds); - Assert.assertTrue(origFeeds.size() >= 1); - - origManagementContext.getRebindManager().forcePersistNow(); - - List<Task<?>> tasksBefore = ((BasicExecutionManager)origManagementContext.getExecutionManager()).getAllTasks(); - LOG.info("tasks before disabling HA, "+tasksBefore.size()+": "+tasksBefore); - Assert.assertFalse(tasksBefore.isEmpty()); - origManagementContext.getHighAvailabilityManager().changeMode(HighAvailabilityMode.DISABLED); - origApp = null; - - Repeater.create().every(Duration.millis(20)).backoffTo(Duration.ONE_SECOND).limitTimeTo(Duration.THIRTY_SECONDS).until(new Callable<Boolean>() { - @Override - public Boolean call() throws Exception { - origManagementContext.getGarbageCollector().gcIteration(); - List<Task<?>> tasksAfter = ((BasicExecutionManager)origManagementContext.getExecutionManager()).getAllTasks(); - LOG.info("tasks after disabling HA, "+tasksAfter.size()+": "+tasksAfter); - return tasksAfter.isEmpty(); - } - }).runRequiringTrue(); - - // disable SSH to localhost to ensure we don't try to ssh while rebinding - - RecordingSshjTool.forbidden.set(true); - newManagementContext = createNewManagementContext(); - newApp = (TestApplication) RebindTestUtils.rebind((LocalManagementContext)newManagementContext, classLoader); - - NginxController newNginx = Iterables.getOnlyElement(Entities.descendants(newApp, NginxController.class)); - - Collection<Feed> newFeeds = ((EntityInternal)newNginx).feeds().getFeeds(); - LOG.info("feeds after rebind are: "+newFeeds); - Assert.assertTrue(newFeeds.size() >= 1); - - // eventually goes on fire, because we disabled ssh - EntityTestUtils.assertAttributeEqualsEventually(newNginx, Attributes.SERVICE_STATE_ACTUAL, Lifecycle.ON_FIRE); - - // re-enable SSH and it should right itself - RecordingSshjTool.forbidden.set(false); - EntityTestUtils.assertAttributeEqualsEventually(newNginx, Attributes.SERVICE_STATE_ACTUAL, Lifecycle.RUNNING); - } - -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/77dff880/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxUrlMappingIntegrationTest.java ---------------------------------------------------------------------- diff --git a/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxUrlMappingIntegrationTest.java b/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxUrlMappingIntegrationTest.java deleted file mode 100644 index 2ebb1e5..0000000 --- a/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxUrlMappingIntegrationTest.java +++ /dev/null @@ -1,525 +0,0 @@ -/* - * 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 brooklyn.entity.proxy.nginx; - -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertTrue; -import static org.testng.Assert.fail; - -import java.net.Inet4Address; -import java.net.InetAddress; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import org.apache.brooklyn.management.EntityManager; -import org.apache.brooklyn.test.HttpTestUtils; -import org.apache.brooklyn.test.TestResourceUnavailableException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import brooklyn.entity.BrooklynAppLiveTestSupport; -import brooklyn.entity.Entity; -import brooklyn.entity.Group; -import brooklyn.entity.basic.Attributes; -import brooklyn.entity.basic.BasicGroup; -import brooklyn.entity.basic.Entities; -import brooklyn.entity.basic.EntityFactory; -import brooklyn.entity.group.DynamicCluster; -import brooklyn.entity.proxying.EntitySpec; -import brooklyn.entity.webapp.JavaWebAppService; -import brooklyn.entity.webapp.WebAppService; -import brooklyn.entity.webapp.jboss.JBoss7Server; -import brooklyn.entity.webapp.tomcat.Tomcat8Server; -import brooklyn.entity.webapp.tomcat.Tomcat8ServerImpl; -import brooklyn.location.basic.LocalhostMachineProvisioningLocation; -import brooklyn.test.Asserts; - -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Iterables; -import com.google.common.collect.Sets; - -/** - * Test the operation of the {@link NginxController} class, for URL mapped groups (two different pools). - * - * These tests require that /etc/hosts contains some extra entries, such as: - * 127.0.0.1 localhost localhost1 localhost2 localhost3 localhost4 - */ -public class NginxUrlMappingIntegrationTest extends BrooklynAppLiveTestSupport { - - // TODO Make JBoss7Server.deploy wait for the web-app to actually be deployed. - // That may simplify some of the tests, because we can assert some things immediately rather than in a succeedsEventually. - - private static final Logger log = LoggerFactory.getLogger(NginxUrlMappingIntegrationTest.class); - - private NginxController nginx; - private Group urlMappingsGroup; - private EntityManager entityManager; - private LocalhostMachineProvisioningLocation localLoc; - - @BeforeMethod(alwaysRun=true) - @Override - public void setUp() throws Exception { - super.setUp(); - - urlMappingsGroup = app.createAndManageChild(EntitySpec.create(BasicGroup.class) - .configure("childrenAsMembers", true)); - entityManager = app.getManagementContext().getEntityManager(); - - localLoc = new LocalhostMachineProvisioningLocation(); - } - - public String getTestWar() { - TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), "/hello-world.war"); - return "classpath://hello-world.war"; - } - - protected void checkExtraLocalhosts() throws Exception { - Set<String> failedHosts = Sets.newLinkedHashSet(); - List<String> allHosts = ImmutableList.of("localhost", "localhost1", "localhost2", "localhost3", "localhost4"); - for (String host : allHosts) { - try { - InetAddress i = InetAddress.getByName(host); - byte[] b = ((Inet4Address)i).getAddress(); - if (b[0]!=127 || b[1]!=0 || b[2]!=0 || b[3]!=1) { - log.warn("Failed to resolve "+host+" (test will subsequently fail, but looking for more errors first; see subsequent failure for more info): wrong IP "+Arrays.asList(b)); - failedHosts.add(host); - } - } catch (Exception e) { - log.warn("Failed to resolve "+host+" (test will subsequently fail, but looking for more errors first; see subsequent failure for more info): "+e, e); - failedHosts.add(host); - } - } - if (!failedHosts.isEmpty()) { - fail("These tests (in "+this+") require special hostnames to map to 127.0.0.1, in /etc/hosts: "+failedHosts); - } - } - - @Test(groups = "Integration") - public void testUrlMappingServerNameAndPath() throws Exception { - nginx = app.createAndManageChild(EntitySpec.create(NginxController.class) - .configure("urlMappings", urlMappingsGroup)); - - //cluster 0 mounted at localhost1 / - DynamicCluster c0 = app.createAndManageChild(EntitySpec.create(DynamicCluster.class) - .configure("initialSize", 1) - .configure(DynamicCluster.MEMBER_SPEC, EntitySpec.create(Tomcat8Server.class).configure("httpPort", "8100+")) - .configure(JavaWebAppService.ROOT_WAR, getTestWar())); - UrlMapping u0 = entityManager.createEntity(EntitySpec.create(UrlMapping.class) - .configure("domain", "localhost1") - .configure("target", c0) - .parent(urlMappingsGroup)); - Entities.manage(u0); - - //cluster 1 at localhost2 /hello-world/ - DynamicCluster c1 = app.createAndManageChild(EntitySpec.create(DynamicCluster.class) - .configure("initialSize", 1) - .configure(DynamicCluster.MEMBER_SPEC, EntitySpec.create(Tomcat8Server.class).configure("httpPort", "8100+")) - .configure(JavaWebAppService.NAMED_WARS, ImmutableList.of(getTestWar()))); - UrlMapping u1 = entityManager.createEntity(EntitySpec.create(UrlMapping.class) - .configure("domain", "localhost2") - .configure("path", "/hello-world($|/.*)") - .configure("target", c1) - .parent(urlMappingsGroup)); - Entities.manage(u1); - - // cluster 2 at localhost3 /c2/ and mapping /hello/xxx to /hello/new xxx - DynamicCluster c2 = app.createAndManageChild(EntitySpec.create(DynamicCluster.class) - .configure("initialSize", 1) - .configure(DynamicCluster.MEMBER_SPEC, EntitySpec.create(Tomcat8Server.class).configure("httpPort", "8100+"))); - UrlMapping u2 = entityManager.createEntity(EntitySpec.create(UrlMapping.class) - .configure("domain", "localhost3") - .configure("path", "/c2($|/.*)") - .configure("target", c2) - .configure("rewrites", ImmutableList.of(new UrlRewriteRule("(.*/|)(hello/)(.*)", "$1$2new $3").setBreak())) - .parent(urlMappingsGroup)); - Entities.manage(u2); - // FIXME rewrite not a config - - app.start(ImmutableList.of(localLoc)); - final int port = nginx.getAttribute(NginxController.PROXY_HTTP_PORT); - for (Entity member : c2.getMembers()) { - ((Tomcat8Server)member).deploy(getTestWar(), "c2.war"); - } - - Entities.dumpInfo(app); - - // Confirm routes requests to the correct cluster - // Do more than one request for each in-case just lucky with round-robin... - Asserts.succeedsEventually(new Runnable() { - public void run() { - //cluster 0 - for (int i = 0; i < 2; i++) { - HttpTestUtils.assertContentContainsText("http://localhost1:"+port, "Hello"); - HttpTestUtils.assertContentContainsText("http://localhost1:"+port+"/", "Hello"); - HttpTestUtils.assertContentContainsText("http://localhost1:"+port+"/hello/frank", "http://localhost1:"+port+"/hello/frank"); - } - //cluster 1 - for (int i = 0; i < 2; i++) { - HttpTestUtils.assertContentContainsText("http://localhost2:"+port+"/hello-world", "Hello"); - HttpTestUtils.assertContentContainsText("http://localhost2:"+port+"/hello-world/", "Hello"); - HttpTestUtils.assertContentContainsText("http://localhost2:"+port+"/hello-world/hello/bob", "http://localhost2:"+port+"/hello-world/hello/bob"); - } - //cluster 2 - for (int i = 0; i < 2; i++) { - HttpTestUtils.assertContentContainsText("http://localhost3:"+port+"/c2", "Hello"); - HttpTestUtils.assertContentContainsText("http://localhost3:"+port+"/c2/", "Hello"); - HttpTestUtils.assertContentContainsText("http://localhost3:"+port+"/c2/hello/joe", "http://localhost3:"+port+"/c2/hello/new%20joe"); - } - }}); - - //these should *not* be available - HttpTestUtils.assertHttpStatusCodeEquals("http://localhost:"+port+"/", 404); - HttpTestUtils.assertHttpStatusCodeEquals("http://localhost1:"+port+"/hello-world", 404); - HttpTestUtils.assertHttpStatusCodeEquals("http://localhost2:"+port+"/", 404); - HttpTestUtils.assertHttpStatusCodeEquals("http://localhost2:"+port+"/hello-world/notexists", 404); - HttpTestUtils.assertHttpStatusCodeEquals("http://localhost3:"+port+"/", 404); - - // TODO previously said "make sure nginx default welcome page isn't displayed", - // but the assertion only worked because threw exception on 404 trying to read - // stdin of http connection. If reading stderr of http connection, we do see - // "ginx" in the output. Why were we asserting this? Can we just delete it? - // Previous code was: - // Asserts.assertFails { HttpTestUtils.assertContentContainsText([timeout:1], "http://localhost:${port}/", "ginx"); } - } - - @Test(groups = "Integration") - public void testUrlMappingRoutesRequestByPathToCorrectGroup() throws Exception { - DynamicCluster c0 = app.createAndManageChild(EntitySpec.create(DynamicCluster.class) - .configure("initialSize", 1) - .configure(DynamicCluster.MEMBER_SPEC, EntitySpec.create(Tomcat8Server.class).configure("httpPort", "8100+"))); - UrlMapping u0 = entityManager.createEntity(EntitySpec.create(UrlMapping.class) - .configure("domain", "localhost") - .configure("path", "/atC0($|/.*)") - .configure("target", c0) - .parent(urlMappingsGroup)); - Entities.manage(u0); - - DynamicCluster c1 = app.createAndManageChild(EntitySpec.create(DynamicCluster.class) - .configure("initialSize", 1) - .configure(DynamicCluster.MEMBER_SPEC, EntitySpec.create(Tomcat8Server.class).configure("httpPort", "8100+"))); - UrlMapping u1 = entityManager.createEntity(EntitySpec.create(UrlMapping.class) - .configure("domain", "localhost") - .configure("path", "/atC1($|/.*)") - .configure("target", c1) - .parent(urlMappingsGroup)); - Entities.manage(u1); - - nginx = app.createAndManageChild(EntitySpec.create(NginxController.class) - .configure("domain", "localhost") - .configure("port", "8000+") - .configure("portNumberSensor", WebAppService.HTTP_PORT) - .configure("urlMappings", urlMappingsGroup)); - - app.start(ImmutableList.of(localLoc)); - final int port = nginx.getAttribute(NginxController.PROXY_HTTP_PORT); - - for (Entity child : c0.getMembers()) { - ((Tomcat8Server)child).deploy(getTestWar(), "atC0.war"); - } - for (Entity child : c1.getMembers()) { - ((Tomcat8Server)child).deploy(getTestWar(), "atC1.war"); - } - - // Confirm routes requests to the correct cluster - // Do more than one request for each in-case just lucky with round-robin... - Asserts.succeedsEventually(new Runnable() { - public void run() { - for (int i = 0; i < 2; i++) { - HttpTestUtils.assertContentContainsText("http://localhost:"+port+"/atC0", "Hello"); - HttpTestUtils.assertContentContainsText("http://localhost:"+port+"/atC0/", "Hello"); - } - for (int i = 0; i < 2; i++) { - HttpTestUtils.assertContentContainsText("http://localhost:"+port+"/atC1", "Hello"); - HttpTestUtils.assertContentContainsText("http://localhost:"+port+"/atC1/", "Hello"); - } - }}); - } - - @Test(groups = "Integration") - public void testUrlMappingRemovedWhenMappingEntityRemoved() throws Exception { - DynamicCluster c0 = app.createAndManageChild(EntitySpec.create(DynamicCluster.class) - .configure("initialSize", 1) - .configure(DynamicCluster.MEMBER_SPEC, EntitySpec.create(Tomcat8Server.class).configure("httpPort", "8100+")) - .configure(JavaWebAppService.ROOT_WAR, getTestWar())); - UrlMapping u0 = entityManager.createEntity(EntitySpec.create(UrlMapping.class) - .configure("domain", "localhost2") - .configure("target", c0) - .parent(urlMappingsGroup)); - Entities.manage(u0); - - nginx = app.createAndManageChild(EntitySpec.create(NginxController.class) - .configure("domain", "localhost") - .configure("port", "8000+") - .configure("portNumberSensor", WebAppService.HTTP_PORT) - .configure("urlMappings", urlMappingsGroup)); - - app.start(ImmutableList.of(localLoc)); - int port = nginx.getAttribute(NginxController.PROXY_HTTP_PORT); - - // Wait for deployment to be successful - HttpTestUtils.assertHttpStatusCodeEventuallyEquals("http://localhost2:"+port+"/", 200); - - // Now remove mapping; will no longer route requests - Entities.unmanage(u0); - HttpTestUtils.assertHttpStatusCodeEventuallyEquals("http://localhost2:"+port+"/", 404); - } - - @Test(groups = "Integration") - public void testWithCoreClusterAndUrlMappedGroup() throws Exception { - // TODO Should use different wars, so can confirm content from each cluster - // TODO Could also assert on: nginx.getConfigFile() - - checkExtraLocalhosts(); - - DynamicCluster coreCluster = app.createAndManageChild(EntitySpec.create(DynamicCluster.class) - .configure("initialSize", 1) - .configure(DynamicCluster.MEMBER_SPEC, EntitySpec.create(Tomcat8Server.class).configure("httpPort", "8100+")) - .configure(JavaWebAppService.ROOT_WAR, getTestWar())); - - DynamicCluster c1 = app.createAndManageChild(EntitySpec.create(DynamicCluster.class) - .configure("initialSize", 1) - .configure(DynamicCluster.MEMBER_SPEC, EntitySpec.create(Tomcat8Server.class).configure("httpPort", "8100+")) - .configure(JavaWebAppService.NAMED_WARS, ImmutableList.of(getTestWar()))); - UrlMapping u1 = entityManager.createEntity(EntitySpec.create(UrlMapping.class) - .configure("domain", "localhost1") - .configure("target", c1) - .parent(urlMappingsGroup)); - Entities.manage(u1); - - nginx = app.createAndManageChild(EntitySpec.create(NginxController.class) - .configure("serverPool", coreCluster) - .configure("domain", "localhost") - .configure("port", "8000+") - .configure("portNumberSensor", WebAppService.HTTP_PORT) - .configure("urlMappings", urlMappingsGroup)); - - app.start(ImmutableList.of(localLoc)); - final int port = nginx.getAttribute(NginxController.PROXY_HTTP_PORT); - - // check nginx forwards localhost1 to c1, and localhost to core group - Asserts.succeedsEventually(new Runnable() { - public void run() { - HttpTestUtils.assertContentContainsText("http://localhost1:"+port+"/hello-world", "Hello"); - HttpTestUtils.assertHttpStatusCodeEquals("http://localhost1:"+port+"", 404); - - HttpTestUtils.assertContentContainsText("http://localhost:"+port+"", "Hello"); - HttpTestUtils.assertHttpStatusCodeEquals("http://localhost:"+port+"/hello-world", 404); - }}); - } - - @Test(groups = "Integration") - public void testUrlMappingMultipleRewrites() throws Exception { - nginx = app.createAndManageChild(EntitySpec.create(NginxController.class) - .configure("urlMappings", urlMappingsGroup)); - - //cluster 0 mounted at localhost1 / - DynamicCluster c0 = app.createAndManageChild(EntitySpec.create(DynamicCluster.class) - .configure("initialSize", 1) - .configure(DynamicCluster.MEMBER_SPEC, EntitySpec.create(Tomcat8Server.class).configure("httpPort", "8100+")) - .configure(JavaWebAppService.ROOT_WAR, getTestWar())); - UrlMapping u0 = entityManager.createEntity(EntitySpec.create(UrlMapping.class) - .configure("domain", "localhost1") - .configure("target", c0) - .parent(urlMappingsGroup)); - u0.addRewrite("/goodbye/al(.*)", "/hello/al$1"); - u0.addRewrite(new UrlRewriteRule("/goodbye(|/.*)$", "/hello$1").setBreak()); - u0.addRewrite("(.*)/hello/al(.*)", "$1/hello/Big Al$2"); - u0.addRewrite("/hello/an(.*)", "/hello/Sir An$1"); - Entities.manage(u0); - - app.start(ImmutableList.of(localLoc)); - final int port = nginx.getAttribute(NginxController.PROXY_HTTP_PORT); - - // Confirm routes requests to the correct cluster - Asserts.succeedsEventually(new Runnable() { - public void run() { - // health check - HttpTestUtils.assertContentContainsText("http://localhost1:"+port+"", "Hello"); - HttpTestUtils.assertContentContainsText("http://localhost1:"+port+"/hello/frank", "http://localhost1:"+port+"/hello/frank"); - - // goodbye rewritten to hello - HttpTestUtils.assertContentContainsText("http://localhost1:"+port+"/goodbye/frank", "http://localhost1:"+port+"/hello/frank"); - // hello al rewritten to hello Big Al - HttpTestUtils.assertContentContainsText("http://localhost1:"+port+"/hello/aled", "http://localhost1:"+port+"/hello/Big%20Aled"); - // hello andrew rewritten to hello Sir Andrew - HttpTestUtils.assertContentContainsText("http://localhost1:"+port+"/hello/andrew", "http://localhost1:"+port+"/hello/Sir%20Andrew"); - - // goodbye alex rewritten to hello Big Alex (two rewrites) - HttpTestUtils.assertContentContainsText("http://localhost1:"+port+"/goodbye/alex", "http://localhost1:"+port+"/hello/Big%20Alex"); - // but goodbye andrew rewritten only to hello Andrew -- test the "break" logic above (won't continue rewriting) - HttpTestUtils.assertContentContainsText("http://localhost1:"+port+"/goodbye/andrew", "http://localhost1:"+port+"/hello/andrew"); - - // al rewrite can be anywhere - HttpTestUtils.assertContentContainsText("http://localhost1:"+port+"/hello/hello/alex", "http://localhost1:"+port+"/hello/hello/Big%20Alex"); - // but an rewrite must be at beginning - HttpTestUtils.assertContentContainsText("http://localhost1:"+port+"/hello/hello/andrew", "http://localhost1:"+port+"/hello/hello/andrew"); - }}); - } - - @Test(groups = "Integration") - public void testUrlMappingGroupRespondsToScaleOut() throws Exception { - checkExtraLocalhosts(); - - nginx = app.createAndManageChild(EntitySpec.create(NginxController.class) - .configure("domain", "localhost") - .configure("port", "8000+") - .configure("portNumberSensor", WebAppService.HTTP_PORT) - .configure("urlMappings", urlMappingsGroup)); - - final DynamicCluster c1 = app.createAndManageChild(EntitySpec.create(DynamicCluster.class) - .configure("initialSize", 1) - .configure(DynamicCluster.MEMBER_SPEC, EntitySpec.create(Tomcat8Server.class).configure("httpPort", "8100+")) - .configure(JavaWebAppService.ROOT_WAR, getTestWar())); - final UrlMapping u1 = entityManager.createEntity(EntitySpec.create(UrlMapping.class) - .configure("domain", "localhost1") - .configure("target", c1) - .parent(urlMappingsGroup)); - Entities.manage(u1); - - app.start(ImmutableList.of(localLoc)); - int port = nginx.getAttribute(NginxController.PROXY_HTTP_PORT); - - Entity c1jboss = Iterables.getOnlyElement(c1.getMembers()); - - // Wait for app-server to be responsive, and url-mapping to update its TARGET_ADDRESSES (through async subscription) - Asserts.succeedsEventually(new Runnable() { - public void run() { - // Entities.dumpInfo(app); - assertEquals(u1.getAttribute(UrlMapping.TARGET_ADDRESSES).size(), 1); - }}); - - // check nginx forwards localhost1 to c1 - HttpTestUtils.assertContentEventuallyContainsText("http://localhost1:"+port+"", "Hello"); - - // Resize target cluster of url-mapping - c1.resize(2); - List c1jbosses = new ArrayList(c1.getMembers()); - c1jbosses.remove(c1jboss); - // the unnecessary (Entity) cast is required as a work-around to an IntelliJ issue that prevents Brooklyn from launching from the IDE - Entity c1jboss2 = (Entity)Iterables.getOnlyElement(c1jbosses); - - // TODO Have to wait for new app-server; should fix app-servers to block - // Also wait for TARGET_ADDRESSES to update - assertAppServerRespondsEventually(c1jboss2); - Asserts.succeedsEventually(new Runnable() { - public void run() { - assertEquals(u1.getAttribute(UrlMapping.TARGET_ADDRESSES).size(), 2); - }}); - - // check jboss2 is included in nginx rules - // TODO Should getConfigFile return the current config file, rather than recalculate? - // This assertion isn't good enough to tell if it's been deployed. - final String c1jboss2addr = c1jboss2.getAttribute(Attributes.HOSTNAME)+":"+c1jboss2.getAttribute(Attributes.HTTP_PORT); - Asserts.succeedsEventually(new Runnable() { - public void run() { - String conf = nginx.getConfigFile(); - assertTrue(conf.contains(c1jboss2addr), "could not find "+c1jboss2addr+" in:\n"+conf); - }}); - - // and check forwarding to c1 by nginx still works - for (int i = 0; i < 2; i++) { - HttpTestUtils.assertContentContainsText("http://localhost1:"+port+"", "Hello"); - } - } - - @Test(groups = "Integration") - public void testUrlMappingWithEmptyCoreCluster() throws Exception { - DynamicCluster nullCluster = app.createAndManageChild(EntitySpec.create(DynamicCluster.class) - .configure("initialSize", 0) - .configure("factory", new EntityFactory<Entity>() { - public Entity newEntity(Map flags, Entity parent) { - throw new UnsupportedOperationException(); - }})); - - DynamicCluster c0 = app.createAndManageChild(EntitySpec.create(DynamicCluster.class) - .configure("initialSize", 1) - .configure(DynamicCluster.MEMBER_SPEC, EntitySpec.create(Tomcat8Server.class).configure("httpPort", "8100+"))); - UrlMapping u0 = entityManager.createEntity(EntitySpec.create(UrlMapping.class) - .configure("domain", "localhost") - .configure("path", "/atC0($|/.*)") - .configure("target", c0) - .parent(urlMappingsGroup)); - Entities.manage(u0); - - nginx = app.createAndManageChild(EntitySpec.create(NginxController.class) - .configure("cluster", nullCluster) - .configure("domain", "localhost") - .configure("port", "8000+") - .configure("portNumberSensor", WebAppService.HTTP_PORT) - .configure("urlMappings", urlMappingsGroup)); - - app.start(ImmutableList.of(localLoc)); - final int port = nginx.getAttribute(NginxController.PROXY_HTTP_PORT); - - for (Entity child : c0.getMembers()) { - ((Tomcat8Server)child).deploy(getTestWar(), "atC0.war"); - } - - // Confirm routes requests to the correct cluster - // Do more than one request for each in-case just lucky with round-robin... - Asserts.succeedsEventually(new Runnable() { - public void run() { - for (int i = 0; i < 2; i++) { - HttpTestUtils.assertContentContainsText("http://localhost:"+port+"/atC0/", "Hello"); - HttpTestUtils.assertContentContainsText("http://localhost:"+port+"/atC0", "Hello"); - } - }}); - - // And empty-core should return 404 - HttpTestUtils.assertHttpStatusCodeEquals("http://localhost:"+port+"", 404); - } - - @Test(groups = "Integration") - public void testDiscardUrlMapping() throws Exception { - //cluster 0 mounted at localhost1 / - DynamicCluster c0 = app.createAndManageChild(EntitySpec.create(DynamicCluster.class) - .configure("initialSize", 1) - .configure(DynamicCluster.MEMBER_SPEC, EntitySpec.create(Tomcat8Server.class).configure("httpPort", "8100+")) - .configure(JavaWebAppService.ROOT_WAR, getTestWar())); - UrlMapping u0 = entityManager.createEntity(EntitySpec.create(UrlMapping.class) - .configure("domain", "localhost1") - .configure("target", c0) - .parent(urlMappingsGroup)); - Entities.manage(u0); - - nginx = app.createAndManageChild(EntitySpec.create(NginxController.class) - .configure("urlMappings", urlMappingsGroup)); - - app.start(ImmutableList.of(localLoc)); - int port = nginx.getAttribute(NginxController.PROXY_HTTP_PORT); - - HttpTestUtils.assertHttpStatusCodeEventuallyEquals("http://localhost1:"+port+"", 200); - - // Discard, and confirm that subsequently get a 404 instead - u0.discard(); - - HttpTestUtils.assertHttpStatusCodeEventuallyEquals("http://localhost1:"+port+"", 404); - } - - private void assertAppServerRespondsEventually(Entity server) { - String hostname = server.getAttribute(Attributes.HOSTNAME); - int port = server.getAttribute(Attributes.HTTP_PORT); - HttpTestUtils.assertHttpStatusCodeEventuallyEquals("http://"+hostname+":"+port, 200); - } -}
