Adds ControlledDynamicWebAppCluster.WEB_CLUSTER_SPEC
Project: http://git-wip-us.apache.org/repos/asf/brooklyn-library/repo Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-library/commit/95cec8ab Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-library/tree/95cec8ab Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-library/diff/95cec8ab Branch: refs/heads/0.6.0 Commit: 95cec8abca067b0f1db632889c17b9d4521cc012 Parents: b6eb7c0 Author: Aled Sage <[email protected]> Authored: Wed Nov 6 15:23:26 2013 +0000 Committer: Aled Sage <[email protected]> Committed: Wed Nov 6 15:30:05 2013 +0000 ---------------------------------------------------------------------- .../webapp/ControlledDynamicWebAppCluster.java | 8 ++++-- .../ControlledDynamicWebAppClusterImpl.java | 24 ++++++++++++---- .../ControlledDynamicWebAppClusterTest.java | 30 +++++++++++++++++++- 3 files changed, 54 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/95cec8ab/software/webapp/src/main/java/brooklyn/entity/webapp/ControlledDynamicWebAppCluster.java ---------------------------------------------------------------------- diff --git a/software/webapp/src/main/java/brooklyn/entity/webapp/ControlledDynamicWebAppCluster.java b/software/webapp/src/main/java/brooklyn/entity/webapp/ControlledDynamicWebAppCluster.java index dd1990f..263dcbc 100644 --- a/software/webapp/src/main/java/brooklyn/entity/webapp/ControlledDynamicWebAppCluster.java +++ b/software/webapp/src/main/java/brooklyn/entity/webapp/ControlledDynamicWebAppCluster.java @@ -80,11 +80,11 @@ public interface ControlledDynamicWebAppCluster extends Entity, Startable, Resiz @SetFromFlag("controller") public static BasicAttributeSensorAndConfigKey<LoadBalancer> CONTROLLER = new BasicAttributeSensorAndConfigKey<LoadBalancer>( - LoadBalancer.class, "controlleddynamicweballcluster.controller", "Controller for the cluster; if null a default will created"); + LoadBalancer.class, "controlleddynamicweballcluster.controller", "Controller for the cluster; if null a default will created (using controllerSpec)"); @SetFromFlag("controllerSpec") public static BasicAttributeSensorAndConfigKey<EntitySpec<? extends LoadBalancer>> CONTROLLER_SPEC = new BasicAttributeSensorAndConfigKey( - EntitySpec.class, "controlleddynamicweballcluster.controllerSpec", "Spec for creating the cluster (if one not supplied explicitly); if null an NGINX instance will be created"); + EntitySpec.class, "controlleddynamicweballcluster.controllerSpec", "Spec for creating the controller (if one not supplied explicitly); if null an NGINX instance will be created"); /** factory (or closure) to create the web server, given flags */ @SetFromFlag("factory") @@ -96,6 +96,10 @@ public interface ControlledDynamicWebAppCluster extends Entity, Startable, Resiz public static BasicAttributeSensorAndConfigKey<EntitySpec<? extends WebAppService>> MEMBER_SPEC = new BasicAttributeSensorAndConfigKey( EntitySpec.class, DynamicCluster.MEMBER_SPEC.getName(), "Spec for web server entiites to be created"); + @SetFromFlag("webClusterSpec") + public static BasicAttributeSensorAndConfigKey<EntitySpec<? extends DynamicWebAppCluster>> WEB_CLUSTER_SPEC = new BasicAttributeSensorAndConfigKey( + EntitySpec.class, "controlleddynamicweballcluster.webClusterSpec", "Spec for creating the cluster; if null a DynamicWebAppCluster will be created"); + public static AttributeSensor<DynamicWebAppCluster> CLUSTER = new BasicAttributeSensor<DynamicWebAppCluster>( DynamicWebAppCluster.class, "controlleddynamicweballcluster.cluster", "Underlying web-app cluster"); http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/95cec8ab/software/webapp/src/main/java/brooklyn/entity/webapp/ControlledDynamicWebAppClusterImpl.java ---------------------------------------------------------------------- diff --git a/software/webapp/src/main/java/brooklyn/entity/webapp/ControlledDynamicWebAppClusterImpl.java b/software/webapp/src/main/java/brooklyn/entity/webapp/ControlledDynamicWebAppClusterImpl.java index dcb5f32..c177a34 100644 --- a/software/webapp/src/main/java/brooklyn/entity/webapp/ControlledDynamicWebAppClusterImpl.java +++ b/software/webapp/src/main/java/brooklyn/entity/webapp/ControlledDynamicWebAppClusterImpl.java @@ -57,6 +57,7 @@ public class ControlledDynamicWebAppClusterImpl extends AbstractEntity implement ConfigToAttributes.apply(this, MEMBER_SPEC); ConfigToAttributes.apply(this, CONTROLLER); ConfigToAttributes.apply(this, CONTROLLER_SPEC); + ConfigToAttributes.apply(this, WEB_CLUSTER_SPEC); ConfigurableEntityFactory<? extends WebAppService> webServerFactory = getAttribute(FACTORY); EntitySpec<? extends WebAppService> webServerSpec = getAttribute(MEMBER_SPEC); @@ -68,14 +69,27 @@ public class ControlledDynamicWebAppClusterImpl extends AbstractEntity implement log.debug("creating cluster child for {}", this); // Note relies on initial_size being inherited by DynamicWebAppCluster, because key id is identical - Map<String,Object> flags; + EntitySpec<? extends DynamicWebAppCluster> webClusterSpec = getAttribute(WEB_CLUSTER_SPEC); + Map<String,Object> webClusterFlags; if (webServerSpec != null) { - flags = MutableMap.<String,Object>of("memberSpec", webServerSpec); + webClusterFlags = MutableMap.<String,Object>of("memberSpec", webServerSpec); } else { - flags = MutableMap.<String,Object>of("factory", webServerFactory); + webClusterFlags = MutableMap.<String,Object>of("factory", webServerFactory); } - DynamicWebAppCluster cluster = addChild(EntitySpec.create(DynamicWebAppCluster.class) - .configure(flags)); + if (webClusterSpec == null) { + log.debug("creating default web cluster spec for {}", this); + webClusterSpec = EntitySpec.create(DynamicWebAppCluster.class); + } + boolean hasMemberSpec = webClusterSpec.getConfig().containsKey(DynamicWebAppCluster.MEMBER_SPEC) || webClusterSpec.getFlags().containsKey("memberSpec"); + boolean hasMemberFactory = webClusterSpec.getConfig().containsKey(DynamicWebAppCluster.FACTORY) || webClusterSpec.getFlags().containsKey("factory"); + if (!(hasMemberSpec || hasMemberFactory)) { + webClusterSpec.configure(webClusterFlags); + } else { + log.warn("In {}, not setting cluster's {} because already set on webClusterSpec", new Object[] {this, webClusterFlags.keySet()}); + } + setAttribute(WEB_CLUSTER_SPEC, webClusterSpec); + + DynamicWebAppCluster cluster = addChild(webClusterSpec); if (Entities.isManaged(this)) Entities.manage(cluster); setAttribute(CLUSTER, cluster); http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/95cec8ab/software/webapp/src/test/java/brooklyn/entity/webapp/ControlledDynamicWebAppClusterTest.java ---------------------------------------------------------------------- diff --git a/software/webapp/src/test/java/brooklyn/entity/webapp/ControlledDynamicWebAppClusterTest.java b/software/webapp/src/test/java/brooklyn/entity/webapp/ControlledDynamicWebAppClusterTest.java index 7a5a9ee..8128ccd 100644 --- a/software/webapp/src/test/java/brooklyn/entity/webapp/ControlledDynamicWebAppClusterTest.java +++ b/software/webapp/src/test/java/brooklyn/entity/webapp/ControlledDynamicWebAppClusterTest.java @@ -15,10 +15,10 @@ import org.testng.annotations.Test; import brooklyn.entity.basic.ApplicationBuilder; import brooklyn.entity.basic.BasicConfigurableEntityFactory; import brooklyn.entity.basic.Entities; -import brooklyn.entity.proxy.AbstractController; import brooklyn.entity.proxy.LoadBalancer; import brooklyn.entity.proxy.nginx.NginxController; import brooklyn.entity.proxying.EntitySpec; +import brooklyn.entity.webapp.jboss.JBoss7Server; import brooklyn.entity.webapp.jboss.JBoss7ServerFactory; import brooklyn.location.basic.LocalhostMachineProvisioningLocation; import brooklyn.test.EntityTestUtils; @@ -136,4 +136,32 @@ public class ControlledDynamicWebAppClusterTest { EntityTestUtils.assertAttributeEqualsEventually(MutableMap.of("timeout", TIMEOUT_MS), cluster, ControlledDynamicWebAppCluster.SERVICE_UP, expectedServiceUp); } + @Test(groups="Integration") + public void testUsesCustomWebClusterSpec() { + ControlledDynamicWebAppCluster cluster = app.createAndManageChild(EntitySpec.create(ControlledDynamicWebAppCluster.class) + .configure("initialSize", 0) + .configure(ControlledDynamicWebAppCluster.WEB_CLUSTER_SPEC, EntitySpec.create(DynamicWebAppCluster.class) + .displayName("mydisplayname"))); + app.start(locs); + + assertEquals(cluster.getCluster().getDisplayName(), "mydisplayname"); + } + + @Test(groups="Integration") + public void testCustomWebClusterSpecGetsMemberSpec() { + ControlledDynamicWebAppCluster cluster = app.createAndManageChild(EntitySpec.create(ControlledDynamicWebAppCluster.class) + .configure("initialSize", 1) + .configure(ControlledDynamicWebAppCluster.MEMBER_SPEC, EntitySpec.create(JBoss7Server.class) + .configure(JBoss7Server.ROOT_WAR, warUrl.toString())) + .configure(ControlledDynamicWebAppCluster.WEB_CLUSTER_SPEC, EntitySpec.create(DynamicWebAppCluster.class) + .displayName("mydisplayname"))); + app.start(locs); + + String url = cluster.getController().getAttribute(NginxController.ROOT_URL); + HttpTestUtils.assertContentEventuallyContainsText(url, "Hello"); + + // and make sure it really was using our custom spec + assertEquals(cluster.getCluster().getDisplayName(), "mydisplayname"); + + } }
